1#pragma once
2
3#include <basis/seadTypes.h>
4
5#include "System/ByamlSave.h"
6
7class WorldList;
8
9class GameProgressData : public ByamlSave {
10public:
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
87private:
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