From 3e5e78a606946482876b8fd8e01b4b15d564098c Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Tue, 2 Jan 2024 02:15:39 -0600 Subject: [PATCH] Added load file information on load screen. metadata file no longer counts towards file count. Added loadout data to the save file. --- Crawler/C++ Header File (OLC-3).zip | Bin 6851 -> 6861 bytes Crawler/C++ Source File (OLC-3).zip | Bin 6853 -> 6863 bytes Crawler/Crawler.cpp | 3 + Crawler/Crawler.h | 1 + Crawler/LoadFileButton.h | 51 ++++++++++++++-- Crawler/LoadGameWindow.cpp | 8 ++- Crawler/SaveFile.cpp | 88 +++++++++++++++++----------- Crawler/Version.h | 2 +- Crawler/assets/saves/metadata.dat | 2 + 9 files changed, 112 insertions(+), 43 deletions(-) diff --git a/Crawler/C++ Header File (OLC-3).zip b/Crawler/C++ Header File (OLC-3).zip index 55ab0c3048f6320cedc738658c2877fd6e71dd58..06791b1aa9891b5ec8fdc231190faf444b987fde 100644 GIT binary patch delta 1099 zcmV-R1ho6ZHO)1DP)h>@6aWAK2ml=hB3NQ4(Qe!W0012a000sI003-hV`Xl0WnXk< zZE$R1bY(7Rja9*J<2DdIM}YoeuzN`ss?#PtwM9``rfn`{NhPUdeJT`*cG%jYLDF$^ z>HqXEJEY~(M%C)Jrowu1@S) z-J#>&I+V>d$l4<`Px{5120h}a*A4|t(5NhIFtU$uiQadAqlWP9rcqmIMxN5$e^NrQ zgEqfeuiAxFCtfH)w@0pT)Z*xk8yu;PK>S~7S7&N}M}Q}c_Xg6zph2hG{Z{s_IhFMm z32U^VSL2X)v$5ymgpvlgiyTAd_ai8z3Vz<+H(Ti$`t>=9XT3o!FqiY8P$cE7&*d0V z8;j7dar7j8i(y(CWZ&Vo^kO2Ht#%TQiJ)Up7muybaIBowD|hgna_T(0ldW&PINBNI zJJR@nrt6RGXYDBmF{d1OITep7BY^9Ql@D}6CNN%tm=nm#YRTwqE?{2f6T#RPW? z!RWXaCF55gQjVSPks5AWo@&C_LB{(Nd^VCTLdYDTAtJRmlnX#3qzy zc}f>#GD3KS1oA)%5l4KU=K1?Xua1d&_LphGm>|t`oRcF|vBap1WWpyjtl|iBL-mkh zo?P*YWE2-bz7WhOWy@p;%E`|)9zr8b(nUHW9IpRe6|54IAy(BsTYK!YMHn^hv+DxxH_i^1)1e^ zMv9DhYw5#0QciBLV3hj@lQ0?@vmgZ46%8E*B3NQ4(Qe!W001460~%2Q43kwF RKLKcyl^Q4p^cesE008ZA{MP^g delta 1064 zcmV+@1lRk`HN!O@6aWAK2mn{1n^&}p$jj0L000pO000t`9~u>ZjaAKV<2DdJ zM}Xd8uzN`sTBn;_iuNSSv`s*kRFX>8r$UkFM6D$n5*=?YeV@K%Kgvq%?4m^t*rrI% zd_OZHKkmBXu_>t2kF{wju1nqa+V`$M`QG?ImuVb*zP<9jzutd*&-Ws;d+F-OCrdX! zefgO_(Y?^d zbWI=7p|($Cy5ZmKEj6a9H+5OK1cC1rou-}cn%Y`j(XKPkb%lX_DlC39vTV2JP`8g% znzpK4R8KCb(e@Wd>C1%Pv+5lhIM>g`__%pxS3(Ol``*GTTY$BHLnt21vs)TH@V(Yp zm=<8M?rDq6F2gx`TYX0j@a49s8yMv%-TWsdfE`TtXYX7)v+9)>EU5P2`bN$7-nh|` z+Jw~qrFLTAZ)OLsKSDHvF%UA8A>{YooO7D-%cpe z^$_RQ+oI8qp&OrnL_C=-ynvR|rlCl+?VXlmM$`3xe(}8r?OF`74C%JQw035KOJl62 zqYwlR?qb^p3&+a!W@8VoQ(il--|5n|p6~6t+I3{-nyx*zU*ErKP)jaJrgL>43Pu=b zBE91?Hlyj9)RIw@W^2J0OGV2xo-rXQOlFu(l;G1`r9xhRd6}(fL`yt}Qyz1* z9uVhTB@S#3w2-n;C?4f;C@9NCmP$rW*o@044*81BCV&Sdu{)M1-;>KQj^7KtI0|*_ z&t=k-fo3>=joA?@StF}pk#d5@k?%np+ylcnxR4o(I0nSNGUy4#IvA5m_FIlkSfp9F z3KvY$<-favD!~>MCdvg{A&y{$%%@Uul`BSzG@T7*OD67k#N@9Or_TO4<&p(}P~m`# z6mSd6sqnpNF8N>_PZSd(&lFFSD^&R&)_`S**xBHJaGDHiVNxpAE~~R)C_q5>ONM#W zIl;;5+zOo`60Sw+d>_zZqPjTAq=YSEzF5UJO6Mm zbnYT?M`1CZC*gKW16Gf7vDY2mZ_IwW_PvkejfWHAc8b1MElb;$W2I?6A0002QISH@; diff --git a/Crawler/C++ Source File (OLC-3).zip b/Crawler/C++ Source File (OLC-3).zip index 8334de3ef1363077f3bdb4524e3ceb80b01b753c..30df570cfa513d473220bd35381c5ae4d869f366 100644 GIT binary patch delta 1063 zcmV+?1laq@6aWAK2mlZUB3P~R5~kM!000k>7af1WZsRr(Jx754VX%8i z7OK-GJ+(zqS)y$&WJx8dWPK_Wi+0%BqCwJebLs!|FFT~=*lE$C25eIt&b&8oM#GOg z)2_EI7`axuhe9o7Z)F_aeu|^v0j{ee`|AECj{bQ6iK95m^zPND^|OP!ukXHv&)Pok zTi|M~`xbt%;opCnyPpt4ZAMGI{n2|d*(vLcdfGdW+V&mn5lHo5_1-LH*m+WYYhGcc z&DJJxQ0^JD3IBTUV5>W|Qp?r{NaCn95_ZyTm2esN; zeW$#a1@E+#?mJKEn-RQcWj$Iaje2Q^$JL45Qg`UMw+?@0b1ky=2Fz%%A=p8i->g^dLaGxll%U%q*Eec$^u`U2 z)J7owFSV;PwIje2#(M+lV9=n`%l%gNu056Y771&#pjYdVc)PLZ;)Ie0w~HJ@=Jz8g zr3!xD-nV~S=^6UO;!W^FuJCm|>ObA$sG7i>uxy6U>6jK& zECS+$iqeBk5G{o|WrAi+kusN;q8qyDC^Elm!cuHH^&B4^Rr;jJcqq5d@}Hl?SmoVGlGT{Cg-WFaHD@P7;I= zX+Xvhs1}+l7DwZT(;yrz1!1hI1+B^(tnz;&N`ov@^v#39RT;8Hkt(+EQN0YI00}(K z2<~H@OPsP^t<(#`QMF85o=2< zKmYJvF#aO(qp%(3NxIoUz_K_Otu*+4E`4s>F delta 1060 zcmV+<1l#-1HN`a>P)h>@6aWAK2mqr4eOHleh`h}M0009A000z|9~u{bjaAKV<2DdJ zM}Xd8uzN`sTBn;_iuNQ+v`s*kRFX>8r$VvlM6D$n5*=?YeV@K%Kgvq%?4m^t*rrI% zd_OZHKkmBnu_>w3kF{wjsn@#gweMYj^1bnaF0&;1e0$}4f4%?sp6^9w_tMpmPnK?e z`tmb<#^22iWvxz3t0Pl?>29(%joT@7Rrj{5ANJNEm2E|PB(GcQ&AwafVdkN3%kG6X zrfd3u4z+zE(+&S-Z>cd=y{XrwOAz>8*=gG8uBoln7416nTvr&_r_$m_Bg=Mc4t4uT zYtvS>i|WY*HQN5-D1DjGdse+e1Lyj=93MBY?AFji&Azv=%9db%?GVZb^X!&J4}7mR z7N!MQtb5ubv&(Rf-d5jH1N?eh)(wnuly3f$62K0o`?GhhomutD3l>y+aDAiZdvDz6 zNNqyu|5Cd+Q9A-WAm1BEMWY9mS??R&+VZum*C1@Lf~eAhc)9IQ#TiOEgq>*|l;2J$ z)%6hP*4whtj-eZWpF}*FExdr1)25+Fwe6jjV@A{UfPV442klx6vJC0A!nAf~f=gqp zrlSx94(?*x1`Ef^^=4xau2Wt+uixplYdzoFb+zlr&NW?oY`?yL)u0w!lFVl6J`{{F z&P8^|V;0kNMQXt)%JP-q^M#^Cmc&d*3ey;~sSW^W*m(6I&M6|$jIOPdf zs{wJwRqDWIKnp1kh2l|>go5%y43lVUgl+ z8P1uc%YSzTRe~)jOjHQAL>$2iSxlwks!)vPSr!jwOD67k#N@A(WX}E>6_N#jP~m`# z6mSd6nee@7A^Bh&PZblQ$Q94hD^&R&)_`S**m!V%I7WP+gUjiF??a##gKAeO z@H!69IyV^VNqk0Oe8(N}aWgtV^08a88R}g`i_!C;|8vv5oty7pB=GOZn%HmFoqxC& zI(Lz{qp%#$lW@DG0jtNk*y|4OH)cOw``*X##>0tly!8G7vk3(E6%C^UeOHleh`h}M e000A%4H{Dd{{xd^8a@GAlc5?Y2I?6A00006@(OzZ diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index 69757b6d..9188f7d0 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -2555,6 +2555,9 @@ void Crawler::ResetGame(){ player->ResetAccumulatedXP(); player->totalXPEarned=0; player->SetMoney(100U); + for(int i=0;iClearLoadoutItem(i); + } Unlock::unlocks.clear(); Unlock::Initialize(); State_OverworldMap::SetStageMarker("Stage I-I"); diff --git a/Crawler/Crawler.h b/Crawler/Crawler.h index 1c107785..71947fe0 100644 --- a/Crawler/Crawler.h +++ b/Crawler/Crawler.h @@ -58,6 +58,7 @@ class Crawler : public olc::PixelGameEngine { friend class GameState; friend class State_GameRun; + friend class SaveFile; friend class sig::Animation; std::unique_ptrplayer; public: diff --git a/Crawler/LoadFileButton.h b/Crawler/LoadFileButton.h index d620da7b..c0582e1e 100644 --- a/Crawler/LoadFileButton.h +++ b/Crawler/LoadFileButton.h @@ -38,24 +38,63 @@ All rights reserved. #pragma once #include "MenuComponent.h" +#include "ClassInfo.h" + +INCLUDE_ANIMATION_DATA class LoadFileButton:public MenuComponent{ - double playTime; - int chapter; - int level; - std::string className; - std::string saveFileName; - int saveFileID; + double playTime=-1; + int chapter=-1; + int level=-1; + std::string className=""; + std::string saveFileName=""; + int saveFileID=-1; + float animationTime=0; public: inline LoadFileButton(geom2d::rectrect,const utils::datafile&metadata,const int saveFileID,MenuFunc onClick,ButtonAttr attributes) :MenuComponent(rect,"",onClick,attributes),playTime(metadata.GetReal(0U)),chapter(metadata.GetInt(1U)),level(metadata.GetInt(2U)),className(metadata.GetString(3U)),saveFileName(metadata.GetString(4U)),saveFileID(saveFileID){ showDefaultLabel=false; } + inline void Update(Crawler*game)override{ + MenuComponent::Update(game); + if(playTime==-1){ + grayedOut=true; + } + animationTime+=game->GetElapsedTime(); + } + inline void DrawDecal(ViewPort&window,bool focused){ MenuComponent::DrawDecal(window,focused); + if(playTime==-1){ + window.DrawShadowStringPropDecal(rect.pos+vf2d{2,2},"UNKNOWN"); + }else{ + window.DrawShadowStringPropDecal(rect.pos+vf2d{2,2},saveFileName); + + const std::mapclassAnimations={ + {Warrior::name,Warrior::walk_s}, + {Ranger::name,Ranger::walk_s}, + {Wizard::name,Wizard::walk_s}, + {Thief::name,Thief::walk_s}, + {Trapper::name,Trapper::walk_s}, + {Witch::name,Witch::walk_s}, + }; + + std::string chapterText=std::format("Ch.{}",chapter); + vf2d chapterTextSize=game->GetTextSize(chapterText); + window.DrawShadowStringDecal(rect.pos+vf2d{rect.size.x-chapterTextSize.x-2,2},chapterText); + + const Animate2D::Frame&frame=ANIMATION_DATA[classAnimations.at(className)].GetFrame(animationTime); + geom2d::rectsprRect=frame.GetSourceRect(); + window.DrawPartialDecal(rect.pos+vf2d{rect.size.x-26,rect.size.y-36},sprRect.size,frame.GetSourceImage()->Decal(),sprRect.pos,sprRect.size); + std::string levelClassText=std::format("Lv{} {}",level,className); + vf2d levelClassTextSize=game->GetTextSize(levelClassText); + window.DrawShadowStringDecal(rect.pos+vf2d{rect.size.x-levelClassTextSize.x-2,rect.size.y-10},levelClassText); + + window.DrawShadowStringDecal(rect.pos+vf2d{2,12},util::timerStr(playTime)); + } } inline const int&getSaveFileID()const{ diff --git a/Crawler/LoadGameWindow.cpp b/Crawler/LoadGameWindow.cpp index ccbe1c05..200ba9a2 100644 --- a/Crawler/LoadGameWindow.cpp +++ b/Crawler/LoadGameWindow.cpp @@ -40,7 +40,9 @@ All rights reserved. #include "ScrollableWindowComponent.h" void Menu::InitializeLoadGameWindow(){ - Menu*loadGameWindow=CreateMenu(LOAD_GAME,CENTERED,vi2d{96,96}); - - loadGameWindow->ADD("Game Files List",ScrollableWindowComponent)({{-8,0},{112,104}})END; + Menu*loadGameWindow=CreateMenu(LOAD_GAME,CENTERED,vi2d{96,120}); + + loadGameWindow->ADD("Game Files Label",MenuLabel)({{-8,-12},{112,12}},"Load Game",1.0f,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; + loadGameWindow->ADD("Game Files List",ScrollableWindowComponent)({{-8,4},{112,116}})END; + loadGameWindow->ADD("Go Back Button",MenuComponent)({{24,124},{48,12}},"Back",[](MenuFuncData menu){Menu::CloseMenu();return true;})END; } \ No newline at end of file diff --git a/Crawler/SaveFile.cpp b/Crawler/SaveFile.cpp index 7dbfd6d8..e407dcca 100644 --- a/Crawler/SaveFile.cpp +++ b/Crawler/SaveFile.cpp @@ -53,15 +53,18 @@ std::string SaveFile::saveFileName=""; const size_t SaveFile::GetSaveFileCount(){ size_t count=0; - for(auto&path:std::filesystem::directory_iterator("save_file_path"_S)){ - if(path.is_regular_file()){ - count++; + if(std::filesystem::exists("save_file_path"_S)){ + for(auto&path:std::filesystem::directory_iterator("save_file_path"_S)){ + if(path.is_regular_file()&&path.path()!="metadata.dat"){ + count++; + } } } return count; } const void SaveFile::SaveGame(){ + std::filesystem::create_directories("save_file_path"_S); utils::datafile saveFile; utils::datafile::INITIAL_SETUP_COMPLETE=false; for(size_t itemCount=0;auto&[cat,items]:Inventory::sortedInv){ @@ -70,6 +73,11 @@ const void SaveFile::SaveGame(){ 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))); + 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); } @@ -94,7 +102,9 @@ const void SaveFile::SaveGame(){ utils::datafile::Write(saveFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); utils::datafile metadata; - utils::datafile::Read(metadata,"save_file_path"_S+"metadata.dat"); + if(std::filesystem::exists("save_file_path"_S+"metadata.dat")){ + utils::datafile::Read(metadata,"save_file_path"_S+"metadata.dat"); + } metadata.GetProperty(std::format("save{}",saveFileID)).SetReal(game->GetRuntime(),0U); metadata.GetProperty(std::format("save{}",saveFileID)).SetInt(game->GetCurrentChapter(),1U); metadata.GetProperty(std::format("save{}",saveFileID)).SetInt(game->GetPlayer()->Level(),2U); @@ -106,40 +116,52 @@ const void SaveFile::SaveGame(){ } const void SaveFile::LoadGame(){ + std::filesystem::create_directories("save_file_path"_S); utils::datafile loadFile; - utils::datafile::Read(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); - game->ResetGame(); - for(auto&[key,data]:loadFile["Items"].GetOrderedKeys()){ - std::weak_ptrnewItem=Inventory::AddItem(data["Item Name"].GetString(),data["Amt"].GetInt()); - newItem.lock()->enhancementLevel=data["Enhancement Level"].GetInt(); - if(loadFile.GetProperty(std::format("Items.{}",key)).HasProperty("Attributes")){ - for(auto&[attr,data]:loadFile.GetProperty(std::format("Items.{}.Attributes",key)).GetOrderedKeys()){ - newItem.lock()->randomizedStats.A(attr)=data.GetReal(); + if(std::filesystem::exists("save_file_path"_S+std::format("save.{:04}",saveFileID))){ + utils::datafile::Read(loadFile,"save_file_path"_S+std::format("save.{:04}",saveFileID)); + game->ResetGame(); + for(auto&[key,data]:loadFile["Items"].GetOrderedKeys()){ + std::weak_ptrnewItem=Inventory::AddItem(data["Item Name"].GetString(),data["Amt"].GetInt()); + newItem.lock()->enhancementLevel=data["Enhancement Level"].GetInt(); + if(loadFile.GetProperty(std::format("Items.{}",key)).HasProperty("Attributes")){ + for(auto&[attr,data]:loadFile.GetProperty(std::format("Items.{}.Attributes",key)).GetOrderedKeys()){ + newItem.lock()->randomizedStats.A(attr)=data.GetReal(); + } + } + if(data.HasProperty("LoadoutSlot")){ + uint8_t loadoutSlot=data["LoadoutSlot"].GetInt(); + if(loadoutSlot!=255){ + game->SetLoadoutItem(loadoutSlot,newItem.lock()->ActualName()); + } + } + + EquipSlot slot=EquipSlot(loadFile.GetProperty(std::format("Items.{}.Equip Slot",key)).GetInt()); + if(slot!=EquipSlot::NONE){ //This should be equipped somewhere! + Inventory::EquipItem(newItem,slot); } } - EquipSlot slot=EquipSlot(loadFile.GetProperty(std::format("Items.{}.Equip Slot",key)).GetInt()); - if(slot!=EquipSlot::NONE){ //This should be equipped somewhere! - Inventory::EquipItem(newItem,slot); + game->ChangePlayerClass(classutils::StringToClass(loadFile["Player"]["Class"].GetString())); + game->GetPlayer()->level=loadFile["Player"]["Level"].GetInt(); + game->GetPlayer()->SetMoney(loadFile["Player"]["Money"].GetInt()); + game->GetPlayer()->currentLevelXP=loadFile["Player"]["Current EXP"].GetInt(); + game->GetPlayer()->totalXPEarned=loadFile["Player"]["Total EXP"].GetInt(); + for(auto&[key,data]:loadFile["Player"]["Base Stats"].GetOrderedKeys()){ + game->GetPlayer()->SetBaseStat(key,data.GetReal()); } + for(const auto&[key,data]:loadFile["Unlocks"].GetOrderedKeys()){ + Unlock::UnlockArea(key); + } + State_OverworldMap::SetStageMarker(loadFile["Overworld Map Location"].GetString()); + game->SetChapter(loadFile["Chapter"].GetInt()); + SaveFile::SetSaveFileName(loadFile["Save Name"].GetString()); + game->SetRuntime(loadFile["Game Time"].GetReal()); + game->GetPlayer()->RecalculateEquipStats(); + + GameState::ChangeState(States::OVERWORLD_MAP,0.5f); + }else{ + std::cout<ChangePlayerClass(classutils::StringToClass(loadFile["Player"]["Class"].GetString())); - game->GetPlayer()->level=loadFile["Player"]["Level"].GetInt(); - game->GetPlayer()->SetMoney(loadFile["Player"]["Money"].GetInt()); - game->GetPlayer()->currentLevelXP=loadFile["Player"]["Current EXP"].GetInt(); - game->GetPlayer()->totalXPEarned=loadFile["Player"]["Total EXP"].GetInt(); - for(auto&[key,data]:loadFile["Player"]["Base Stats"].GetOrderedKeys()){ - game->GetPlayer()->SetBaseStat(key,data.GetReal()); - } - for(const auto&[key,data]:loadFile["Unlocks"].GetOrderedKeys()){ - Unlock::UnlockArea(key); - } - State_OverworldMap::SetStageMarker(loadFile["Overworld Map Location"].GetString()); - game->SetChapter(loadFile["Chapter"].GetInt()); - SaveFile::SetSaveFileName(loadFile["Save Name"].GetString()); - game->SetRuntime(loadFile["Game Time"].GetReal()); - game->GetPlayer()->RecalculateEquipStats(); - - GameState::ChangeState(States::OVERWORLD_MAP,0.5f); } const std::string_view SaveFile::GetSaveFileName(){ diff --git a/Crawler/Version.h b/Crawler/Version.h index 961073f9..e1ea9208 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 1 -#define VERSION_BUILD 5262 +#define VERSION_BUILD 5279 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/saves/metadata.dat b/Crawler/assets/saves/metadata.dat index e69de29b..6f66f2c1 100644 --- a/Crawler/assets/saves/metadata.dat +++ b/Crawler/assets/saves/metadata.dat @@ -0,0 +1,2 @@ +save0 = 534.977882, 1, 2, Ranger, Sig +save1 = 107.824620, 1, 1, Wizard, WIZ