CScriptMazeNode: Working implementation

This commit is contained in:
Luke Street 2020-09-20 03:25:56 -04:00
parent 2cca2b8513
commit eb124a9470
3 changed files with 26 additions and 23 deletions

View File

@ -2749,9 +2749,9 @@ TUniqueId CStateManager::AllocateUniqueId() {
s16 ourIndex;
do {
ourIndex = x0_nextFreeIndex;
x0_nextFreeIndex = (x0_nextFreeIndex + 1) & 0x3ff;
x0_nextFreeIndex = (ourIndex + 1) & 0x3ff;
if (x0_nextFreeIndex == lastIndex) {
LogModule.report(logvisor::Fatal, FMT_STRING("Object List Full!"));
LogModule.report(logvisor::Fatal, FMT_STRING("Object list full!"));
}
} while (GetAllObjectList().GetObjectByIndex(ourIndex) != nullptr);

View File

@ -1,7 +1,7 @@
#include "Runtime/World/CScriptMazeNode.hpp"
#include "Runtime/Character/CModelData.hpp"
#include "Runtime/CStateManager.hpp"
#include "Runtime/Character/CModelData.hpp"
#include "Runtime/GameGlobalObjects.hpp"
#include "Runtime/World/CActorParameters.hpp"
@ -18,8 +18,8 @@ CScriptMazeNode::CScriptMazeNode(TUniqueId uid, std::string_view name, const CEn
: CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(), CActorParameters::None(),
kInvalidUniqueId)
, xe8_col(w1)
, xec_row(w1)
, xf0_(w2)
, xec_row(w2)
, xf0_(w3)
, x100_actorPos(actorPos)
, x110_triggerPos(triggerPos)
, x120_effectPos(effectPos) {}
@ -68,6 +68,7 @@ void CScriptMazeNode::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C
actor->SetTranslation(origin + x120_effectPos);
mgr.SendScriptMsg(actor, GetUniqueId(), EScriptObjectMessage::Activate);
}
break;
}
}
if (x13c_24_) {
@ -376,14 +377,15 @@ void CScriptMazeState::sub_802899c8() {
Initialize();
}
s32 iVar5 = x0_rand.Next();
s32 iVar1 = ((iVar5 / 5) * -5) + 9;
s32 iVar6 = x0_rand.Next();
s32 iVar2 = ((iVar6 / 5) * -5) + 21;
s32 iVar7 = x0_rand.Next();
s32 iVar3 = ((iVar7 / 5) * -5) + 33;
s32 iVar16 = ((x0_rand.Next() / 5) * -5) + 13;
s32 iVar9 = ((x0_rand.Next() / 5) * -5) + 29;
auto GetRandom = [this](s32 offset) constexpr {
s32 tmp = x0_rand.Next();
return tmp + ((tmp / 5) * -5) + offset;
};
s32 rand1 = GetRandom(9);
s32 rand2 = GetRandom(21);
s32 rand3 = GetRandom(33);
s32 rand4 = GetRandom(13);
s32 rand5 = GetRandom(29);
u32 uVar10 = -1;
s32 idx = 0;
@ -395,7 +397,7 @@ void CScriptMazeState::sub_802899c8() {
s32 nextCol;
while (col != x8c_ || row != x90_) {
if (idx == iVar5 + iVar1 || idx == iVar6 + iVar2 || idx == iVar7 + iVar3) {
if (idx == rand1 || idx == rand2 || idx == rand3) {
if (uVar10 == 2) {
GetCell(col, row).x0_28_ = true;
GetCell(prevCol, prevRow).x0_30_ = true;
@ -444,12 +446,12 @@ void CScriptMazeState::sub_802899c8() {
uVar10 = 0;
nextRow = row - 1;
}
if (idx == iVar16 || idx == iVar9) {
if (idx == rand4 || idx == rand5) {
if (col == 0 || row == 0 || col == 8 || row == 6) {
if (idx == iVar16) {
iVar16++;
if (idx == rand4) {
rand4++;
} else {
iVar9++;
rand5++;
}
} else {
auto& cell = GetCell(col, row);

View File

@ -54,7 +54,7 @@ class CScriptMazeNode : public CActor {
s32 xec_row;
s32 xf0_;
TUniqueId xf4_ = kInvalidUniqueId;
float xf8_msgTimer = 0.f;
float xf8_msgTimer = 1.f;
TUniqueId xfc_actorId = kInvalidUniqueId;
zeus::CVector3f x100_actorPos;
TUniqueId x10c_triggerId = kInvalidUniqueId;
@ -62,13 +62,14 @@ class CScriptMazeNode : public CActor {
TUniqueId x11c_effectId = kInvalidUniqueId;
zeus::CVector3f x120_effectPos;
std::vector<TUniqueId> x12c_;
bool x13c_24_ : 1 = true;
bool x13c_24_ : 1 = false;
bool x13c_25_ : 1 = false;
bool x13c_26_ : 1 = false;
bool x13c_26_ : 1 = true;
public:
CScriptMazeNode(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, bool, s32, s32, s32,
const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&);
CScriptMazeNode(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
bool active, s32 w1, s32 w2, s32 w3, const zeus::CVector3f& actorPos,
const zeus::CVector3f& triggerPos, const zeus::CVector3f& effectPos);
void Accept(IVisitor& visitor) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;