Scene: Implement QuestInfoHolder and QuestInfo

This commit is contained in:
Narr the Reg 2026-04-19 14:32:12 -06:00
parent 8f46da6630
commit 0da5b54368
5 changed files with 586 additions and 90 deletions

View file

@ -137147,47 +137147,47 @@ Scene/QuestInfo.o:
label:
- _ZN9QuestInfoC1Ev
- _ZN9QuestInfoC2Ev
status: NotDecompiled
status: Matching
- offset: 0x4c1de8
size: 92
label: _ZN9QuestInfo5clearEv
status: NotDecompiled
status: Matching
- offset: 0x4c1e44
size: 52
label: _ZN9QuestInfo4initERKN2al13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x4c1e78
size: 8
label: _ZN9QuestInfo4initERKN2al13PlacementInfoERKNS0_13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x4c1e80
size: 656
label: _ZN9QuestInfo4initERKN2al13PlacementInfoEPNS0_14SceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c2110
size: 24
label: _ZN9QuestInfo12setStageNameEPKc
status: NotDecompiled
status: Matching
- offset: 0x4c2128
size: 24
label: _ZN9QuestInfo8setLabelEPKc
status: NotDecompiled
status: Matching
- offset: 0x4c2140
size: 876
label: _ZN9QuestInfo4copyEPKS_
status: NotDecompiled
status: Matching
- offset: 0x4c24ac
size: 76
label: _ZN9QuestInfo3endEv
status: NotDecompiled
status: Matching
- offset: 0x4c24f8
size: 608
label: _ZNK9QuestInfo7isEqualEPKS_
status: NotDecompiled
status: Matching
- offset: 0x4c2758
size: 8
label: _ZNK9QuestInfo17getSceneObjHolderEv
status: NotDecompiled
status: Matching
lazy: true
Scene/QuestInfoHolder.o:
'.text':
@ -137196,140 +137196,140 @@ Scene/QuestInfoHolder.o:
label:
- _ZN15QuestInfoHolderC1Ei
- _ZN15QuestInfoHolderC2Ei
status: NotDecompiled
status: Matching
- offset: 0x4c28a0
size: 112
label: _ZN15QuestInfoHolder8clearAllEv
status: NotDecompiled
status: Matching
- offset: 0x4c2910
size: 8
label: _ZN15QuestInfoHolder16finalizeForSceneEv
status: NotDecompiled
status: Matching
- offset: 0x4c2918
size: 12
label: _ZN15QuestInfoHolder26initAfterPlacementSceneObjERKN2al13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x4c2924
size: 584
label: _ZN15QuestInfoHolder26initAfterPlacementQuestObjEi
status: NotDecompiled
status: Matching
- offset: 0x4c2b6c
size: 172
label: _ZN15QuestInfoHolder16updateActiveListEi
status: NotDecompiled
status: Matching
- offset: 0x4c2c18
size: 48
label: _ZN15QuestInfoHolder14clearMainQuestEv
status: NotDecompiled
status: Matching
- offset: 0x4c2c48
size: 52
label: _ZN15QuestInfoHolder18initSceneObjHolderEPN2al14SceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c2c7c
size: 108
label: _ZN15QuestInfoHolder17registerQuestInfoEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c2ce8
size: 80
label: _ZN15QuestInfoHolder13validateQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c2d38
size: 116
label: _ZNK15QuestInfoHolder12tryFindQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c2dac
size: 540
label: _ZN15QuestInfoHolder15invalidateQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c2fc8
size: 132
label: _ZNK15QuestInfoHolder11getQuestNumEi
status: NotDecompiled
status: Matching
- offset: 0x4c304c
size: 100
label: _ZNK15QuestInfoHolder19getActiveQuestLabelEv
status: NotDecompiled
status: Matching
- offset: 0x4c30b0
size: 128
label: _ZNK15QuestInfoHolder23getActiveQuestStageNameEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3130
size: 104
label: _ZNK15QuestInfoHolder13isActiveQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c3198
size: 152
label: _ZNK15QuestInfoHolder12tryFindQuestERKN2al13PlacementInfoEPNS0_14SceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3230
size: 8
label: _ZN2rs18getQuestInfoHolderEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3238
size: 352
label: _ZN2rs37tryCreateAndRegisterQuestInfoToHolderEPKN2al9LiveActorERKNS0_13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x4c3398
size: 548
label: _ZN2rs47createAndRegisterQuestInfoToHolderFromLinkedObjEPKN2al9LiveActorERKNS0_13PlacementInfoEb
status: NotDecompiled
status: Matching
- offset: 0x4c35bc
size: 60
label: _ZN2rs15invalidateQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c35f8
size: 396
label: _ZN2rs50tryCreateAndRegisterQuestInfoToHolderFromLinkedObjEPKN2al9LiveActorERKNS0_13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x4c3784
size: 96
label: _ZN2rs13validateQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c37e4
size: 28
label: _ZN2rs18getActiveQuestListEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3800
size: 28
label: _ZN2rs17getActiveQuestNumEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c381c
size: 88
label: _ZN2rs23getActiveQuestNumForMapEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3874
size: 208
label: _ZN2rs23isActiveQuestAllEqualNoEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3944
size: 108
label: _ZN2rs19getActiveQuestLabelEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c39b0
size: 128
label: _ZN2rs23getActiveQuestStageNameEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3a30
size: 128
label: _ZN2rs13isActiveQuestEPK9QuestInfo
status: NotDecompiled
status: Matching
- offset: 0x4c3ab0
size: 224
label: _ZN2rs13isActiveQuestEPKN4sead8PtrArrayI9QuestInfoEE
status: NotDecompiled
status: Matching
- offset: 0x4c3b90
size: 28
label: _ZN2rs16getActiveQuestNoEPKN2al18IUseSceneObjHolderE
status: NotDecompiled
status: Matching
- offset: 0x4c3bac
size: 12
label: _ZNK15QuestInfoHolder15getSceneObjNameEv
status: NotDecompiled
status: Matching
lazy: true
- offset: 0x4c3bb8
size: 4
label: _ZN15QuestInfoHolderD0Ev
status: NotDecompiled
status: Matching
lazy: true
Scene/SceneAudioSystemPauseController.o:
'.text':

113
src/Scene/QuestInfo.cpp Normal file
View file

@ -0,0 +1,113 @@
#include "Scene/QuestInfo.h"
#include "Library/Base/StringUtil.h"
#include "Library/LiveActor/ActorInitInfo.h"
#include "Library/LiveActor/ActorInitUtil.h"
#include "Library/Math/MathUtil.h"
#include "Library/Placement/PlacementFunction.h"
#include "Library/Placement/PlacementId.h"
#include "System/GameDataFunction.h"
#include "Util/StageLayoutFunction.h"
QuestInfo::QuestInfo() {}
void QuestInfo::clear() {
mQuestNo = -1;
mTrans.set(sead::Vector3f::zero);
mIsMainQuest = false;
mIsInvalid = false;
mSceneObjHolder = nullptr;
mScenarioName.clear();
mStageName.clear();
mPlacementStageName.clear();
mPlacementId.clear();
mIsSingle = false;
}
void QuestInfo::init(const al::ActorInitInfo& initInfo) {
init(al::getPlacementInfo(initInfo), initInfo);
}
void QuestInfo::init(const al::PlacementInfo& placementInfo, const al::ActorInitInfo& initInfo) {
init(placementInfo, initInfo.actorSceneInfo.sceneObjHolder);
}
void QuestInfo::init(const al::PlacementInfo& placementInfo, al::SceneObjHolder* holder) {
mIsMainQuest = true;
mSceneObjHolder = holder;
al::tryGetTrans(&mTrans, placementInfo);
al::tryGetArg(&mQuestNo, placementInfo, "QuestNo");
al::tryGetArg(&mIsMainQuest, placementInfo, "IsMainQuest");
al::tryGetArg(&mIsSingle, placementInfo, "IsSingle");
al::PlacementId placementId;
al::tryGetPlacementId(&placementId, placementInfo);
mPlacementId = al::makeStringPlacementId(&placementId);
mPlacementStageName.format("%s", rs::getPlacementStageName(this, placementInfo));
const char* className = nullptr;
if (!al::tryGetClassName(&className, placementInfo) ||
!al::searchSubString(className, "Shine")) {
mScenarioName.clear();
mStageName.clear();
return;
}
if (al::isObjectName(placementInfo, "ShineDummy")) {
const char* stageName = nullptr;
const char* label = nullptr;
al::getStringArg(&stageName, placementInfo, "StageName");
al::getStringArg(&label, placementInfo, "ObjId");
setStageName(stageName);
setLabel(label);
return;
}
rs::makeMessageLabel(&mScenarioName, placementInfo, "ScenarioName");
mStageName.format(rs::getPlacementStageName(this, placementInfo));
}
void QuestInfo::setStageName(const char* stageName) {
mStageName.format("%s", stageName);
}
void QuestInfo::setLabel(const char* label) {
mScenarioName.format("ScenarioName_%s", label);
}
void QuestInfo::copy(const QuestInfo* quest) {
mTrans.set(quest->getTrans());
mQuestNo = quest->getQuestNo();
mIsMainQuest = quest->isMainQuest();
mSceneObjHolder = quest->getSceneObjHolder();
mScenarioName = quest->getScenarioName();
mStageName = quest->getStageName();
mIsSingle = quest->isSingle();
mPlacementId = quest->getPlacementId();
mPlacementStageName = quest->getPlacementStageName();
}
void QuestInfo::end() {
mIsInvalid = !GameDataFunction::isWorldCity(this) || mQuestNo != 8;
}
bool QuestInfo::isEqual(const QuestInfo* quest) const {
if (mQuestNo != quest->getQuestNo() || mIsMainQuest != quest->isMainQuest())
return false;
if (!mScenarioName.isEmpty() && !mStageName.isEmpty()) {
return al::isEqualString(mScenarioName.cstr(), quest->getScenarioName()) &&
al::isEqualString(mStageName.cstr(), quest->getStageName());
}
if (mIsSingle && quest->isSingle())
return true;
if (mPlacementStageName == quest->getPlacementStageName() &&
mPlacementId == quest->getPlacementId())
return true;
return al::isNear(mTrans, quest->getTrans());
}

View file

@ -1,6 +1,7 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadVector.h>
#include <prim/seadSafeString.h>
#include "Library/Scene/IUseSceneObjHolder.h"
@ -15,30 +16,50 @@ class QuestInfo : public al::IUseSceneObjHolder {
public:
QuestInfo();
void clear();
void init(const al::ActorInitInfo&);
void init(const al::PlacementInfo&, const al::ActorInitInfo&);
void init(const al::PlacementInfo&, al::SceneObjHolder*);
void setStageName(const char*);
void setLabel(const char*);
void copy(const QuestInfo*);
void init(const al::ActorInitInfo& initInfo);
void init(const al::PlacementInfo& placementInfo, const al::ActorInitInfo& initInfo);
void init(const al::PlacementInfo& placementInfo, al::SceneObjHolder* holder);
void setStageName(const char* stageName);
void setLabel(const char* label);
void copy(const QuestInfo* quest);
void end();
bool isEqual(const QuestInfo*) const;
al::SceneObjHolder* getSceneObjHolder() const override { return mSceneObjHolder; }
bool isEqual(const QuestInfo* quest) const;
s32 getQuestNo() const { return mQuestNo; }
const sead::Vector3f& getTrans() const { return mTrans; }
bool isMainQuest() const { return mIsMainQuest; }
bool isInvalid() const { return mIsInvalid; }
void setInvalid(bool isInvalid) { mIsInvalid = isInvalid; }
void setSceneObjHolder(al::SceneObjHolder* holder) { mSceneObjHolder = holder; }
al::SceneObjHolder* getSceneObjHolder() const override { return mSceneObjHolder; }
const sead::FixedSafeString<128>& getScenarioName() const { return mScenarioName; }
const sead::FixedSafeString<128>& getStageName() const { return mStageName; }
bool isSingle() const { return mIsSingle; }
const sead::FixedSafeString<128>& getPlacementId() const { return mPlacementId; }
const sead::FixedSafeString<128>& getPlacementStageName() const { return mPlacementStageName; }
private:
s32 mQuestNo;
void* filler_10;
bool mIsMainQuest;
al::SceneObjHolder* mSceneObjHolder;
sead::SafeString* mScenarioName;
void* filler_30[0x12];
sead::SafeString* mStageName;
void* filler_c8[0x12];
bool mIsSingle;
void* filler_160[0x26];
s32 mQuestNo = -1;
sead::Vector3f mTrans = sead::Vector3f::zero;
bool mIsMainQuest = false;
bool mIsInvalid = false;
al::SceneObjHolder* mSceneObjHolder = nullptr;
sead::FixedSafeString<128> mScenarioName;
sead::FixedSafeString<128> mStageName;
bool mIsSingle = false;
sead::FixedSafeString<128> mPlacementId;
sead::FixedSafeString<128> mPlacementStageName;
};
static_assert(sizeof(QuestInfo) == 0x290);

View file

@ -0,0 +1,357 @@
#include "Scene/QuestInfoHolder.h"
#include <math/seadMathCalcCommon.h>
#include "Library/LiveActor/ActorInitInfo.h"
#include "Library/LiveActor/ActorInitUtil.h"
#include "Library/LiveActor/LiveActor.h"
#include "Library/Placement/PlacementFunction.h"
#include "Library/Placement/PlacementInfo.h"
#include "Library/Scene/SceneObjUtil.h"
#include "Scene/QuestInfo.h"
#include "System/GameDataFunction.h"
QuestInfoHolder::QuestInfoHolder(s32 capacity) : mCapacity(capacity) {
mQuests = new QuestInfo[mCapacity];
mActiveQuests = new QuestInfo*[mCapacity];
mIsMainQuest = new bool[mCapacity];
for (s32 i = 0; i < mCapacity; i++) {
mActiveQuests[i] = nullptr;
mIsMainQuest[i] = false;
}
}
void QuestInfoHolder::clearAll() {
for (s32 i = 0; i < mCapacity; i++) {
mQuests[i].clear();
mActiveQuests[i] = nullptr;
mIsMainQuest[i] = false;
}
mSize = 0;
mActiveQuestNum = 0;
}
void QuestInfoHolder::finalizeForScene() {
mIsInitialized = false;
}
void QuestInfoHolder::initAfterPlacementSceneObj(const al::ActorInitInfo& info) {
mIsInitialized = true;
}
void QuestInfoHolder::initAfterPlacementQuestObj(s32 questNo) {
mActiveMainQuestNo = -1;
s32 foundQuestNo = -1;
for (s32 i = 0; i <= mMaxMainQuestNo; i++) {
bool hasMainQuest = false;
for (s32 j = 0; j < mSize; j++) {
s32 currentQuestNo = mQuests[j].getQuestNo();
if (currentQuestNo == questNo)
foundQuestNo = questNo;
if (currentQuestNo == i && mQuests[j].isMainQuest()) {
if (hasMainQuest | mQuests[j].getScenarioName().isEmpty())
mIsMainQuest[i] = true;
else
hasMainQuest = true;
}
}
}
if (foundQuestNo > -1)
updateActiveList(foundQuestNo);
else
clearMainQuest();
if (GameDataFunction::isWorldCity(mQuests) && mActiveMainQuestNo == 8 &&
GameDataFunction::getScenarioNoPlacement(mQuests) != 7 &&
GameDataFunction::getScenarioNoPlacement(mQuests) != 11) {
clearMainQuest();
}
}
void QuestInfoHolder::updateActiveList(s32 questNo) {
clearMainQuest();
for (s32 i = 0; i < mSize; i++) {
QuestInfo* quest = &mQuests[i];
if (!quest->isInvalid() && quest->getQuestNo() == questNo) {
mActiveQuests[mActiveQuestNum] = quest;
mActiveQuestNum++;
if (mQuests[i].isMainQuest())
mActiveMainQuestNo = mQuests[i].getQuestNo();
mActiveQuestNo = mQuests[i].getQuestNo();
}
}
}
void QuestInfoHolder::clearMainQuest() {
for (s32 i = 0; i < mCapacity; i++)
mActiveQuests[i] = nullptr;
mActiveQuestNum = 0;
}
void QuestInfoHolder::initSceneObjHolder(al::SceneObjHolder* holder) {
for (s32 i = 0; i < mCapacity; i++)
mQuests[i].setSceneObjHolder(holder);
}
QuestInfo* QuestInfoHolder::registerQuestInfo(const QuestInfo* quest) {
QuestInfo* newQuest = &mQuests[mSize];
newQuest->copy(quest);
mSize++;
if (quest->isMainQuest())
mMaxMainQuestNo = sead::Mathi::max(mMaxMainQuestNo, quest->getQuestNo());
return newQuest;
}
void QuestInfoHolder::validateQuest(const QuestInfo* quest) {
// BUG: No bounds checking. Will soflock if entry is not found.
for (s32 i = 0; true; i++) {
if (mQuests[i].isEqual(quest)) {
mQuests[i].setInvalid(false);
return;
}
}
}
void QuestInfoHolder::invalidateQuest(const QuestInfo* quest) {
QuestInfo* entry = tryFindQuest(quest);
if (entry->isInvalid())
return;
entry->end();
if (mActiveQuestNo > entry->getQuestNo() || !mIsInitialized)
return;
updateActiveList(entry->getQuestNo());
if (mActiveQuestNum == 0) {
updateActiveList(entry->getQuestNo() + 1);
GameDataFunction::setMainScenarioNo(quest, entry->getQuestNo() + 1);
}
}
s32 QuestInfoHolder::getQuestNum(s32 questNo) const {
s32 questNum = 0;
for (s32 i = 0; i < mSize; i++)
if (mQuests[i].getQuestNo() == questNo)
questNum++;
return questNum;
}
al::StringTmp<128> QuestInfoHolder::getActiveQuestLabel() const {
if (mIsMainQuest[mActiveQuestNo])
return al::StringTmp<128>("Quest_%02d", mActiveQuestNo);
return mActiveQuests[0]->getScenarioName().cstr();
}
al::StringTmp<128>
QuestInfoHolder::getActiveQuestStageName(const al::IUseSceneObjHolder* holder) const {
if (mIsMainQuest[mActiveQuestNo])
return GameDataFunction::tryGetCurrentMainStageName(holder);
return mActiveQuests[0]->getStageName().cstr();
}
bool QuestInfoHolder::isActiveQuest(const QuestInfo* quest) const {
for (s32 i = 0; i < mActiveQuestNum; i++)
if (mActiveQuests[i]->isEqual(quest))
return true;
return false;
}
QuestInfo* QuestInfoHolder::tryFindQuest(const QuestInfo* quest) const {
for (s32 i = 0; i < mCapacity; i++)
if (mQuests[i].isEqual(quest))
return &mQuests[i];
return nullptr;
}
QuestInfo* QuestInfoHolder::tryFindQuest(const al::PlacementInfo& placementInfo,
al::SceneObjHolder* holder) const {
QuestInfo quest;
quest.init(placementInfo, holder);
return tryFindQuest(&quest);
}
namespace rs {
QuestInfoHolder* getQuestInfoHolder(const al::IUseSceneObjHolder* holder) {
return al::getSceneObj<QuestInfoHolder>(holder);
}
QuestInfo* tryCreateAndRegisterQuestInfoToHolder(const al::LiveActor* actor,
const al::ActorInitInfo& info) {
s32 questNo = -1;
al::tryGetArg(&questNo, info, "QuestNo");
if (questNo == -1)
return nullptr;
QuestInfo* foundQuest = getQuestInfoHolder(actor)->tryFindQuest(
al::getPlacementInfo(info), info.actorSceneInfo.sceneObjHolder);
if (foundQuest)
return foundQuest;
QuestInfo quest;
quest.init(info);
return getQuestInfoHolder(actor)->registerQuestInfo(&quest);
}
QuestInfo* createAndRegisterQuestInfoToHolderFromLinkedObj(const al::LiveActor* actor,
const al::PlacementInfo& info,
bool isDummy) {
s32 questNo = -1;
al::tryGetArg(&questNo, info, "QuestNo");
if (questNo == -1)
return nullptr;
QuestInfo* foundQuest =
getQuestInfoHolder(actor)->tryFindQuest(info, actor->getSceneInfo()->sceneObjHolder);
if (foundQuest)
return foundQuest;
QuestInfo quest;
quest.init(info, actor->getSceneObjHolder());
if (isDummy) {
const char* stageName = nullptr;
const char* objId = nullptr;
al::getStringArg(&stageName, info, "StageName");
al::getStringArg(&objId, info, "ObjId");
quest.setStageName(stageName);
quest.setLabel(objId);
}
QuestInfo* newQuest = getQuestInfoHolder(actor)->registerQuestInfo(&quest);
if (isDummy) {
const char* stageName = nullptr;
const char* objId = nullptr;
al::getStringArg(&stageName, info, "StageName");
al::getStringArg(&objId, info, "ObjId");
if (GameDataFunction::isGotShine(actor, stageName, objId))
invalidateQuest(&quest);
}
return newQuest;
}
sead::PtrArray<QuestInfo>*
tryCreateAndRegisterQuestInfoToHolderFromLinkedObj(const al::LiveActor* actor,
const al::ActorInitInfo& info) {
al::PlacementInfo placementInfo;
s32 noDeleteShines = al::calcLinkChildNum(info, "NoDelete_Shine");
s32 shineDummies = al::calcLinkChildNum(info, "ShineDummy");
if (shineDummies + noDeleteShines == 0)
return nullptr;
sead::PtrArray<QuestInfo>* quests = new sead::PtrArray<QuestInfo>;
quests->allocBuffer(shineDummies + noDeleteShines, nullptr);
for (s32 i = 0; i < noDeleteShines; i++) {
al::getLinksInfoByIndex(&placementInfo, info, "NoDelete_Shine", i);
QuestInfo* quest =
createAndRegisterQuestInfoToHolderFromLinkedObj(actor, placementInfo, false);
if (quest)
quests->pushBack(quest);
}
if (shineDummies < 1) {
if (quests->isEmpty())
return nullptr;
return quests;
}
for (s32 i = 0; i < shineDummies; i++) {
al::getLinksInfoByIndex(&placementInfo, info, "ShineDummy", i);
QuestInfo* quest =
createAndRegisterQuestInfoToHolderFromLinkedObj(actor, placementInfo, true);
if (quest)
quests->pushBack(quest);
}
if (quests->isEmpty())
return nullptr;
return quests;
}
void validateQuest(const QuestInfo* quest) {
if (!quest)
return;
getQuestInfoHolder(quest)->validateQuest(quest);
}
void invalidateQuest(const QuestInfo* quest) {
if (!quest)
return;
getQuestInfoHolder(quest)->invalidateQuest(quest);
}
const QuestInfo* const* getActiveQuestList(const al::IUseSceneObjHolder* holder) {
return getQuestInfoHolder(holder)->getActiveQuestList();
}
s32 getActiveQuestNum(const al::IUseSceneObjHolder* holder) {
return getQuestInfoHolder(holder)->getActiveQuestNum();
}
s32 getActiveQuestNumForMap(const al::IUseSceneObjHolder* holder) {
s32 questNum = getActiveQuestNum(holder);
bool isWorldSnow = GameDataFunction::isWorldSnow(holder);
return (1 < questNum) & isWorldSnow ? 1 : questNum;
}
bool isActiveQuestAllEqualNo(const al::IUseSceneObjHolder* holder) {
return getActiveQuestNum(holder) ==
getQuestInfoHolder(holder)->getQuestNum(getActiveQuestNo(holder));
}
al::StringTmp<128> getActiveQuestLabel(const al::IUseSceneObjHolder* holder) {
return getQuestInfoHolder(holder)->getActiveQuestLabel();
}
al::StringTmp<128> getActiveQuestStageName(const al::IUseSceneObjHolder* holder) {
return getQuestInfoHolder(holder)->getActiveQuestStageName(holder);
}
bool isActiveQuest(const QuestInfo* quest) {
if (!quest || !quest->QuestInfo::getSceneObjHolder())
return false;
return getQuestInfoHolder(quest)->isActiveQuest(quest);
}
bool isActiveQuest(const sead::PtrArray<QuestInfo>* questList) {
if (!questList)
return false;
s32 size = questList->size();
for (s32 i = 0; i < size; i++) {
QuestInfo* quest = questList->at(i);
if (!quest->QuestInfo::getSceneObjHolder())
return false;
if (getQuestInfoHolder(quest)->isActiveQuest(quest))
return true;
}
return false;
}
s32 getActiveQuestNo(const al::IUseSceneObjHolder* holder) {
return getQuestInfoHolder(holder)->getActiveQuestNo();
}
} // namespace rs

View file

@ -24,25 +24,30 @@ public:
void clearAll();
void finalizeForScene();
void initAfterPlacementSceneObj(const al::ActorInitInfo& _info) override;
void initAfterPlacementQuestObj(s32 quest_no);
void updateActiveList(s32 quest_no);
void initAfterPlacementSceneObj(const al::ActorInitInfo& info) override;
void initAfterPlacementQuestObj(s32 questNo);
void updateActiveList(s32 questNo);
void clearMainQuest();
void initSceneObjHolder(al::SceneObjHolder* scene_obj_holder);
QuestInfo* registerQuestInfo(const QuestInfo* info);
void validateQuest(const QuestInfo* info);
void invalidateQuest(const QuestInfo* info);
s32 getQuestNum(s32 quest_no) const;
void initSceneObjHolder(al::SceneObjHolder* holder);
QuestInfo* registerQuestInfo(const QuestInfo* quest);
void validateQuest(const QuestInfo* quest);
void invalidateQuest(const QuestInfo* quest);
s32 getQuestNum(s32 questNo) const;
al::StringTmp<128> getActiveQuestLabel() const;
al::StringTmp<128>
getActiveQuestStageName(const al::IUseSceneObjHolder* scene_obj_holder) const;
bool isActiveQuest(const QuestInfo* info) const;
QuestInfo* tryFindQuest(const QuestInfo* info) const;
QuestInfo* tryFindQuest(const al::PlacementInfo& placement_info,
al::SceneObjHolder* scene_obj_holder) const;
al::StringTmp<128> getActiveQuestStageName(const al::IUseSceneObjHolder* holder) const;
bool isActiveQuest(const QuestInfo* quest) const;
QuestInfo* tryFindQuest(const QuestInfo* quest) const;
QuestInfo* tryFindQuest(const al::PlacementInfo& placementInfo,
al::SceneObjHolder* holder) const;
const char* getSceneObjName() const override { return "クエスト情報保持者"; }
s32 getActiveQuestNo() const { return mActiveQuestNo; }
s32 getActiveQuestNum() const { return mActiveQuestNum; }
QuestInfo** getActiveQuestList() const { return mActiveQuests; }
private:
s32 mCapacity;
QuestInfo* mQuests = nullptr;
@ -59,24 +64,24 @@ private:
static_assert(sizeof(QuestInfoHolder) == 0x40);
namespace rs {
QuestInfoHolder* getQuestInfoHolder(const al::IUseSceneObjHolder* scene_obj_holder);
QuestInfoHolder* getQuestInfoHolder(const al::IUseSceneObjHolder* holder);
QuestInfo* tryCreateAndRegisterQuestInfoToHolder(const al::LiveActor* actor,
const al::ActorInitInfo& info);
QuestInfo* createAndRegisterQuestInfoToHolderFromLinkedObj(const al::LiveActor* actor,
const al::PlacementInfo& placement_info,
const al::PlacementInfo& placementInfo,
bool is_dummy);
sead::PtrArray<QuestInfo>*
tryCreateAndRegisterQuestInfoToHolderFromLinkedObj(const al::LiveActor* actor,
const al::ActorInitInfo& info);
void validateQuest(const QuestInfo* info);
void invalidateQuest(const QuestInfo* info);
const QuestInfo* const* getActiveQuestList(const al::IUseSceneObjHolder* scene_obj_holder);
s32 getActiveQuestNum(const al::IUseSceneObjHolder* scene_obj_holder);
s32 getActiveQuestNumForMap(const al::IUseSceneObjHolder* scene_obj_holder);
bool isActiveQuestAllEqualNo(const al::IUseSceneObjHolder* scene_obj_holder);
al::StringTmp<128> getActiveQuestLabel(const al::IUseSceneObjHolder* scene_obj_holder);
al::StringTmp<128> getActiveQuestStageName(const al::IUseSceneObjHolder* scene_obj_holder);
bool isActiveQuest(const QuestInfo* info);
void validateQuest(const QuestInfo* quest);
void invalidateQuest(const QuestInfo* quest);
const QuestInfo* const* getActiveQuestList(const al::IUseSceneObjHolder* holder);
s32 getActiveQuestNum(const al::IUseSceneObjHolder* holder);
s32 getActiveQuestNumForMap(const al::IUseSceneObjHolder* holder);
bool isActiveQuestAllEqualNo(const al::IUseSceneObjHolder* holder);
al::StringTmp<128> getActiveQuestLabel(const al::IUseSceneObjHolder* holder);
al::StringTmp<128> getActiveQuestStageName(const al::IUseSceneObjHolder* holder);
bool isActiveQuest(const QuestInfo* quest);
bool isActiveQuest(const sead::PtrArray<QuestInfo>* list);
s32 getActiveQuestNo(const al::IUseSceneObjHolder* scene_obj_holder);
s32 getActiveQuestNo(const al::IUseSceneObjHolder* holder);
} // namespace rs