ModeBalloon: Implement TimeBalloonDataAccessorState

This commit is contained in:
guymakinggames 2026-04-22 16:33:46 +01:00
parent b6f947c559
commit f3b1181af7
6 changed files with 688 additions and 59 deletions

View file

@ -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':

View file

@ -0,0 +1,12 @@
#pragma once
#include <basis/seadTypes.h>
class TimeBalloonBalloonDataHolder {
public:
s32 getCurrentCount() const { return mCurrentCount; }
private:
u8 _0[0x10];
s32 mCurrentCount = 0;
};

View file

@ -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<s8, nn::nex::DataStoreRatingInfo>& ratingInfoMap);

View file

@ -0,0 +1,43 @@
#pragma once
#include <basis/seadTypes.h>
#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;
};

View file

@ -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

View file

@ -0,0 +1,157 @@
#pragma once
#include <basis/seadTypes.h>
#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