| 1 | #pragma once |
| 2 | |
| 3 | #include <basis/seadTypes.h> |
| 4 | |
| 5 | #include "System/ByamlSave.h" |
| 6 | |
| 7 | class WorldList; |
| 8 | |
| 9 | class GameProgressData : public ByamlSave { |
| 10 | public: |
| 11 | enum class FirstBranch : u32 { |
| 12 | None = 0, |
| 13 | Forest = 1, |
| 14 | Lake = 2, |
| 15 | }; |
| 16 | |
| 17 | enum class SecondBranch : u32 { |
| 18 | None = 0, |
| 19 | Sea = 3, |
| 20 | Snow = 4, |
| 21 | }; |
| 22 | |
| 23 | enum class HomeStatus : s32 { |
| 24 | None = 0, |
| 25 | ActivatedHome = 1, |
| 26 | LaunchedHome = 2, |
| 27 | FoundKoopa = 3, |
| 28 | CrashedHome = 4, |
| 29 | RepairedHome = 5, |
| 30 | BossAttackedHome = 6, |
| 31 | RepairedHomeByCrashedBoss = 7, |
| 32 | }; |
| 33 | |
| 34 | enum class WaterfallWorldProgress : s32 { |
| 35 | None = 0, |
| 36 | GotFirstMoon = 1, |
| 37 | TalkedCapNearHome = 2, |
| 38 | }; |
| 39 | |
| 40 | void write(al::ByamlWriter* writer) override; |
| 41 | void read(const al::ByamlIter& iter) override; |
| 42 | |
| 43 | GameProgressData(const WorldList* worldList); |
| 44 | void init(); |
| 45 | void updateList(); |
| 46 | void checkAndChangeCorrectStatus(s32 worldId, s32 nextScenarioNo); |
| 47 | bool isFindKoopa() const; |
| 48 | bool isBossAttackedHome() const; |
| 49 | bool isActivateHome() const; |
| 50 | void activateHome(); |
| 51 | bool isLaunchHome() const; |
| 52 | void launchHome(); |
| 53 | void findKoopa(); |
| 54 | bool isCrashHome() const; |
| 55 | void crashHome(); |
| 56 | bool isRepairHome() const; |
| 57 | void repairHome(); |
| 58 | void bossAttackHome(); |
| 59 | bool isRepairHomeByCrashedBoss() const; |
| 60 | void repairHomeByCrashedBoss(); |
| 61 | s32 getHomeLevel() const; |
| 62 | void upHomeLevel(); |
| 63 | s32 getUnlockWorldNum() const; |
| 64 | bool isUnlockWorld(s32 idx) const; |
| 65 | s32 getWorldIdForWorldMap(s32 idx) const; |
| 66 | s32 calcNextLockedWorldNumForWorldMap() const; |
| 67 | s32 calcNextLockedWorldIdForWorldMap(s32 idx) const; |
| 68 | bool isUnlockFirstForest() const; |
| 69 | bool isUnlockFirstSea() const; |
| 70 | s32 getWorldIdForWorldWarpHole(s32 idx) const; |
| 71 | s32 getWorldIdForShineList(s32 idx) const; |
| 72 | s32 calcWorldNumForShineList() const; |
| 73 | bool isAlreadyGoWorld(s32 idx) const; |
| 74 | void unlockNextWorld(s32 idx); |
| 75 | void unlockForest(); |
| 76 | void unlockLake(); |
| 77 | void unlockSnow(); |
| 78 | void unlockSea(); |
| 79 | void unlockNormalWorld(); |
| 80 | bool isFirstTimeGoWorld(s32 idx) const; |
| 81 | void setAlreadyGoWorld(s32 idx); |
| 82 | bool isTalkedCapNearHomeInWaterfall() const; |
| 83 | void talkCapNearHomeInWaterfall(); |
| 84 | void initList(); |
| 85 | s32 calcWorldIdByOrderUnlock(s32 idx) const; |
| 86 | |
| 87 | private: |
| 88 | s32* mWorldIdForWorldMap = nullptr; |
| 89 | s32* mWorldIdForWorldWarpHole = nullptr; |
| 90 | s32* mWorldIdForShineList = nullptr; |
| 91 | bool* mIsUnlockWorld = nullptr; |
| 92 | s32 mUnlockWorldNum = 1; |
| 93 | FirstBranch mUnlockWorldStatusFirstBranch = FirstBranch::None; |
| 94 | SecondBranch mUnlockWorldStatusSecondBranch = SecondBranch::None; |
| 95 | HomeStatus mHomeStatus = HomeStatus::None; |
| 96 | s32 mHomeLevel = 0; |
| 97 | const WorldList* mWorldList = nullptr; |
| 98 | bool* mIsFirstTimeWorld = nullptr; |
| 99 | WaterfallWorldProgress mWaterfallWorldProgress = WaterfallWorldProgress::None; |
| 100 | }; |
| 101 | |