isle-portable/LEGO1/lego/legoomni/include/legorace.h
2026-01-04 17:23:56 -07:00

187 lines
4.6 KiB
C++

#ifndef LEGORACE_H
#define LEGORACE_H
#include "decomp.h"
#include "legogamestate.h"
#include "legoraceactor.h"
#include "legoracemap.h"
#include "legostate.h"
#include "legoworld.h"
#include "mxgeometry.h"
#include "mxtypes.h"
class Act1State;
class LegoControlManagerNotificationParam;
class LegoPathActor;
class MxEndActionNotificationParam;
class MxNotificationParam;
class LegoPathStructNotificationParam;
// VTABLE: LEGO1 0x100d5e30
// VTABLE: BETA10 0x101be270
// SIZE 0x2c
class RaceState : public LegoState {
public:
// SIZE 0x06
struct Entry {
public:
// FUNCTION: LEGO1 0x10016000
Entry()
{
m_id = 0;
m_lastScore = 0;
m_score = 0;
}
MxS16 GetLastScore() { return m_lastScore; }
// FUNCTION: BETA10 0x10088970
MxS16 GetHighScore() { return m_score; }
// FUNCTION: BETA10 0x100c96f0
MxResult Serialize(LegoStorage* p_storage)
{
if (p_storage->IsReadMode()) {
p_storage->ReadU8(m_id);
p_storage->ReadS16(m_lastScore);
p_storage->ReadS16(m_score);
}
else if (p_storage->IsWriteMode()) {
p_storage->WriteU8(m_id);
p_storage->WriteS16(m_lastScore);
p_storage->WriteS16(m_score);
}
else {
return FAILURE;
}
return SUCCESS;
}
// TODO: Possibly private
MxU8 m_id; // 0x00
MxS16 m_lastScore; // 0x02
MxS16 m_score; // 0x04
};
enum {
e_carrace = 0,
e_jetrace = 1,
e_finished = 2,
};
RaceState();
// FUNCTION: LEGO1 0x10016010
// FUNCTION: BETA10 0x100a9040
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07d0
// STRING: BETA10 0x101f1d20
return "RaceState";
}
// FUNCTION: LEGO1 0x10016020
// FUNCTION: BETA10 0x100a8fd0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c
Entry* GetState(MxU8 p_id);
// SYNTHETIC: LEGO1 0x1000f6f0
// RaceState::~RaceState
// SYNTHETIC: LEGO1 0x100160d0
// RaceState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
Entry m_entries[5]; // 0x08
MxU32 m_state; // 0x28
};
// VTABLE: LEGO1 0x100d5db0
// VTABLE: BETA10 0x101be1e0
// SIZE 0x144
class LegoRace : public LegoWorld {
public:
LegoRace();
~LegoRace() override; // vtable+0x00
MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: BETA10 0x100a8970
static const char* HandlerClassName()
{
// STRING: LEGO1 0x100f07c4
return "LegoRace";
}
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
virtual MxLong HandleControl(LegoControlManagerNotificationParam&) = 0; // vtable+0x6c
// FUNCTION: LEGO1 0x10015b70
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x70
// FUNCTION: LEGO1 0x10015b80
virtual MxLong HandleEndAction(MxEndActionNotificationParam&) { return 0; } // vtable+0x74
// FUNCTION: LEGO1 0x10015b90
MxBool Escape() override { return FALSE; } // vtable+0x64
// FUNCTION: LEGO1 0x10015ba0
// FUNCTION: BETA10 0x100a8940
const char* ClassName() const override // vtable+0x0c
{
return HandlerClassName();
}
// FUNCTION: LEGO1 0x10015bb0
// FUNCTION: BETA10 0x100a88d0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoRace::ClassName()) || LegoWorld::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000dab0
virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78
// FUNCTION: LEGO1 0x1000dac0
// FUNCTION: BETA10 0x100a87d0
virtual void SetMapLocator(LegoRaceMap* p_map, MxU32 p_index) // vtable+0x7c
{
m_mapsLocators[p_index] = p_map;
}
// FUNCTION: LEGO1 0x1000dae0
MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
void Enable(MxBool p_enable) override; // vtable+0x68
// SYNTHETIC: LEGO1 0x10015cc0
// LegoRace::`scalar deleting destructor'
protected:
MxS32 m_playerLaps; // 0xf8
MxS32 m_opponent1Laps; // 0xfc
MxS32 m_opponent2Laps; // 0x100
MxS32 m_playerLastPathStruct; // 0x104
MxS32 m_opponent1LastPathStruct; // 0x108
MxS32 m_opponent2LastPathStruct; // 0x10c
LegoRaceMap* m_mapsLocators[3]; // 0x110
LegoGameState::Area m_destLocation; // 0x11c
LegoPathActor* m_pathActor; // 0x120
Act1State* m_act1State; // 0x124
MxStillPresenter* m_opponent1Locator; // 0x128
MxStillPresenter* m_opponent2Locator; // 0x12c
MxRect32 m_progressBarRect; // 0x130
RaceState* m_raceState; // 0x140
};
#endif // LEGORACE_H