Begin matching CScriptMazeNode

This commit is contained in:
2022-09-14 01:24:12 -04:00
parent 0eefeac3c6
commit 38ca1f6816
8 changed files with 440 additions and 18 deletions

View File

@@ -5,30 +5,35 @@
class CRandom16;
class CGlobalRandom {
static CGlobalRandom* gCurrentGlobalRandom;
static CGlobalRandom* gCurrentGlobalRandom;
public:
CGlobalRandom(CRandom16& rnd);
~CGlobalRandom();
CGlobalRandom(CRandom16& rnd);
~CGlobalRandom();
private:
CRandom16& mRandom;
bool mIsFirst;
CGlobalRandom* mPrev;
CRandom16& mRandom;
bool mIsFirst;
CGlobalRandom* mPrev;
};
class CRandom16 {
friend class CGlobalRandom;
static CRandom16* gRandomNumber;
static void _SetRandomNumber(CRandom16* rnd);
friend class CGlobalRandom;
static CRandom16* gRandomNumber;
static void _SetRandomNumber(CRandom16* rnd);
public:
static CRandom16* GetRandomNumber();
CRandom16(uint seed = 99);
void SetSeed(uint seed);
int Range(int min, int max);
float Range(float min, float max);
int Next();
float Float();
CRandom16(uint seed = 99);
void SetSeed(uint seed);
int Range(int min, int max);
float Range(float min, float max);
int Next();
float Float();
static CRandom16* GetRandomNumber();
private:
uint mSeed;
uint mSeed;
};
#endif // __CRANDOM16_HPP__

View File

@@ -9,6 +9,13 @@
#include "Kyoto/CResLoader.hpp"
class IFactory {
public:
virtual ~IFactory() {}
virtual CFactoryFnReturn Build(const SObjectTag&, const CVParamTransfer&, CObjectReference*) = 0;
virtual void BuildAsync(const SObjectTag&, const CVParamTransfer&, rstl::auto_ptr< IObj >*, CObjectReference*) = 0;
virtual void CancelBuild(const SObjectTag&) = 0;
virtual bool CanBuild(const SObjectTag&) = 0;
virtual const SObjectTag* GetResourceIdByName(const char* name) const = 0;
// TODO
};

View File

@@ -25,6 +25,7 @@ public:
void AddPakFileAsync(const rstl::string&, bool, bool);
void AsyncIdlePakLoading();
bool AreAllPaksLoaded() const;
CInputStream* LoadNewResourceSync(const SObjectTag& tag, char* extBuf);
private:
rstl::list< void > x0_aramList;

View File

@@ -25,6 +25,7 @@ public:
void SendScriptMsgs(EScriptObjectState state, CStateManager& mgr, EScriptObjectMessage msg);
TUniqueId GetUniqueId() const { return x8_uid; }
TAreaId GetAreaId() const;
bool GetActive() const { return x30_24_active; }
static rstl::vector<SConnection> NullConnectionList;

View File

@@ -29,6 +29,7 @@ class CVector3f;
class CWeaponMgr;
class CWorld;
class CWorldTransManager;
class CEntity;
namespace SL {
class CSortedListManager;
@@ -37,8 +38,12 @@ class CSortedListManager;
class CStateManager {
public:
void SendScriptMsg(TUniqueId uid, TEditorId target, EScriptObjectMessage msg, EScriptObjectState state);
void SendScriptMsg(CEntity* ent, TUniqueId target, EScriptObjectMessage msg);
bool AddDrawableActor(const CActor& actor, const CVector3f& pos, const CAABox& bounds) const;
void SetupParticleHook(const CActor& actor) const;
void FreeScriptObject(TUniqueId uid);
CEntity* ObjectById(TUniqueId uid);
CCameraManager* CameraManager() { return x870_cameraManager; }
const CCameraManager* GetCameraManager() const { return x870_cameraManager; }

View File

@@ -5,9 +5,112 @@
#include "MetroidPrime/CActor.hpp"
#include "Kyoto/CRandom16.hpp"
#include "Kyoto/Math/CVector3f.hpp"
#include "rstl/vector.hpp"
#define skMazeCols 9
#define skMazeRows 7
#define skEnterCol 4
#define skEnterRow 4
#define skTargetCol 5
#define skTargetRow 3
#define NUM_MAZE_CELLS (skMazeRows * skMazeCols)
struct SMazeCell {
bool x0_24_openTop : 1;
bool x0_25_openRight : 1;
bool x0_26_openBottom : 1;
bool x0_27_openLeft : 1;
bool x0_28_gateTop : 1;
bool x0_29_gateRight : 1;
bool x0_30_gateBottom : 1;
bool x0_31_gateLeft : 1;
bool x1_24_puddle : 1;
bool x1_25_onPath : 1;
bool x1_26_checked : 1;
SMazeCell() {
x0_24_openTop = x0_25_openRight = x0_26_openBottom = x0_27_openLeft = x0_28_gateTop = x0_29_gateRight = x0_30_gateBottom =
x0_31_gateLeft = x1_24_puddle = x1_25_onPath = x1_26_checked = false;
}
inline bool IsClosed() const { return !x0_24_openTop && !x0_25_openRight && !x0_26_openBottom && !x0_27_openLeft; }
};
class CMazeState {
CRandom16 x0_rand;
SMazeCell x4_cells[skMazeRows * skMazeCols];
int x84_enterCol;
int x88_enterRow;
int x8c_targetCol;
int x90_targetRow;
bool x94_24_initialized : 1;
public:
enum ESide {
kS_Invalid = -1,
kS_Top = 0,
kS_Right = 1,
kS_Bottom = 2,
kS_Left = 3,
};
CMazeState(int enterCol, int enterRow, int targetCol, int targetRow);
void Reset(int seed);
void Initialize();
void GenerateObstacles();
SMazeCell& GetCell(uint col, uint row);
SMazeCell& GetCell2(uint col, uint row); // ????
SMazeCell& GetCellInline(uint col, uint row) { return x4_cells[col + row * skMazeCols]; } // ????
inline SMazeCell& GetCell(uint idx) { return x4_cells[idx]; }
};
class CScriptMazeNode : public CActor {
public:
CScriptMazeNode(TUniqueId uid, const rstl::string& name, const CEntityInfo& info, const CTransform4f& xf, bool active, int col, int row,
int side, const CVector3f& actorPos, const CVector3f& triggerPos, const CVector3f& effectPos);
~CScriptMazeNode() override;
void Accept(IVisitor& visitor) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
void Think(float dt, CStateManager& mgr) override;
static void LoadMazeSeeds();
private:
enum ESide {
Invalid = -1,
Top = 0,
Right = 1,
Bottom = 2,
Left = 3,
};
int xe8_col;
int xec_row;
ESide xf0_side;
TUniqueId xf4_gateEffectId;
float xf8_msgTimer;
TUniqueId xfc_actorId;
CVector3f x100_actorPos;
TUniqueId x10c_triggerId;
CVector3f x110_triggerPos;
TUniqueId x11c_effectId;
CVector3f x120_effectPos;
rstl::vector< TUniqueId > x12c_puddleObjectIds;
bool x13c_24_hasPuddle : 1;
bool x13c_25_hasGate : 1;
bool x13c_26_gateActive : 1;
void GenerateObjects(CStateManager& mgr);
void Reset(CStateManager& mgr);
void SendScriptMsgs(CStateManager& mgr, EScriptObjectMessage msg);
static uint sMazeSeeds[300];
};
#endif