Upstream Merge branch 'demo'

pull/57/head
Nic0Nic0Nii 11 months ago
commit 5abd80932e
  1. 3
      .gitignore
  2. 2
      Adventures in Lestoria/Adventures in Lestoria.html
  3. 266
      Adventures in Lestoria/AdventuresInLestoria.cpp
  4. 10
      Adventures in Lestoria/AdventuresInLestoria.h
  5. 8
      Adventures in Lestoria/ConsumableCraftingWindow.cpp
  6. 9
      Adventures in Lestoria/InventoryWindow.cpp
  7. 3
      Adventures in Lestoria/Item.cpp
  8. 14
      Adventures in Lestoria/MerchantWindow.cpp
  9. 4
      Adventures in Lestoria/Monster.cpp
  10. 2
      Adventures in Lestoria/PauseMenu.cpp
  11. 4
      Adventures in Lestoria/Player.cpp
  12. 55
      Adventures in Lestoria/SaveFile.cpp
  13. 4
      Adventures in Lestoria/SlimeKing.cpp
  14. 2
      Adventures in Lestoria/State_OverworldMap.cpp
  15. 14
      Adventures in Lestoria/TODO.txt
  16. 4
      Adventures in Lestoria/Version.h
  17. BIN
      Adventures in Lestoria/assets/AdventuresInLestoria_GamePatch.png
  18. BIN
      Adventures in Lestoria/assets/AdventuresInLestoria_GamePatch.xcf
  19. BIN
      Adventures in Lestoria/assets/AdventuresInLestoria_LibraryHero.xcf
  20. BIN
      Adventures in Lestoria/assets/AdventuresInLestoria_LibraryHeroGamePatch.png
  21. 2
      Adventures in Lestoria/assets/Campaigns/1_1_v2.tmx
  22. 1
      Adventures in Lestoria/assets/Campaigns/World_Map.tmx
  23. 9
      Adventures in Lestoria/assets/config/Interface.txt
  24. 1
      Adventures in Lestoria/assets/config/gfx/gfx.txt
  25. 2
      Adventures in Lestoria/assets/config/items/ItemDatabase.txt
  26. 6
      Adventures in Lestoria/assets/config/items/Weapons.txt
  27. BIN
      Adventures in Lestoria/assets/vignette.png
  28. 1
      Adventures in Lestoria/olcPixelGameEngine.h
  29. 1
      Adventures in Lestoria/util.cpp
  30. 1
      debug.sh
  31. 1
      distribute.ps1
  32. 1
      distribute.sh
  33. 1
      emscripten_build.ps1
  34. 1
      emscripten_build.sh
  35. 1
      emscripten_debug_build.ps1
  36. 1
      emscripten_debug_build.sh
  37. 1
      emscripten_run.ps1
  38. 3
      emscripten_run.sh
  39. 1
      release.sh

3
.gitignore vendored

@ -397,10 +397,7 @@ build/CMakeFiles/3.16.3/CompilerIdC/CMakeCCompilerId.c
build/CMakeFiles/3.16.3/CompilerIdCXX/CMakeCXXCompilerId.cpp build/CMakeFiles/3.16.3/CompilerIdCXX/CMakeCXXCompilerId.cpp
test.cpp test.cpp
/Adventures in Lestoria/Adventures in Lestoria /Adventures in Lestoria/Adventures in Lestoria
/Adventures in Lestoria/packkey.cpp
/x64/Release/Adventures in Lestoria.zip /x64/Release/Adventures in Lestoria.zip
/x64/Release/Adventures in Lestoria_web.zip /x64/Release/Adventures in Lestoria_web.zip
/x64/Release/AdventuresInLestoria_web.zip /x64/Release/AdventuresInLestoria_web.zip
Adventures in Lestoria/packkey.cpp
Adventures in Lestoria/packkey.cpp
packkey.cpp packkey.cpp

@ -35,7 +35,7 @@ var Module = {
})(), })(),
}; };
</script> </script>
<script async type="text/javascript" src="Adventures in Lestoria.js"></script> <script async type="text/javascript" src="AdventuresInLestoria.js"></script>
<script type="text/javascript"> <script type="text/javascript">
Module.canvas.addEventListener("resize", (e) => { Module.canvas.addEventListener("resize", (e) => {

@ -361,27 +361,7 @@ bool AiL::OnUserCreate(){
} }
bool AiL::OnUserUpdate(float fElapsedTime){ bool AiL::OnUserUpdate(float fElapsedTime){
levelTime+=fElapsedTime; GlobalGameUpdates();
SteamAPI_RunCallbacks();
STEAMINPUT(
ActivateActionSetForAllControllers(Input::ingameControlsHandle);
Input::UpdateSteamInput();
)
if(GetMousePos()!=lastMousePos){
lastMouseMovement=0.f;
lastMousePos=GetMousePos();
}else lastMouseMovement+=fElapsedTime;
if(Audio::Engine().IsPlaying(GetPlayer()->cooldownSoundInstance)){
Audio::Engine().SetVolume(GetPlayer()->cooldownSoundInstance,Audio::GetCalculatedSFXVolume("Audio.Casting Sound Volume"_F/100.f));
}
if(!GamePaused()){
GameState::STATE->OnUserUpdate(this);
}else{
ClearTimedOutGarbage();
}
LoadingScreen::Update(); LoadingScreen::Update();
InputListener::Update(); InputListener::Update();
Tutorial::Update(); Tutorial::Update();
@ -402,6 +382,7 @@ bool AiL::OnUserUpdate(float fElapsedTime){
} }
} }
#endif #endif
if(QuitRequested())EndGame();
return !gameEnd; return !gameEnd;
} }
@ -454,6 +435,7 @@ void AiL::HandleUserInput(float fElapsedTime){
Menu::OpenMenu(MenuType::PAUSE); Menu::OpenMenu(MenuType::PAUSE);
} }
float animationSpd=0.f; float animationSpd=0.f;
player->movementVelocity={};
if(player->GetVelocity().mag()<"Player.Move Allowed Velocity Lower Limit"_F&&player->CanMove()){ if(player->GetVelocity().mag()<"Player.Move Allowed Velocity Lower Limit"_F&&player->CanMove()){
auto GetPlayerStaircaseDirection=[&](){ auto GetPlayerStaircaseDirection=[&](){
for(LayerTag&layer:MAP_DATA[GetCurrentLevel()].LayerData){ for(LayerTag&layer:MAP_DATA[GetCurrentLevel()].LayerData){
@ -480,16 +462,15 @@ void AiL::HandleUserInput(float fElapsedTime){
moveAmt*=controllerAmt; moveAmt*=controllerAmt;
}else animationSpd=1.f; }else animationSpd=1.f;
player->SetX(player->GetX()+fElapsedTime*moveAmt*player->GetMoveSpdMult()); player->SetX(player->GetX()+fElapsedTime*moveAmt*player->GetMoveSpdMult());
player->movementVelocity.x=moveAmt*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.x+=moveAmt*fElapsedTime*player->GetMoveSpdMult();
if(staircaseDirection=="RIGHT"){ if(staircaseDirection=="RIGHT"){
player->SetY(player->GetY()-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult()); player->SetY(player->GetY()-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult());
player->movementVelocity.y=-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+=-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult();
} else } else
if(staircaseDirection=="LEFT"){ if(staircaseDirection=="LEFT"){
player->SetY(player->GetY()+"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult()); player->SetY(player->GetY()+"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult());
player->movementVelocity.y="Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+="Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult();
} }
player->SetFacingDirection(RIGHT);
newAimingAngle+=vf2d{1,0}; newAimingAngle+=vf2d{1,0};
@ -508,14 +489,14 @@ void AiL::HandleUserInput(float fElapsedTime){
moveAmt*=controllerAmt; moveAmt*=controllerAmt;
}else animationSpd=1.f; }else animationSpd=1.f;
player->SetX(player->GetX()-fElapsedTime*moveAmt*player->GetMoveSpdMult()); player->SetX(player->GetX()-fElapsedTime*moveAmt*player->GetMoveSpdMult());
player->movementVelocity.x=-moveAmt*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.x+=-moveAmt*fElapsedTime*player->GetMoveSpdMult();
if(staircaseDirection=="RIGHT"){ if(staircaseDirection=="RIGHT"){
player->SetY(player->GetY()+"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult()); player->SetY(player->GetY()+"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult());
player->movementVelocity.y="Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+="Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult();
} else } else
if(staircaseDirection=="LEFT"){ if(staircaseDirection=="LEFT"){
player->SetY(player->GetY()-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult()); player->SetY(player->GetY()-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult());
player->movementVelocity.y=-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+=-"Player.StaircaseClimbSpd"_F*fElapsedTime*player->GetMoveSpdMult();
} }
newAimingAngle-=vf2d{1,0}; newAimingAngle-=vf2d{1,0};
@ -535,7 +516,7 @@ void AiL::HandleUserInput(float fElapsedTime){
moveAmt*=controllerAmt; moveAmt*=controllerAmt;
}else animationSpd=1.f; }else animationSpd=1.f;
player->SetY(player->GetY()-fElapsedTime*moveAmt*player->GetMoveSpdMult()); player->SetY(player->GetY()-fElapsedTime*moveAmt*player->GetMoveSpdMult());
player->movementVelocity.y=-moveAmt*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+=-moveAmt*fElapsedTime*player->GetMoveSpdMult();
newAimingAngle-=vf2d{0,1}; newAimingAngle-=vf2d{0,1};
@ -554,7 +535,7 @@ void AiL::HandleUserInput(float fElapsedTime){
moveAmt*=controllerAmt; moveAmt*=controllerAmt;
}else animationSpd=1.f; }else animationSpd=1.f;
player->SetY(player->GetY()+fElapsedTime*moveAmt*player->GetMoveSpdMult()); player->SetY(player->GetY()+fElapsedTime*moveAmt*player->GetMoveSpdMult());
player->movementVelocity.y=moveAmt*fElapsedTime*player->GetMoveSpdMult(); player->movementVelocity.y+=moveAmt*fElapsedTime*player->GetMoveSpdMult();
newAimingAngle+=vf2d{0,1}; newAimingAngle+=vf2d{0,1};
@ -566,25 +547,52 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
} }
if(heldDownMovementKey){ if(heldDownMovementKey){
if(abs(player->movementVelocity.x)>abs(player->movementVelocity.y)){ //Greater Horizontal movement. if(player->movementVelocity.x!=0.f||player->movementVelocity.y!=0.f){
if(player->movementVelocity.x!=0.f){ if(abs(player->movementVelocity.x)>abs(player->movementVelocity.y)){ //Greater Horizontal movement.
player->SetFacingDirection(player->movementVelocity.x>0?RIGHT:LEFT); if(player->movementVelocity.x!=0.f){
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ player->SetFacingDirection(player->movementVelocity.x>0?RIGHT:LEFT);
player->UpdateWalkingAnimation(player->GetFacingDirection(),animationSpd); player->SetLastReleasedMovementKey(player->GetFacingDirection());
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
player->UpdateWalkingAnimation(player->GetFacingDirection(),animationSpd);
}
}
}else{ //Greater Vertical movement.
if(player->movementVelocity.y!=0.f){
player->SetFacingDirection(player->movementVelocity.y>0?DOWN:UP);
player->SetLastReleasedMovementKey(player->GetFacingDirection());
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
player->UpdateWalkingAnimation(player->GetFacingDirection(),animationSpd);
}
} }
} }
}else{ //Greater Vertical movement. #pragma region Footstep code
if(player->movementVelocity.y!=0.f){ player->footstepTimer+=GetElapsedTime()*animationSpd;
player->SetFacingDirection(player->movementVelocity.y>0?DOWN:UP); if(player->footstepTimer>"Player.Footstep Timer"_F){
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ player->footstepTimer-="Player.Footstep Timer"_F;
player->UpdateWalkingAnimation(player->GetFacingDirection(),animationSpd);
bool inWater=true;
for(const LayerTag&layer:GetCurrentMap().LayerData){
int tileID=layer.tiles[player->GetY()/24][player->GetX()/24]-1;
if(tileID!=-1&&!IsReflectiveTile(GetTileSheet(GetCurrentLevel(),tileID),tileID)){
inWater=false;
break;
}
}
if(inWater){
SoundEffect::PlaySFX("Footstep - Wet",SoundEffect::CENTERED);
}else{
SoundEffect::PlaySFX("Footstep",SoundEffect::CENTERED);
} }
} }
#pragma endregion
}else{ //This means we are holding down movement keys but we aren't actually moving anywhere, so don't.
setIdleAnimation=true;
} }
} }
if(UpReleased()){ if(UpReleased()){
player->SetLastReleasedMovementKey(UP); player->SetLastReleasedMovementKey(UP);
player->movementVelocity.y=0;
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
if(RightHeld()){ if(RightHeld()){
player->UpdateWalkingAnimation(RIGHT); player->UpdateWalkingAnimation(RIGHT);
@ -599,7 +607,6 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
if(RightReleased()){ if(RightReleased()){
player->SetLastReleasedMovementKey(RIGHT); player->SetLastReleasedMovementKey(RIGHT);
player->movementVelocity.x=0;
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
if(UpHeld()){ if(UpHeld()){
player->UpdateWalkingAnimation(UP); player->UpdateWalkingAnimation(UP);
@ -614,7 +621,6 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
if(LeftReleased()){ if(LeftReleased()){
player->SetLastReleasedMovementKey(LEFT); player->SetLastReleasedMovementKey(LEFT);
player->movementVelocity.x=0;
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
if(RightHeld()){ if(RightHeld()){
player->UpdateWalkingAnimation(RIGHT); player->UpdateWalkingAnimation(RIGHT);
@ -629,7 +635,6 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
if(DownReleased()){ if(DownReleased()){
player->SetLastReleasedMovementKey(DOWN); player->SetLastReleasedMovementKey(DOWN);
player->movementVelocity.y=0;
if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){ if(player->GetState()==State::NORMAL||player->GetState()==State::PREP_CAST){
if(RightHeld()){ if(RightHeld()){
player->UpdateWalkingAnimation(RIGHT); player->UpdateWalkingAnimation(RIGHT);
@ -647,29 +652,6 @@ void AiL::HandleUserInput(float fElapsedTime){
setIdleAnimation=false; setIdleAnimation=false;
} }
if(heldDownMovementKey){
player->footstepTimer+=GetElapsedTime()*animationSpd;
if(player->footstepTimer>"Player.Footstep Timer"_F){
player->footstepTimer-="Player.Footstep Timer"_F;
bool inWater=true;
for(const LayerTag&layer:GetCurrentMap().LayerData){
int tileID=layer.tiles[player->GetY()/24][player->GetX()/24]-1;
if(tileID!=-1&&!IsReflectiveTile(GetTileSheet(GetCurrentLevel(),tileID),tileID)){
inWater=false;
break;
}
}
if(inWater){
SoundEffect::PlaySFX("Footstep - Wet",SoundEffect::CENTERED);
}else{
SoundEffect::PlaySFX("Footstep",SoundEffect::CENTERED);
}
}
}
if(setIdleAnimation){ if(setIdleAnimation){
switch(player->GetLastReleasedMovementKey()){ switch(player->GetLastReleasedMovementKey()){
case UP:{ case UP:{
@ -1657,20 +1639,6 @@ void AiL::RenderWorld(float fElapsedTime){
for(std::vector<std::shared_ptr<DamageNumber>>::iterator it=DAMAGENUMBER_LIST.begin();it!=DAMAGENUMBER_LIST.end();++it){ for(std::vector<std::shared_ptr<DamageNumber>>::iterator it=DAMAGENUMBER_LIST.begin();it!=DAMAGENUMBER_LIST.end();++it){
DamageNumber*dn=(*it).get(); DamageNumber*dn=(*it).get();
if(dn->pauseTime>0){
dn->pauseTime-=fElapsedTime;
} else{
dn->lifeTime+=fElapsedTime;
if(dn->lifeTime<=1){
if(dn->lifeTime<DamageNumber::MOVE_UP_TIME){
if(dn->invertedDirection){
dn->pos.y+=dn->riseSpd*fElapsedTime;
}else{
dn->pos.y-=dn->riseSpd*fElapsedTime;
}
}
}
}
#define NumberScalesWithDamage true #define NumberScalesWithDamage true
#define NormalNumber false #define NormalNumber false
@ -1850,6 +1818,11 @@ void AiL::RenderHud(){
DrawShadowStringDecal({0,12},"Button Hold Time: "+std::to_string(Menu::menus[INVENTORY_CONSUMABLES]->buttonHoldTime)); DrawShadowStringDecal({0,12},"Button Hold Time: "+std::to_string(Menu::menus[INVENTORY_CONSUMABLES]->buttonHoldTime));
} }
#endif #endif
Pixel vignetteOverlayColor="Interface.Vignette Color"_Pixel;
const float vignetteTotalDisplayTime="Interface.Vignette Appearance Time"_F+"Interface.Vignette Fadeout Time"_F;
if(vignetteDisplayTime<"Interface.Vignette Fadeout Time"_F)vignetteOverlayColor.a=util::lerp(0,255,vignetteDisplayTime/"Interface.Vignette Fadeout Time"_F);
DrawDecal({0,0},GFX["vignette.png"].Decal(),{1.f,1.f},vignetteOverlayColor);
} }
void AiL::RenderCooldowns(){ void AiL::RenderCooldowns(){
@ -2467,7 +2440,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
return true; return true;
}); });
#pragma endregion #pragma endregion
if(changeMusic==PLAY_LEVEL_MUSIC){ if(changeMusic==PLAY_LEVEL_MUSIC){
#pragma region Audio Preparation (Loading Phase 10) #pragma region Audio Preparation (Loading Phase 10)
LoadingScreen::AddPhase([&](){ LoadingScreen::AddPhase([&](){
@ -2483,7 +2456,6 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
//Until the audio has stopped (by waiting for a set amount of time), we will respect the audio engine's wishes and not proceed. //Until the audio has stopped (by waiting for a set amount of time), we will respect the audio engine's wishes and not proceed.
LoadingScreen::DeferLoad([&](){return audioEngine.playBGMWaitTime==0.f;}); //This is the wait time for the audio engine to finish. LoadingScreen::DeferLoad([&](){return audioEngine.playBGMWaitTime==0.f;}); //This is the wait time for the audio engine to finish.
#pragma region Audio Channel Loading (Count based on Audio::GetPrepareBGMLoopIterations) #pragma region Audio Channel Loading (Count based on Audio::GetPrepareBGMLoopIterations)
for(int i=0;i<Audio::GetPrepareBGMLoopIterations(MAP_DATA[GetCurrentLevel()].bgmSongName);i++){ for(int i=0;i<Audio::GetPrepareBGMLoopIterations(MAP_DATA[GetCurrentLevel()].bgmSongName);i++){
LoadingScreen::AddPhase([&](){ LoadingScreen::AddPhase([&](){
@ -2502,15 +2474,15 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
Audio::UpdateBGMVolume(); Audio::UpdateBGMVolume();
return true; return true;
}); });
LoadingScreen::AddPhase([&](){
STEAMUSERSTATS(
SteamUserStats()->StoreStats();
)
ClearGarbage();
return true;
});
} }
LoadingScreen::AddPhase([&](){
STEAMUSERSTATS(
SteamUserStats()->StoreStats();
)
ClearGarbage();
return true;
});
} }
bool AiL::IsUpperForegroundTile(int tileID){ bool AiL::IsUpperForegroundTile(int tileID){
@ -2926,27 +2898,32 @@ bool AiL::IsReflectiveTile(TilesheetData tileSheet,int tileID){
} }
bool AiL::OnUserDestroy(){ bool AiL::OnUserDestroy(){
#ifndef __EMSCRIPTEN__ gameEnd=true;
SteamAPI_Shutdown(); if(!savingFile){
#endif #ifndef __EMSCRIPTEN__
GFX.Reset(); SteamAPI_Shutdown();
for(auto&[key,value]:MAP_DATA){ #endif
if(MAP_DATA[key].optimizedTile!=nullptr){ GFX.Reset();
delete MAP_DATA[key].optimizedTile; for(auto&[key,value]:MAP_DATA){
if(MAP_DATA[key].optimizedTile!=nullptr){
delete MAP_DATA[key].optimizedTile;
}
} }
for(auto&[key,value]:MAP_TILESETS){
delete value.tileset;
}
for(auto&[key,value]:GameState::states){
delete value;
}
Menu::CleanupAllMenus();
for(auto&[key,value]:MonsterData::imgs){
delete value;
}
BACKDROP_DATA.clear();
return true;
}else{
return false; //Something is preventing us from quitting. We wait patiently...
} }
for(auto&[key,value]:MAP_TILESETS){
delete value.tileset;
}
for(auto&[key,value]:GameState::states){
delete value;
}
Menu::CleanupAllMenus();
for(auto&[key,value]:MonsterData::imgs){
delete value;
}
BACKDROP_DATA.clear();
return true;
} }
void AiL::InitializeLevels(){ void AiL::InitializeLevels(){
@ -3937,4 +3914,73 @@ void AiL::ActivateActionSetForAllControllers(InputActionSetHandle_t actionSetHan
const float AiL::GetEncounterDuration()const{ const float AiL::GetEncounterDuration()const{
return encounterDuration; return encounterDuration;
}
void AiL::ShowDamageVignetteOverlay(){
vignetteDisplayTime="Interface.Vignette Appearance Time"_F+"Interface.Vignette Fadeout Time"_F;
}
void AiL::GlobalGameUpdates(){
levelTime+=GetElapsedTime();
SteamAPI_RunCallbacks();
STEAMINPUT(
ActivateActionSetForAllControllers(Input::ingameControlsHandle);
Input::UpdateSteamInput();
)
#pragma region Damage Numbers update
for(std::vector<std::shared_ptr<DamageNumber>>::iterator it=DAMAGENUMBER_LIST.begin();it!=DAMAGENUMBER_LIST.end();++it){
DamageNumber*dn=(*it).get();
if(dn->pauseTime>0){
dn->pauseTime-=GetElapsedTime();
} else{
dn->lifeTime+=GetElapsedTime();
if(dn->lifeTime<=1){
if(dn->lifeTime<DamageNumber::MOVE_UP_TIME){
if(dn->invertedDirection){
dn->pos.y+=dn->riseSpd*GetElapsedTime();
}else{
dn->pos.y-=dn->riseSpd*GetElapsedTime();
}
}
}
}
}
#pragma endregion
if(GetMousePos()!=lastMousePos){
lastMouseMovement=0.f;
lastMousePos=GetMousePos();
}else lastMouseMovement+=GetElapsedTime();
vignetteDisplayTime=std::max(0.f,vignetteDisplayTime-GetElapsedTime());
if(Audio::Engine().IsPlaying(GetPlayer()->cooldownSoundInstance)){
Audio::Engine().SetVolume(GetPlayer()->cooldownSoundInstance,Audio::GetCalculatedSFXVolume("Audio.Casting Sound Volume"_F/100.f));
}
if(!GamePaused()){
GameState::STATE->OnUserUpdate(this);
}else{
ClearTimedOutGarbage();
}
}
const bool AiL::QuitRequested()const{
return gameEnd;
}
void AiL::SetQuitAllowed(bool quittingAllowed){
savingFile=!quittingAllowed;
}
const bool AiL::PreviousStageCompleted()const{
return prevStageCompleted;
}
void AiL::SetCompletedStageFlag(){
prevStageCompleted=true;
}
void AiL::ResetCompletedStageFlag(){
prevStageCompleted=false;
} }

@ -182,6 +182,9 @@ private:
float saveGameDisplayTime=0.f; float saveGameDisplayTime=0.f;
float loadingWaitTime=0.f; float loadingWaitTime=0.f;
bool displayHud=true; bool displayHud=true;
float vignetteDisplayTime=0.f;
bool savingFile=false;
bool prevStageCompleted=false;
void ValidateGameStatus(); void ValidateGameStatus();
void _PrepareLevel(MapName map,MusicChange changeMusic); void _PrepareLevel(MapName map,MusicChange changeMusic);
@ -319,6 +322,13 @@ public:
void UpdateMonsters(); void UpdateMonsters();
void ActivateActionSetForAllControllers(InputActionSetHandle_t actionSetHandle); void ActivateActionSetForAllControllers(InputActionSetHandle_t actionSetHandle);
const float GetEncounterDuration()const; const float GetEncounterDuration()const;
void ShowDamageVignetteOverlay();
void GlobalGameUpdates();
const bool QuitRequested()const;
void SetQuitAllowed(bool quittingAllowed); //Locks the game from quitting during sensitive operations such as file saving/loading.
const bool PreviousStageCompleted()const;
void SetCompletedStageFlag();
void ResetCompletedStageFlag();
struct TileGroupData{ struct TileGroupData{
vi2d tilePos; vi2d tilePos;

@ -121,11 +121,11 @@ void Menu::InitializeConsumableCraftingWindow(){
#pragma region Inventory Description #pragma region Inventory Description
float inventoryDescriptionWidth=consumableCraftingWindow->pos.x+consumableCraftingWindow->size.x-26-224; float inventoryDescriptionWidth=consumableCraftingWindow->pos.x+consumableCraftingWindow->size.x-26-224;
consumableCraftingWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,consumableCraftingWindow->size.y-44}},"",1,ComponentAttr::LEFT_ALIGN|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; consumableCraftingWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,consumableCraftingWindow->size.y-44}},"",1,ComponentAttr::LEFT_ALIGN|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
auto itemIconButton=consumableCraftingWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-24,30},{48,48}},Item::BLANK,DO_NOTHING,"","",IconButtonAttr::NOT_SELECTABLE)END; auto itemIconButton=consumableCraftingWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-18,30},{36,36}},Item::BLANK,DO_NOTHING,"","",IconButtonAttr::NOT_SELECTABLE)END;
itemIconButton->SetShowQuantity(false); itemIconButton->SetShowQuantity(false);
itemIconButton->SetIconScale({2.f,2.f}); itemIconButton->SetIconScale({1.5f,1.5f});
consumableCraftingWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,84},{inventoryDescriptionWidth-6,12}},"",0.75f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END; consumableCraftingWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,72},{inventoryDescriptionWidth-6,12}},"",0.75f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
consumableCraftingWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,94},{inventoryDescriptionWidth-6,consumableCraftingWindow->size.y-44-66}},"",0.5f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END; consumableCraftingWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,82},{inventoryDescriptionWidth-6,consumableCraftingWindow->size.y-44-66}},"",0.5f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
#pragma endregion #pragma endregion
#pragma region Money Display #pragma region Money Display

@ -138,10 +138,11 @@ void Menu::InitializeInventoryWindow(){
#pragma region Inventory Description #pragma region Inventory Description
float inventoryDescriptionWidth=inventoryWindow->pos.x+inventoryWindow->size.x-26-224; float inventoryDescriptionWidth=inventoryWindow->pos.x+inventoryWindow->size.x-26-224;
inventoryWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,inventoryWindow->size.y-44}},"",1,LEFT_ALIGN|OUTLINE|BACKGROUND)END; inventoryWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,inventoryWindow->size.y-44}},"",1,LEFT_ALIGN|OUTLINE|BACKGROUND)END;
inventoryWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-24,30},{48,48}},Item::BLANK,DO_NOTHING,"Item Name Label","Item Description Label",IconButtonAttr::NOT_SELECTABLE)END auto itemIcon=inventoryWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-18,30},{36,36}},Item::BLANK,DO_NOTHING,"Item Name Label","Item Description Label",IconButtonAttr::NOT_SELECTABLE)END;
->SetIconScale({2.f,2.f}); itemIcon->SetIconScale({1.5f,1.5f});
inventoryWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,84},{inventoryDescriptionWidth-6,12}},"",0.75f,LEFT_ALIGN|SHADOW)END; itemIcon->SetCompactDescriptions(false);
inventoryWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,94},{inventoryDescriptionWidth-6,inventoryWindow->size.y-44-66}},"",0.5f,LEFT_ALIGN|SHADOW)END; inventoryWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,72},{inventoryDescriptionWidth-6,12}},"",0.75f,LEFT_ALIGN|SHADOW)END;
inventoryWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,82},{inventoryDescriptionWidth-6,inventoryWindow->size.y-44-66}},"",0.5f,LEFT_ALIGN|SHADOW)END;
#pragma endregion #pragma endregion
#pragma region Money Display #pragma region Money Display

@ -490,7 +490,8 @@ std::vector<std::weak_ptr<Item>>Inventory::GetItem(IT it){
uint32_t Inventory::GetItemCount(IT it){ uint32_t Inventory::GetItemCount(IT it){
if(!_inventory.count(it)){ if(!_inventory.count(it)){
return 0; return 0;
}else{ }else
{
auto inventory=_inventory.equal_range(it); auto inventory=_inventory.equal_range(it);
return std::accumulate(inventory.first,inventory.second,0,[](int val,std::pair<IT,std::shared_ptr<Item>>it){return val+(*it.second).Amt();}); return std::accumulate(inventory.first,inventory.second,0,[](int val,std::pair<IT,std::shared_ptr<Item>>it){return val+(*it.second).Amt();});
} }

@ -198,9 +198,11 @@ void Menu::InitializeMerchantWindow(){
return true; return true;
} }
if(item.lock()->GetItem().lock()->CanBeSold()){ if(item.lock()->GetItem().lock()->CanBeSold()){
int inventoryQty=item.lock()->GetItem().lock()->IsEquippable()?1:Inventory::GetItemCount(item.lock()->GetItem().lock()->ActualName());
Component<ItemMenuLabel>(SELL_ITEM,"Item Sell Header")->SetItem(item.lock()->GetItem()); Component<ItemMenuLabel>(SELL_ITEM,"Item Sell Header")->SetItem(item.lock()->GetItem());
Component<MenuLabel>(SELL_ITEM,"Price per item Amount Label")->SetLabel(std::to_string(item.lock()->GetItem().lock()->SellValue())); Component<MenuLabel>(SELL_ITEM,"Price per item Amount Label")->SetLabel(std::to_string(item.lock()->GetItem().lock()->SellValue()));
Component<MenuLabel>(SELL_ITEM,"Amount to sell Amount Label")->SetLabel(std::format("{}/{}",1,Inventory::GetItemCount(item.lock()->GetItem().lock()->ActualName()))); Component<MenuLabel>(SELL_ITEM,"Amount to sell Amount Label")->SetLabel(std::format("{}/{}",1,inventoryQty));
Component<MenuLabel>(SELL_ITEM,"Total Price Amount Label")->SetLabel(std::to_string(item.lock()->GetItem().lock()->SellValue())); Component<MenuLabel>(SELL_ITEM,"Total Price Amount Label")->SetLabel(std::to_string(item.lock()->GetItem().lock()->SellValue()));
Merchant&merchant=Merchant::GetCurrentTravelingMerchant(); Merchant&merchant=Merchant::GetCurrentTravelingMerchant();
bool canPurchase=merchant.CanSellItem(item.lock()->GetItem(),1); bool canPurchase=merchant.CanSellItem(item.lock()->GetItem(),1);
@ -213,7 +215,6 @@ void Menu::InitializeMerchantWindow(){
Component<MenuComponent>(SELL_ITEM,"Decrease sell amount Button")->SetGrayedOut(true); Component<MenuComponent>(SELL_ITEM,"Decrease sell amount Button")->SetGrayedOut(true);
int qty=1; int qty=1;
int inventoryQty=Inventory::GetItemCount(item.lock()->GetItem().lock()->ActualName());
if(qty>=inventoryQty){ if(qty>=inventoryQty){
Component<MenuComponent>(SELL_ITEM,"Increase sell amount Button")->SetGrayedOut(true); Component<MenuComponent>(SELL_ITEM,"Increase sell amount Button")->SetGrayedOut(true);
}else{ }else{
@ -256,10 +257,11 @@ void Menu::InitializeMerchantWindow(){
#pragma region Inventory Description #pragma region Inventory Description
float inventoryDescriptionWidth=merchantWindow->pos.x+merchantWindow->size.x-26-224; float inventoryDescriptionWidth=merchantWindow->pos.x+merchantWindow->size.x-26-224;
merchantWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,merchantWindow->size.y-44}},"",1,ComponentAttr::LEFT_ALIGN|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; merchantWindow->ADD("Item Description Outline",MenuLabel)(geom2d::rect<float>{{224,28},{inventoryDescriptionWidth,merchantWindow->size.y-44}},"",1,ComponentAttr::LEFT_ALIGN|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
merchantWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-24,30},{48,48}},Item::BLANK,DO_NOTHING,"Item Name Label","Item Description Label",IconButtonAttr::NOT_SELECTABLE)END auto itemIcon=merchantWindow->ADD("Item Icon",MenuItemItemButton)(geom2d::rect<float>{{226+inventoryDescriptionWidth/2-18,30},{36,36}},Item::BLANK,DO_NOTHING,"Item Name Label","Item Description Label",IconButtonAttr::NOT_SELECTABLE)END;
->SetIconScale({2.f,2.f}); itemIcon->SetIconScale({1.5f,1.5f});
merchantWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,84},{inventoryDescriptionWidth-6,12}},"",0.75f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END; itemIcon->SetCompactDescriptions(false);
merchantWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,94},{inventoryDescriptionWidth-6,merchantWindow->size.y-44-66}},"",0.5f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END; merchantWindow->ADD("Item Name Label",MenuLabel)(geom2d::rect<float>{{226,72},{inventoryDescriptionWidth-6,12}},"",0.75f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
merchantWindow->ADD("Item Description Label",MenuLabel)(geom2d::rect<float>{{226,82},{inventoryDescriptionWidth-6,merchantWindow->size.y-44-66}},"",0.5f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
#pragma endregion #pragma endregion
#pragma region Money Display #pragma region Money Display

@ -165,7 +165,7 @@ bool Monster::_SetX(float x,const bool monsterInvoked){
} }
#pragma endregion #pragma endregion
#pragma region lambdas #pragma region lambdas
auto NoEnemyCollisionWithTile=[&](){return (isBoss&&insideArenaBounds)||!geom2d::overlaps(newPos,collision);}; auto NoEnemyCollisionWithTile=[&](){return (isBoss&&insideArenaBounds)||(!isBoss&&!geom2d::overlaps(newPos,collision));};
#pragma endregion #pragma endregion
collision.pos+=tilePos; collision.pos+=tilePos;
if(NoEnemyCollisionWithTile()){ if(NoEnemyCollisionWithTile()){
@ -204,7 +204,7 @@ bool Monster::_SetY(float y,const bool monsterInvoked){
} }
#pragma endregion #pragma endregion
#pragma region lambdas #pragma region lambdas
auto NoEnemyCollisionWithTile=[&](){return (isBoss&&insideArenaBounds)||!geom2d::overlaps(newPos,collision);}; auto NoEnemyCollisionWithTile=[&](){return (isBoss&&insideArenaBounds)||(!isBoss&&!geom2d::overlaps(newPos,collision));};
#pragma endregion #pragma endregion
collision.pos+=tilePos; collision.pos+=tilePos;
if(NoEnemyCollisionWithTile()){ if(NoEnemyCollisionWithTile()){

@ -74,7 +74,7 @@ void Menu::InitializePauseWindow(){
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Summary"); Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Summary");
Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel(""); Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel("");
if(game->GetCurrentMapName()=="HUB")Unlock::UnlockCurrentMap(); //Special unlock for the hub area when leaving. if(game->GetCurrentMapName()=="HUB"&&game->PreviousStageCompleted())Unlock::UnlockCurrentMap(); //Special unlock for the hub area when leaving.
if(Unlock::IsUnlocked("STORY_1_1")){ if(Unlock::IsUnlocked("STORY_1_1")){
Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->Enable(); Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->Enable();

@ -745,6 +745,9 @@ bool Player::Hurt(int damage,bool onUpperLevel,float z){
SoundEffect::PlaySFX("Player Hit",SoundEffect::CENTERED); SoundEffect::PlaySFX("Player Hit",SoundEffect::CENTERED);
} }
if(Menu::IsMenuOpen()&&mod_dmg>0)Menu::CloseAllMenus(); if(Menu::IsMenuOpen()&&mod_dmg>0)Menu::CloseAllMenus();
if(mod_dmg>0)game->ShowDamageVignetteOverlay();
hp=std::max(0,hp-int(mod_dmg)); hp=std::max(0,hp-int(mod_dmg));
if(hp==0&&GameState::STATE!=GameState::states[States::DEATH])GameState::ChangeState(States::DEATH); if(hp==0&&GameState::STATE!=GameState::states[States::DEATH])GameState::ChangeState(States::DEATH);
@ -1062,6 +1065,7 @@ void Player::CheckEndZoneCollision(){
endZoneStandTime+=game->GetElapsedTime(); endZoneStandTime+=game->GetElapsedTime();
if(endZoneStandTime>="Player.End Zone Wait Time"_F){ if(endZoneStandTime>="Player.End Zone Wait Time"_F){
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Completed"); Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Completed");
game->SetCompletedStageFlag();
Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel("Complete Bonus\n +10% XP"); Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel("Complete Bonus\n +10% XP");
if(Unlock::IsUnlocked("STORY_1_1")){ if(Unlock::IsUnlocked("STORY_1_1")){
Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->Enable(); Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->Enable();

@ -82,6 +82,8 @@ const size_t SaveFile::GetOnlineSaveFileCount(){
const void SaveFile::SaveGame(){ const void SaveFile::SaveGame(){
game->saveGameDisplayTime=6.f; game->saveGameDisplayTime=6.f;
game->SetQuitAllowed(false);
std::filesystem::create_directories("save_file_path"_S); std::filesystem::create_directories("save_file_path"_S);
utils::datafile saveFile; utils::datafile saveFile;
@ -222,6 +224,7 @@ const void SaveFile::SaveGame(){
}else{ }else{
LOG("WARNING! Could not save metadata to server!"); LOG("WARNING! Could not save metadata to server!");
} }
game->SetQuitAllowed(true);
}; };
Server_SaveMetadataFile(RetryResponse); Server_SaveMetadataFile(RetryResponse);
}else{ }else{
@ -271,38 +274,54 @@ const void SaveFile::SaveGame(){
std::string systemContents=systemFileContents.str(); std::string systemContents=systemFileContents.str();
emscripten_idb_async_store("/assets",("save_file_path"_S+"system.conf").c_str(),systemContents.data(),systemContents.length(),0,[](void*arg){ emscripten_idb_async_store("/assets",("save_file_path"_S+"system.conf").c_str(),systemContents.data(),systemContents.length(),0,[](void*arg){
LOG("Successfully saved system file!"); LOG("Successfully saved system file!");
game->SetQuitAllowed(true);
},[](void*arg){ },[](void*arg){
LOG("Failed to save system file!"); LOG("Failed to save system file!");
game->SetQuitAllowed(true);
}); });
systemfile.close(); systemfile.close();
#else
game->SetQuitAllowed(true);
#endif #endif
} }
#define HASH_VERIFICATION_REQUIRED true
void SaveFile::LoadFile(){ void SaveFile::LoadFile(){
utils::datafile loadFile; utils::datafile loadFile;
std::string loadFilename="save_file_path"_S+std::format("save.{:04}",saveFileID); std::string loadFilename="save_file_path"_S+std::format("save.{:04}",saveFileID);
if(std::filesystem::exists(loadFilename)){ if(std::filesystem::exists(loadFilename)){
utils::datafile::Read(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); utils::datafile::Read(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID));
if(!loadFile.HasProperty("Hash")){ if(HASH_VERIFICATION_REQUIRED){
LOG(std::format("WARNING! Filehash for file {} does not exist!","save_file_path"_S+std::format("save.{:04}",saveFileID))); if(!loadFile.HasProperty("Hash")){
return; LOG(std::format("WARNING! Filehash for file {} does not exist!","save_file_path"_S+std::format("save.{:04}",saveFileID)));
}
if(loadFile.HasProperty("Hash")){
std::string expectedFileHash=loadFile["Hash"].GetString();
loadFile["Hash"].SetString("");
utils::datafile::Write(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID));
std::string fileHash=util::GetHash("save_file_path"_S+std::format("save.{:04}",saveFileID));
if(expectedFileHash!=fileHash){
LOG(std::format("WARNING! Filehash for file {} was not identified as proper! Will not load this file!","save_file_path"_S+std::format("save.{:04}",saveFileID)));
return; return;
} }
if(loadFile.HasProperty("Hash")){
std::string expectedFileHash=loadFile["Hash"].GetString();
loadFile["Hash"].SetString("");
utils::datafile::Write(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID));
auto trim = [](std::string& s)
{
s.erase(0, s.find_first_not_of(" \t\n\r\f\v"));
s.erase(s.find_last_not_of(" \t\n\r\f\v") + 1);
};
std::string fileHash=util::GetHash("save_file_path"_S+std::format("save.{:04}",saveFileID));
trim(fileHash); //It's possible the expected file hash has a space at the end/beginning that gets stripped out. We want to trim and match that string.
if(expectedFileHash!=fileHash){
LOG(std::format("WARNING! Filehash for file {} was not identified as proper! Will not load this file!","save_file_path"_S+std::format("save.{:04}",saveFileID)));
return;
}
loadFile["Hash"].SetString(expectedFileHash); //Now write the hash back into the file since we tampered with it. loadFile["Hash"].SetString(expectedFileHash); //Now write the hash back into the file since we tampered with it.
utils::datafile::Write(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); utils::datafile::Write(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID));
}
} }
game->ResetGame(); game->ResetGame();
for(auto&[key,data]:loadFile["Items"].GetOrderedKeys()){ for(auto&[key,data]:loadFile["Items"].GetOrderedKeys()){
@ -398,6 +417,8 @@ void SaveFile::LoadFile(){
const void SaveFile::LoadGame(){ const void SaveFile::LoadGame(){
std::filesystem::create_directories("save_file_path"_S); std::filesystem::create_directories("save_file_path"_S);
game->SetQuitAllowed(false);
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
if(onlineMode){ if(onlineMode){
@ -410,6 +431,7 @@ const void SaveFile::LoadGame(){
}else{ }else{
LOG("WARNING! Could not load save file!"); LOG("WARNING! Could not load save file!");
} }
game->SetQuitAllowed(true);
}); });
}else{ }else{
emscripten_idb_async_load("/assets",("save_file_path"_S+std::format("save.{:04}",saveFileID)).c_str(),0,[](void*arg,void*data,int length){ emscripten_idb_async_load("/assets",("save_file_path"_S+std::format("save.{:04}",saveFileID)).c_str(),0,[](void*arg,void*data,int length){
@ -422,12 +444,15 @@ const void SaveFile::LoadGame(){
} }
file.close(); file.close();
LoadFile(); LoadFile();
game->SetQuitAllowed(true);
},[](void*arg){ },[](void*arg){
LOG("Failed to load Save File "<<saveFileID<<"!"); LOG("Failed to load Save File "<<saveFileID<<"!");
game->SetQuitAllowed(true);
}); });
} }
#else #else
LoadFile(); LoadFile();
game->SetQuitAllowed(true);
#endif #endif
} }

@ -349,10 +349,10 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,std::string strat
} }
if(m.I(A::PHASE_REPEAT_COUNT)>=5){ if(m.I(A::PHASE_REPEAT_COUNT)>=5){
m.I(A::PHASE_REPEAT_COUNT)=0; m.I(A::PHASE_REPEAT_COUNT)=0;
float jumpAngle=util::angleTo(m.GetPos(),game->GetCurrentMapData().MapSize*game->GetCurrentMapData().tilewidth/2); //We jump towards the center to keep the player from constantly dealing with a stuck boss. float jumpAngle=util::angleTo(m.GetPos(),game->GetCurrentMapData().MapSize/2*game->GetCurrentMapData().tilewidth); //We jump towards the center to keep the player from constantly dealing with a stuck boss.
float jumpDistance=ConfigFloat("Phase4.JumpDistance")/100*game->GetCurrentMapData().tilewidth; float jumpDistance=ConfigFloat("Phase4.JumpDistance")/100*game->GetCurrentMapData().tilewidth;
float jumpSpd=jumpDistance/ConfigFloat("Phase4.JumpDuration"); float jumpSpd=jumpDistance/ConfigFloat("Phase4.JumpDuration");
float lockedInTargetTime=jumpDistance/ConfigFloat("Phase4.JumpLockinTargetTime"); float lockedInTargetTime=ConfigFloat("Phase4.JumpLockinTargetTime");
StartJump(ConfigFloat("Phase4.JumpDuration"),m.GetPos()+vf2d{cos(jumpAngle)*jumpDistance,sin(jumpAngle)*jumpDistance},0,jumpSpd,lockedInTargetTime); StartJump(ConfigFloat("Phase4.JumpDuration"),m.GetPos()+vf2d{cos(jumpAngle)*jumpDistance,sin(jumpAngle)*jumpDistance},0,jumpSpd,lockedInTargetTime);
}else }else
if(m.I(A::PATTERN_REPEAT_COUNT)<5&&m.F(A::SHOOT_TIMER)==0){ if(m.I(A::PATTERN_REPEAT_COUNT)<5&&m.F(A::SHOOT_TIMER)==0){

@ -61,6 +61,8 @@ void State_OverworldMap::OnStateChange(GameState*prevState){
Component<MenuComponent>(MenuType::PAUSE,"Return to Camp Button")->SetGrayedOut(false); Component<MenuComponent>(MenuType::PAUSE,"Return to Camp Button")->SetGrayedOut(false);
SaveFile::SaveGame(); SaveFile::SaveGame();
game->ResetCompletedStageFlag();
if(Unlock::IsUnlocked("STORY_1_3")){ if(Unlock::IsUnlocked("STORY_1_3")){
game->SetChapter(2); game->SetChapter(2);
} }

@ -12,7 +12,19 @@ Upon completion of a stage in time trial mode if the player beat their previous
Settings menu doesn't scroll back up properly while the scrollbar does? Settings menu doesn't scroll back up properly while the scrollbar does?
Merchant descriptions have no newlines. Merchant descriptions have no newlines.
Amount to sell shows total of that accessory you have instead of 1/1.
Bosses can get stuck outside the arena?
Traveling merchants of different colors/looks.
Steel Weapons appear in the demo for Chapter 2.
Update display counters on the overworld map.
Pressing movement keys that negate each other shouldn't cause a walking animation to occur.
============================================ ============================================
Consider a "killed by player" / "marked by player" flag for monsters to determine if a player gets credit for a monster kill (for achievements) Consider a "killed by player" / "marked by player" flag for monsters to determine if a player gets credit for a monster kill (for achievements)
Make another actions config file for the main build (The app # is different) Make another actions config file for the main build (The app # is different)
Review other games and see what the screen does when the player takes damage. Vignette effect
Look at green slime remains count for crafting.
Textured ground tiles

@ -37,9 +37,9 @@ All rights reserved.
#pragma endregion #pragma endregion
#pragma once #pragma once
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 0 #define VERSION_MINOR 1
#define VERSION_PATCH 0 #define VERSION_PATCH 0
#define VERSION_BUILD 8601 #define VERSION_BUILD 8666
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

@ -104,7 +104,7 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4821,4822,4823,4824,4825,4826,4827,4828, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4821,4822,4823,4824,4825,4826,4827,4828,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4861,4862,4863,4864,4865,4866,4867,4868, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4861,4862,4863,4864,4865,4866,4867,4868,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4901,4902,4903,4904,4905,4906,4907,4908, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,1048,4901,4902,4903,4904,4905,4906,4907,4908,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,995,1046,1046,1046,1046,1046,1046,1046,1046, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,995,79,79,79,79,79,79,79,79,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1462,1462,1462,1462,1462,1462,1462,1462,1046,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,

@ -603,7 +603,6 @@
</object> </object>
<object id="8" name="Camp" type="StagePlate" x="416" y="416" width="20" height="24"> <object id="8" name="Camp" type="StagePlate" x="416" y="416" width="20" height="24">
<properties> <properties>
<property name="Connection 1 - North" type="object" value="20"/>
<property name="Map" propertytype="Level" value="HUB"/> <property name="Map" propertytype="Level" value="HUB"/>
<property name="Type" propertytype="StageType" value="HUB"/> <property name="Type" propertytype="StageType" value="HUB"/>
<property name="Unlock Condition" propertytype="Level" value="STORY_1_1"/> <property name="Unlock Condition" propertytype="Level" value="STORY_1_1"/>

@ -21,6 +21,15 @@ Interface
# The text color of input keys. # The text color of input keys.
InputButtonTextCol = 175,199,191,255 InputButtonTextCol = 175,199,191,255
# Vignette Appearance Wait Duration
Vignette Appearance Time = 0.4s
# Vignette Fade out Duration
Vignette Fadeout Time = 0.2s
# Damage Vignette Overlay Color
Vignette Color = 218, 44, 143, 255
# The original health display color. # The original health display color.
HUD Health Display Color = 255,255,255,255 HUD Health Display Color = 255,255,255,255

@ -84,6 +84,7 @@ Images
GFX_Unlock = unlock.png GFX_Unlock = unlock.png
GFX_SwordSlash = swordslash.png GFX_SwordSlash = swordslash.png
GFX_CustomFont = font.png GFX_CustomFont = font.png
GFX_Vignette = vignette.png
# Ability Icons # Ability Icons
GFX_Warrior_BattleCry_Icon = Ability Icons/battlecry.png GFX_Warrior_BattleCry_Icon = Ability Icons/battlecry.png

@ -102,7 +102,7 @@ ItemDatabase
Bandages Bandages
{ {
ItemScript = RestoreDuringCast ItemScript = RestoreDuringCast
Description = Restores 30% health points over 6 seconds. The effect can be interrupted. Description = Restores 30% health points casting for 6 seconds. The effect can be interrupted.
HP % Restore = 5%,0.9,6 HP % Restore = 5%,0.9,6
Cast Time = 6.0 Cast Time = 6.0
Cooldown Time = 5.0 Cooldown Time = 5.0

@ -406,7 +406,7 @@ Equipment
Crafting Crafting
{ {
# When this crafting recipe is available. # When this crafting recipe is available.
AvailableChapter = 2 AvailableChapter = 6
Item[0] = Slimy Bun,1 Item[0] = Slimy Bun,1
Gold = 500 Gold = 500
@ -519,7 +519,7 @@ Equipment
Crafting Crafting
{ {
# When this crafting recipe is available. # When this crafting recipe is available.
AvailableChapter = 2 AvailableChapter = 6
Item[0] = Slimy Bun,1 Item[0] = Slimy Bun,1
Gold = 500 Gold = 500
@ -632,7 +632,7 @@ Equipment
Crafting Crafting
{ {
# When this crafting recipe is available. # When this crafting recipe is available.
AvailableChapter = 2 AvailableChapter = 6
Item[0] = Slimy Bun,1 Item[0] = Slimy Bun,1
Gold = 500 Gold = 500

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -4951,6 +4951,7 @@ namespace olc
if(requestClear||garbageCollector.size()>5000){ if(requestClear||garbageCollector.size()>5000){
std::for_each(garbageCollector.begin(),garbageCollector.end(),[&](auto&key){ std::for_each(garbageCollector.begin(),garbageCollector.end(),[&](auto&key){
delete key.second.decal->sprite;
delete key.second.decal; delete key.second.decal;
}); });
garbageCollector.clear(); garbageCollector.clear();

@ -176,6 +176,7 @@ std::string util::GetHash(std::string fileName){
} }
hashIndex++; hashIndex++;
} }
file.close();
return hash; return hash;
} }
#pragma endregion #pragma endregion

@ -1 +1,2 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
cmake -DCMAKE_BUILD_TYPE=Debug -D_DEBUG=1 .;make -j 8 cmake -DCMAKE_BUILD_TYPE=Debug -D_DEBUG=1 .;make -j 8

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
rm -R bin rm -R bin
mkdir bin mkdir bin
mkdir bin/assets mkdir bin/assets

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
rm -R release rm -R release
mkdir release mkdir release
mkdir release/assets mkdir release/assets

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
clear clear
rm -R bin rm -R bin
mkdir bin mkdir bin

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
clear clear
mkdir bin mkdir bin

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
clear clear
rm -R bin rm -R bin
mkdir bin mkdir bin

@ -1,3 +1,4 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
clear clear
source ./emsdk/emsdk_env.sh source ./emsdk/emsdk_env.sh
emcmake cmake -DCMAKE_BUILD_TYPE=Debug -D_DEBUG=1 . emcmake cmake -DCMAKE_BUILD_TYPE=Debug -D_DEBUG=1 .

@ -1 +1,2 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
emrun bin/index.html emrun bin/index.html

@ -1,3 +1,4 @@
cp AdventuresInLestoria/play.html ./bin git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
cp "Adventures in Lestoria/play.html" ./bin
source ./emsdk/emsdk_env.sh source ./emsdk/emsdk_env.sh
emrun --no_browser bin/play.html emrun --no_browser bin/play.html

@ -1 +1,2 @@
git update-index --assume-unchanged "Adventures in Lestoria/packkey.cpp"
cmake -DCMAKE_BUILD_TYPE=Release .;make -j 8 cmake -DCMAKE_BUILD_TYPE=Release .;make -j 8

Loading…
Cancel
Save