diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 2e6b63d9..3dc8b302 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -3778,12 +3778,13 @@ void AiL::ResetGame(bool changeToMainMenu){ game->ClearLoadoutItem(i); } Unlock::Initialize(); - State_OverworldMap::SetStageMarker("Story I"); + State_OverworldMap::SetStageMarker("Player.Starting Location"_S); State_OverworldMap::UpdateCurrentConnectionPoint(*State_OverworldMap::currentConnectionPoint); State_OverworldMap::ResetConnectionPoints(); SetChapter(1); SaveFile::SetSaveFileName(""); Tutorial::Initialize(); + minimap.EraseChunkData(); } void AiL::OnRequestCompleted(const std::string_view receivedData)const{ diff --git a/Adventures in Lestoria/Minimap.cpp b/Adventures in Lestoria/Minimap.cpp index 3e459ff7..a2eaedb7 100644 --- a/Adventures in Lestoria/Minimap.cpp +++ b/Adventures in Lestoria/Minimap.cpp @@ -55,8 +55,6 @@ void Minimap::Initialize(){ } void Minimap::Reset(){ - loadedChunks.clear(); - if(minimap.Sprite()==nullptr)minimap.Create(1,1); if(cover.Sprite()==nullptr)cover.Create(1,1); @@ -128,48 +126,63 @@ void Minimap::Reset(){ game->SetDrawTarget(nullptr); minimap.Decal()->Update(); + + #pragma region Load all minimap chunks already explored + for(auto&chunk:loadedChunks[game->GetCurrentMapName()]){ + vi2d chunkPos={stoi(chunk.substr(0,chunk.find('_'))),stoi(chunk.substr(chunk.find('_')+1))}; + UpdateChunk(game->GetCurrentMapName(),chunkPos); + } + #pragma endregion } void Minimap::Update(){ } -void Minimap::UpdateChunk(const vi2d chunkPos){ - if(!loadedChunks.count(std::format("{}_{}",chunkPos.x,chunkPos.y))){ - loadedChunks.insert(std::format("{}_{}",chunkPos.x,chunkPos.y)); - - vi2d centerChunkPos=chunkPos*"Minimap.Chunk Size"_I; +void Minimap::UpdateChunk(const MapName map,const vi2d chunkPos){ + loadedChunks[map].insert(std::format("{}_{}",chunkPos.x,chunkPos.y)); + + if(game->GetCurrentMapName()!=map)return; //Don't update the minimap when the map name doesn't match the current map. - vi2d pixelPos=centerChunkPos-"Minimap.Chunk Size"_I*2; - vi2d chunkEndPixelPos=centerChunkPos+"Minimap.Chunk Size"_I*4; + vi2d centerChunkPos=chunkPos*"Minimap.Chunk Size"_I; - //We start twice the distance we are supposed to outwards. - for(int y=pixelPos.y;yGetPixel(x,y).a==255||minimap.Sprite()->GetPixel(x,y).a==0)continue; //Already revealed or invisible anyways. + vi2d pixelPos=centerChunkPos-"Minimap.Chunk Size"_I*2; + vi2d chunkEndPixelPos=centerChunkPos+"Minimap.Chunk Size"_I*4; - vi2d chunk=vi2d{x,y}/"Minimap.Chunk Size"_I; - if(chunk==chunkPos){ - cover.Sprite()->SetPixel(x,y,minimap.Sprite()->GetPixel(x,y)); - }else{ - const vi2d chunkOffset={"Minimap.Chunk Size"_I/2,"Minimap.Chunk Size"_I/2}; + //We start twice the distance we are supposed to outwards. + for(int y=pixelPos.y;yGetPixel(x,y).a==255||minimap.Sprite()->GetPixel(x,y).a==0)continue; //Already revealed or invisible anyways. - const float distance=geom2d::line(centerChunkPos+chunkOffset,vf2d{float(x),float(y)}).length(); - const int alpha=std::clamp(util::lerp(255,0,(distance-"Minimap.Chunk Size"_I)/"Minimap.Chunk Size"_I),0.f,255.f); + vi2d chunk=vi2d{x,y}/"Minimap.Chunk Size"_I; + if(chunk==chunkPos){ + cover.Sprite()->SetPixel(x,y,minimap.Sprite()->GetPixel(x,y)); + }else{ + const vi2d chunkOffset={"Minimap.Chunk Size"_I/2,"Minimap.Chunk Size"_I/2}; + + const float distance=geom2d::line(centerChunkPos+chunkOffset,vf2d{float(x),float(y)}).length(); + const int alpha=std::clamp(util::lerp(255,0,(distance-"Minimap.Chunk Size"_I)/"Minimap.Chunk Size"_I),0.f,255.f); - if(cover.Sprite()->GetPixel(x,y).a>alpha)continue; //The distance was uncovered by another closer chunk, don't need to reveal it here. + if(cover.Sprite()->GetPixel(x,y).a>alpha)continue; //The distance was uncovered by another closer chunk, don't need to reveal it here. - Pixel sourceCol=minimap.Sprite()->GetPixel(x,y); - sourceCol.a=alpha; - cover.Sprite()->SetPixel(x,y,sourceCol); - } + Pixel sourceCol=minimap.Sprite()->GetPixel(x,y); + sourceCol.a=alpha; + cover.Sprite()->SetPixel(x,y,sourceCol); } } - - cover.Decal()->Update(); } + + cover.Decal()->Update(); } void Minimap::Draw(){ - if(!game->InBossEncounter())mapCircleHud.DrawRotatedDecal(vf2d{float("Minimap.Minimap HUD Size"_I),float("Minimap.Minimap HUD Size"_I)}/2,cover.Decal(),0.f,game->GetPlayer()->GetPos()/24,vf2d{0.5f,0.5f}); + if(!game->InBossEncounter())mapCircleHud.DrawRotatedDecal(vf2d{float("Minimap.Minimap HUD Size"_I),float("Minimap.Minimap HUD Size"_I)}/2,cover.Decal(),0.f,game->GetPlayer()->GetPos()/game->GetCurrentMapData().tilewidth,vf2d{0.5f,0.5f}); +} + +void Minimap::EraseChunkData(){ + loadedChunks.clear(); +} + +const std::unordered_map>&Minimap::GetChunkData(){ + return loadedChunks; } \ No newline at end of file diff --git a/Adventures in Lestoria/Minimap.h b/Adventures in Lestoria/Minimap.h index e17e387b..0f9fec52 100644 --- a/Adventures in Lestoria/Minimap.h +++ b/Adventures in Lestoria/Minimap.h @@ -46,10 +46,13 @@ public: void Update(); void Draw(); - void UpdateChunk(const vi2d chunkPos); + void UpdateChunk(const MapName map,const vi2d chunkPos); + void EraseChunkData(); + + const std::unordered_map>&GetChunkData(); private: ViewPort mapCircleHud; Renderable minimap; Renderable cover; - std::unordered_setloadedChunks; + std::unordered_map>loadedChunks; }; \ No newline at end of file diff --git a/Adventures in Lestoria/Player.cpp b/Adventures in Lestoria/Player.cpp index deb2d954..9572c8b8 100644 --- a/Adventures in Lestoria/Player.cpp +++ b/Adventures in Lestoria/Player.cpp @@ -866,7 +866,7 @@ void Player::Moved(){ ForceSetPos({pos.x,float(game->GetCurrentMapData().playerSpawnLocation.y)}); } - game->minimap.UpdateChunk(GetPos()/24/"Minimap.Chunk Size"_I); + game->minimap.UpdateChunk(game->GetCurrentMapName(),GetPos()/24/"Minimap.Chunk Size"_I); } void Player::Spin(float duration,float spinSpd){ diff --git a/Adventures in Lestoria/SaveFile.cpp b/Adventures in Lestoria/SaveFile.cpp index 877e66ce..638debf6 100644 --- a/Adventures in Lestoria/SaveFile.cpp +++ b/Adventures in Lestoria/SaveFile.cpp @@ -86,108 +86,123 @@ const void SaveFile::SaveGame(){ game->SetQuitAllowed(false); std::filesystem::create_directories("save_file_path"_S); - utils::datafile saveFile; utils::datafile saveSystemFile; - utils::datafile::INITIAL_SETUP_COMPLETE=false; - for(size_t itemCount=0;auto&item:Inventory::GetInventory()){ - saveFile["Items"][std::format("Item[{}]",itemCount)]["Amt"].SetInt(item->Amt()); - saveFile["Items"][std::format("Item[{}]",itemCount)]["Enhancement Level"].SetInt(item->EnhancementLevel()); - saveFile["Items"][std::format("Item[{}]",itemCount)]["Item Name"].SetString(item->ActualName()); - saveFile["Items"][std::format("Item[{}]",itemCount)]["Equip Slot"].SetInt(int(Inventory::GetSlotEquippedIn(item))); - saveFile["Items"][std::format("Item[{}]",itemCount)]["Locked"].SetBool(item->IsLocked()); - uint8_t loadoutSlotNumber=255; - for(int i=0;iloadout.size();i++){ - if(item==game->GetLoadoutItem(i)){loadoutSlotNumber=i;break;} + { + utils::datafile saveFile; + utils::datafile::INITIAL_SETUP_COMPLETE=false; + for(size_t itemCount=0;auto&item:Inventory::GetInventory()){ + saveFile["Items"][std::format("Item[{}]",itemCount)]["Amt"].SetInt(item->Amt()); + saveFile["Items"][std::format("Item[{}]",itemCount)]["Enhancement Level"].SetInt(item->EnhancementLevel()); + saveFile["Items"][std::format("Item[{}]",itemCount)]["Item Name"].SetString(item->ActualName()); + saveFile["Items"][std::format("Item[{}]",itemCount)]["Equip Slot"].SetInt(int(Inventory::GetSlotEquippedIn(item))); + saveFile["Items"][std::format("Item[{}]",itemCount)]["Locked"].SetBool(item->IsLocked()); + uint8_t loadoutSlotNumber=255; + for(int i=0;iloadout.size();i++){ + if(item==game->GetLoadoutItem(i)){loadoutSlotNumber=i;break;} + } + saveFile["Items"][std::format("Item[{}]",itemCount)]["LoadoutSlot"].SetInt(loadoutSlotNumber); + for(const auto&[attr,val]:item->RandomStats()){ + saveFile["Items"][std::format("Item[{}]",itemCount)]["Attributes"][std::string(attr.ActualName())].SetReal(val); + } + itemCount++; } - saveFile["Items"][std::format("Item[{}]",itemCount)]["LoadoutSlot"].SetInt(loadoutSlotNumber); - for(const auto&[attr,val]:item->RandomStats()){ - saveFile["Items"][std::format("Item[{}]",itemCount)]["Attributes"][std::string(attr.ActualName())].SetReal(val); + saveFile["Player"]["Class"].SetString(game->GetPlayer()->GetClassName()); + saveFile["Player"]["Level"].SetInt(game->GetPlayer()->Level()); + saveFile["Player"]["Money"].SetInt(game->GetPlayer()->GetMoney()); + saveFile["Player"]["Current EXP"].SetInt(game->GetPlayer()->CurrentXP()); + saveFile["Player"]["Total EXP"].SetInt(game->GetPlayer()->TotalXP()); + for(const auto&[attr,val]:game->GetPlayer()->GetBaseStats()){ + saveFile["Player"]["Base Stats"][std::string(attr.ActualName())].SetReal(val); } - itemCount++; - } - saveFile["Player"]["Class"].SetString(game->GetPlayer()->GetClassName()); - saveFile["Player"]["Level"].SetInt(game->GetPlayer()->Level()); - saveFile["Player"]["Money"].SetInt(game->GetPlayer()->GetMoney()); - saveFile["Player"]["Current EXP"].SetInt(game->GetPlayer()->CurrentXP()); - saveFile["Player"]["Total EXP"].SetInt(game->GetPlayer()->TotalXP()); - for(const auto&[attr,val]:game->GetPlayer()->GetBaseStats()){ - saveFile["Player"]["Base Stats"][std::string(attr.ActualName())].SetReal(val); - } - for(const std::string&unlockName:Unlock::unlocks){ - if(unlockName=="WORLD_MAP")continue; //This is a special exception, because the world map is not an actual stage. - saveFile["Unlocks"][unlockName].SetString("True"); - - auto opt_cp=State_OverworldMap::ConnectionPointFromString(unlockName); - if(!opt_cp.has_value())continue; //Harmless, we probably just deleted the map. - if(opt_cp.value()->Visited()){ - saveFile["Unlocks"][unlockName].SetString("True",1U); - }else{ - saveFile["Unlocks"][unlockName].SetString("False",1U); + for(const std::string&unlockName:Unlock::unlocks){ + if(unlockName=="WORLD_MAP")continue; //This is a special exception, because the world map is not an actual stage. + saveFile["Unlocks"][unlockName].SetString("True"); + + auto opt_cp=State_OverworldMap::ConnectionPointFromString(unlockName); + if(!opt_cp.has_value())continue; //Harmless, we probably just deleted the map. + if(opt_cp.value()->Visited()){ + saveFile["Unlocks"][unlockName].SetString("True",1U); + }else{ + saveFile["Unlocks"][unlockName].SetString("False",1U); + } } - } - for(auto&[taskName,task]:Tutorial::taskList){ - saveFile["Tutorial"][std::to_string(int(taskName))].SetBool(Tutorial::TaskIsComplete(taskName)); - } - - saveFile["Overworld Map Location"].SetString(State_OverworldMap::GetCurrentConnectionPoint().name); - saveFile["Chapter"].SetInt(game->GetCurrentChapter()); - saveFile["Save Name"].SetString(std::string(GetSaveFileName())); - saveFile["Game Time"].SetReal(game->GetRuntime()); - saveFile["TravelingMerchant"].SetString(std::string(Merchant::GetCurrentTravelingMerchant().GetKeyName())); + for(auto&[taskName,task]:Tutorial::taskList){ + saveFile["Tutorial"][std::to_string(int(taskName))].SetBool(Tutorial::TaskIsComplete(taskName)); + } - #pragma region Save Keyboard/Controller mappings - //NOTE: We are shadowing code from InputKeyboardWindow! If at some point the retrival method for getting input displays changes, we likely will be changing the code here as well! - //ALSO NOTE: The menu inputs are saved to the system file while gameplay inputs are per-character and saved to the character settings file! - const int menuRowCount=DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2+1; - const int menuColCount=2; - for(int row=0;row(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Input Displayer",row,col))->GetInput().GetPrimaryKey(KEY).value().GetKeyCode()); - saveSystemFile["Menu Controller Input_"+"Inputs.Menu Input Names"_s[inputID]].SetInt(Component(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Input Displayer",row,col))->GetInput().GetPrimaryKey(CONTROLLER).value().GetKeyCode()); + saveFile["Overworld Map Location"].SetString(State_OverworldMap::GetCurrentConnectionPoint().name); + saveFile["Chapter"].SetInt(game->GetCurrentChapter()); + saveFile["Save Name"].SetString(std::string(GetSaveFileName())); + saveFile["Game Time"].SetReal(game->GetRuntime()); + saveFile["TravelingMerchant"].SetString(std::string(Merchant::GetCurrentTravelingMerchant().GetKeyName())); + + #pragma region Save Keyboard/Controller mappings + //NOTE: We are shadowing code from InputKeyboardWindow! If at some point the retrival method for getting input displays changes, we likely will be changing the code here as well! + //ALSO NOTE: The menu inputs are saved to the system file while gameplay inputs are per-character and saved to the character settings file! + const int menuRowCount=DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2+1; + const int menuColCount=2; + for(int row=0;row(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Input Displayer",row,col))->GetInput().GetPrimaryKey(KEY).value().GetKeyCode()); + saveSystemFile["Menu Controller Input_"+"Inputs.Menu Input Names"_s[inputID]].SetInt(Component(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Input Displayer",row,col))->GetInput().GetPrimaryKey(CONTROLLER).value().GetKeyCode()); + } } - } - const int ingameControlsRowCount=DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2+1; - const int ingameControlsColCount=2; - for(int row=0;row(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Gameplay Input Displayer",row,col))->GetInput().GetPrimaryKey(KEY).value().GetKeyCode()); - saveFile["Gameplay Controller Input_"+"Inputs.Gameplay Input Names"_s[inputID]].SetInt(Component(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Gameplay Input Displayer",row,col))->GetInput().GetPrimaryKey(CONTROLLER).value().GetKeyCode()); + const int ingameControlsRowCount=DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2+1; + const int ingameControlsColCount=2; + for(int row=0;row(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Gameplay Input Displayer",row,col))->GetInput().GetPrimaryKey(KEY).value().GetKeyCode()); + saveFile["Gameplay Controller Input_"+"Inputs.Gameplay Input Names"_s[inputID]].SetInt(Component(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Gameplay Input Displayer",row,col))->GetInput().GetPrimaryKey(CONTROLLER).value().GetKeyCode()); + } + } + #pragma endregion + + #pragma region Save System Settings + saveSystemFile["BGM Level"].SetReal(Audio::GetBGMVolume()); + saveSystemFile["SFX Level"].SetReal(Audio::GetSFXVolume()); + saveSystemFile["Show Max Health"].SetBool(GameSettings::ShowMaxHealth()); + saveSystemFile["Show Max Mana"].SetBool(GameSettings::ShowMaxMana()); + saveSystemFile["Screen Shake"].SetBool(GameSettings::ScreenShakeEnabled()); + saveSystemFile["Controller Rumble"].SetBool(GameSettings::RumbleEnabled()); + saveSystemFile["Terrain Collision Boxes"].SetBool(GameSettings::TerrainCollisionBoxesEnabled()); + saveSystemFile["Keyboard Auto-Aim"].SetBool(GameSettings::KeyboardAutoAimEnabled()); + saveSystemFile["Controller Icons"].SetInt(int(GameSettings::GetIconType())); + saveSystemFile["VSync"].SetBool(GameSettings::VSyncEnabled()); + + saveSystemFile["Window Pos"].SetInt(game->GetActualWindowPos().x,0); + saveSystemFile["Window Pos"].SetInt(game->GetActualWindowPos().y,1); + saveSystemFile["Window Size"].SetInt(game->GetWindowSize().x,0); + saveSystemFile["Window Size"].SetInt(game->GetWindowSize().y,1); + saveSystemFile["Fullscreen"].SetBool(game->IsFullscreen()); + #pragma endregion + + saveFile["Hash"].SetString(""); + + + for(auto&[mapName,chunks]:game->minimap.GetChunkData()){ + size_t chunkInd=0; + for(auto&chunk:chunks){ + saveFile["Minimap"][mapName].SetString(chunk,chunkInd); + chunkInd++; } } - #pragma endregion - - #pragma region Save System Settings - saveSystemFile["BGM Level"].SetReal(Audio::GetBGMVolume()); - saveSystemFile["SFX Level"].SetReal(Audio::GetSFXVolume()); - saveSystemFile["Show Max Health"].SetBool(GameSettings::ShowMaxHealth()); - saveSystemFile["Show Max Mana"].SetBool(GameSettings::ShowMaxMana()); - saveSystemFile["Screen Shake"].SetBool(GameSettings::ScreenShakeEnabled()); - saveSystemFile["Controller Rumble"].SetBool(GameSettings::RumbleEnabled()); - saveSystemFile["Terrain Collision Boxes"].SetBool(GameSettings::TerrainCollisionBoxesEnabled()); - saveSystemFile["Keyboard Auto-Aim"].SetBool(GameSettings::KeyboardAutoAimEnabled()); - saveSystemFile["Controller Icons"].SetInt(int(GameSettings::GetIconType())); - saveSystemFile["VSync"].SetBool(GameSettings::VSyncEnabled()); - - saveSystemFile["Window Pos"].SetInt(game->GetActualWindowPos().x,0); - saveSystemFile["Window Pos"].SetInt(game->GetActualWindowPos().y,1); - saveSystemFile["Window Size"].SetInt(game->GetWindowSize().x,0); - saveSystemFile["Window Size"].SetInt(game->GetWindowSize().y,1); - saveSystemFile["Fullscreen"].SetBool(game->IsFullscreen()); - #pragma endregion - - saveFile["Hash"].SetString(""); - - utils::datafile::Write(saveFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); - - std::string fileHash=util::GetHash("save_file_path"_S+std::format("save.{:04}",saveFileID)); - saveFile["Hash"].SetString(fileHash); + + #pragma region Save save file and prep File Hash + utils::datafile::Write(saveFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); + + std::string fileHash=util::GetHash("save_file_path"_S+std::format("save.{:04}",saveFileID)); + saveFile["Hash"].SetString(fileHash); - utils::datafile::Write(saveFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); //Once the hash has been computed and added, save the file a second time. + utils::datafile::Write(saveFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); //Once the hash has been computed and added, save the file a second time. + #pragma endregion + //WARNING! DO NOT WRITE ANY CODE BELOW HERE!!!!! THE HASH HAS ALREADY BEEN WRITTEN. + //FILES BECOME CORRUPTED IF THE SAVE FILE IS MODIFIED FROM HERE ONWARDS. + } utils::datafile::Write(saveSystemFile,"save_file_path"_S+"system.conf"); utils::datafile metadata; if(onlineMode){ @@ -379,6 +394,15 @@ void SaveFile::LoadFile(){ game->GetPlayer()->RecalculateEquipStats(); if(loadFile.HasProperty("TravelingMerchant"))Merchant::SetTravelingMerchant(loadFile["TravelingMerchant"].GetString()); + if(loadFile.HasProperty("Minimap")){ + for(auto&[key,size]:loadFile["Minimap"].GetKeys()){ + for(const std::string&chunk:loadFile["Minimap"][key].GetValues()){ + vi2d chunkPos={stoi(chunk.substr(0,chunk.find('_'))),stoi(chunk.substr(chunk.find('_')+1))}; + game->minimap.UpdateChunk(key,chunkPos); + } + } + } + #pragma region Load Keyboard/Controller mappings //NOTE: We are shadowing code from InputKeyboardWindow! If at some point the retrival method for getting input displays changes, we likely will be changing the code here as well! const int ingameControlsRowCount=DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2+1; diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 2a0d1723..077ebca4 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_PATCH 0 -#define VERSION_BUILD 8819 +#define VERSION_BUILD 8825 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/config/Player.txt b/Adventures in Lestoria/assets/config/Player.txt index 36975ab5..2f8acdae 100644 --- a/Adventures in Lestoria/assets/config/Player.txt +++ b/Adventures in Lestoria/assets/config/Player.txt @@ -3,6 +3,9 @@ Player BaseMana = 100 MoveSpd = 100 + # Game Map Starting Location + Starting Location = Story I + # Starting base crit rate. Crit Rate = 0% diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index 8cec5a59..175c51a8 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ