Consolidate state and building entity classes (#989)

This commit is contained in:
Christian Semmler 2024-06-03 12:53:25 -04:00 committed by GitHub
parent 73bb37596e
commit 133a312aee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
107 changed files with 2190 additions and 2569 deletions

View File

@ -284,14 +284,12 @@ target_link_libraries(omni PRIVATE dsound winmm Smacker::Smacker)
add_library(lego1 SHARED
LEGO1/define.cpp
LEGO1/lego/legoomni/src/act1/act1state.cpp
LEGO1/lego/legoomni/src/act2/legoact2state.cpp
LEGO1/lego/legoomni/src/act3/act3shark.cpp
LEGO1/lego/legoomni/src/act3/act3state.cpp
LEGO1/lego/legoomni/src/actors/act2actor.cpp
LEGO1/lego/legoomni/src/actors/act3actor.cpp
LEGO1/lego/legoomni/src/actors/act3shark.cpp
LEGO1/lego/legoomni/src/actors/ambulance.cpp
LEGO1/lego/legoomni/src/actors/bike.cpp
LEGO1/lego/legoomni/src/actors/buildings.cpp
LEGO1/lego/legoomni/src/actors/bumpbouy.cpp
LEGO1/lego/legoomni/src/actors/doors.cpp
LEGO1/lego/legoomni/src/actors/dunebuggy.cpp
@ -315,11 +313,9 @@ add_library(lego1 SHARED
LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp
LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp
LEGO1/lego/legoomni/src/build/buildingentity.cpp
LEGO1/lego/legoomni/src/build/helicopterstate.cpp
LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp
LEGO1/lego/legoomni/src/build/legocarbuild.cpp
LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp
LEGO1/lego/legoomni/src/common/animstate.cpp
LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
LEGO1/lego/legoomni/src/common/legoactioncontrolpresenter.cpp
LEGO1/lego/legoomni/src/common/legoactors.cpp
LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
@ -356,18 +352,7 @@ add_library(lego1 SHARED
LEGO1/lego/legoomni/src/entity/legopovcontroller.cpp
LEGO1/lego/legoomni/src/entity/legoworld.cpp
LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp
LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp
LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp
LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp
LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp
LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp
LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp
LEGO1/lego/legoomni/src/infocenter/infocenterstate.cpp
LEGO1/lego/legoomni/src/infocenter/scorestate.cpp
LEGO1/lego/legoomni/src/input/legoinputmanager.cpp
LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp
LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp
LEGO1/lego/legoomni/src/isle/radiostate.cpp
LEGO1/lego/legoomni/src/main/legomain.cpp
LEGO1/lego/legoomni/src/main/scripts.cpp
LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp
@ -378,22 +363,14 @@ add_library(lego1 SHARED
LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp
LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp
LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp
LEGO1/lego/legoomni/src/police/policeentity.cpp
LEGO1/lego/legoomni/src/police/policestate.cpp
LEGO1/lego/legoomni/src/race/carrace.cpp
LEGO1/lego/legoomni/src/race/jetskirace.cpp
LEGO1/lego/legoomni/src/race/legorace.cpp
LEGO1/lego/legoomni/src/race/legoraceactor.cpp
LEGO1/lego/legoomni/src/race/legoracecar.cpp
LEGO1/lego/legoomni/src/race/legoracemap.cpp
LEGO1/lego/legoomni/src/race/racestandsentity.cpp
LEGO1/lego/legoomni/src/race/raceskel.cpp
LEGO1/lego/legoomni/src/race/racestate.cpp
LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp
LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp
LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp

View File

@ -1,134 +0,0 @@
#ifndef ACT1STATE_H
#define ACT1STATE_H
#include "legostate.h"
class LegoNamedTexture;
// VTABLE: LEGO1 0x100d7028
// SIZE 0x26c
class Act1State : public LegoState {
public:
enum ElevatorFloor {
c_floor1 = 1,
c_floor2,
c_floor3
};
enum {
e_unk953 = 953,
e_unk954 = 954,
e_unk955 = 955,
};
// SIZE 0x4c
class NamedPlane {
public:
// FUNCTION: LEGO1 0x10033800
NamedPlane() {}
inline void SetName(const char* p_name) { m_name = p_name; }
inline const MxString* GetName() const { return &m_name; }
// FUNCTION: LEGO1 0x100344d0
MxResult Serialize(LegoFile* p_file)
{
if (p_file->IsWriteMode()) {
p_file->WriteString(m_name);
p_file->WriteVector3(m_point1);
p_file->WriteVector3(m_point2);
p_file->WriteVector3(m_point3);
}
else if (p_file->IsReadMode()) {
p_file->ReadString(m_name);
p_file->ReadVector3(m_point1);
p_file->ReadVector3(m_point2);
p_file->ReadVector3(m_point3);
}
return SUCCESS;
}
private:
MxString m_name; // 0x00
Mx3DPointFloat m_point1; // 0x10
Mx3DPointFloat m_point2; // 0x24
Mx3DPointFloat m_point3; // 0x38
};
Act1State();
// FUNCTION: LEGO1 0x100338a0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0154
return "Act1State";
}
// FUNCTION: LEGO1 0x100338b0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name);
}
MxBool SetFlag() override; // vtable+0x18
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
void FUN_10034660();
void FUN_100346a0();
void FUN_10034b60();
void FUN_10034d00();
// TODO: Most likely getters/setters are not used according to BETA.
inline MxU32 GetUnknown18() { return m_unk0x018; }
inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
inline MxU8 GetUnknown21() { return m_unk0x021; }
inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; }
inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; }
inline void SetUnknown21(MxU8 p_unk0x21) { m_unk0x021 = p_unk0x21; }
// SYNTHETIC: LEGO1 0x10033960
// Act1State::`scalar deleting destructor'
MxS32* m_unk0x008; // 0x008 FIXME: count for m_unk0x008
MxS16 m_unk0x00c; // 0x00c
undefined2 m_unk0x00e; // 0x00e
undefined2 m_unk0x010; // 0x010
undefined m_unk0x012; // 0x012
MxS32 m_unk0x014; // 0x014
MxU32 m_unk0x018; // 0x018
MxS16 m_elevFloor; // 0x01c
MxBool m_unk0x01e; // 0x01e
MxBool m_unk0x01f; // 0x01f
MxBool m_planeActive; // 0x020
undefined m_unk0x021; // 0x021
MxBool m_unk0x022; // 0x022
undefined m_unk0x023; // 0x023
NamedPlane m_unk0x024; // 0x024
NamedPlane m_unk0x070; // 0x070
NamedPlane m_unk0x0bc; // 0x0bc
NamedPlane m_unk0x108; // 0x108
LegoNamedTexture* m_unk0x154; // 0x154
LegoNamedTexture* m_unk0x158; // 0x158
LegoNamedTexture* m_unk0x15c; // 0x15c
MxCore* m_unk0x160; // 0x160
NamedPlane m_unk0x164; // 0x164
LegoNamedTexture* m_unk0x1b0; // 0x1b0
LegoNamedTexture* m_unk0x1b4; // 0x1b4
MxCore* m_unk0x1b8; // 0x1b8
NamedPlane m_unk0x1bc; // 0x1bc
LegoNamedTexture* m_unk0x208; // 0x208
MxCore* m_unk0x20c; // 0x20c
NamedPlane m_unk0x210; // 0x210
LegoNamedTexture* m_unk0x25c; // 0x25c
LegoNamedTexture* m_unk0x260; // 0x260
LegoNamedTexture* m_unk0x264; // 0x264
MxCore* m_unk0x268; // 0x268
};
// FUNCTION: LEGO1 0x10033a70
// Act1State::NamedPlane::~NamedPlane
#endif // ACT1STATE_H

View File

@ -1,8 +1,41 @@
#ifndef ACT3_H
#define ACT3_H
#include "legostate.h"
#include "legoworld.h"
// VTABLE: LEGO1 0x100d4fc8
// SIZE 0x0c
class Act3State : public LegoState {
public:
inline Act3State() { m_unk0x08 = 0; }
// FUNCTION: LEGO1 0x1000e300
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f03f0
return "Act3State";
}
// FUNCTION: LEGO1 0x1000e310
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000e2f0
MxBool IsSerializable() override { return FALSE; }
// SYNTHETIC: LEGO1 0x1000e3c0
// Act3State::`scalar deleting destructor'
inline undefined4 GetUnknown0x08() { return m_unk0x08; }
// TODO: Most likely getters/setters are not used according to BETA.
undefined4 m_unk0x08; // 0x08
};
// VTABLE: LEGO1 0x100d9628
// SIZE 0x4274
class Act3 : public LegoWorld {

View File

@ -1,36 +0,0 @@
#ifndef ACT3STATE_H
#define ACT3STATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d4fc8
// SIZE 0x0c
class Act3State : public LegoState {
public:
inline Act3State() { m_unk0x08 = 0; }
// FUNCTION: LEGO1 0x1000e300
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f03f0
return "Act3State";
}
// FUNCTION: LEGO1 0x1000e310
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override;
// SYNTHETIC: LEGO1 0x1000e3c0
// Act3State::`scalar deleting destructor'
inline undefined4 GetUnknown0x08() { return m_unk0x08; }
private:
undefined4 m_unk0x08; // 0x08
};
#endif // ACT3STATE_H

View File

@ -2,8 +2,63 @@
#define AMBULANCE_H
#include "islepathactor.h"
#include "legostate.h"
class AmbulanceMissionState;
// VTABLE: LEGO1 0x100d72a0
// SIZE 0x24
class AmbulanceMissionState : public LegoState {
public:
AmbulanceMissionState();
// FUNCTION: LEGO1 0x10037600
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00e8
return "AmbulanceMissionState";
}
// FUNCTION: LEGO1 0x10037610
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id)
{
switch (p_id) {
case 1:
return m_score1;
case 2:
return m_score2;
case 3:
return m_score3;
case 4:
return m_score4;
case 5:
return m_score5;
default:
return 0;
}
}
// SYNTHETIC: LEGO1 0x100376c0
// AmbulanceMissionState::`scalar deleting destructor'
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
MxU16 m_unk0x10; // 0x10
MxU16 m_unk0x12; // 0x12
MxU16 m_unk0x14; // 0x14
MxU16 m_unk0x16; // 0x16
MxU16 m_unk0x18; // 0x18
MxU16 m_score1; // 0x1a
MxU16 m_score2; // 0x1c
MxU16 m_score3; // 0x1e
MxU16 m_score4; // 0x20
MxU16 m_score5; // 0x22
};
// VTABLE: LEGO1 0x100d71a8
// SIZE 0x184

View File

@ -1,62 +0,0 @@
#ifndef AMBULANCEMISSIONSTATE_H
#define AMBULANCEMISSIONSTATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d72a0
// SIZE 0x24
class AmbulanceMissionState : public LegoState {
public:
AmbulanceMissionState();
// FUNCTION: LEGO1 0x10037600
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00e8
return "AmbulanceMissionState";
}
// FUNCTION: LEGO1 0x10037610
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id)
{
switch (p_id) {
case 1:
return m_score1;
case 2:
return m_score2;
case 3:
return m_score3;
case 4:
return m_score4;
case 5:
return m_score5;
default:
return 0;
}
}
// SYNTHETIC: LEGO1 0x100376c0
// AmbulanceMissionState::`scalar deleting destructor'
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
MxU16 m_unk0x10; // 0x10
MxU16 m_unk0x12; // 0x12
MxU16 m_unk0x14; // 0x14
MxU16 m_unk0x16; // 0x16
MxU16 m_unk0x18; // 0x18
MxU16 m_score1; // 0x1a
MxU16 m_score2; // 0x1c
MxU16 m_score3; // 0x1e
MxU16 m_score4; // 0x20
MxU16 m_score5; // 0x22
};
#endif // AMBULANCEMISSIONSTATE_H

View File

@ -1,71 +0,0 @@
#ifndef ANIMSTATE_H
#define ANIMSTATE_H
#include "legostate.h"
// SIZE 0x30
struct ModelInfo {
char* m_name; // 0x00
MxU8 m_unk0x04; // 0x04
float m_location[3]; // 0x08
float m_direction[3]; // 0x14
float m_up[3]; // 0x20
MxU8 m_unk0x2c; // 0x2c
};
// SIZE 0x30
struct AnimInfo {
char* m_name; // 0x00
MxU32 m_objectId; // 0x04
MxS16 m_location; // 0x08
MxBool m_unk0x0a; // 0x0a
MxU8 m_unk0x0b; // 0x0b
MxU8 m_unk0x0c; // 0x0c
MxU8 m_unk0x0d; // 0x0d
float m_unk0x10[4]; // 0x10
MxU8 m_modelCount; // 0x20
MxU16 m_unk0x22; // 0x22
ModelInfo* m_models; // 0x24
MxS8 m_unk0x28; // 0x28
MxBool m_unk0x29; // 0x29
MxS8 m_unk0x2a[3]; // 0x2a
};
// VTABLE: LEGO1 0x100d8d80
// SIZE 0x1c
class AnimState : public LegoState {
public:
AnimState();
~AnimState() override; // vtable+0x00
// FUNCTION: LEGO1 0x10065070
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0460
return "AnimState";
}
// FUNCTION: LEGO1 0x10065080
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, AnimState::ClassName()) || LegoState::IsA(p_name);
}
MxBool SetFlag() override; // vtable+0x18
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
void FUN_100651d0(MxU32, AnimInfo*, MxU32&);
void FUN_10065240(MxU32, AnimInfo*, MxU32);
// SYNTHETIC: LEGO1 0x10065130
// AnimState::`scalar deleting destructor'
private:
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
void* m_unk0x10; // 0x10
undefined4 m_unk0x14; // 0x14
void* m_unk0x18; // 0x18
};
#endif // ANIMSTATE_H

View File

@ -1,29 +0,0 @@
#ifndef BEACHHOUSEENTITY_H
#define BEACHHOUSEENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d4a18
// SIZE 0x68
class BeachHouseEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ee80
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0314
return "BeachHouseEntity";
}
// FUNCTION: LEGO1 0x1000ee90
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f970
// BeachHouseEntity::`scalar deleting destructor'
};
#endif // BEACHHOUSEENTITY_H

View File

@ -0,0 +1,166 @@
#ifndef BUILDINGS_H
#define BUILDINGS_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d48a8
// SIZE 0x68
class RaceStandsEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000efa0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0300
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000efb0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f9e0
// RaceStandsEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4a18
// SIZE 0x68
class BeachHouseEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ee80
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0314
return "BeachHouseEntity";
}
// FUNCTION: LEGO1 0x1000ee90
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f970
// BeachHouseEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4ab0
// SIZE 0x68
class PoliceEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ed60
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0328
return "PoliceEntity";
}
// FUNCTION: LEGO1 0x1000ed70
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f900
// PoliceEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4b90
// SIZE 0x68
class InfoCenterEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ea00
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f035c
return "InfoCenterEntity";
}
// FUNCTION: LEGO1 0x1000ea10
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f7b0
// InfoCenterEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5068
// SIZE 0x68
class HospitalEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ec40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0338
return "HospitalEntity";
}
// FUNCTION: LEGO1 0x1000ec50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f820
// HospitalEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5200
// SIZE 0x68
class JailEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f0c0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0300
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f0d0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
// STUB: LEGO1 0x100154f0
MxLong VTable0x50(MxParam& p_param) override { return 0; }
// SYNTHETIC: LEGO1 0x1000fac0
// JailEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5258
// SIZE 0x68
class GasStationEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000eb20
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0348
return "GasStationEntity";
}
// FUNCTION: LEGO1 0x1000eb30
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, GasStationEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f890
// GasStationEntity::`scalar deleting destructor'
};
#endif // BUILDINGS_H

View File

@ -4,6 +4,27 @@
#include "decomp.h"
#include "legorace.h"
// VTABLE: LEGO1 0x100d4b70
// SIZE 0x2c
class CarRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dd30
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f009c
return "CarRaceState";
}
// FUNCTION: LEGO1 0x1000dd40
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, CarRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f740
// CarRaceState::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5e50
// SIZE 0x154
class CarRace : public LegoRace {

View File

@ -1,27 +0,0 @@
#ifndef CARRACESTATE_H
#define CARRACESTATE_H
#include "racestate.h"
// VTABLE: LEGO1 0x100d4b70
// SIZE 0x2c
class CarRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dd30
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f009c
return "CarRaceState";
}
// FUNCTION: LEGO1 0x1000dd40
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, CarRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f740
// CarRaceState::`scalar deleting destructor'
};
#endif // CARRACESTATE_H

View File

@ -1,7 +1,7 @@
#ifndef CAVEENTITY_H
#define CAVEENTITY_H
#include "racestandsentity.h"
#include "buildings.h"
// No overrides, uses vtable from RaceStandsEntity
// SIZE 0x68

View File

@ -3,12 +3,55 @@
#include "decomp.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
#include "radio.h"
class GasStationState;
class MxStillPresenter;
// VTABLE: LEGO1 0x100d46e0
// SIZE 0x24
class GasStationState : public LegoState {
public:
// SIZE 0x04
struct Unknown0x14 {
undefined4 m_unk0x00; // 0x00
};
GasStationState();
// FUNCTION: LEGO1 0x100061d0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0174
return "GasStationState";
}
// FUNCTION: LEGO1 0x100061e0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x10006290
// GasStationState::`scalar deleting destructor'
void FUN_10006430(undefined4);
void FUN_10006490();
// TODO: Most likely getters/setters are not used according to BETA.
undefined4 m_unk0x08[3]; // 0x08
Unknown0x14 m_unk0x14; // 0x14
MxS16 m_unk0x18; // 0x18
MxS16 m_unk0x1a; // 0x1a
MxS16 m_unk0x1c; // 0x1c
MxS16 m_unk0x1e; // 0x1e
MxS16 m_unk0x20; // 0x20
};
// VTABLE: LEGO1 0x100d4650
// SIZE 0x128
class GasStation : public LegoWorld {

View File

@ -1,29 +0,0 @@
#ifndef GASSTATIONENTITY_H
#define GASSTATIONENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d5258
// SIZE 0x68
class GasStationEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000eb20
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0348
return "GasStationEntity";
}
// FUNCTION: LEGO1 0x1000eb30
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, GasStationEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f890
// GasStationEntity::`scalar deleting destructor'
};
#endif // GASSTATIONENTITY_H

View File

@ -1,50 +0,0 @@
#ifndef GASSTATIONSTATE_H
#define GASSTATIONSTATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d46e0
// SIZE 0x24
class GasStationState : public LegoState {
public:
// SIZE 0x04
struct Unknown0x14 {
undefined4 m_unk0x00; // 0x00
};
GasStationState();
// FUNCTION: LEGO1 0x100061d0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0174
return "GasStationState";
}
// FUNCTION: LEGO1 0x100061e0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x10006290
// GasStationState::`scalar deleting destructor'
void FUN_10006430(undefined4);
void FUN_10006490();
friend class GasStation;
private:
undefined4 m_unk0x08[3]; // 0x08
Unknown0x14 m_unk0x14; // 0x14
MxS16 m_unk0x18; // 0x18
MxS16 m_unk0x1a; // 0x1a
MxS16 m_unk0x1c; // 0x1c
MxS16 m_unk0x1e; // 0x1e
MxS16 m_unk0x20; // 0x20
};
#endif // GASSTATIONSTATE_H

View File

@ -2,9 +2,46 @@
#define HELICOPTER_H
#include "islepathactor.h"
#include "legostate.h"
#include "realtime/matrix.h"
class HelicopterState;
// VTABLE: LEGO1 0x100d5418
// SIZE 0x0c
class HelicopterState : public LegoState {
public:
// FUNCTION: LEGO1 0x1000e0d0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0144
return "HelicopterState";
}
// FUNCTION: LEGO1 0x1000e0e0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000e0b0
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000e0c0
MxBool SetFlag() override
{
m_unk0x08 = 0;
return TRUE;
} // vtable+0x18
inline void SetUnknown8(MxU32 p_unk0x08) { m_unk0x08 = p_unk0x08; }
inline MxU32 GetUnkown8() { return m_unk0x08; }
// SYNTHETIC: LEGO1 0x1000e190
// HelicopterState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
MxU32 m_unk0x08; // 0x08
};
// VTABLE: LEGO1 0x100d40f8
// SIZE 0x230

View File

@ -1,44 +0,0 @@
#ifndef HELICOPTERSTATE_H
#define HELICOPTERSTATE_H
#include "decomp.h"
#include "legostate.h"
// VTABLE: LEGO1 0x100d5418
// SIZE 0x0c
class HelicopterState : public LegoState {
public:
// FUNCTION: LEGO1 0x1000e0d0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0144
return "HelicopterState";
}
// FUNCTION: LEGO1 0x1000e0e0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000e0b0
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000e0c0
MxBool SetFlag() override
{
m_unk0x08 = 0;
return TRUE;
} // vtable+0x18
inline void SetUnknown8(MxU32 p_unk0x08) { m_unk0x08 = p_unk0x08; }
inline MxU32 GetUnkown8() { return m_unk0x08; }
// SYNTHETIC: LEGO1 0x1000e190
// HelicopterState::`scalar deleting destructor'
protected:
MxU32 m_unk0x08; // 0x08
};
#endif // HELICOPTERSTATE_H

View File

@ -4,13 +4,54 @@
#include "actionsfwd.h"
#include "decomp.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
class HospitalState;
class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class MxStillPresenter;
// VTABLE: LEGO1 0x100d97a0
// SIZE 0x18
class HospitalState : public LegoState {
public:
// SIZE 0x04
struct Unknown0x08 {
undefined4 m_unk0x00; // 0x00
};
HospitalState();
~HospitalState() override {}
// FUNCTION: LEGO1 0x10076400
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0480
return "HospitalState";
}
// FUNCTION: LEGO1 0x10076410
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x100764c0
// HospitalState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
Unknown0x08 m_unk0x08; // 0x08
MxS16 m_unk0x0c; // 0x0c
MxS16 m_unk0x0e; // 0x0e
MxS16 m_unk0x10; // 0x10
MxS16 m_unk0x12; // 0x12
MxS16 m_unk0x14; // 0x14
MxS16 m_unk0x16; // 0x16
};
// VTABLE: LEGO1 0x100d9730
// SIZE 0x12c
class Hospital : public LegoWorld {

View File

@ -1,29 +0,0 @@
#ifndef HOSPITALENTITY_H
#define HOSPITALENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d5068
// SIZE 0x68
class HospitalEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ec40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0338
return "HospitalEntity";
}
// FUNCTION: LEGO1 0x1000ec50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f820
// HospitalEntity::`scalar deleting destructor'
};
#endif // HOSPITALENTITY_H

View File

@ -1,49 +0,0 @@
#ifndef HOSPITALSTATE_H
#define HOSPITALSTATE_H
#include "decomp.h"
#include "legostate.h"
// VTABLE: LEGO1 0x100d97a0
// SIZE 0x18
class HospitalState : public LegoState {
public:
// SIZE 0x04
struct Unknown0x08 {
undefined4 m_unk0x00; // 0x00
};
HospitalState();
~HospitalState() override {}
// FUNCTION: LEGO1 0x10076400
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0480
return "HospitalState";
}
// FUNCTION: LEGO1 0x10076410
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x100764c0
// HospitalState::`scalar deleting destructor'
friend class Hospital;
private:
Unknown0x08 m_unk0x08; // 0x08
MxS16 m_unk0x0c; // 0x0c
MxS16 m_unk0x0e; // 0x0e
MxS16 m_unk0x10; // 0x10
MxS16 m_unk0x12; // 0x12
MxS16 m_unk0x14; // 0x14
MxS16 m_unk0x16; // 0x16
};
#endif // HOSPITALSTATE_H

View File

@ -3,15 +3,65 @@
#include "actionsfwd.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
#include "mxrect32.h"
#include "radio.h"
class InfocenterState;
class MxNotificationParam;
class MxStillPresenter;
class LegoControlManagerEvent;
// VTABLE: LEGO1 0x100d93a8
// SIZE 0x94
class InfocenterState : public LegoState {
public:
InfocenterState();
~InfocenterState() override;
// FUNCTION: LEGO1 0x10071840
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f04dc
return "InfocenterState";
}
// FUNCTION: LEGO1 0x10071850
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, InfocenterState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x10071830
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
inline MxS16 GetMaxNameLength() { return sizeOfArray(m_letters); }
inline MxStillPresenter* GetNameLetter(MxS32 p_index) { return m_letters[p_index]; }
inline void SetNameLetter(MxS32 p_index, MxStillPresenter* p_letter) { m_letters[p_index] = p_letter; }
inline MxBool HasRegistered() { return m_letters[0] != NULL; }
inline Playlist& GetExitDialogueAct1() { return m_exitDialogueAct1; }
inline Playlist& GetExitDialogueAct23() { return m_exitDialogueAct23; }
inline Playlist& GetReturnDialogue(LegoGameState::Act p_act) { return m_returnDialogue[p_act]; }
inline Playlist& GetLeaveDialogue(LegoGameState::Act p_act) { return m_leaveDialogue[p_act]; }
inline Playlist& GetBricksterDialogue() { return m_bricksterDialogue; }
inline MxU32 GetUnknown0x74() { return m_unk0x74; }
inline void SetUnknown0x74(MxU32 p_unk0x74) { m_unk0x74 = p_unk0x74; }
// SYNTHETIC: LEGO1 0x10071900
// InfocenterState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
Playlist m_exitDialogueAct1; // 0x08
Playlist m_exitDialogueAct23; // 0x14
Playlist m_returnDialogue[3]; // 0x20
Playlist m_leaveDialogue[3]; // 0x44
Playlist m_bricksterDialogue; // 0x68
MxU32 m_unk0x74; // 0x74
MxStillPresenter* m_letters[7]; // 0x78
};
// SIZE 0x18
struct InfocenterMapEntry {
// FUNCTION: LEGO1 0x1006ec80

View File

@ -1,29 +0,0 @@
#ifndef INFOCENTERENTITY_H
#define INFOCENTERENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d4b90
// SIZE 0x68
class InfoCenterEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ea00
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f035c
return "InfoCenterEntity";
}
// FUNCTION: LEGO1 0x1000ea10
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f7b0
// InfoCenterEntity::`scalar deleting destructor'
};
#endif // INFOCENTERENTITY_H

View File

@ -1,59 +0,0 @@
#ifndef INFOCENTERSTATE_H
#define INFOCENTERSTATE_H
#include "decomp.h"
#include "legogamestate.h"
#include "legostate.h"
class MxStillPresenter;
// VTABLE: LEGO1 0x100d93a8
// SIZE 0x94
class InfocenterState : public LegoState {
public:
InfocenterState();
~InfocenterState() override;
// FUNCTION: LEGO1 0x10071840
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f04dc
return "InfocenterState";
}
// FUNCTION: LEGO1 0x10071850
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, InfocenterState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x10071830
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
inline MxS16 GetMaxNameLength() { return sizeOfArray(m_letters); }
inline MxStillPresenter* GetNameLetter(MxS32 p_index) { return m_letters[p_index]; }
inline void SetNameLetter(MxS32 p_index, MxStillPresenter* p_letter) { m_letters[p_index] = p_letter; }
inline MxBool HasRegistered() { return m_letters[0] != NULL; }
inline Playlist& GetExitDialogueAct1() { return m_exitDialogueAct1; }
inline Playlist& GetExitDialogueAct23() { return m_exitDialogueAct23; }
inline Playlist& GetReturnDialogue(LegoGameState::Act p_act) { return m_returnDialogue[p_act]; }
inline Playlist& GetLeaveDialogue(LegoGameState::Act p_act) { return m_leaveDialogue[p_act]; }
inline Playlist& GetBricksterDialogue() { return m_bricksterDialogue; }
inline MxU32 GetUnknown0x74() { return m_unk0x74; }
inline void SetUnknown0x74(MxU32 p_unk0x74) { m_unk0x74 = p_unk0x74; }
// SYNTHETIC: LEGO1 0x10071900
// InfocenterState::`scalar deleting destructor'
private:
Playlist m_exitDialogueAct1; // 0x08
Playlist m_exitDialogueAct23; // 0x14
Playlist m_returnDialogue[3]; // 0x20
Playlist m_leaveDialogue[3]; // 0x44
Playlist m_bricksterDialogue; // 0x68
MxU32 m_unk0x74; // 0x74
MxStillPresenter* m_letters[7]; // 0x78
};
#endif // INFOCENTERSTATE_H

View File

@ -3,16 +3,17 @@
#include "actionsfwd.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
#include "radio.h"
class Act1State;
class Ambulance;
class Bike;
class DuneBuggy;
class Helicopter;
class Jetski;
class JukeBoxEntity;
class LegoNamedTexture;
class Motocycle;
class MxType19NotificationParam;
class Pizza;
@ -21,6 +22,132 @@ class RaceCar;
class SkateBoard;
class TowTrack;
// VTABLE: LEGO1 0x100d7028
// SIZE 0x26c
class Act1State : public LegoState {
public:
enum ElevatorFloor {
c_floor1 = 1,
c_floor2,
c_floor3
};
enum {
e_unk953 = 953,
e_unk954 = 954,
e_unk955 = 955,
};
// SIZE 0x4c
class NamedPlane {
public:
// FUNCTION: LEGO1 0x10033800
NamedPlane() {}
inline void SetName(const char* p_name) { m_name = p_name; }
inline const MxString* GetName() const { return &m_name; }
// FUNCTION: LEGO1 0x100344d0
MxResult Serialize(LegoFile* p_file)
{
if (p_file->IsWriteMode()) {
p_file->WriteString(m_name);
p_file->WriteVector3(m_point1);
p_file->WriteVector3(m_point2);
p_file->WriteVector3(m_point3);
}
else if (p_file->IsReadMode()) {
p_file->ReadString(m_name);
p_file->ReadVector3(m_point1);
p_file->ReadVector3(m_point2);
p_file->ReadVector3(m_point3);
}
return SUCCESS;
}
private:
MxString m_name; // 0x00
Mx3DPointFloat m_point1; // 0x10
Mx3DPointFloat m_point2; // 0x24
Mx3DPointFloat m_point3; // 0x38
};
Act1State();
// FUNCTION: LEGO1 0x100338a0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0154
return "Act1State";
}
// FUNCTION: LEGO1 0x100338b0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name);
}
MxBool SetFlag() override; // vtable+0x18
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
void FUN_10034660();
void FUN_100346a0();
void FUN_10034b60();
void FUN_10034d00();
inline MxU32 GetUnknown18() { return m_unk0x018; }
inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
inline MxU8 GetUnknown21() { return m_unk0x021; }
inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; }
inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; }
inline void SetUnknown21(MxU8 p_unk0x21) { m_unk0x021 = p_unk0x21; }
// SYNTHETIC: LEGO1 0x10033960
// Act1State::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
MxS32* m_unk0x008; // 0x008 FIXME: count for m_unk0x008
MxS16 m_unk0x00c; // 0x00c
undefined2 m_unk0x00e; // 0x00e
undefined2 m_unk0x010; // 0x010
undefined m_unk0x012; // 0x012
MxS32 m_unk0x014; // 0x014
MxU32 m_unk0x018; // 0x018
MxS16 m_elevFloor; // 0x01c
MxBool m_unk0x01e; // 0x01e
MxBool m_unk0x01f; // 0x01f
MxBool m_planeActive; // 0x020
undefined m_unk0x021; // 0x021
MxBool m_unk0x022; // 0x022
undefined m_unk0x023; // 0x023
NamedPlane m_unk0x024; // 0x024
NamedPlane m_unk0x070; // 0x070
NamedPlane m_unk0x0bc; // 0x0bc
NamedPlane m_unk0x108; // 0x108
LegoNamedTexture* m_unk0x154; // 0x154
LegoNamedTexture* m_unk0x158; // 0x158
LegoNamedTexture* m_unk0x15c; // 0x15c
MxCore* m_unk0x160; // 0x160
NamedPlane m_unk0x164; // 0x164
LegoNamedTexture* m_unk0x1b0; // 0x1b0
LegoNamedTexture* m_unk0x1b4; // 0x1b4
MxCore* m_unk0x1b8; // 0x1b8
NamedPlane m_unk0x1bc; // 0x1bc
LegoNamedTexture* m_unk0x208; // 0x208
MxCore* m_unk0x20c; // 0x20c
NamedPlane m_unk0x210; // 0x210
LegoNamedTexture* m_unk0x25c; // 0x25c
LegoNamedTexture* m_unk0x260; // 0x260
LegoNamedTexture* m_unk0x264; // 0x264
MxCore* m_unk0x268; // 0x268
};
// FUNCTION: LEGO1 0x10033a70
// Act1State::NamedPlane::~NamedPlane
// VTABLE: LEGO1 0x100d6fb8
// SIZE 0x140
class Isle : public LegoWorld {

View File

@ -1,29 +0,0 @@
#ifndef JAILENTITY_H
#define JAILENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d5200
// SIZE 0x68
class JailEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f0c0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0300
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f0d0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
// STUB: LEGO1 0x100154f0
MxLong VTable0x50(MxParam& p_param) override { return 0; }
// SYNTHETIC: LEGO1 0x1000fac0
// JailEntity::`scalar deleting destructor'
};
#endif // JAILENTITY_H

View File

@ -3,6 +3,27 @@
#include "legorace.h"
// VTABLE: LEGO1 0x100d4fa8
// SIZE 0x2c
class JetskiRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dc40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00ac
return "JetskiRaceState";
}
// FUNCTION: LEGO1 0x1000dc50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f680
// JetskiRaceState::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4fe8
// SIZE 0x144
class JetskiRace : public LegoRace {

View File

@ -1,27 +0,0 @@
#ifndef JETSKIRACESTATE_H
#define JETSKIRACESTATE_H
#include "racestate.h"
// VTABLE: LEGO1 0x100d4fa8
// SIZE 0x2c
class JetskiRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dc40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00ac
return "JetskiRaceState";
}
// FUNCTION: LEGO1 0x1000dc50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f680
// JetskiRaceState::`scalar deleting destructor'
};
#endif // JETSKIRACESTATE_H

View File

@ -3,10 +3,46 @@
#include "decomp.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
class LegoControlManagerEvent;
class JukeBoxState;
// VTABLE: LEGO1 0x100d4a90
// SIZE 0x10
class JukeBoxState : public LegoState {
public:
enum Music {
e_pasquell = 0,
e_right,
e_decal,
e_wallis,
e_nelson,
e_torpedos
};
// FUNCTION: LEGO1 0x1000f310
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f02bc
return "JukeBoxState";
}
// FUNCTION: LEGO1 0x1000f320
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000f300
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000f3d0
// JukeBoxState::`scalar deleting destructor'
Music m_music; // 0x08
MxU32 m_active; // 0x0c
};
// VTABLE: LEGO1 0x100d8958
// SIZE 0x104

View File

@ -1,41 +0,0 @@
#ifndef JUKEBOXSTATE_H
#define JUKEBOXSTATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d4a90
// SIZE 0x10
class JukeBoxState : public LegoState {
public:
enum Music {
e_pasquell = 0,
e_right,
e_decal,
e_wallis,
e_nelson,
e_torpedos
};
// FUNCTION: LEGO1 0x1000f310
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f02bc
return "JukeBoxState";
}
// FUNCTION: LEGO1 0x1000f320
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override; // vtable+0x14
// SYNTHETIC: LEGO1 0x1000f3d0
// JukeBoxState::`scalar deleting destructor'
Music m_music; // 0x08
MxU32 m_active; // 0x0c
};
#endif // JUKEBOXSTATE_H

View File

@ -2,8 +2,43 @@
#define LEGOACT2_H
#include "act2brick.h"
#include "legostate.h"
#include "legoworld.h"
// VTABLE: LEGO1 0x100d4a70
// SIZE 0x10
class LegoAct2State : public LegoState {
public:
~LegoAct2State() override {}
// FUNCTION: LEGO1 0x1000df80
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0428
return "LegoAct2State";
}
// FUNCTION: LEGO1 0x1000df90
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000df70
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000e040
// LegoAct2State::`scalar deleting destructor'
inline undefined4 GetUnknown0x08() { return m_unk0x08; }
inline void SetUnknown0x0c(undefined p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
// TODO: Most likely getters/setters are not used according to BETA.
undefined4 m_unk0x08; // 0x08
undefined m_unk0x0c; // 0x0c
};
// VTABLE: LEGO1 0x100d82e0
// SIZE 0x1154
class LegoAct2 : public LegoWorld {

View File

@ -1,38 +0,0 @@
#ifndef LEGOACT2STATE_H
#define LEGOACT2STATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d4a70
// SIZE 0x10
class LegoAct2State : public LegoState {
public:
~LegoAct2State() override {}
// FUNCTION: LEGO1 0x1000df80
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0428
return "LegoAct2State";
}
// FUNCTION: LEGO1 0x1000df90
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override; // vtable+0x14
// SYNTHETIC: LEGO1 0x1000e040
// LegoAct2State::`scalar deleting destructor'
inline undefined4 GetUnknown0x08() { return m_unk0x08; }
inline void SetUnknown0x0c(undefined p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
private:
undefined4 m_unk0x08; // 0x08
undefined m_unk0x0c; // 0x0c
};
#endif // LEGOACT2STATE_H

View File

@ -4,11 +4,11 @@
#include "actionsfwd.h"
#include "decomp.h"
#include "legolocations.h"
#include "legostate.h"
#include "legotraninfolist.h"
#include "mxcore.h"
#include "mxgeometry/mxgeometry3d.h"
class AnimState;
class LegoAnimPresenter;
class LegoEntity;
class LegoExtraActor;
@ -18,9 +18,73 @@ class LegoPathBoundary;
class LegoROIList;
struct LegoUnknown100db7f4;
class LegoWorld;
struct ModelInfo;
class MxDSAction;
// SIZE 0x30
struct ModelInfo {
char* m_name; // 0x00
MxU8 m_unk0x04; // 0x04
float m_location[3]; // 0x08
float m_direction[3]; // 0x14
float m_up[3]; // 0x20
MxU8 m_unk0x2c; // 0x2c
};
// SIZE 0x30
struct AnimInfo {
char* m_name; // 0x00
MxU32 m_objectId; // 0x04
MxS16 m_location; // 0x08
MxBool m_unk0x0a; // 0x0a
MxU8 m_unk0x0b; // 0x0b
MxU8 m_unk0x0c; // 0x0c
MxU8 m_unk0x0d; // 0x0d
float m_unk0x10[4]; // 0x10
MxU8 m_modelCount; // 0x20
MxU16 m_unk0x22; // 0x22
ModelInfo* m_models; // 0x24
MxS8 m_unk0x28; // 0x28
MxBool m_unk0x29; // 0x29
MxS8 m_unk0x2a[3]; // 0x2a
};
// VTABLE: LEGO1 0x100d8d80
// SIZE 0x1c
class AnimState : public LegoState {
public:
AnimState();
~AnimState() override; // vtable+0x00
// FUNCTION: LEGO1 0x10065070
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0460
return "AnimState";
}
// FUNCTION: LEGO1 0x10065080
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, AnimState::ClassName()) || LegoState::IsA(p_name);
}
MxBool SetFlag() override; // vtable+0x18
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
void FUN_100651d0(MxU32, AnimInfo*, MxU32&);
void FUN_10065240(MxU32, AnimInfo*, MxU32);
// SYNTHETIC: LEGO1 0x10065130
// AnimState::`scalar deleting destructor'
private:
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
void* m_unk0x10; // 0x10
undefined4 m_unk0x14; // 0x14
void* m_unk0x18; // 0x18
};
// VTABLE: LEGO1 0x100d8c18
// SIZE 0x500
class LegoAnimationManager : public MxCore {

View File

@ -1,8 +1,54 @@
#ifndef LEGOCARBUILD_H
#define LEGOCARBUILD_H
#include "legostate.h"
#include "legoworld.h"
// VTABLE: LEGO1 0x100d66e0
// SIZE 0x50
class LegoVehicleBuildState : public LegoState {
public:
LegoVehicleBuildState(char* p_classType);
// FUNCTION: LEGO1 0x10025ff0
inline const char* ClassName() const override // vtable+0x0c
{
return this->m_className.GetData();
}
// FUNCTION: LEGO1 0x10026000
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x100260a0
// LegoVehicleBuildState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
Playlist m_unk0x08[4]; // 0x08
// This can be one of the following:
// * LegoRaceCarBuildState
// * LegoCopterBuildState
// * LegoDuneCarBuildState
// * LegoJetskiBuildState
MxString m_className; // 0x38
// Known States:
// * 1 == enter(ing) build screen
// * 3 == cutscene/dialogue
// * 6 == exit(ing) build screen
MxU32 m_animationState; // 0x48
undefined m_unk0x4c; // 0x4c
MxBool m_unk0x4d; // 0x4d
MxBool m_unk0x4e; // 0x4e
MxU8 m_placedPartCount; // 0x4f
};
// VTABLE: LEGO1 0x100d6658
// SIZE 0x34c
class LegoCarBuild : public LegoWorld {

View File

@ -1,5 +1,5 @@
#ifndef LEGOCARBUILDANIMPRESENTER_H
#define LEGOCARBUILDANIMPRESENTER_H
#ifndef LEGOCARBUILDPRESENTER_H
#define LEGOCARBUILDPRESENTER_H
#include "anim/legoanim.h"
#include "legoanimpresenter.h"
@ -59,4 +59,4 @@ private:
undefined4 m_unk0x14c; // 0x14c
};
#endif // LEGOCARBUILDANIMPRESENTER_H
#endif // LEGOCARBUILDPRESENTER_H

View File

@ -2,10 +2,60 @@
#define LEGORACE_H
#include "decomp.h"
#include "legostate.h"
#include "legoworld.h"
#include "mxrect32.h"
#include "mxtypes.h"
// VTABLE: LEGO1 0x100d5e30
// SIZE 0x2c
class RaceState : public LegoState {
public:
// SIZE 0x06
struct Entry {
public:
inline MxS16 GetUnknown0x02() { return m_unk0x02; }
inline MxU16 GetScore() { return m_score; }
// TODO: Possibly private
MxU8 m_id; // 0x00
MxS16 m_unk0x02; // 0x02
MxU16 m_score; // 0x04
};
RaceState();
// FUNCTION: LEGO1 0x10016010
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07d0
return "RaceState";
}
// FUNCTION: LEGO1 0x10016020
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
Entry* GetState(MxU8 p_id);
inline undefined4 GetUnknown0x28() { return m_unk0x28; }
// 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_state[5]; // 0x08
undefined4 m_unk0x28; // 0x28
};
// VTABLE: LEGO1 0x100d5db0
// SIZE 0x144
class LegoRace : public LegoWorld {

View File

@ -1,52 +0,0 @@
#ifndef LEGOVEHICLEBUILDSTATE_H
#define LEGOVEHICLEBUILDSTATE_H
#include "decomp.h"
#include "legostate.h"
#include "mxstring.h"
// VTABLE: LEGO1 0x100d66e0
// SIZE 0x50
class LegoVehicleBuildState : public LegoState {
public:
LegoVehicleBuildState(char* p_classType);
// FUNCTION: LEGO1 0x10025ff0
inline const char* ClassName() const override // vtable+0x0c
{
return this->m_className.GetData();
}
// FUNCTION: LEGO1 0x10026000
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x100260a0
// LegoVehicleBuildState::`scalar deleting destructor'
// private:
Playlist m_unk0x08[4]; // 0x08
// This can be one of the following:
// * LegoRaceCarBuildState
// * LegoCopterBuildState
// * LegoDuneCarBuildState
// * LegoJetskiBuildState
MxString m_className; // 0x38
// Known States:
// * 1 == enter(ing) build screen
// * 3 == cutscene/dialogue
// * 6 == exit(ing) build screen
MxU32 m_animationState; // 0x48
undefined m_unk0x4c; // 0x4c
MxBool m_unk0x4d; // 0x4d
MxBool m_unk0x4e; // 0x4e
MxU8 m_placedPartCount; // 0x4f
};
#endif // LEGOVEHICLEBUILDSTATE_H

View File

@ -3,11 +3,52 @@
#include "decomp.h"
#include "isleactor.h"
#include "legostate.h"
class Act1State;
class PizzaMissionState;
class SkateBoard;
// VTABLE: LEGO1 0x100d7408
// SIZE 0xb0
class PizzaMissionState : public LegoState {
public:
// SIZE 0x20
struct Entry {
public:
undefined2 m_unk0x00; // 0x00
MxU8 m_id; // 0x02
undefined m_unk0x03[0x15]; // 0x03
MxU16 m_score; // 0x18
undefined m_unk0x18[6]; // 0x1a
};
// FUNCTION: LEGO1 0x10039290
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00d4
return "PizzaMissionState";
}
// FUNCTION: LEGO1 0x100392a0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id) { return GetState(p_id)->m_score; }
// SYNTHETIC: LEGO1 0x10039350
// PizzaMissionState::`scalar deleting destructor'
Entry* GetState(MxU8 p_id);
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
Entry m_state[5]; // 0x10
};
// VTABLE: LEGO1 0x100d7380
// SIZE 0x9c
class Pizza : public IsleActor {

View File

@ -1,47 +0,0 @@
#ifndef PIZZAMISSIONSTATE_H
#define PIZZAMISSIONSTATE_H
#include "legostate.h"
// SIZE 0x20
struct PizzaMissionStateEntry {
public:
undefined2 m_unk0x00; // 0x00
MxU8 m_id; // 0x02
undefined m_unk0x03[0x15]; // 0x03
MxU16 m_score; // 0x18
undefined m_unk0x18[6]; // 0x1a
};
// VTABLE: LEGO1 0x100d7408
// SIZE 0xb0
class PizzaMissionState : public LegoState {
public:
// FUNCTION: LEGO1 0x10039290
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00d4
return "PizzaMissionState";
}
// FUNCTION: LEGO1 0x100392a0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id) { return GetState(p_id)->m_score; }
// SYNTHETIC: LEGO1 0x10039350
// PizzaMissionState::`scalar deleting destructor'
PizzaMissionStateEntry* GetState(MxU8 p_id);
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
PizzaMissionStateEntry m_state[5]; // 0x10
};
#endif // PIZZAMISSIONSTATE_H

View File

@ -3,10 +3,51 @@
#include "decomp.h"
#include "isleactor.h"
#include "legostate.h"
class PizzeriaState;
class PizzaMissionState;
// VTABLE: LEGO1 0x100d5ee8
// SIZE 0x58
class PizzeriaState : public LegoState {
public:
// SIZE 0x14
struct StateStruct {
undefined4 m_unk0x00; // 0x00
undefined4 m_unk0x04; // 0x04
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
undefined4 m_unk0x10; // 0x10
};
PizzeriaState();
// FUNCTION: LEGO1 0x10017c20
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0370
return "PizzeriaState";
}
// FUNCTION: LEGO1 0x10017c30
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x10017ce0
// PizzeriaState::`scalar deleting destructor'
MxU32 FUN_10017d70();
// TODO: Most likely getters/setters are not used according to BETA.
Playlist m_unk0x08[5]; // 0x08
StateStruct m_unk0x44; // 0x44
};
// VTABLE: LEGO1 0x100d5520
// SIZE 0x84
class Pizzeria : public IsleActor {

View File

@ -1,46 +0,0 @@
#ifndef PIZZERIASTATE_H
#define PIZZERIASTATE_H
#include "legostate.h"
// SIZE 0x14
struct PizzeriaStateStruct {
undefined4 m_unk0x00; // 0x00
undefined4 m_unk0x04; // 0x04
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
undefined4 m_unk0x10; // 0x10
};
// VTABLE: LEGO1 0x100d5ee8
// SIZE 0x58
class PizzeriaState : public LegoState {
public:
PizzeriaState();
// FUNCTION: LEGO1 0x10017c20
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0370
return "PizzeriaState";
}
// FUNCTION: LEGO1 0x10017c30
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x10017ce0
// PizzeriaState::`scalar deleting destructor'
MxU32 FUN_10017d70();
private:
Playlist m_unk0x08[5]; // 0x08
PizzeriaStateStruct m_unk0x44; // 0x44
};
#endif // PIZZERIASTATE_H

View File

@ -3,13 +3,49 @@
#include "decomp.h"
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
#include "radio.h"
class LegoControlManagerEvent;
class LegoEventNotificationParam;
class MxDSAction;
class PoliceState;
// VTABLE: LEGO1 0x100d8af0
// SIZE 0x10
class PoliceState : public LegoState {
public:
PoliceState();
~PoliceState() override {}
// FUNCTION: LEGO1 0x1005e860
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0444
return "PoliceState";
}
// FUNCTION: LEGO1 0x1005e870
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x1005e920
// PoliceState::`scalar deleting destructor'
inline undefined4 GetUnknown0x0c() { return m_unk0x0c; }
inline void SetUnknown0x0c(undefined4 p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
void FUN_1005ea40();
// TODO: Most likely getters/setters are not used according to BETA.
PoliceScript::Script m_policeScript; // 0x08
undefined4 m_unk0x0c; // 0x0c
};
// VTABLE: LEGO1 0x100d8a80
// SIZE 0x110

View File

@ -1,29 +0,0 @@
#ifndef POLICEENTITY_H
#define POLICEENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d4ab0
// SIZE 0x68
class PoliceEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ed60
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0328
return "PoliceEntity";
}
// FUNCTION: LEGO1 0x1000ed70
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f900
// PoliceEntity::`scalar deleting destructor'
};
#endif // POLICEENTITY_H

View File

@ -1,43 +0,0 @@
#ifndef POLICESTATE_H
#define POLICESTATE_H
#include "actionsfwd.h"
#include "decomp.h"
#include "legostate.h"
// VTABLE: LEGO1 0x100d8af0
// SIZE 0x10
class PoliceState : public LegoState {
public:
PoliceState();
~PoliceState() override {}
// FUNCTION: LEGO1 0x1005e860
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0444
return "PoliceState";
}
// FUNCTION: LEGO1 0x1005e870
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
// SYNTHETIC: LEGO1 0x1005e920
// PoliceState::`scalar deleting destructor'
inline undefined4 GetUnknown0x0c() { return m_unk0x0c; }
inline void SetUnknown0x0c(undefined4 p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
void FUN_1005ea40();
private:
PoliceScript::Script m_policeScript; // 0x08
undefined4 m_unk0x0c; // 0x0c
};
#endif // POLICESTATE_H

View File

@ -1,28 +0,0 @@
#ifndef RACESTANDSENTITY_H
#define RACESTANDSENTITY_H
#include "buildingentity.h"
// VTABLE: LEGO1 0x100d48a8
// SIZE 0x68
class RaceStandsEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000efa0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0300
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000efb0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong VTable0x50(MxParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f9e0
// RaceStandsEntity::`scalar deleting destructor'
};
#endif // RACESTANDSENTITY_H

View File

@ -1,54 +0,0 @@
#ifndef RACESTATE_H
#define RACESTATE_H
#include "legostate.h"
// SIZE 0x06
struct RaceStateEntry {
public:
inline MxS16 GetUnknown0x02() { return m_unk0x02; }
inline MxU16 GetScore() { return m_score; }
// TODO: Possibly private
MxU8 m_id; // 0x00
MxS16 m_unk0x02; // 0x02
MxU16 m_score; // 0x04
};
// VTABLE: LEGO1 0x100d5e30
// SIZE 0x2c
class RaceState : public LegoState {
public:
RaceState();
// FUNCTION: LEGO1 0x10016010
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07d0
return "RaceState";
}
// FUNCTION: LEGO1 0x10016020
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
RaceStateEntry* GetState(MxU8 p_id);
inline undefined4 GetUnknown0x28() { return m_unk0x28; }
// SYNTHETIC: LEGO1 0x1000f6f0
// RaceState::~RaceState
// SYNTHETIC: LEGO1 0x100160d0
// RaceState::`scalar deleting destructor'
protected:
RaceStateEntry m_state[5]; // 0x08
undefined4 m_unk0x28; // 0x28
};
#endif // RACESTATE_H

View File

@ -1,11 +1,50 @@
#ifndef RADIO_H
#define RADIO_H
#include "legostate.h"
#include "mxcore.h"
class LegoControlManagerEvent;
class MxAtomId;
class MxEndActionNotificationParam;
class RadioState;
// VTABLE: LEGO1 0x100d6d28
// SIZE 0x30
class RadioState : public LegoState {
public:
RadioState();
// FUNCTION: LEGO1 0x1002cf60
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f04f8
return "RadioState";
}
// FUNCTION: LEGO1 0x1002cf70
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override; // vtable+0x14
// SYNTHETIC: LEGO1 0x1002d020
// RadioState::`scalar deleting destructor'
inline MxBool IsActive() { return m_active; }
inline void SetActive(MxBool p_active) { m_active = p_active; }
undefined4 FUN_1002d090();
MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId);
// TODO: Most likely getters/setters are not used according to BETA.
Playlist m_unk0x08[3]; // 0x08
MxS16 m_unk0x2c; // 0x2c
MxBool m_active; // 0x2e
};
// VTABLE: LEGO1 0x100d6d10
// SIZE 0x10

View File

@ -1,45 +0,0 @@
#ifndef RADIOSTATE_H
#define RADIOSTATE_H
#include "legostate.h"
class MxAtomId;
// VTABLE: LEGO1 0x100d6d28
// SIZE 0x30
class RadioState : public LegoState {
public:
RadioState();
// FUNCTION: LEGO1 0x1002cf60
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f04f8
return "RadioState";
}
// FUNCTION: LEGO1 0x1002cf70
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override; // vtable+0x14
// SYNTHETIC: LEGO1 0x1002d020
// RadioState::`scalar deleting destructor'
inline MxBool IsActive() { return m_active; }
inline void SetActive(MxBool p_active) { m_active = p_active; }
undefined4 FUN_1002d090();
MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId);
private:
Playlist m_unk0x08[3]; // 0x08
MxS16 m_unk0x2c; // 0x2c
MxBool m_active; // 0x2e
};
#endif // RADIOSTATE_H

View File

@ -2,11 +2,49 @@
#define SCORE_H
#include "legogamestate.h"
#include "legostate.h"
#include "legoworld.h"
class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class ScoreState;
// VTABLE: LEGO1 0x100d53f8
// SIZE 0x0c
class ScoreState : public LegoState {
public:
// FUNCTION: LEGO1 0x1000de40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0084
return "ScoreState";
}
// FUNCTION: LEGO1 0x1000de50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
}
// FUNCTION: LEGO1 0x1000de20
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000de30
MxBool SetFlag() override
{
m_playCubeTutorial = TRUE;
return TRUE;
} // vtable+0x18
inline MxBool GetTutorialFlag() { return m_playCubeTutorial; }
inline void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
// SYNTHETIC: LEGO1 0x1000df00
// ScoreState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
MxBool m_playCubeTutorial; // 0x08
};
// VTABLE: LEGO1 0x100d4018
// SIZE 0x104

View File

@ -1,36 +0,0 @@
#ifndef SCORESTATE_H
#define SCORESTATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d53f8
// SIZE 0x0c
class ScoreState : public LegoState {
public:
// FUNCTION: LEGO1 0x1000de40
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0084
return "ScoreState";
}
// FUNCTION: LEGO1 0x1000de50
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
}
MxBool IsSerializable() override; // vtable+0x14
MxBool SetFlag() override; // vtable+0x18
inline MxBool GetTutorialFlag() { return m_playCubeTutorial; }
inline void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
// SYNTHETIC: LEGO1 0x1000df00
// ScoreState::`scalar deleting destructor'
private:
MxBool m_playCubeTutorial; // 0x08
};
#endif // SCORESTATE_H

View File

@ -3,8 +3,64 @@
#include "decomp.h"
#include "islepathactor.h"
#include "legostate.h"
class TowTrackMissionState;
// VTABLE: LEGO1 0x100d7fd8
// SIZE 0x28
class TowTrackMissionState : public LegoState {
public:
TowTrackMissionState();
// FUNCTION: LEGO1 0x1004dfa0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00bc
return "TowTrackMissionState";
}
// FUNCTION: LEGO1 0x1004dfb0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id)
{
switch (p_id) {
case 1:
return m_score1;
case 2:
return m_score2;
case 3:
return m_score3;
case 4:
return m_score4;
case 5:
return m_score5;
default:
return 0;
}
}
// SYNTHETIC: LEGO1 0x1004e060
// TowTrackMissionState::`scalar deleting destructor'
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
MxU8 m_unk0x10; // 0x10
MxU16 m_unk0x12; // 0x12
MxU16 m_unk0x14; // 0x14
MxU16 m_unk0x16; // 0x16
MxU16 m_unk0x18; // 0x18
MxU16 m_unk0x1a; // 0x1a
MxU16 m_score1; // 0x1c
MxU16 m_score2; // 0x1e
MxU16 m_score3; // 0x20
MxU16 m_score4; // 0x22
MxU16 m_score5; // 0x24
};
// VTABLE: LEGO1 0x100d7ee0
// SIZE 0x180

View File

@ -1,63 +0,0 @@
#ifndef TOWTRACKMISSIONSTATE_H
#define TOWTRACKMISSIONSTATE_H
#include "legostate.h"
// VTABLE: LEGO1 0x100d7fd8
// SIZE 0x28
class TowTrackMissionState : public LegoState {
public:
TowTrackMissionState();
// FUNCTION: LEGO1 0x1004dfa0
inline const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00bc
return "TowTrackMissionState";
}
// FUNCTION: LEGO1 0x1004dfb0
inline MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
}
MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
inline MxU16 GetScore(MxU8 p_id)
{
switch (p_id) {
case 1:
return m_score1;
case 2:
return m_score2;
case 3:
return m_score3;
case 4:
return m_score4;
case 5:
return m_score5;
default:
return 0;
}
}
// SYNTHETIC: LEGO1 0x1004e060
// TowTrackMissionState::`scalar deleting destructor'
undefined4 m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
MxU8 m_unk0x10; // 0x10
MxU16 m_unk0x12; // 0x12
MxU16 m_unk0x14; // 0x14
MxU16 m_unk0x16; // 0x16
MxU16 m_unk0x18; // 0x18
MxU16 m_unk0x1a; // 0x1a
MxU16 m_score1; // 0x1c
MxU16 m_score2; // 0x1e
MxU16 m_score3; // 0x20
MxU16 m_score4; // 0x22
MxU16 m_score5; // 0x24
};
#endif // TOWTRACKMISSIONSTATE_H

View File

@ -1,296 +0,0 @@
#include "act1state.h"
#include "legonamedtexture.h"
#include "legoutils.h"
DECOMP_SIZE_ASSERT(Act1State, 0x26c)
DECOMP_SIZE_ASSERT(Act1State::NamedPlane, 0x4c)
// GLOBAL: ISLE 0x100f37f0
MxS32 g_unk0x100f37f0[] = {
Act1State::e_unk953,
Act1State::e_unk954,
Act1State::e_unk955,
};
extern MxAtomId* g_isleScript;
// STUB: LEGO1 0x100334b0
Act1State::Act1State() : m_unk0x00c(0), m_unk0x00e(0), m_unk0x008(NULL), m_unk0x010(0)
{
m_unk0x01e = FALSE;
m_unk0x018 = 1;
m_unk0x010 = 0;
m_planeActive = FALSE;
m_unk0x00e = 0;
m_unk0x01f = FALSE;
m_unk0x008 = g_unk0x100f37f0;
m_unk0x014 = -1;
m_unk0x022 = FALSE;
m_unk0x154 = NULL;
m_unk0x158 = NULL;
m_unk0x15c = NULL;
m_unk0x160 = NULL;
m_unk0x1b0 = NULL;
m_unk0x021 = 1;
m_elevFloor = Act1State::c_floor1;
m_unk0x00c = sizeOfArray(g_unk0x100f37f0);
m_unk0x1b4 = NULL;
m_unk0x1b8 = NULL;
m_unk0x208 = NULL;
m_unk0x20c = NULL;
m_unk0x25c = NULL;
m_unk0x260 = NULL;
m_unk0x264 = NULL;
m_unk0x268 = NULL;
SetFlag();
}
// FUNCTION: LEGO1 0x10033ac0
MxResult Act1State::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
m_unk0x024.Serialize(p_legoFile);
m_unk0x070.Serialize(p_legoFile);
m_unk0x0bc.Serialize(p_legoFile);
m_unk0x108.Serialize(p_legoFile);
m_unk0x164.Serialize(p_legoFile);
m_unk0x1bc.Serialize(p_legoFile);
m_unk0x210.Serialize(p_legoFile);
if (p_legoFile->IsWriteMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) {
if (m_unk0x154) {
WriteNamedTexture(p_legoFile, m_unk0x154);
}
else {
FUN_1003f540(p_legoFile, "chwind.gif");
}
if (m_unk0x158) {
WriteNamedTexture(p_legoFile, m_unk0x158);
}
else {
FUN_1003f540(p_legoFile, "chjetl.gif");
}
if (m_unk0x15c) {
WriteNamedTexture(p_legoFile, m_unk0x15c);
}
else {
FUN_1003f540(p_legoFile, "chjetr.gif");
}
}
if (m_unk0x164.GetName()->Compare("") != 0) {
if (m_unk0x1b0) {
WriteNamedTexture(p_legoFile, m_unk0x1b0);
}
else {
FUN_1003f540(p_legoFile, "jsfrnt.gif");
}
if (m_unk0x1b4) {
WriteNamedTexture(p_legoFile, m_unk0x1b4);
}
else {
FUN_1003f540(p_legoFile, "jswnsh.gif");
}
}
if (m_unk0x1bc.GetName()->Compare("") != 0) {
if (m_unk0x208) {
WriteNamedTexture(p_legoFile, m_unk0x208);
}
else {
FUN_1003f540(p_legoFile, "dbfrfn.gif");
}
}
if (m_unk0x210.GetName()->Compare("") != 0) {
if (m_unk0x25c) {
WriteNamedTexture(p_legoFile, m_unk0x25c);
}
else {
FUN_1003f540(p_legoFile, "rcfrnt.gif");
}
if (m_unk0x260) {
WriteNamedTexture(p_legoFile, m_unk0x260);
}
else {
FUN_1003f540(p_legoFile, "rcback.gif");
}
if (m_unk0x264) {
WriteNamedTexture(p_legoFile, m_unk0x264);
}
else {
FUN_1003f540(p_legoFile, "rctail.gif");
}
}
p_legoFile->Write(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Write(&m_unk0x022, sizeof(m_unk0x022));
}
else if (p_legoFile->IsReadMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) {
m_unk0x154 = ReadNamedTexture(p_legoFile);
if (m_unk0x154 == NULL) {
return FAILURE;
}
m_unk0x158 = ReadNamedTexture(p_legoFile);
if (m_unk0x158 == NULL) {
return FAILURE;
}
m_unk0x15c = ReadNamedTexture(p_legoFile);
if (m_unk0x15c == NULL) {
return FAILURE;
}
}
if (m_unk0x164.GetName()->Compare("") != 0) {
m_unk0x1b0 = ReadNamedTexture(p_legoFile);
if (m_unk0x1b0 == NULL) {
return FAILURE;
}
m_unk0x1b4 = ReadNamedTexture(p_legoFile);
if (m_unk0x1b4 == NULL) {
return FAILURE;
}
}
if (m_unk0x1bc.GetName()->Compare("") != 0) {
m_unk0x208 = ReadNamedTexture(p_legoFile);
if (m_unk0x208 == NULL) {
return FAILURE;
}
}
if (m_unk0x210.GetName()->Compare("") != 0) {
m_unk0x25c = ReadNamedTexture(p_legoFile);
if (m_unk0x25c == NULL) {
return FAILURE;
}
m_unk0x260 = ReadNamedTexture(p_legoFile);
if (m_unk0x260 == NULL) {
return FAILURE;
}
m_unk0x264 = ReadNamedTexture(p_legoFile);
if (m_unk0x264 == NULL) {
return FAILURE;
}
}
p_legoFile->Read(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Read(&m_unk0x022, sizeof(m_unk0x022));
}
// TODO
return SUCCESS;
}
// STUB: LEGO1 0x10034660
void Act1State::FUN_10034660()
{
// TODO
}
// FUNCTION: LEGO1 0x100346a0
void Act1State::FUN_100346a0()
{
if (m_unk0x014 != -1) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x014, NULL);
m_unk0x014 = -1;
}
}
// FUNCTION: LEGO1 0x100346d0
MxBool Act1State::SetFlag()
{
m_unk0x024.SetName("");
m_unk0x070.SetName("");
m_unk0x0bc.SetName("");
m_unk0x022 = FALSE;
m_unk0x108.SetName("");
if (m_unk0x154) {
delete m_unk0x154;
m_unk0x154 = NULL;
}
if (m_unk0x158) {
delete m_unk0x158;
m_unk0x158 = NULL;
}
if (m_unk0x15c) {
delete m_unk0x15c;
m_unk0x15c = NULL;
}
if (m_unk0x160) {
delete m_unk0x160;
m_unk0x160 = NULL;
}
m_unk0x164.SetName("");
if (m_unk0x1b0) {
delete m_unk0x1b0;
m_unk0x1b0 = NULL;
}
if (m_unk0x1b4) {
delete m_unk0x1b4;
m_unk0x1b4 = NULL;
}
if (m_unk0x1b8) {
delete m_unk0x1b8;
m_unk0x1b8 = NULL;
}
m_unk0x1bc.SetName("");
if (m_unk0x208) {
delete m_unk0x208;
m_unk0x208 = NULL;
}
if (m_unk0x20c) {
delete m_unk0x20c;
m_unk0x20c = NULL;
}
m_unk0x210.SetName("");
if (m_unk0x25c) {
delete m_unk0x25c;
m_unk0x25c = NULL;
}
if (m_unk0x260) {
delete m_unk0x260;
m_unk0x260 = NULL;
}
if (m_unk0x264) {
delete m_unk0x264;
m_unk0x264 = NULL;
}
if (m_unk0x268) {
delete m_unk0x268;
m_unk0x268 = NULL;
}
return TRUE;
}
// STUB: LEGO1 0x10034b60
void Act1State::FUN_10034b60()
{
// TODO
}
// STUB: LEGO1 0x10034d00
void Act1State::FUN_10034d00()
{
// TODO
}

View File

@ -1,9 +0,0 @@
#include "legoact2state.h"
DECOMP_SIZE_ASSERT(LegoAct2State, 0x10)
// FUNCTION: LEGO1 0x1000df70
MxBool LegoAct2State::IsSerializable()
{
return FALSE;
}

View File

@ -1,9 +0,0 @@
#include "act3state.h"
DECOMP_SIZE_ASSERT(Act3State, 0x0c)
// FUNCTION: LEGO1 0x1000e2f0
MxBool Act3State::IsSerializable()
{
return FALSE;
}

View File

@ -1,6 +1,5 @@
#include "ambulance.h"
#include "ambulancemissionstate.h"
#include "decomp.h"
#include "legocontrolmanager.h"
#include "legogamestate.h"
@ -14,6 +13,7 @@
#include "scripts.h"
DECOMP_SIZE_ASSERT(Ambulance, 0x184)
DECOMP_SIZE_ASSERT(AmbulanceMissionState, 0x24)
// FUNCTION: LEGO1 0x10035ee0
Ambulance::Ambulance()
@ -152,3 +152,27 @@ void Ambulance::FUN_10037250()
{
// TODO
}
// FUNCTION: LEGO1 0x100373a0
AmbulanceMissionState::AmbulanceMissionState()
{
m_unk0x10 = 0;
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x08 = 0;
m_unk0x16 = 0;
m_unk0x0c = 0;
m_unk0x18 = 0;
m_score1 = 0;
m_score2 = 0;
m_score3 = 0;
m_score4 = 0;
m_score5 = 0;
}
// STUB: LEGO1 0x10037440
MxResult AmbulanceMissionState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -0,0 +1,176 @@
#include "buildings.h"
#include "act2main_actions.h"
#include "act3.h"
#include "act3_actions.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoact2.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(BeachHouseEntity, 0x68)
DECOMP_SIZE_ASSERT(GasStationEntity, 0x68)
DECOMP_SIZE_ASSERT(HospitalEntity, 0x68)
DECOMP_SIZE_ASSERT(InfoCenterEntity, 0x68)
DECOMP_SIZE_ASSERT(JailEntity, 0x68)
DECOMP_SIZE_ASSERT(PoliceEntity, 0x68)
DECOMP_SIZE_ASSERT(RaceStandsEntity, 0x68)
// FUNCTION: LEGO1 0x100150c0
MxLong InfoCenterEntity::VTable0x50(MxParam& p_param)
{
switch (GameState()->GetCurrentAct()) {
case LegoGameState::Act::e_act1: {
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->FUN_10033350();
isle->SetDestLocation(LegoGameState::Area::e_infomain);
Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
act1state->SetUnknown18(0);
break;
}
case LegoGameState::Act::e_act2: {
LegoAct2* act2 = (LegoAct2*) FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main);
act2->SetUnknown0x1150(2);
LegoAct2State* act2state = (LegoAct2State*) GameState()->GetState("LegoAct2State");
if (act2state) {
act2state->SetUnknown0x0c(0);
}
break;
}
case LegoGameState::Act::e_act3:
Act3* act3 = (Act3*) FindWorld(*g_act3Script, Act3Script::c__Act3);
act3->SetUnknown4270(2);
break;
}
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
return 1;
}
// FUNCTION: LEGO1 0x100151d0
MxLong GasStationEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 8) {
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_garage);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}
// FUNCTION: LEGO1 0x10015270
MxLong HospitalEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
if (act1State->GetUnknown18() != 10) {
act1State->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_hospital);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}
// FUNCTION: LEGO1 0x10015310
MxLong PoliceEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 10) {
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_police);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}
// FUNCTION: LEGO1 0x100153b0
MxLong BeachHouseEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_jetskibuild);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
return 1;
}
// FUNCTION: LEGO1 0x10015450
MxLong RaceStandsEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_racecarbuild);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
return 1;
}

View File

@ -1,9 +1,7 @@
#include "helicopter.h"
#include "act1state.h"
#include "act3.h"
#include "act3_actions.h"
#include "helicopterstate.h"
#include "isle.h"
#include "isle_actions.h"
#include "jukebox.h"
@ -19,6 +17,7 @@
#include "scripts.h"
DECOMP_SIZE_ASSERT(Helicopter, 0x230)
DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)
DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14)
DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18)
DECOMP_SIZE_ASSERT(MxMatrix, 0x48)

View File

@ -4,10 +4,10 @@
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legoanimationmanager.h"
#include "legocarbuild.h"
#include "legonavcontroller.h"
#include "legopathboundary.h"
#include "legoutils.h"
#include "legovehiclebuildstate.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h"

View File

@ -3,8 +3,8 @@
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "jukebox.h"
#include "jukebox_actions.h"
#include "jukeboxstate.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "misc.h"

View File

@ -1,15 +1,15 @@
#include "pizza.h"
#include "act1state.h"
#include "isle_actions.h"
#include "legogamestate.h"
#include "legoworld.h"
#include "misc.h"
#include "mxmisc.h"
#include "mxticklemanager.h"
#include "pizzamissionstate.h"
DECOMP_SIZE_ASSERT(Pizza, 0x9c)
DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0)
DECOMP_SIZE_ASSERT(PizzaMissionState::Entry, 0x20)
// FUNCTION: LEGO1 0x10037ef0
Pizza::Pizza()
@ -98,3 +98,22 @@ undefined4 Pizza::HandleEndAction(MxEndActionNotificationParam&)
// TODO
return 0;
}
// STUB: LEGO1 0x100393c0
MxResult PizzaMissionState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// FUNCTION: LEGO1 0x10039510
PizzaMissionState::Entry* PizzaMissionState::GetState(MxU8 p_id)
{
for (MxS16 i = 0; i < 5; i++) {
if (m_state[i].m_id == p_id) {
return m_state + i;
}
}
return NULL;
}

View File

@ -9,11 +9,11 @@
#include "legoworld.h"
#include "misc.h"
#include "pizza.h"
#include "pizzamissionstate.h"
#include "pizzeriastate.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Pizzeria, 0x84)
DECOMP_SIZE_ASSERT(PizzeriaState, 0x58)
DECOMP_SIZE_ASSERT(PizzeriaState::StateStruct, 0x14)
// FUNCTION: LEGO1 0x100179c0
MxResult Pizzeria::Create(MxDSAction& p_dsAction)
@ -63,3 +63,22 @@ undefined4 Pizzeria::HandleClick()
return 1;
}
// STUB: LEGO1 0x10017af0
PizzeriaState::PizzeriaState()
{
// TODO
}
// STUB: LEGO1 0x10017d70
MxU32 PizzeriaState::FUN_10017d70()
{
return 0;
}
// STUB: LEGO1 0x10017da0
MxResult PizzeriaState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -1,6 +1,7 @@
#include "radio.h"
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legocontrolmanager.h"
#include "legogamestate.h"
#include "legoworld.h"
@ -10,10 +11,52 @@
#include "mxcontrolpresenter.h"
#include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "radiostate.h"
#include "mxtimer.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Radio, 0x10)
DECOMP_SIZE_ASSERT(RadioState, 0x30)
// GLOBAL: LEGO1 0x100f3218
JukeboxScript::Script g_unk0x100f3218[6] = {
JukeboxScript::c_sns002ra_Audio,
JukeboxScript::c_sns001ja_Audio,
JukeboxScript::c_snsc01js_Audio,
JukeboxScript::c_snsb01js_Audio,
JukeboxScript::c_snsa01js_Audio,
JukeboxScript::c_sns009ra_Audio
};
// GLOBAL: LEGO1 0x100f3230
JukeboxScript::Script g_unk0x100f3230[14] = {
JukeboxScript::c_ham035ra_Audio,
JukeboxScript::c_ham039ra_Audio,
JukeboxScript::c_sns005ra_Audio,
JukeboxScript::c_sns078pa_Audio,
JukeboxScript::c_ham036ra_Audio,
JukeboxScript::c_sns006ra_Audio,
JukeboxScript::c_sns013ra_Audio,
JukeboxScript::c_sns004ra_Audio,
JukeboxScript::c_sns079pa_Audio,
JukeboxScript::c_sns007ra_Audio,
JukeboxScript::c_sns008ra_Audio,
JukeboxScript::c_hpz037ma_Audio,
JukeboxScript::c_sns003ra_Audio,
JukeboxScript::c_sns010ra_Audio,
};
// GLOBAL: LEGO1 0x100f3268
JukeboxScript::Script g_unk0x100f3268[9] = {
JukeboxScript::c_CentralRoads_Music,
JukeboxScript::c_BeachBlvd_Music,
JukeboxScript::c_ResidentalArea_Music,
JukeboxScript::c_Radio1_Music,
JukeboxScript::c_Radio2_Music,
JukeboxScript::c_Radio3_Music,
JukeboxScript::c_Radio4_Music,
JukeboxScript::c_Radio5_Music,
JukeboxScript::c_Radio6_Music,
};
// FUNCTION: LEGO1 0x1002c850
Radio::Radio()
@ -162,3 +205,56 @@ void Radio::CreateState()
m_state = state;
}
// FUNCTION: LEGO1 0x1002ce10
RadioState::RadioState()
{
srand(Timer()->GetTime());
MxS32 random = rand();
m_unk0x2c = random % 3;
m_unk0x08[0] = LegoState::Playlist((MxU32*) g_unk0x100f3218, sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0]));
m_unk0x08[0].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0])));
m_unk0x08[1] = LegoState::Playlist((MxU32*) g_unk0x100f3230, sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0]));
m_unk0x08[1].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0])));
m_unk0x08[2] = LegoState::Playlist((MxU32*) g_unk0x100f3268, sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0]));
m_unk0x08[2].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0])));
m_active = FALSE;
}
// FUNCTION: LEGO1 0x1002cf50
MxBool RadioState::IsSerializable()
{
return FALSE;
}
// FUNCTION: LEGO1 0x1002d090
MxU32 RadioState::FUN_1002d090()
{
if (m_unk0x2c == 2) {
m_unk0x2c = 0;
}
else {
m_unk0x2c++;
}
return m_unk0x08[m_unk0x2c].Next();
}
// FUNCTION: LEGO1 0x1002d0c0
MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId)
{
if (*g_jukeboxScript == p_atom) {
for (MxS16 i = 0; i < 3; i++) {
if (m_unk0x08[i].Contains(p_objectId)) {
return TRUE;
}
}
}
return FALSE;
}

View File

@ -1,6 +1,5 @@
#include "skateboard.h"
#include "act1state.h"
#include "decomp.h"
#include "isle.h"
#include "isle_actions.h"

View File

@ -7,9 +7,9 @@
#include "mxmisc.h"
#include "mxtimer.h"
#include "mxvariabletable.h"
#include "towtrackmissionstate.h"
DECOMP_SIZE_ASSERT(TowTrack, 0x180)
DECOMP_SIZE_ASSERT(TowTrackMissionState, 0x28)
// FUNCTION: LEGO1 0x1004c720
TowTrack::TowTrack()
@ -131,3 +131,73 @@ void TowTrack::FUN_1004dbe0()
{
// TODO
}
// FUNCTION: LEGO1 0x1004dd30
TowTrackMissionState::TowTrackMissionState()
{
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x16 = 0;
m_unk0x08 = 0;
m_unk0x18 = 0;
m_unk0x0c = 0;
m_unk0x1a = 0;
m_unk0x10 = 0;
m_score1 = 0;
m_score2 = 0;
m_score3 = 0;
m_score4 = 0;
m_score5 = 0;
}
// FUNCTION: LEGO1 0x1004dde0
MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
if (p_legoFile->IsReadMode()) {
p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
p_legoFile->Read(&m_unk0x18, sizeof(m_unk0x18));
p_legoFile->Read(&m_unk0x1a, sizeof(m_unk0x1a));
p_legoFile->Read(&m_score1, sizeof(m_score1));
p_legoFile->Read(&m_score2, sizeof(m_score2));
p_legoFile->Read(&m_score3, sizeof(m_score3));
p_legoFile->Read(&m_score4, sizeof(m_score4));
p_legoFile->Read(&m_score5, sizeof(m_score5));
}
else if (p_legoFile->IsWriteMode()) {
MxU16 write = m_unk0x12;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x14;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x16;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x18;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x1a;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score1;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score2;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score3;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score4;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score5;
p_legoFile->Write(&write, sizeof(m_unk0x12));
}
return SUCCESS;
}

View File

@ -1,3 +0,0 @@
#include "helicopterstate.h"
DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)

View File

@ -1,6 +1,7 @@
#include "legocarbuild.h"
DECOMP_SIZE_ASSERT(LegoCarBuild, 0x34c)
DECOMP_SIZE_ASSERT(LegoVehicleBuildState, 0x50)
// STUB: LEGO1 0x100226d0
LegoCarBuild::LegoCarBuild()
@ -61,3 +62,20 @@ MxBool LegoCarBuild::Escape()
// TODO
return FALSE;
}
// FUNCTION: LEGO1 0x10025f30
LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType)
{
m_className = p_classType;
m_unk0x4c = 0;
m_unk0x4d = FALSE;
m_unk0x4e = FALSE;
m_placedPartCount = 0;
}
// STUB: LEGO1 0x10026120
MxResult LegoVehicleBuildState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -1,4 +1,4 @@
#include "legocarbuildanimpresenter.h"
#include "legocarbuildpresenter.h"
DECOMP_SIZE_ASSERT(LegoCarBuildAnimPresenter, 0x150)

View File

@ -1,22 +0,0 @@
#include "legovehiclebuildstate.h"
#include "decomp.h"
DECOMP_SIZE_ASSERT(LegoVehicleBuildState, 0x50)
// FUNCTION: LEGO1 0x10025f30
LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType)
{
this->m_className = p_classType;
this->m_unk0x4c = 0;
this->m_unk0x4d = FALSE;
this->m_unk0x4e = FALSE;
this->m_placedPartCount = 0;
}
// STUB: LEGO1 0x10026120
MxResult LegoVehicleBuildState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -1,46 +0,0 @@
#include "animstate.h"
DECOMP_SIZE_ASSERT(AnimState, 0x1c)
DECOMP_SIZE_ASSERT(ModelInfo, 0x30)
DECOMP_SIZE_ASSERT(AnimInfo, 0x30)
// FUNCTION: LEGO1 0x10064ff0
AnimState::AnimState()
{
m_unk0x0c = 0;
m_unk0x10 = NULL;
m_unk0x14 = 0;
m_unk0x18 = NULL;
}
// STUB: LEGO1 0x10065150
AnimState::~AnimState()
{
// TODO
}
// STUB: LEGO1 0x100651d0
void AnimState::FUN_100651d0(MxU32, AnimInfo*, MxU32&)
{
// TODO
}
// STUB: LEGO1 0x10065240
void AnimState::FUN_10065240(MxU32, AnimInfo*, MxU32)
{
// TODO
}
// STUB: LEGO1 0x100652d0
MxResult AnimState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// STUB: LEGO1 0x100654f0
MxBool AnimState::SetFlag()
{
// TODO
return FALSE;
}

View File

@ -2,7 +2,6 @@
#include "3dmanager/lego3dmanager.h"
#include "anim/legoanim.h"
#include "animstate.h"
#include "define.h"
#include "islepathactor.h"
#include "legoanimmmpresenter.h"
@ -37,6 +36,9 @@ DECOMP_SIZE_ASSERT(LegoAnimationManager::Character, 0x18)
DECOMP_SIZE_ASSERT(LegoAnimationManager::Vehicle, 0x08)
DECOMP_SIZE_ASSERT(LegoAnimationManager::Extra, 0x18)
DECOMP_SIZE_ASSERT(LegoTranInfo, 0x78)
DECOMP_SIZE_ASSERT(AnimState, 0x1c)
DECOMP_SIZE_ASSERT(AnimInfo, 0x30)
DECOMP_SIZE_ASSERT(ModelInfo, 0x30)
// GLOBAL: LEGO1 0x100d8b28
MxU8 g_unk0x100d8b28[] = {0, 1, 2, 4, 8, 16};
@ -2820,3 +2822,44 @@ void LegoAnimationManager::FUN_10064b50(MxLong p_time)
);
}
}
// FUNCTION: LEGO1 0x10064ff0
AnimState::AnimState()
{
m_unk0x0c = 0;
m_unk0x10 = NULL;
m_unk0x14 = 0;
m_unk0x18 = NULL;
}
// STUB: LEGO1 0x10065150
AnimState::~AnimState()
{
// TODO
}
// STUB: LEGO1 0x100651d0
void AnimState::FUN_100651d0(MxU32, AnimInfo*, MxU32&)
{
// TODO
}
// STUB: LEGO1 0x10065240
void AnimState::FUN_10065240(MxU32, AnimInfo*, MxU32)
{
// TODO
}
// STUB: LEGO1 0x100652d0
MxResult AnimState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// STUB: LEGO1 0x100654f0
MxBool AnimState::SetFlag()
{
// TODO
return FALSE;
}

View File

@ -1,7 +1,6 @@
#include "legogamestate.h"
#include "3dmanager/lego3dmanager.h"
#include "act1state.h"
#include "act2main_actions.h"
#include "act3_actions.h"
#include "carrace_actions.h"
@ -15,7 +14,7 @@
#include "helicopter.h"
#include "histbook_actions.h"
#include "hospital_actions.h"
#include "infocenterstate.h"
#include "infocenter.h"
#include "infodoor_actions.h"
#include "infomain_actions.h"
#include "infoscor_actions.h"

View File

@ -7,27 +7,22 @@
#include "dunebuggy.h"
#include "elevatorbottom.h"
#include "gasstation.h"
#include "gasstationstate.h"
#include "helicopter.h"
#include "helicopterstate.h"
#include "historybook.h"
#include "hospital.h"
#include "hospitalstate.h"
#include "infocenter.h"
#include "infocenterdoor.h"
#include "infocenterstate.h"
#include "isle.h"
#include "jetskirace.h"
#include "lego3dwavepresenter.h"
#include "legoact2.h"
#include "legoact2state.h"
#include "legoactioncontrolpresenter.h"
#include "legoactor.h"
#include "legoactorpresenter.h"
#include "legoanimactor.h"
#include "legoanimpresenter.h"
#include "legocarbuild.h"
#include "legocarbuildanimpresenter.h"
#include "legocarbuildpresenter.h"
#include "legocarraceactor.h"
#include "legoentity.h"
#include "legoentitypresenter.h"
@ -51,52 +46,34 @@
#include "mxcontrolpresenter.h"
#include "mxvideopresenter.h"
#include "pizza.h"
#include "pizzamissionstate.h"
#include "police.h"
#include "policestate.h"
#include "registrationbook.h"
#include "score.h"
#include "scorestate.h"
#include "skateboard.h"
// #include "act2genactor.h"
#include "act2policestation.h"
#include "act3.h"
#include "act3state.h"
#include "ambulance.h"
#include "ambulancemissionstate.h"
#include "bike.h"
#include "doors.h"
#include "jetski.h"
#include "legoanimationmanager.h"
#include "legoanimmmpresenter.h"
#include "motocycle.h"
#include "racecar.h"
#include "towtrack.h"
#include "towtrackmissionstate.h"
// #include "act3cop.h"
// #include "act3brickster.h"
#include "act1state.h"
#include "act3actor.h"
#include "act3shark.h"
#include "animstate.h"
#include "beachhouseentity.h"
#include "buildings.h"
#include "bumpbouy.h"
#include "carracestate.h"
#include "caveentity.h"
#include "gasstationentity.h"
#include "hospitalentity.h"
#include "infocenterentity.h"
#include "jailentity.h"
#include "jetskiracestate.h"
#include "jukebox.h"
#include "jukeboxentity.h"
#include "jukeboxstate.h"
#include "mxcompositemediapresenter.h"
#include "pizzeria.h"
#include "pizzeriastate.h"
#include "policeentity.h"
#include "raceskel.h"
#include "racestandsentity.h"
#include "radiostate.h"
// TODO: Before HospitalState, add all of the different LegoVehicleBuildState's

View File

@ -1,8 +1,8 @@
#include "legoutils.h"
#include "3dmanager/lego3dmanager.h"
#include "act1state.h"
#include "anim/legoanim.h"
#include "isle.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legoanimpresenter.h"

View File

@ -1,7 +1,7 @@
#include "legonavcontroller.h"
#include "3dmanager/lego3dmanager.h"
#include "infocenterstate.h"
#include "infocenter.h"
#include "legoanimationmanager.h"
#include "legocameracontroller.h"
#include "legogamestate.h"

View File

@ -1,39 +0,0 @@
#include "gasstationentity.h"
#include "act1state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(GasStationEntity, 0x68)
// FUNCTION: LEGO1 0x100151d0
MxLong GasStationEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 8) {
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_garage);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}

View File

@ -1,37 +0,0 @@
#include "gasstationstate.h"
DECOMP_SIZE_ASSERT(GasStationState, 0x24)
// FUNCTION: LEGO1 0x10005eb0
GasStationState::GasStationState()
{
m_unk0x18 = 0;
m_unk0x1a = 0;
m_unk0x1c = 0;
m_unk0x1e = 0;
m_unk0x20 = 0;
undefined4* unk0x08 = m_unk0x08;
unk0x08[0] = -1;
unk0x08[1] = -1;
unk0x08[2] = -1;
}
// STUB: LEGO1 0x10006300
MxResult GasStationState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// STUB: LEGO1 0x10006430
void GasStationState::FUN_10006430(undefined4)
{
// TODO
}
// STUB: LEGO1 0x10006490
void GasStationState::FUN_10006490()
{
// TODO
}

View File

@ -1,27 +0,0 @@
#include "ambulancemissionstate.h"
DECOMP_SIZE_ASSERT(AmbulanceMissionState, 0x24)
// FUNCTION: LEGO1 0x100373a0
AmbulanceMissionState::AmbulanceMissionState()
{
m_unk0x10 = 0;
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x08 = 0;
m_unk0x16 = 0;
m_unk0x0c = 0;
m_unk0x18 = 0;
m_score1 = 0;
m_score2 = 0;
m_score3 = 0;
m_score4 = 0;
m_score5 = 0;
}
// STUB: LEGO1 0x10037440
MxResult AmbulanceMissionState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -1,39 +0,0 @@
#include "hospitalentity.h"
#include "act1state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(HospitalEntity, 0x68)
// FUNCTION: LEGO1 0x10015270
MxLong HospitalEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
if (act1State->GetUnknown18() != 10) {
act1State->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_hospital);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}

View File

@ -1,49 +0,0 @@
#include "hospitalstate.h"
DECOMP_SIZE_ASSERT(HospitalState, 0x18)
// FUNCTION: LEGO1 0x10076370
HospitalState::HospitalState()
{
m_unk0x0c = 0;
m_unk0x0e = 0;
m_unk0x10 = 0;
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x16 = 0;
}
// FUNCTION: LEGO1 0x10076530
MxResult HospitalState::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
if (p_legoFile->IsWriteMode()) {
// A write variable needs to be used here, otherwise
// the compiler aggresively optimizes the function
MxS16 write;
write = m_unk0x0c;
p_legoFile->Write(&write, sizeof(m_unk0x0c));
write = m_unk0x0e;
p_legoFile->Write(&write, sizeof(m_unk0x0e));
write = m_unk0x10;
p_legoFile->Write(&write, sizeof(m_unk0x10));
write = m_unk0x12;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x14;
p_legoFile->Write(&write, sizeof(m_unk0x14));
write = m_unk0x16;
p_legoFile->Write(&write, sizeof(m_unk0x16));
}
else if (p_legoFile->IsReadMode()) {
p_legoFile->Read(&m_unk0x0c, sizeof(m_unk0x0c));
p_legoFile->Read(&m_unk0x0e, sizeof(m_unk0x0e));
p_legoFile->Read(&m_unk0x10, sizeof(m_unk0x10));
p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
}
return SUCCESS;
}

View File

@ -1,60 +0,0 @@
#include "infocenterentity.h"
#include "act1state.h"
#include "act2main_actions.h"
#include "act3.h"
#include "act3_actions.h"
#include "act3state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoact2.h"
#include "legoact2state.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(InfoCenterEntity, 0x68)
// FUNCTION: LEGO1 0x100150c0
MxLong InfoCenterEntity::VTable0x50(MxParam& p_param)
{
switch (GameState()->GetCurrentAct()) {
case LegoGameState::Act::e_act1: {
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->FUN_10033350();
isle->SetDestLocation(LegoGameState::Area::e_infomain);
Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
act1state->SetUnknown18(0);
break;
}
case LegoGameState::Act::e_act2: {
LegoAct2* act2 = (LegoAct2*) FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main);
act2->SetUnknown0x1150(2);
LegoAct2State* act2state = (LegoAct2State*) GameState()->GetState("LegoAct2State");
if (act2state) {
act2state->SetUnknown0x0c(0);
}
break;
}
case LegoGameState::Act::e_act3:
Act3* act3 = (Act3*) FindWorld(*g_act3Script, Act3Script::c__Act3);
act3->SetUnknown4270(2);
break;
}
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
return 1;
}

View File

@ -1,133 +0,0 @@
#include "infocenterstate.h"
#include "infocenter.h"
#include "infomain_actions.h"
#include "mxstillpresenter.h"
DECOMP_SIZE_ASSERT(InfocenterState, 0x94)
// GLOBAL: LEGO1 0x100f76a8
InfomainScript::Script g_exitDialogueAct1[14] = {
InfomainScript::c_iic019in_RunAnim,
InfomainScript::c_iic020in_RunAnim,
InfomainScript::c_iic021in_RunAnim,
InfomainScript::c_iic022in_RunAnim,
InfomainScript::c_iic023in_RunAnim,
InfomainScript::c_iic024in_RunAnim,
InfomainScript::c_iic025in_RunAnim,
InfomainScript::c_iic026in_RunAnim,
InfomainScript::c_iic027in_RunAnim,
InfomainScript::c_iica28in_RunAnim,
InfomainScript::c_iicb28in_RunAnim,
InfomainScript::c_iicc28in_RunAnim,
InfomainScript::c_iic029in_RunAnim,
InfomainScript::c_iic032in_RunAnim
};
// GLOBAL: LEGO1 0x100f76e0
InfomainScript::Script g_exitDialogueAct23[6] = {
InfomainScript::c_iic027in_RunAnim,
InfomainScript::c_iic029in_RunAnim,
InfomainScript::c_iic048in_RunAnim,
InfomainScript::c_iic056in_RunAnim,
InfomainScript::c_iicx23in_RunAnim
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f76f8
InfomainScript::Script g_returnDialogueAct1[6] = {
InfomainScript::c_iicx26in_RunAnim,
InfomainScript::c_iic033in_RunAnim,
InfomainScript::c_iic034in_RunAnim,
InfomainScript::c_iic035in_RunAnim,
InfomainScript::c_iic036in_RunAnim
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7710
InfomainScript::Script g_returnDialogueAct2[4] = {
InfomainScript::c_iic048in_RunAnim,
InfomainScript::c_iic049in_RunAnim,
InfomainScript::c_iic050in_RunAnim,
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7720
InfomainScript::Script g_returnDialogueAct3[4] = {
InfomainScript::c_iic055in_RunAnim,
InfomainScript::c_iic056in_RunAnim,
InfomainScript::c_iic057in_RunAnim,
InfomainScript::c_iic058in_RunAnim
};
// GLOBAL: LEGO1 0x100f7730
InfomainScript::Script g_leaveDialogueAct1[4] = {
InfomainScript::c_iic039in_PlayWav,
InfomainScript::c_iic040in_PlayWav,
InfomainScript::c_iic041in_PlayWav,
InfomainScript::c_iic042in_PlayWav
};
// GLOBAL: LEGO1 0x100f7740
InfomainScript::Script g_leaveDialogueAct2[4] = {
InfomainScript::c_iic051in_PlayWav,
InfomainScript::c_iic052in_PlayWav,
InfomainScript::c_iic053in_PlayWav,
InfomainScript::c_iic054in_PlayWav
};
// GLOBAL: LEGO1 0x100f7750
InfomainScript::Script g_leaveDialogueAct3[4] = {
InfomainScript::c_iic059in_PlayWav,
InfomainScript::c_iic060in_PlayWav,
InfomainScript::c_iic061in_PlayWav,
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7760
InfomainScript::Script g_bricksterDialogue[2] = {
InfomainScript::c_sbleh2br_PlayWav,
InfomainScript::c_snshahbr_PlayWav
};
// FUNCTION: LEGO1 0x10071600
InfocenterState::InfocenterState()
{
m_exitDialogueAct1 = LegoState::Playlist((MxU32*) g_exitDialogueAct1, sizeOfArray(g_exitDialogueAct1));
m_exitDialogueAct23 = LegoState::Playlist((MxU32*) g_exitDialogueAct23, sizeOfArray(g_exitDialogueAct23) - 1);
m_returnDialogue[LegoGameState::e_act1] =
LegoState::Playlist((MxU32*) g_returnDialogueAct1, sizeOfArray(g_returnDialogueAct1) - 1);
m_returnDialogue[LegoGameState::e_act2] =
LegoState::Playlist((MxU32*) g_returnDialogueAct2, sizeOfArray(g_returnDialogueAct2) - 1);
m_returnDialogue[LegoGameState::e_act3] =
LegoState::Playlist((MxU32*) g_returnDialogueAct3, sizeOfArray(g_returnDialogueAct3));
m_leaveDialogue[LegoGameState::e_act1] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct1, sizeOfArray(g_leaveDialogueAct1));
m_leaveDialogue[LegoGameState::e_act2] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct2, sizeOfArray(g_leaveDialogueAct2));
m_leaveDialogue[LegoGameState::e_act3] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct3, sizeOfArray(g_leaveDialogueAct3) - 1);
m_bricksterDialogue = LegoState::Playlist((MxU32*) g_bricksterDialogue, sizeOfArray(g_bricksterDialogue));
memset(m_letters, 0, sizeof(m_letters));
}
// FUNCTION: LEGO1 0x10071920
InfocenterState::~InfocenterState()
{
MxS16 i = 0;
do {
if (GetNameLetter(i) != NULL) {
delete GetNameLetter(i)->GetAction();
delete GetNameLetter(i);
}
i++;
} while (i < GetMaxNameLength());
}

View File

@ -1,16 +0,0 @@
#include "scorestate.h"
DECOMP_SIZE_ASSERT(ScoreState, 0x0c)
// FUNCTION: LEGO1 0x1000de20
MxBool ScoreState::IsSerializable()
{
return FALSE;
}
// FUNCTION: LEGO1 0x1000de30
MxBool ScoreState::SetFlag()
{
m_playCubeTutorial = TRUE;
return TRUE;
}

View File

@ -1,36 +0,0 @@
#include "beachhouseentity.h"
#include "act1state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(BeachHouseEntity, 0x68)
// FUNCTION: LEGO1 0x100153b0
MxLong BeachHouseEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_jetskibuild);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
return 1;
}

View File

@ -1,9 +0,0 @@
#include "jukeboxstate.h"
DECOMP_SIZE_ASSERT(JukeBoxState, 0x10)
// FUNCTION: LEGO1 0x1000f300
MxBool JukeBoxState::IsSerializable()
{
return FALSE;
}

View File

@ -1,103 +0,0 @@
#include "radiostate.h"
#include "jukebox.h"
#include "jukebox_actions.h"
#include "mxmisc.h"
#include "mxtimer.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(RadioState, 0x30)
// GLOBAL: LEGO1 0x100f3218
JukeboxScript::Script g_unk0x100f3218[6] = {
JukeboxScript::c_sns002ra_Audio,
JukeboxScript::c_sns001ja_Audio,
JukeboxScript::c_snsc01js_Audio,
JukeboxScript::c_snsb01js_Audio,
JukeboxScript::c_snsa01js_Audio,
JukeboxScript::c_sns009ra_Audio
};
// GLOBAL: LEGO1 0x100f3230
JukeboxScript::Script g_unk0x100f3230[14] = {
JukeboxScript::c_ham035ra_Audio,
JukeboxScript::c_ham039ra_Audio,
JukeboxScript::c_sns005ra_Audio,
JukeboxScript::c_sns078pa_Audio,
JukeboxScript::c_ham036ra_Audio,
JukeboxScript::c_sns006ra_Audio,
JukeboxScript::c_sns013ra_Audio,
JukeboxScript::c_sns004ra_Audio,
JukeboxScript::c_sns079pa_Audio,
JukeboxScript::c_sns007ra_Audio,
JukeboxScript::c_sns008ra_Audio,
JukeboxScript::c_hpz037ma_Audio,
JukeboxScript::c_sns003ra_Audio,
JukeboxScript::c_sns010ra_Audio,
};
// GLOBAL: LEGO1 0x100f3268
JukeboxScript::Script g_unk0x100f3268[9] = {
JukeboxScript::c_CentralRoads_Music,
JukeboxScript::c_BeachBlvd_Music,
JukeboxScript::c_ResidentalArea_Music,
JukeboxScript::c_Radio1_Music,
JukeboxScript::c_Radio2_Music,
JukeboxScript::c_Radio3_Music,
JukeboxScript::c_Radio4_Music,
JukeboxScript::c_Radio5_Music,
JukeboxScript::c_Radio6_Music,
};
// FUNCTION: LEGO1 0x1002ce10
RadioState::RadioState()
{
srand(Timer()->GetTime());
MxS32 random = rand();
m_unk0x2c = random % 3;
m_unk0x08[0] = LegoState::Playlist((MxU32*) g_unk0x100f3218, sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0]));
m_unk0x08[0].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0])));
m_unk0x08[1] = LegoState::Playlist((MxU32*) g_unk0x100f3230, sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0]));
m_unk0x08[1].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0])));
m_unk0x08[2] = LegoState::Playlist((MxU32*) g_unk0x100f3268, sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0]));
m_unk0x08[2].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0])));
m_active = FALSE;
}
// FUNCTION: LEGO1 0x1002cf50
MxBool RadioState::IsSerializable()
{
return FALSE;
}
// FUNCTION: LEGO1 0x1002d090
MxU32 RadioState::FUN_1002d090()
{
if (m_unk0x2c == 2) {
m_unk0x2c = 0;
}
else {
m_unk0x2c++;
}
return m_unk0x08[m_unk0x2c].Next();
}
// FUNCTION: LEGO1 0x1002d0c0
MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId)
{
if (*g_jukeboxScript == p_atom) {
for (MxS16 i = 0; i < 3; i++) {
if (m_unk0x08[i].Contains(p_objectId)) {
return TRUE;
}
}
}
return FALSE;
}

View File

@ -1,8 +1,8 @@
#include "legopathstruct.h"
#include "isle.h"
#include "jukebox.h"
#include "jukebox_actions.h"
#include "jukeboxstate.h"
#include "legohideanimpresenter.h"
#include "legopathactor.h"
#include "legoutils.h"

View File

@ -1,23 +0,0 @@
#include "pizzamissionstate.h"
DECOMP_SIZE_ASSERT(PizzaMissionStateEntry, 0x20)
DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0)
// STUB: LEGO1 0x100393c0
MxResult PizzaMissionState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// FUNCTION: LEGO1 0x10039510
PizzaMissionStateEntry* PizzaMissionState::GetState(MxU8 p_id)
{
for (MxS16 i = 0; i < 5; i++) {
if (m_state[i].m_id == p_id) {
return m_state + i;
}
}
return NULL;
}

View File

@ -1,22 +0,0 @@
#include "pizzeriastate.h"
DECOMP_SIZE_ASSERT(PizzeriaState, 0x58)
// STUB: LEGO1 0x10017af0
PizzeriaState::PizzeriaState()
{
// TODO
}
// STUB: LEGO1 0x10017d70
MxU32 PizzeriaState::FUN_10017d70()
{
return 0;
}
// STUB: LEGO1 0x10017da0
MxResult PizzeriaState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}

View File

@ -1,39 +0,0 @@
#include "policeentity.h"
#include "act1state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(PoliceEntity, 0x68)
// FUNCTION: LEGO1 0x10015310
MxLong PoliceEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 10) {
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_police);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
}
return 1;
}

View File

@ -1,70 +0,0 @@
#include "policestate.h"
#include "islepathactor.h"
#include "misc.h"
#include "mxdsaction.h"
#include "mxmisc.h"
#include "police.h"
#include "police_actions.h"
#include "scripts.h"
#include <stdlib.h>
DECOMP_SIZE_ASSERT(PoliceState, 0x10)
// FUNCTION: LEGO1 0x1005e7c0
PoliceState::PoliceState()
{
m_unk0x0c = 0;
m_policeScript = (rand() % 2 == 0) ? PoliceScript::c_nps002la_RunAnim : PoliceScript::c_nps001ni_RunAnim;
}
// FUNCTION: LEGO1 0x1005e990
MxResult PoliceState::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
if (p_legoFile->IsReadMode()) {
p_legoFile->Read(&m_policeScript, sizeof(m_policeScript));
}
else {
PoliceScript::Script policeScript = m_policeScript;
p_legoFile->Write(&policeScript, sizeof(m_policeScript));
}
return SUCCESS;
}
// FUNCTION: LEGO1 0x1005ea40
void PoliceState::FUN_1005ea40()
{
PoliceScript::Script policeScript;
if (m_unk0x0c == 1) {
return;
}
switch (CurrentActor()->GetActorId()) {
case 4:
policeScript = PoliceScript::c_nps002la_RunAnim;
m_policeScript = policeScript;
break;
case 5:
policeScript = PoliceScript::c_nps001ni_RunAnim;
m_policeScript = policeScript;
break;
default:
policeScript = m_policeScript;
m_policeScript = policeScript == PoliceScript::c_nps002la_RunAnim ? PoliceScript::c_nps001ni_RunAnim
: PoliceScript::c_nps002la_RunAnim;
}
{
MxDSAction action;
action.SetObjectId(policeScript);
action.SetAtomId(*g_policeScript);
Start(&action);
}
m_unk0x0c = 1;
}

View File

@ -4,6 +4,9 @@
#include "mxnotificationmanager.h"
DECOMP_SIZE_ASSERT(LegoRace, 0x144)
DECOMP_SIZE_ASSERT(RaceState::Entry, 0x06)
// TODO: Must be 0x2c but current structure is incorrect
// DECOMP_SIZE_ASSERT(RaceState, 0x2c)
// FUNCTION: LEGO1 0x1000dab0
undefined4 LegoRace::VTable0x78(undefined4)
@ -87,3 +90,30 @@ void LegoRace::Enable(MxBool p_enable)
{
// TODO
}
// STUB: LEGO1 0x10015f30
RaceState::RaceState()
{
// TODO
}
// STUB: LEGO1 0x10016140
MxResult RaceState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// FUNCTION: LEGO1 0x10016280
RaceState::Entry* RaceState::GetState(MxU8 p_id)
{
for (MxS16 i = 0;; i++) {
if (i >= 5) {
return NULL;
}
if (m_state[i].m_id == p_id) {
return m_state + i;
}
}
}

View File

@ -1,36 +0,0 @@
#include "racestandsentity.h"
#include "act1state.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(RaceStandsEntity, 0x68)
// FUNCTION: LEGO1 0x10015450
MxLong RaceStandsEntity::VTable0x50(MxParam& p_param)
{
if (FUN_1003ef60()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0);
if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) CurrentActor())->VTable0xe4();
}
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->SetDestLocation(LegoGameState::Area::e_racecarbuild);
AnimationManager()->FUN_10061010(FALSE);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
return 1;
}

View File

@ -1,33 +0,0 @@
#include "racestate.h"
DECOMP_SIZE_ASSERT(RaceStateEntry, 0x06)
// TODO: Must be 0x2c but current structure is incorrect
// DECOMP_SIZE_ASSERT(RaceState, 0x2c)
// STUB: LEGO1 0x10015f30
RaceState::RaceState()
{
// TODO
}
// STUB: LEGO1 0x10016140
MxResult RaceState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// FUNCTION: LEGO1 0x10016280
RaceStateEntry* RaceState::GetState(MxU8 p_id)
{
for (MxS16 i = 0;; i++) {
if (i >= 5) {
return NULL;
}
if (m_state[i].m_id == p_id) {
return m_state + i;
}
}
}

View File

@ -1,73 +0,0 @@
#include "towtrackmissionstate.h"
DECOMP_SIZE_ASSERT(TowTrackMissionState, 0x28)
// FUNCTION: LEGO1 0x1004dd30
TowTrackMissionState::TowTrackMissionState()
{
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x16 = 0;
m_unk0x08 = 0;
m_unk0x18 = 0;
m_unk0x0c = 0;
m_unk0x1a = 0;
m_unk0x10 = 0;
m_score1 = 0;
m_score2 = 0;
m_score3 = 0;
m_score4 = 0;
m_score5 = 0;
}
// FUNCTION: LEGO1 0x1004dde0
MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
if (p_legoFile->IsReadMode()) {
p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
p_legoFile->Read(&m_unk0x18, sizeof(m_unk0x18));
p_legoFile->Read(&m_unk0x1a, sizeof(m_unk0x1a));
p_legoFile->Read(&m_score1, sizeof(m_score1));
p_legoFile->Read(&m_score2, sizeof(m_score2));
p_legoFile->Read(&m_score3, sizeof(m_score3));
p_legoFile->Read(&m_score4, sizeof(m_score4));
p_legoFile->Read(&m_score5, sizeof(m_score5));
}
else if (p_legoFile->IsWriteMode()) {
MxU16 write = m_unk0x12;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x14;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x16;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x18;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x1a;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score1;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score2;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score3;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score4;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_score5;
p_legoFile->Write(&write, sizeof(m_unk0x12));
}
return SUCCESS;
}

View File

@ -1,6 +1,7 @@
#include "act3.h"
DECOMP_SIZE_ASSERT(Act3, 0x4274)
DECOMP_SIZE_ASSERT(Act3State, 0x0c)
// STUB: LEGO1 0x10072270
Act3::Act3()

View File

@ -1,7 +1,7 @@
#include "elevatorbottom.h"
#include "act1state.h"
#include "elevbott_actions.h"
#include "isle.h"
#include "jukebox.h"
#include "jukebox_actions.h"
#include "legocontrolmanager.h"

View File

@ -1,7 +1,6 @@
#include "gasstation.h"
#include "garage_actions.h"
#include "gasstationstate.h"
#include "islepathactor.h"
#include "jukebox.h"
#include "jukebox_actions.h"
@ -21,6 +20,7 @@
#include "scripts.h"
DECOMP_SIZE_ASSERT(GasStation, 0x128)
DECOMP_SIZE_ASSERT(GasStationState, 0x24)
// GLOBAL: LEGO1 0x100f0160
undefined4 g_unk0x100f0160 = 3;
@ -419,3 +419,37 @@ MxBool GasStation::Escape()
m_destLocation = LegoGameState::Area::e_infomain;
return TRUE;
}
// FUNCTION: LEGO1 0x10005eb0
GasStationState::GasStationState()
{
m_unk0x18 = 0;
m_unk0x1a = 0;
m_unk0x1c = 0;
m_unk0x1e = 0;
m_unk0x20 = 0;
undefined4* unk0x08 = m_unk0x08;
unk0x08[0] = -1;
unk0x08[1] = -1;
unk0x08[2] = -1;
}
// STUB: LEGO1 0x10006300
MxResult GasStationState::Serialize(LegoFile* p_legoFile)
{
// TODO
return LegoState::Serialize(p_legoFile);
}
// STUB: LEGO1 0x10006430
void GasStationState::FUN_10006430(undefined4)
{
// TODO
}
// STUB: LEGO1 0x10006490
void GasStationState::FUN_10006490()
{
// TODO
}

View File

@ -1,8 +1,7 @@
#include "hospital.h"
#include "act1state.h"
#include "hospital_actions.h"
#include "hospitalstate.h"
#include "isle.h"
#include "islepathactor.h"
#include "jukebox.h"
#include "jukebox_actions.h"
@ -22,6 +21,7 @@
#include "scripts.h"
DECOMP_SIZE_ASSERT(Hospital, 0x12c)
DECOMP_SIZE_ASSERT(HospitalState, 0x18)
// GLOBAL: LEGO1 0x100f7918
undefined4 g_unk0x100f7918 = 3;
@ -671,3 +671,49 @@ MxBool Hospital::Escape()
return TRUE;
}
// FUNCTION: LEGO1 0x10076370
HospitalState::HospitalState()
{
m_unk0x0c = 0;
m_unk0x0e = 0;
m_unk0x10 = 0;
m_unk0x12 = 0;
m_unk0x14 = 0;
m_unk0x16 = 0;
}
// FUNCTION: LEGO1 0x10076530
MxResult HospitalState::Serialize(LegoFile* p_legoFile)
{
LegoState::Serialize(p_legoFile);
if (p_legoFile->IsWriteMode()) {
// A write variable needs to be used here, otherwise
// the compiler aggresively optimizes the function
MxS16 write;
write = m_unk0x0c;
p_legoFile->Write(&write, sizeof(m_unk0x0c));
write = m_unk0x0e;
p_legoFile->Write(&write, sizeof(m_unk0x0e));
write = m_unk0x10;
p_legoFile->Write(&write, sizeof(m_unk0x10));
write = m_unk0x12;
p_legoFile->Write(&write, sizeof(m_unk0x12));
write = m_unk0x14;
p_legoFile->Write(&write, sizeof(m_unk0x14));
write = m_unk0x16;
p_legoFile->Write(&write, sizeof(m_unk0x16));
}
else if (p_legoFile->IsReadMode()) {
p_legoFile->Read(&m_unk0x0c, sizeof(m_unk0x0c));
p_legoFile->Read(&m_unk0x0e, sizeof(m_unk0x0e));
p_legoFile->Read(&m_unk0x10, sizeof(m_unk0x10));
p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
}
return SUCCESS;
}

View File

@ -1,13 +1,12 @@
#include "infocenter.h"
#include "act3state.h"
#include "act3.h"
#include "credits_actions.h"
#include "helicopterstate.h"
#include "infocenterstate.h"
#include "helicopter.h"
#include "infomain_actions.h"
#include "jukebox.h"
#include "jukebox_actions.h"
#include "legoact2state.h"
#include "legoact2.h"
#include "legoanimationmanager.h"
#include "legobuildingmanager.h"
#include "legocharactermanager.h"
@ -29,13 +28,13 @@
#include "mxticklemanager.h"
#include "mxtransitionmanager.h"
#include "mxutilities.h"
#include "radiostate.h"
#include "scripts.h"
#include "sndanim_actions.h"
#include "viewmanager/viewmanager.h"
DECOMP_SIZE_ASSERT(Infocenter, 0x1d8)
DECOMP_SIZE_ASSERT(InfocenterMapEntry, 0x18)
DECOMP_SIZE_ASSERT(InfocenterState, 0x94)
// GLOBAL: LEGO1 0x100f76a0
const char* g_object2x4red = "2x4red";
@ -43,6 +42,90 @@ const char* g_object2x4red = "2x4red";
// GLOBAL: LEGO1 0x100f76a4
const char* g_object2x4grn = "2x4grn";
// GLOBAL: LEGO1 0x100f76a8
InfomainScript::Script g_exitDialogueAct1[14] = {
InfomainScript::c_iic019in_RunAnim,
InfomainScript::c_iic020in_RunAnim,
InfomainScript::c_iic021in_RunAnim,
InfomainScript::c_iic022in_RunAnim,
InfomainScript::c_iic023in_RunAnim,
InfomainScript::c_iic024in_RunAnim,
InfomainScript::c_iic025in_RunAnim,
InfomainScript::c_iic026in_RunAnim,
InfomainScript::c_iic027in_RunAnim,
InfomainScript::c_iica28in_RunAnim,
InfomainScript::c_iicb28in_RunAnim,
InfomainScript::c_iicc28in_RunAnim,
InfomainScript::c_iic029in_RunAnim,
InfomainScript::c_iic032in_RunAnim
};
// GLOBAL: LEGO1 0x100f76e0
InfomainScript::Script g_exitDialogueAct23[6] = {
InfomainScript::c_iic027in_RunAnim,
InfomainScript::c_iic029in_RunAnim,
InfomainScript::c_iic048in_RunAnim,
InfomainScript::c_iic056in_RunAnim,
InfomainScript::c_iicx23in_RunAnim
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f76f8
InfomainScript::Script g_returnDialogueAct1[6] = {
InfomainScript::c_iicx26in_RunAnim,
InfomainScript::c_iic033in_RunAnim,
InfomainScript::c_iic034in_RunAnim,
InfomainScript::c_iic035in_RunAnim,
InfomainScript::c_iic036in_RunAnim
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7710
InfomainScript::Script g_returnDialogueAct2[4] = {
InfomainScript::c_iic048in_RunAnim,
InfomainScript::c_iic049in_RunAnim,
InfomainScript::c_iic050in_RunAnim,
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7720
InfomainScript::Script g_returnDialogueAct3[4] = {
InfomainScript::c_iic055in_RunAnim,
InfomainScript::c_iic056in_RunAnim,
InfomainScript::c_iic057in_RunAnim,
InfomainScript::c_iic058in_RunAnim
};
// GLOBAL: LEGO1 0x100f7730
InfomainScript::Script g_leaveDialogueAct1[4] = {
InfomainScript::c_iic039in_PlayWav,
InfomainScript::c_iic040in_PlayWav,
InfomainScript::c_iic041in_PlayWav,
InfomainScript::c_iic042in_PlayWav
};
// GLOBAL: LEGO1 0x100f7740
InfomainScript::Script g_leaveDialogueAct2[4] = {
InfomainScript::c_iic051in_PlayWav,
InfomainScript::c_iic052in_PlayWav,
InfomainScript::c_iic053in_PlayWav,
InfomainScript::c_iic054in_PlayWav
};
// GLOBAL: LEGO1 0x100f7750
InfomainScript::Script g_leaveDialogueAct3[4] = {
InfomainScript::c_iic059in_PlayWav,
InfomainScript::c_iic060in_PlayWav,
InfomainScript::c_iic061in_PlayWav,
// Zero-terminated
};
// GLOBAL: LEGO1 0x100f7760
InfomainScript::Script g_bricksterDialogue[2] = {
InfomainScript::c_sbleh2br_PlayWav,
InfomainScript::c_snshahbr_PlayWav
};
// FUNCTION: LEGO1 0x1006ea20
Infocenter::Infocenter()
{
@ -1462,3 +1545,45 @@ void Infocenter::StopBookAnimation()
action.SetUnknown24(-2);
DeleteObject(action);
}
// FUNCTION: LEGO1 0x10071600
InfocenterState::InfocenterState()
{
m_exitDialogueAct1 = LegoState::Playlist((MxU32*) g_exitDialogueAct1, sizeOfArray(g_exitDialogueAct1));
m_exitDialogueAct23 = LegoState::Playlist((MxU32*) g_exitDialogueAct23, sizeOfArray(g_exitDialogueAct23) - 1);
m_returnDialogue[LegoGameState::e_act1] =
LegoState::Playlist((MxU32*) g_returnDialogueAct1, sizeOfArray(g_returnDialogueAct1) - 1);
m_returnDialogue[LegoGameState::e_act2] =
LegoState::Playlist((MxU32*) g_returnDialogueAct2, sizeOfArray(g_returnDialogueAct2) - 1);
m_returnDialogue[LegoGameState::e_act3] =
LegoState::Playlist((MxU32*) g_returnDialogueAct3, sizeOfArray(g_returnDialogueAct3));
m_leaveDialogue[LegoGameState::e_act1] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct1, sizeOfArray(g_leaveDialogueAct1));
m_leaveDialogue[LegoGameState::e_act2] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct2, sizeOfArray(g_leaveDialogueAct2));
m_leaveDialogue[LegoGameState::e_act3] =
LegoState::Playlist((MxU32*) g_leaveDialogueAct3, sizeOfArray(g_leaveDialogueAct3) - 1);
m_bricksterDialogue = LegoState::Playlist((MxU32*) g_bricksterDialogue, sizeOfArray(g_bricksterDialogue));
memset(m_letters, 0, sizeof(m_letters));
}
// FUNCTION: LEGO1 0x10071920
InfocenterState::~InfocenterState()
{
MxS16 i = 0;
do {
if (GetNameLetter(i) != NULL) {
delete GetNameLetter(i)->GetAction();
delete GetNameLetter(i);
}
i++;
} while (i < GetMaxNameLength());
}

Some files were not shown because too many files have changed in this diff Show More