mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-23 09:04:21 +00:00
Scene: Implement QuestInfoHolder and QuestInfo
This commit is contained in:
parent
8f46da6630
commit
0da5b54368
|
|
@ -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
113
src/Scene/QuestInfo.cpp
Normal 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());
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
357
src/Scene/QuestInfoHolder.cpp
Normal file
357
src/Scene/QuestInfoHolder.cpp
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue