From f3b1181af70370992b6a8ab48e1ba47e01f79cc2 Mon Sep 17 00:00:00 2001 From: guymakinggames <66076221+guymakinggames@users.noreply.github.com> Date: Wed, 22 Apr 2026 16:33:46 +0100 Subject: [PATCH] ModeBalloon: Implement TimeBalloonDataAccessorState --- data/file_list.yml | 118 +++--- .../TimeBalloonBalloonDataHolder.h | 12 + src/ModeBalloon/TimeBalloonData.h | 19 + src/ModeBalloon/TimeBalloonDataAccessor.h | 43 ++ .../TimeBalloonDataAccessorState.cpp | 398 ++++++++++++++++++ .../TimeBalloonDataAccessorState.h | 157 +++++++ 6 files changed, 688 insertions(+), 59 deletions(-) create mode 100644 src/ModeBalloon/TimeBalloonBalloonDataHolder.h create mode 100644 src/ModeBalloon/TimeBalloonDataAccessor.h create mode 100644 src/ModeBalloon/TimeBalloonDataAccessorState.cpp create mode 100644 src/ModeBalloon/TimeBalloonDataAccessorState.h diff --git a/data/file_list.yml b/data/file_list.yml index 64c53263..42061a11 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -95563,274 +95563,274 @@ ModeBalloon/TimeBalloonDataAccessorState.o: label: - _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBaseC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBaseC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x365c7c size: 12 label: _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBase6appearEv - status: NotDecompiled + status: Matching - offset: 0x365c88 size: 20 label: _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBase12errorAndKillEv - status: NotDecompiled + status: Matching - offset: 0x365c9c size: 20 label: _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBase22errorConnectionAndKillEv - status: NotDecompiled + status: Matching - offset: 0x365cb0 size: 104 label: - _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x365d18 size: 20 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x365d2c size: 8 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State11setAccessorEPN2al9LiveActorE - status: NotDecompiled + status: Matching - offset: 0x365d34 size: 12 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State7settingEPN11TimeBalloon17BalloonDataServerEmm - status: NotDecompiled + status: Matching - offset: 0x365d40 size: 212 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State15exeDeleteNoticeEv - status: NotDecompiled + status: Matching - offset: 0x365e14 size: 196 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State15exeCreateNoticeEv - status: NotDecompiled + status: Matching - offset: 0x365ed8 size: 92 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5State16exeCreateBalloonEv - status: NotDecompiled + status: Matching - offset: 0x365f34 size: 100 label: - _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x365f98 size: 20 label: _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x365fac size: 136 label: _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5State12exeSearchAllEv - status: NotDecompiled + status: Matching - offset: 0x366034 size: 92 label: _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5State25exeDownloadBufferQueueAllEv - status: NotDecompiled + status: Matching - offset: 0x366090 size: 96 label: - _ZN20TimeBalloonDataState19DownloadFindBalloon5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState19DownloadFindBalloon5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x3660f0 size: 20 label: _ZN20TimeBalloonDataState19DownloadFindBalloon5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x366104 size: 116 label: _ZN20TimeBalloonDataState19DownloadFindBalloon5State16exeSearchBalloonEv - status: NotDecompiled + status: Matching - offset: 0x366178 size: 92 label: _ZN20TimeBalloonDataState19DownloadFindBalloon5State25exeDownloadAchievementAllEv - status: NotDecompiled + status: Matching - offset: 0x3661d4 size: 108 label: - _ZN20TimeBalloonDataState13RateUpBalloon5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState13RateUpBalloon5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x366240 size: 16 label: _ZN20TimeBalloonDataState13RateUpBalloon5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x366250 size: 20 label: _ZN20TimeBalloonDataState13RateUpBalloon5State7settingEmmmb - status: NotDecompiled + status: Matching - offset: 0x366264 size: 128 label: _ZN20TimeBalloonDataState13RateUpBalloon5State15exeUpdateRatingEv - status: NotDecompiled + status: Matching - offset: 0x3662e4 size: 96 label: _ZN20TimeBalloonDataState13RateUpBalloon5State26exeUpdateBufferQueuePlayedEv - status: NotDecompiled + status: Matching - offset: 0x366344 size: 104 label: - _ZN20TimeBalloonDataState16UpdateGetBalloon5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState16UpdateGetBalloon5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x3663ac size: 16 label: _ZN20TimeBalloonDataState16UpdateGetBalloon5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x3663bc size: 16 label: _ZN20TimeBalloonDataState16UpdateGetBalloon5State7settingEmmmii - status: NotDecompiled + status: Matching - offset: 0x3663cc size: 140 label: _ZN20TimeBalloonDataState16UpdateGetBalloon5State15exeUpdateRatingEv - status: NotDecompiled + status: Matching - offset: 0x366458 size: 108 label: _ZN20TimeBalloonDataState16UpdateGetBalloon5State15exeUpdateNoticeEv - status: NotDecompiled + status: Matching - offset: 0x3664c4 size: 96 label: - _ZN20TimeBalloonDataState24UpdateGetBalloonTutorial5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState24UpdateGetBalloonTutorial5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x366524 size: 16 label: _ZN20TimeBalloonDataState24UpdateGetBalloonTutorial5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x366534 size: 92 label: _ZN20TimeBalloonDataState24UpdateGetBalloonTutorial5State15exeUpdateRatingEv - status: NotDecompiled + status: Matching - offset: 0x366590 size: 100 label: - _ZN20TimeBalloonDataState24TryCreateAchievementData5StateC1EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - _ZN20TimeBalloonDataState24TryCreateAchievementData5StateC2EP31TimeBalloonDataAccessorExecutorP23TimeBalloonDataAccessor - status: NotDecompiled + status: Matching - offset: 0x3665f4 size: 16 label: _ZN20TimeBalloonDataState24TryCreateAchievementData5State6appearEv - status: NotDecompiled + status: Matching - offset: 0x366604 size: 8 label: _ZN20TimeBalloonDataState24TryCreateAchievementData5State11setAccessorEPN2al9LiveActorE - status: NotDecompiled + status: Matching - offset: 0x36660c size: 152 label: _ZN20TimeBalloonDataState24TryCreateAchievementData5State12exeGetDataIdEv - status: NotDecompiled + status: Matching - offset: 0x3666a4 size: 92 label: _ZN20TimeBalloonDataState24TryCreateAchievementData5State9exeCreateEv - status: NotDecompiled + status: Matching - offset: 0x366700 size: 36 label: _ZN20TimeBalloonDataState40TimeBalloonDataAccessorExecutorStateBaseD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x366724 size: 36 label: _ZN20TimeBalloonDataState19UpdatePutBalloonOwn5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x366748 size: 36 label: _ZN20TimeBalloonDataState25DownloadAllBalloonDataOwn5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x36676c size: 36 label: _ZN20TimeBalloonDataState19DownloadFindBalloon5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x366790 size: 36 label: _ZN20TimeBalloonDataState13RateUpBalloon5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x3667b4 size: 36 label: _ZN20TimeBalloonDataState16UpdateGetBalloon5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x3667d8 size: 36 label: _ZN20TimeBalloonDataState24UpdateGetBalloonTutorial5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x3667fc size: 36 label: _ZN20TimeBalloonDataState24TryCreateAchievementData5StateD0Ev - status: NotDecompiled + status: Matching lazy: true - offset: 0x366820 size: 8 label: _ZNK20TimeBalloonDataState19UpdatePutBalloonOwn20StateNrvDeleteNotice7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366828 size: 8 label: _ZNK20TimeBalloonDataState19UpdatePutBalloonOwn20StateNrvCreateNotice7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366830 size: 96 label: _ZNK20TimeBalloonDataState19UpdatePutBalloonOwn21StateNrvCreateBalloon7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366890 size: 140 label: _ZNK20TimeBalloonDataState25DownloadAllBalloonDataOwn17StateNrvSearchAll7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x36691c size: 96 label: _ZNK20TimeBalloonDataState25DownloadAllBalloonDataOwn30StateNrvDownloadBufferQueueAll7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x36697c size: 120 label: _ZNK20TimeBalloonDataState19DownloadFindBalloon21StateNrvSearchBalloon7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x3669f4 size: 96 label: _ZNK20TimeBalloonDataState19DownloadFindBalloon30StateNrvDownloadAchievementAll7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366a54 size: 132 label: _ZNK20TimeBalloonDataState13RateUpBalloon20StateNrvUpdateRating7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366ad8 size: 100 label: _ZNK20TimeBalloonDataState13RateUpBalloon31StateNrvUpdateBufferQueuePlayed7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366b3c size: 140 label: _ZNK20TimeBalloonDataState16UpdateGetBalloon20StateNrvUpdateRating7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366bc8 size: 108 label: _ZNK20TimeBalloonDataState16UpdateGetBalloon20StateNrvUpdateNotice7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366c34 size: 96 label: _ZNK20TimeBalloonDataState24UpdateGetBalloonTutorial20StateNrvUpdateRating7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366c94 size: 8 label: _ZNK20TimeBalloonDataState24TryCreateAchievementData17StateNrvGetDataId7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true - offset: 0x366c9c size: 96 label: _ZNK20TimeBalloonDataState24TryCreateAchievementData14StateNrvCreate7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching lazy: true ModeBalloon/TimeBalloonDataAccessorStateAchievement.o: '.text': diff --git a/src/ModeBalloon/TimeBalloonBalloonDataHolder.h b/src/ModeBalloon/TimeBalloonBalloonDataHolder.h new file mode 100644 index 00000000..e9fb4341 --- /dev/null +++ b/src/ModeBalloon/TimeBalloonBalloonDataHolder.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +class TimeBalloonBalloonDataHolder { +public: + s32 getCurrentCount() const { return mCurrentCount; } + +private: + u8 _0[0x10]; + s32 mCurrentCount = 0; +}; diff --git a/src/ModeBalloon/TimeBalloonData.h b/src/ModeBalloon/TimeBalloonData.h index f5a97464..9136c3d0 100644 --- a/src/ModeBalloon/TimeBalloonData.h +++ b/src/ModeBalloon/TimeBalloonData.h @@ -24,8 +24,27 @@ class BalloonDataServer { public: BalloonDataServer(); virtual ~BalloonDataServer(); + + void setNoticeDataId(u64 noticeDataId) { mNoticeDataId = noticeDataId; } + +private: + s32 mDataTypeCurrentWorldId = 0; + bool mIsInvalid = false; + u8 _d[3] = {}; + s32 mArg10 = 0; + sead::Vector3f mBalloonPos = sead::Vector3f::zero; + u64 mNoticeDataId = 0; + u64 _28 = 0; + u64 _30 = 0; + u64 _38 = 0; + u64 _40 = 0; + u64 _48 = 0; + void* _50 = nullptr; + void* _58 = nullptr; }; +static_assert(sizeof(BalloonDataServer) == 0x60); + class BalloonData { public: void setRatingInfo(const nn::nex::qMap& ratingInfoMap); diff --git a/src/ModeBalloon/TimeBalloonDataAccessor.h b/src/ModeBalloon/TimeBalloonDataAccessor.h new file mode 100644 index 00000000..0686a46c --- /dev/null +++ b/src/ModeBalloon/TimeBalloonDataAccessor.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include "ModeBalloon/TimeBalloonBalloonDataHolder.h" + +namespace TimeBalloon { +class BalloonDataServer; +} + +class TimeBalloonDataAccessor { +public: + bool tryDeleteNoticeDataOne(u64 noticeDataId); + bool isEnd() const; + void deleteNotice(s32 worldId); + bool tryCreateNoticeDataOne(); + u64 getCreateNoticeDataOneLast() const; + void registerNewNotice(u64 noticeDataId, s32 worldId); + bool tryCreateBalloonDataOne(const TimeBalloon::BalloonDataServer* balloonDataServer); + u64 getBalloonDataIdLast() const; + bool trySearchOwnAll(); + bool tryDownloadBalloonDataOwnAllBufferQueue(); + bool trySearchBalloon(); + bool tryDownloadAchievementOther(); + bool tryRateUpBalloonRating(u64 dataId, u64 ownerId, bool isInvalidRating); + bool tryUpdateBalloonPlayed(u64 dataId); + bool tryGotBalloon(u64 dataId, u64 ownerId, s32 arg4, s32 arg5); + bool tryUpdateNoticeGot(u64 noticeDataId); + bool tryGotBalloonTutorial(); + bool tryGetAndSaveAchievementIfExist(); + bool isExistAchievementData() const; + bool tryCreateAndSaveAchievement(); + + s32 getOwnBalloonCount() const { return mBalloonDataHolder->getCurrentCount(); } + + u16 getAchievementDataId() const { return mAchievementDataId; } + +private: + u8 _00[0x60]; + TimeBalloonBalloonDataHolder* mBalloonDataHolder = nullptr; + u8 _68[0x10]; + u16 mAchievementDataId = 0; +}; diff --git a/src/ModeBalloon/TimeBalloonDataAccessorState.cpp b/src/ModeBalloon/TimeBalloonDataAccessorState.cpp new file mode 100644 index 00000000..acf23b63 --- /dev/null +++ b/src/ModeBalloon/TimeBalloonDataAccessorState.cpp @@ -0,0 +1,398 @@ +#include "ModeBalloon/TimeBalloonDataAccessorState.h" + +#include "Library/Nerve/NerveSetupUtil.h" +#include "Library/Nerve/NerveUtil.h" + +#include "ModeBalloon/TimeBalloonData.h" +#include "ModeBalloon/TimeBalloonDataAccessor.h" +#include "System/GameDataFunction.h" +#include "System/GameDataHolderAccessor.h" + +namespace TimeBalloonDataState { + +TimeBalloonDataAccessorExecutorStateBase::TimeBalloonDataAccessorExecutorStateBase( + TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : al::NerveStateBase(""), mExecutor(executor), mAccessor(accessor) {} + +void TimeBalloonDataAccessorExecutorStateBase::appear() { + al::NerveStateBase::appear(); + mIsError = false; +} + +void TimeBalloonDataAccessorExecutorStateBase::errorAndKill() { + mIsError = true; + kill(); +} + +void TimeBalloonDataAccessorExecutorStateBase::errorConnectionAndKill() { + mIsError = true; + kill(); +} + +namespace UpdatePutBalloonOwn { + +NERVE_IMPL(State, DeleteNotice) +NERVE_IMPL(State, CreateNotice) +NERVE_IMPL(State, CreateBalloon) + +NERVES_MAKE_NOSTRUCT(State, DeleteNotice, CreateNotice, CreateBalloon) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&DeleteNotice, 0); +} + +void State::appear() { + TimeBalloonDataAccessorExecutorStateBase::appear(); + al::setNerve(this, &DeleteNotice); +} + +void State::setAccessor(al::LiveActor* accessor) { + mAccessorActor = accessor; +} + +void State::setting(TimeBalloon::BalloonDataServer* balloonDataServer, u64 previousDataId, + u64 noticeDataId) { + mBalloonDataServer = balloonDataServer; + mPreviousDataId = previousDataId; + mNoticeDataId = noticeDataId; +} + +void State::exeDeleteNotice() { + if (mNoticeDataId == 0) { + al::setNerve(this, &CreateBalloon); + return; + } + + if (al::isFirstStep(this) && !mAccessor->tryDeleteNoticeDataOne(mNoticeDataId)) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) { + TimeBalloonDataAccessor* accessor = mAccessor; + GameDataHolderAccessor holderAccessor(mAccessorActor); + accessor->deleteNotice(GameDataFunction::getCurrentWorldId(holderAccessor) & 0xFFFF); + al::setNerve(this, &CreateNotice); + } +} + +void State::exeCreateNotice() { + if (al::isFirstStep(this) && !mAccessor->tryCreateNoticeDataOne()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) { + mNoticeDataId = mAccessor->getCreateNoticeDataOneLast(); + mBalloonDataServer->setNoticeDataId(mNoticeDataId); + + TimeBalloonDataAccessor* accessor = mAccessor; + u64 noticeDataId = mNoticeDataId; + GameDataHolderAccessor holderAccessor(mAccessorActor); + + accessor->registerNewNotice(noticeDataId, + GameDataFunction::getCurrentWorldId(holderAccessor) & 0xFFFF); + al::setNerve(this, &CreateBalloon); + } +} + +void State::exeCreateBalloon() { + if (al::isFirstStep(this)) + mAccessor->tryCreateBalloonDataOne(mBalloonDataServer); + + if (mAccessor->isEnd()) { + mAccessor->getBalloonDataIdLast(); + kill(); + } +} + +} // namespace UpdatePutBalloonOwn + +namespace DownloadAllBalloonDataOwn { + +NERVE_IMPL(State, SearchAll) +NERVE_IMPL(State, DownloadBufferQueueAll) + +NERVES_MAKE_NOSTRUCT(State, SearchAll, DownloadBufferQueueAll) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor), mSearchAccessor(accessor) { + initNerve(&SearchAll, 0); +} + +void State::appear() { + TimeBalloonDataAccessorExecutorStateBase::appear(); + al::setNerve(this, &SearchAll); +} + +void State::exeSearchAll() { + if (al::isFirstStep(this) && !mSearchAccessor->trySearchOwnAll()) { + mIsError = true; + kill(); + return; + } + + if (mSearchAccessor->isEnd()) { + if (mSearchAccessor->getOwnBalloonCount() >= 1) + al::setNerve(this, &DownloadBufferQueueAll); + else + kill(); + } +} + +void State::exeDownloadBufferQueueAll() { + if (al::isFirstStep(this) && !mSearchAccessor->tryDownloadBalloonDataOwnAllBufferQueue()) { + mIsError = true; + kill(); + return; + } + + if (mSearchAccessor->isEnd()) + kill(); +} + +} // namespace DownloadAllBalloonDataOwn + +namespace DownloadFindBalloon { + +NERVE_IMPL(State, SearchBalloon) +NERVE_IMPL(State, DownloadAchievementAll) + +NERVES_MAKE_NOSTRUCT(State, SearchBalloon, DownloadAchievementAll) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&SearchBalloon, 0); +} + +void State::appear() { + TimeBalloonDataAccessorExecutorStateBase::appear(); + al::setNerve(this, &SearchBalloon); +} + +void State::exeSearchBalloon() { + if (al::isFirstStep(this) && !mAccessor->trySearchBalloon()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + al::setNerve(this, &DownloadAchievementAll); +} + +void State::exeDownloadAchievementAll() { + if (al::isFirstStep(this) && !mAccessor->tryDownloadAchievementOther()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + kill(); +} + +} // namespace DownloadFindBalloon + +namespace RateUpBalloon { + +NERVE_IMPL(State, UpdateRating) +NERVE_IMPL(State, UpdateBufferQueuePlayed) + +NERVES_MAKE_NOSTRUCT(State, UpdateRating, UpdateBufferQueuePlayed) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&UpdateRating, 0); +} + +void State::appear() { + al::NerveStateBase::appear(); + al::setNerve(this, &UpdateRating); +} + +void State::setting(u64 dataId, u64 unused, u64 ownerId, bool isInvalidRating) { + mDataId = dataId; + _38 = unused; + mOwnerId = ownerId; + _48 = isInvalidRating; +} + +void State::exeUpdateRating() { + if (al::isFirstStep(this) && !mAccessor->tryRateUpBalloonRating(mDataId, mOwnerId, false)) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + al::setNerve(this, &UpdateBufferQueuePlayed); +} + +void State::exeUpdateBufferQueuePlayed() { + if (al::isFirstStep(this) && !mAccessor->tryUpdateBalloonPlayed(mDataId)) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + kill(); +} + +} // namespace RateUpBalloon + +namespace UpdateGetBalloon { + +NERVE_IMPL(State, UpdateRating) +NERVE_IMPL(State, UpdateNotice) + +NERVES_MAKE_NOSTRUCT(State, UpdateRating, UpdateNotice) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&UpdateRating, 0); +} + +void State::appear() { + al::NerveStateBase::appear(); + al::setNerve(this, &UpdateRating); +} + +void State::setting(u64 dataId, u64 noticeDataId, u64 ownerId, s32 arg4, s32 arg5) { + mDataId = dataId; + mNoticeDataId = noticeDataId; + mOwnerId = ownerId; + mArg4 = arg4; + mArg5 = arg5; +} + +void State::exeUpdateRating() { + if (mDataId != 0) { + if (!al::isFirstStep(this) || mAccessor->tryGotBalloon(mDataId, mOwnerId, mArg4, mArg5)) { + if (mAccessor->isEnd()) + al::setNerve(this, &UpdateNotice); + return; + } + } + + mIsError = true; + kill(); +} + +void State::exeUpdateNotice() { + if (mNoticeDataId == 0) { + kill(); + return; + } + + if (al::isFirstStep(this) && !mAccessor->tryUpdateNoticeGot(mNoticeDataId)) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + kill(); +} + +} // namespace UpdateGetBalloon + +namespace UpdateGetBalloonTutorial { + +NERVE_IMPL(State, UpdateRating) + +NERVES_MAKE_NOSTRUCT(State, UpdateRating) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&UpdateRating, 0); +} + +void State::appear() { + al::NerveStateBase::appear(); + al::setNerve(this, &UpdateRating); +} + +void State::exeUpdateRating() { + if (al::isFirstStep(this) && !mAccessor->tryGotBalloonTutorial()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + kill(); +} + +} // namespace UpdateGetBalloonTutorial + +namespace TryCreateAchievementData { + +NERVE_IMPL(State, GetDataId) +NERVE_IMPL(State, Create) + +NERVES_MAKE_NOSTRUCT(State, GetDataId, Create) + +State::State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor) + : TimeBalloonDataAccessorExecutorStateBase(executor, accessor) { + initNerve(&GetDataId, 0); +} + +void State::appear() { + al::NerveStateBase::appear(); + al::setNerve(this, &GetDataId); +} + +void State::setAccessor(al::LiveActor* accessor) { + mAccessorActor = accessor; +} + +void State::exeGetDataId() { + if (al::isFirstStep(this) && !mAccessor->tryGetAndSaveAchievementIfExist()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) { + if (mAccessor->isExistAchievementData()) { + kill(); + return; + } + + u32 achievementDataId = mAccessor->getAchievementDataId(); + u8 lowByte = achievementDataId; + + if (lowByte == 0) { + kill(); + return; + } + + if (!(achievementDataId < 0x100u)) { + al::setNerve(this, &Create); + return; + } + + mIsError = true; + kill(); + } +} + +void State::exeCreate() { + if (al::isFirstStep(this) && !mAccessor->tryCreateAndSaveAchievement()) { + mIsError = true; + kill(); + return; + } + + if (mAccessor->isEnd()) + kill(); +} + +} // namespace TryCreateAchievementData + +} // namespace TimeBalloonDataState diff --git a/src/ModeBalloon/TimeBalloonDataAccessorState.h b/src/ModeBalloon/TimeBalloonDataAccessorState.h new file mode 100644 index 00000000..df5a6131 --- /dev/null +++ b/src/ModeBalloon/TimeBalloonDataAccessorState.h @@ -0,0 +1,157 @@ +#pragma once + +#include + +#include "Library/Nerve/NerveStateBase.h" + +namespace al { +class LiveActor; +} + +namespace TimeBalloon { +class BalloonDataServer; +} + +class TimeBalloonDataAccessor; +class TimeBalloonDataAccessorExecutor; + +namespace TimeBalloonDataState { + +class TimeBalloonDataAccessorExecutorStateBase : public al::NerveStateBase { +public: + TimeBalloonDataAccessorExecutorStateBase(TimeBalloonDataAccessorExecutor* executor, + TimeBalloonDataAccessor* accessor); + + void appear() override; + void errorAndKill(); + void errorConnectionAndKill(); + +protected: + TimeBalloonDataAccessorExecutor* mExecutor; + TimeBalloonDataAccessor* mAccessor; + bool mIsError = false; +}; + +static_assert(sizeof(TimeBalloonDataAccessorExecutorStateBase) == 0x30); + +namespace UpdatePutBalloonOwn { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void setAccessor(al::LiveActor* accessor); + void setting(TimeBalloon::BalloonDataServer* balloonDataServer, u64 previousDataId, + u64 noticeDataId); + void exeDeleteNotice(); + void exeCreateNotice(); + void exeCreateBalloon(); + +private: + al::LiveActor* mAccessorActor = nullptr; + TimeBalloon::BalloonDataServer* mBalloonDataServer = nullptr; + u64 mPreviousDataId = 0; + u64 mNoticeDataId = 0; +}; + +static_assert(sizeof(State) == 0x50); +} // namespace UpdatePutBalloonOwn + +namespace DownloadAllBalloonDataOwn { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void exeSearchAll(); + void exeDownloadBufferQueueAll(); + +private: + TimeBalloonDataAccessor* mSearchAccessor = nullptr; +}; + +static_assert(sizeof(State) == 0x38); +} // namespace DownloadAllBalloonDataOwn + +namespace DownloadFindBalloon { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void exeSearchBalloon(); + void exeDownloadAchievementAll(); +}; + +static_assert(sizeof(State) == 0x30); +} // namespace DownloadFindBalloon + +namespace RateUpBalloon { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void setting(u64 dataId, u64 unused, u64 ownerId, bool isInvalidRating); + void exeUpdateRating(); + void exeUpdateBufferQueuePlayed(); + +private: + u64 mDataId = 0; + u64 _38 = 0; + u64 mOwnerId = 0; + bool _48 = false; +}; + +static_assert(sizeof(State) == 0x50); +} // namespace RateUpBalloon + +namespace UpdateGetBalloon { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void setting(u64 dataId, u64 noticeDataId, u64 ownerId, s32 arg4, s32 arg5); + void exeUpdateRating(); + void exeUpdateNotice(); + + u64 mDataId = 0; + u64 mNoticeDataId = 0; + u64 mOwnerId = 0; + s32 mArg4 = 0; + s32 mArg5 = 0; +}; + +static_assert(sizeof(State) == 0x50); +} // namespace UpdateGetBalloon + +namespace UpdateGetBalloonTutorial { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void exeUpdateRating(); +}; + +static_assert(sizeof(State) == 0x30); +} // namespace UpdateGetBalloonTutorial + +namespace TryCreateAchievementData { +class State : public TimeBalloonDataAccessorExecutorStateBase { +public: + State(TimeBalloonDataAccessorExecutor* executor, TimeBalloonDataAccessor* accessor); + + void appear() override; + void setAccessor(al::LiveActor* accessor); + void exeGetDataId(); + void exeCreate(); + + al::LiveActor* mAccessorActor = nullptr; +}; + +static_assert(sizeof(State) == 0x38); +} // namespace TryCreateAchievementData + +} // namespace TimeBalloonDataState