/** * @file GameDataFile.h * @brief Holds data for an individual save file. */ #pragma once #include "al/scene/SceneObjHolder.h" #include "container/seadPtrArray.h" #include "prim/seadSafeString.h" #include "types.h" #include "UniqueObjInfo.h" #include "GameProgressData.h" #include "sead/math/seadVector.h" #include "sead/stream/seadStream.h" namespace al { class ActorInitInfo; class PlacementInfo; class PlacementId; } // namespace al class SphinxQuizData; class TimeBalloonSaveData; class WorldWarpTalkData; class VisitStageData; class MoonRockData; class BossSaveData; class AchievementSaveData; class SearchAmiiboDataTable; class NetworkUploadFlag; class SequenceDemoSkipData; class HintPhotoData; class ShopTalkData; class RaceRecord; class PlayerHitPointData; class GameDataHolder; class ShineInfo; class GameDataFile { public: GameDataFile(GameDataHolder*); struct HintInfo { void clear(void); bool isDisableByWorldWarpHole(bool) const; bool isEnableUnlock(int, bool, int, bool) const; bool isHintStatusUnlock(int, int, bool) const; bool isHintStatusUnlockByNpc(void) const; bool isHintStatusUnlockByAmiibo(void) const; bool isEnableNameUnlockByScenario(int, int, bool) const; sead::FixedSafeString<0x80> mStageName; // 0x0 sead::FixedSafeString<0x80> mObjId; // 0x98 sead::FixedSafeString<0x40> mScenarioName; // 0x130 const char *mObjectName; // 0x188 sead::Vector3f mTrans; // 0x190 sead::Vector3f mTransAgain; // 0x19C void *unkPtr1; // 0x1A8 void *unkPtr2; // 0x1B0 void *unkPtr3; // 0x1B8 void *unkPtr4; // 0x1C0 s32 mMainScenarioNo; // 0x1C8 int mWorldIndex; // 0x1CC bool mIsMoonRock; // 0x1D0 bool unkBool1; // 0x1D1 bool mIsAchievement; // 0x1D2 bool mIsGrand; // 0x1D3 bool mIsShopMoon; // 0x1D4 int unkInt; // 0x1D8 int unkInt2; // 0x1DC void *unkPtr6; // 0x1E0 void *unkPtr7; // 0x1E8 int mUniqueID; // 0x1F0 int mHintIdx; // 0x1F4 sead::FixedSafeString<0x20> mOptionalID; // 0x1F8 uint mProcessBitflag; // 0x230 bool unkBool2; // 0x234 bool unkBool3; // 0x235 }; static_assert(sizeof(HintInfo) == 0x238, "size of HintInfo"); void initializeData(void); void tryReadByamlData(uchar const*); void tryFindCoinCollectInfo(char const*,char const*); void tryFindShineIndexByUniqueId(int); void tryFindCoinCollectIndexByUniqueId(int); void buyDefaultItem(void); void unlockAchievementShineName(void); void updateWorldMapIndex(void); void updateWorldWarpIndex(void); void initializeCheckpointTable(void); void generateSaveDataIdForPrepo(void); void resetMapIcon(void); void wearDefault(void); void initializeHintList(void); void initializeCoinCollectList(void); void resetTempData(void); void addPlayTime(int,al::IUseSceneObjHolder const*); void updateSaveTime(void); void updateSaveTimeForDisp(void); void updateSaveInfoForDisp(void); void generateSaveDataIdForPrepoForWrite(void); void resetSaveDataIdForPrepoForWrite(void); void startStage(char const*,int); void checkIsHomeStage(char const*); void setGameClear(void); void startDemoStage(char const*); void changeNextStage(struct ChangeStageInfo const*,int); void returnPrevStage(void); void changeNextStageWithDemoWorldWarp(char const*); void changeNextStageWithWorldWarpHole(char const*); void restartStage(void); void calcNextScenarioNo(void); void tryGetStageNameCurrent(void); void changeWipeType(char const*); void setRestartPointId(al::PlacementId const*); void clearStartId(void); void tryGetRestartPointIdString(void); void endStage(void); void missAndRestartStage(void); void checkGotShine(char const*); void tryGetNextMainScenarioLabel(sead::BufferedSafeString *,sead::BufferedSafeString *); void tryGetNextMainScenarioPos(sead::Vector3f *); void tryFindNextMainScenarioInfo(void); void addPayShine(int); void addPayShineCurrentAll(void); void addKey(int); void addOpenDoorLockNum(int); void tryFindSaveObjS32(al::PlacementId const*); void addSessionMember(struct SessionMusicianType const&); void addCoinCollect(al::PlacementId const*); void useCoinCollect(int); void tryFindExistCoinCollectStageName(int); void payCoinToSphinx(void); void answerCorrectSphinxQuiz(void); void answerCorrectSphinxQuizAll(void); void talkLocalLanguage(void); void saveWorldTravelingStatus(char const*); void startWorldTravelingPeach(void); void setGrowFlowerTime(al::PlacementId const*,ulong); void addGrowFlowerGrowLevel(al::PlacementId const*,uint); void findGrowFlowerPotIdFromSeedId(al::PlacementId const*); void addCoin(int); void addPlayerJumpCount(void); void addPlayerThrowCapCount(void); void readFromStream(sead::ReadStream *,uchar *); void tryReadByamlDataFromStream(sead::ReadStream *,uchar *,int); void writeToStream(sead::WriteStream *,sead::Heap *); void tryWriteByByaml(sead::WriteStream *,sead::Heap *); void calcCheckpointIndexInScenario(int); void changeNextSceneByGotCheckpoint(int); void changeNextSceneByWarp(void); void changeNextSceneByHome(void); void startYukimaruRace(void); void startYukimaruRaceTutorial(void); void startRaceManRace(void); void registerCheckpointTrans(al::PlacementId const*,sead::Vector3f const&); void calcGetCheckpointNum(void); void calcRestHintNum(void); void unlockHint(void); void unlockHintImpl(int); void unlockHintAmiibo(void); void unlockHintAddByMoonRock(void); void calcHintNum(void); void calcHintTrans(int); void findHint(int); void calcHintTransMostEasy(void); void findHintInfoMostEasy(void); void calcHintMoonRockNum(void); void calcHintMoonRockTrans(int); void findHintMoonRock(int); void tryUnlockShineName(int,int); void calcShineIndexTableNameAvailable(int *,int *,int); void calcShineIndexTableNameUnlockable(int *,int *,int); void unlockWorld(int); void noPlayDemoWorldWarp(void); void calcWorldWarpHoleThroughNum(void); void enteredStage(void); //void buyItem(ShopItem::ItemInfo const*,bool); //void tryFindItemList(ShopItem::ItemInfo const*); void calcHaveClothNum(void); void calcHaveCapNum(void); void calcHaveStickerNum(void); void calcHaveGiftNum(void); void buyItemAll(void); void wearCostume(char const*); void wearCap(char const*); void addHackDictionary(char const*); HintInfo* findShine(int worldIndex, int shineIndex); void calcShineNumInOneShine(int,int); void checkAchievementShine(int,int); void winRace(void); void findRaceRecord(char const*); void incrementRaceLoseCount(int); void setUpdateJumpingRopeScoreFlag(void); void setVolleyballBestCount(int); void setUpdateVolleyballScoreFlag(void); void setAmiiboNpcTrans(sead::Vector3f const&); void setTimeBalloonNpcTrans(sead::Vector3f const&); void setPoetterTrans(sead::Vector3f const&); void setShopNpcTrans(sead::Vector3f const&,char const*,int); void setMoonRockTrans(sead::Vector3f const&); void setMiniGameInfo(sead::Vector3f const&,char const*); void calcMiniGameNum(void); void showExplainCheckpointFlag(void); void calcShopNum(void); void talkKakku(void); void talkWorldTravelingPeach(void); void talkCollectBgmNpc(void); void noFirstNetwork(void); void calcIsGetMainShineAll(al::IUseSceneObjHolder const*); void calcIsGetShineAllInWorld(int); void tryFindLinkedShineIndex(al::ActorInitInfo const&,al::IUseSceneObjHolder const*); void tryFindLinkedShineIndex(al::ActorInitInfo const&,int,al::IUseSceneObjHolder const*); void tryFindLinkedShineIndexByLinkName(al::IUseSceneObjHolder const*,al::ActorInitInfo const&,char const*); void calcLinkedShineNum(al::ActorInitInfo const&); void tryFindShineIndex(al::ActorInitInfo const&); void tryFindShineIndex(char const*,char const*); void disableHintById(int); void enableHintById(int); void setHintTrans(int,sead::Vector3f const&); void resetHintTrans(int); void registerShineInfo(ShineInfo const*,sead::Vector3f const&); void calcRestShineInStageWithWorldProgress(char const*); // void calcGetShineNumByObjectNameOrOptionalId(char const*, GameDataFile::CountType); void calcGetShineNumByObjectNameWithWorldId(char const*,int); void calcAllShineNumByObjectNameOrOptionalId(char const*); void calcGetShineNumByStageName(char const*); void tryFindAndInitShineInfoByOptionalId(ShineInfo *,char const*); void tryFindUniqueId(ShineInfo const*); void findUnlockShineNumCurrentWorld(bool *); void trySetCollectedBgm(char const*,char const*); void setGotShine(GameDataFile::HintInfo const*); // void tryWriteByByaml(al::ByamlWriter *); int getTotalShineNum(void); void getCollectBgmByIndex(int); u8 getMainScenarioNoCurrent(void) const; int getStartShineNextIndex(void); void getTokimekiMayorNpcFavorabilityRating(void); void getShopNpcIconNumMax(void); void getShopNpcTrans(int); void getPoetterTrans(void); void getTimeBalloonNpcTrans(void); void getMiniGameNumMax(void); void getRaceLoseCount(int); int getWorldTotalShineNum(int); int getWorldWarpHoleThroughNumMax(void); void getCheckpointObjIdInWorld(int); void getCheckpointNumMaxInWorld(void); void getPlayerThrowCapCount(void); void getPlayerJumpCount(void); void getGrowFlowerGrowLevel(al::PlacementId const*); void getGrowFlowerTime(al::PlacementId const*); void getWorldTravelingStatus(void); void getCoinCollectNum(void); void getKeyNum(void); int getPayShineNum(int); int getShineNum(void); void getAchievement(char const*); void getPlayerStartId(void); void getStageNameNext(void); void getStageNameCurrent(void); void getPlayerHitPointData(void); void getLastUpdateTime(void); void getPlayTimeTotal(void); int getMainScenarioNo(int) const; void getCollectedBgmMaxNum(void); int getScenarioNo(void) const; void getMiniGameName(int); void getWorldTotalShineNumMax(int); void getCheckpointTransInWorld(char const*); void getCoinCollectGotNum(void); void getTotalPayShineNum(void); void getShineNum(int); int getScenarioNo(int worldIndex) const; void getCollectedBgmNum(void); void getScenarioNoPlacement(void); void getMiniGameTrans(int); void getCoinCollectGotNum(int); void getTotalShopShineNum(void); void setGotShine(int); void setMainScenarioNo(int); void setStartShine(ShineInfo const*); void setKidsMode(bool); void setTokimekiMayorNpcFavorabilityRating(int); void setFlagOnTalkMessageInfo(int); void setJangoTrans(sead::Vector3f const&); void setJumpingRopeBestCount(int); void setGrowFlowerTime(al::PlacementId const*,al::PlacementId const*,ulong); void setSaveObjS32(al::PlacementId const*,int); void setStartedObj(al::PlacementId const*); void setGotShine(ShineInfo const*); void setMissRestartInfo(al::PlacementInfo const&); void setCheckpointId(al::PlacementId const*); void setActivateHome(void); void setOriginalHintTrans(int); bool isUnlockedWorld(int) const; bool isAlreadyGoWorld(int) const; bool isFirstTimeNextWorld(void) const; bool isGotShine(ShineInfo const*) const; bool isGotShine(int) const; bool isStartedObj(char const*,char const*) const; bool isAnswerCorrectSphinxQuizAll(int) const; bool isTalkAlreadyLocalLanguage(void) const; bool isBuyItem(char const*,sead::FixedSafeString<64> const*) const; bool isOpenShineName(int,int) const; bool isExistPoetter(void) const; bool isAlreadyShowExplainCheckpointFlag(void) const; bool isFlagOnTalkMessageInfo(int) const; bool isTalkKakku(void) const; bool isNextMainShine(struct QuestInfo const*) const; bool isNextMainShine(int) const; bool isMainShine(int) const; bool isLatestGetMainShine(ShineInfo const*) const; bool isEnableOpenMoonRock(int) const; bool isCollectedBgm(char const*,char const*) const; bool isPlayScenarioCamera(struct QuestInfo const*) const; bool isFirstNetwork(void) const; bool isTalkCollectBgmNpc(void) const; bool isTalkWorldTravelingPeach(void) const; bool isClearWorldMainScenario(int) const; bool isShopSellout(int) const; bool isExistTimeBalloonNpc(void) const; bool isExistJango(void) const; bool isGotShine(int,int) const; bool isExistInHackDictionary(char const*) const; // bool isBuyItem(ShopItem::ItemInfo const*) const; bool isUnlockAchievementShineName(void) const; bool isOpenMoonRock(int) const; bool isEnableUnlockHint(void) const; bool isGotCheckpoint(al::PlacementId *) const; bool isGotCheckpointInWorld(int) const; bool isPlayDemoPlayerDownForBattleKoopaAfter(void) const; bool isUsedGrowFlowerSeed(al::PlacementId const*) const; bool isStartWorldTravelingPeach(void) const; bool isFirstWorldTravelingStatus(void) const; bool isAnswerCorrectSphinxQuiz(int) const; bool isPayCoinToSphinx(void) const; bool isGotCoinCollect(al::PlacementId const*) const; bool isExistSessionMember(struct SessionMusicianType const&) const; bool isStartedObj(al::PlacementId const*,char const*) const; bool isPayShineAllInAllWorld(void) const; bool isUseMissRestartInfo(void) const; bool isGoToCeremonyFromInsideHomeShip(void) const; bool isRaceStart(void) const; bool isGameClear(void) const; bool isEmpty(void) const; bool isKidsMode(void) const; // custom methods // custom impl of findShine that uses shine UID instead of index to get the right HintInfo HintInfo* findShine(int shineUid) { for (int x = 0; x < 0x400; x++) { GameDataFile::HintInfo* curInfo = &mShineHintList[x]; if (curInfo->mUniqueID == shineUid) { return curInfo; } } return nullptr; } // end custom methods ShineInfo **mShineInfoArray; ShineInfo **mShineInfoArray2; ShineInfo *mShineInfo; void *qword18; void *qword20; int dword28; int dword2C; sead::FixedSafeString<0x80> char30; sead::FixedSafeString<0x80> charC8; sead::FixedSafeString<0x80> char160; sead::FixedSafeString<0x80> char1F8; sead::FixedSafeString<0x80> char290; sead::FixedSafeString<0x80> char328; sead::FixedSafeString<0x80> char3C0; u16 word458; char gap45A[6]; void *qword460; void *qword468; void *qword470; void *qword478; void *qword480; void *qword488; sead::FixedSafeString<0x100> char490; void *qword5A8; bool byte5B0; void *qword5B4; sead::FixedSafeString<0x80> *qword5C0; UniqObjInfo** mUniqueObjInfoArr; void *qword5D0; void *qword5D8; void *qword5E0; void *qword5E8; void *qword5F0; u16 word5F8; bool mIsEnableCap; void *qword600; int dword608; bool byte60C; SphinxQuizData *mSphinxQuizData; void *qword618; void *qword620; void *qword628; TimeBalloonSaveData *qword630; sead::FixedSafeString<0x40> char638; int dword690; WorldWarpTalkData *mWorldWarpTalkData; VisitStageData *mVisitStageData; GameProgressData *mGameProgressData; MoonRockData *mMoonRockData; BossSaveData *mBossSaveData; AchievementSaveData *mAchievementSaveData; SearchAmiiboDataTable *mSearchAmiiboDataTable; NetworkUploadFlag *mNetworkUploadFlag; SequenceDemoSkipData *mSequenceDemoSkipData; HintPhotoData *mHintPhotoData; void *qword6E8; void *qword6F0; void *qword6F8; void *qword700; void *qword708; sead::FixedSafeString<0x40> char710; sead::FixedSafeString<0x40> char768; u16 word7C0; void *qword7C8; u16 word7D0; void *qword7D8; sead::PtrArray mLatestRaceRecords; void *qword7F0; void *qword7F8; void *qword800; void *qword808; void *qword810; bool byte818; void *qword820; bool byte828; sead::PtrArrayImpl sead__ptrarrayimpl830; u16 word840; bool byte842; int dword844; bool byte848; GameDataHolder *mGameDataHolder; void *qword858; PlayerHitPointData *mPlayerHintPointData; sead::FixedSafeString<0x80> char868; bool byte900; bool byte901; int dword904; sead::FixedSafeString<0x80> char908; HintInfo *mShineHintList; // 0x9A0 sead::PtrArrayImpl sead__ptrarrayimpl9A8; sead::PtrArrayImpl sead__ptrarrayimpl9B8; sead::PtrArrayImpl sead__ptrarrayimpl9C8; sead::PtrArrayImpl sead__ptrarrayimpl9D8; void *qword9E8; int mCurWorldID; void *qword9F8; void *qwordA00; u16 wordA08; bool byteA0A; void *qwordA10; void *qwordA18; int dwordA20; int dwordA24; int dwordA28; bool byteA2C; ChangeStageInfo *mChangeStageInfo; ChangeStageInfo *mChangeStageInfo2; void *qwordA40; void *qwordA48; void *qwordA50; void *qwordA58; ShopTalkData *mShopTalkData; void *qwordA68; bool byteA70; char gapA71[3]; void *qwordA74; void *qwordA7C; int dwordA84; bool byteA88; char gapA89[3]; void *qwordA8C; int dwordA94; bool byteA98; char gapA99[3]; void *qwordA9C; int dwordAA4; bool byteAA8; char gapAA9[3]; void *qwordAAC; int dwordAB4; bool byteAB8; char gapAB9[3]; void *qwordABC; int dwordAC4; bool byteAC8; char gapAC9[3]; void *qwordACC; int dwordAD4; bool byteAD8; char gapAD9[3]; void *qwordADC; int dwordAE4; bool byteAE8; char gapAE9[3]; void *qwordAEC; int dwordAF4; bool byteAF8; char gapAF9[3]; void *qwordAFC; int dwordB04; bool byteB08; char gapB09[3]; void *qwordB0C; int dwordB14; bool byteB18; char gapB19[3]; void *qwordB1C; int dwordB24; bool byteB28; char gapB29[7]; void *qwordB30; bool byteB38; char gapB39[7]; void *qwordB40; int dwordB48; char gapB4C[4]; void *qwordB50; int dwordB58; int dwordB5C; int dwordB60; u16 wordB64; };