Merge remote-tracking branch 'isle/master'

This commit is contained in:
Christian Semmler 2024-11-14 13:42:52 -07:00
commit bb36eda0dd
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
49 changed files with 1180 additions and 307 deletions

View File

@ -10,19 +10,34 @@ class Act2Actor : public LegoAnimActor {
public:
Act2Actor();
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
MxS32 VTable0x68(Vector3&, Vector3&, Vector3&) override; // vtable+0x68
void VTable0x70(float p_und) override; // vtable+0x70
MxResult VTable0x94(LegoPathActor*, MxBool) override; // vtable+0x94
MxResult VTable0x9c() override; // vtable+0x9c
MxS32 VTable0xa0() override; // vtable+0xa0
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override; // vtable+0x68
void VTable0x70(float p_und) override; // vtable+0x70
MxResult VTable0x94(LegoPathActor*, MxBool) override; // vtable+0x94
MxResult VTable0x9c() override; // vtable+0x9c
MxS32 VTable0xa0() override; // vtable+0xa0
// SYNTHETIC: LEGO1 0x1001a0a0
// Act2Actor::`scalar deleting destructor'
private:
undefined m_unk0x1c[0x34]; // 0x1c
undefined m_unk0x1c; // 0x1c
undefined m_unk0x1d; // 0x1d
undefined m_unk0x1e; // 0x1e
MxBool m_unk0x1f; // 0x1f
undefined4 m_unk0x20; // 0x20
undefined4 m_unk0x24; // 0x24
undefined4 m_unk0x28; // 0x28
undefined4 m_unk0x2c; // 0x2c
undefined4 m_unk0x30; // 0x30
undefined4 m_unk0x34; // 0x34
undefined4 m_unk0x38; // 0x38
undefined4 m_unk0x3c; // 0x3c
undefined m_unk0x40; // 0x40
undefined4 m_unk0x44; // 0x44
undefined m_unk0x48; // 0x48
undefined4 m_unk0x4c; // 0x4c
};
#endif // ACT2ACTOR_H

View File

@ -6,10 +6,13 @@
// VTABLE: LEGO1 0x100d4ed8
// SIZE 0x154
class Act2GenActor : public LegoPathActor {
MxResult VTable0x94(LegoPathActor*, MxBool) override; // vtable+0x94
MxResult VTable0x94(LegoPathActor* p_actor, MxBool) override; // vtable+0x94
// SYNTHETIC: LEGO1 0x1000f5a0
// Act2GenActor::`scalar deleting destructor'
private:
static MxLong g_lastHitActorTime;
};
#endif // ACT2GENACTOR_H

View File

@ -3,11 +3,13 @@
#include "legopathactor.h"
class LegoROI;
// VTABLE: LEGO1 0x100d4788
// SIZE 0x1f8
class Doors : public LegoPathActor {
public:
Doors() : m_unk0x154(0), m_unk0x15c(NULL), m_unk0x160(NULL), m_unk0x1f4(0) {}
Doors() : m_unk0x154(0), m_ltDoor(NULL), m_rtDoor(NULL), m_unk0x1f4(0) {}
// FUNCTION: LEGO1 0x1000e430
const char* ClassName() const override // vtable+0x0c
@ -22,21 +24,22 @@ class Doors : public LegoPathActor {
return !strcmp(p_name, Doors::ClassName()) || LegoPathActor::IsA(p_name);
}
void ParseAction(char*) override; // vtable+0x20
void ParseAction(char* p_extra) override; // vtable+0x20
void VTable0x70(float p_float) override; // vtable+0x70
MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
virtual double VTable0xcc(float p_float); // vtable+0xcc
// SYNTHETIC: LEGO1 0x1000e580
// Doors::`scalar deleting destructor'
private:
undefined4 m_unk0x154; // 0x154
MxFloat m_unk0x158; // 0x158
Matrix4* m_unk0x15c; // 0x15c
Matrix4* m_unk0x160; // 0x160
MxMatrix m_unk0x164; // 0x164
MxMatrix m_unk0x1ac; // 0x1ac
MxFloat m_unk0x1f4; // 0x1f4
undefined4 m_unk0x154; // 0x154
MxFloat m_unk0x158; // 0x158
LegoROI* m_ltDoor; // 0x15c
LegoROI* m_rtDoor; // 0x160
MxMatrix m_ltDoorLocal; // 0x164
MxMatrix m_rtDoorLocal; // 0x1ac
MxFloat m_unk0x1f4; // 0x1f4
};
#endif // DOORS_H

View File

@ -54,7 +54,7 @@ class Act1State : public LegoState {
void PlayCptClickDialogue();
void StopCptClickDialogue();
void RemoveActors();
void FUN_10034d00();
void PlaceActors();
MxU32 GetUnknown18() { return m_unk0x018; }
ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
@ -83,21 +83,21 @@ class Act1State : public LegoState {
LegoNamedPlane m_bikePlane; // 0x070
LegoNamedPlane m_skateboardPlane; // 0x0bc
LegoNamedPlane m_helicopterPlane; // 0x108
LegoNamedTexture* m_unk0x154; // 0x154
LegoNamedTexture* m_unk0x158; // 0x158
LegoNamedTexture* m_unk0x15c; // 0x15c
LegoNamedTexture* m_helicopterWindshield; // 0x154
LegoNamedTexture* m_helicopterJetLeft; // 0x158
LegoNamedTexture* m_helicopterJetRight; // 0x15c
Helicopter* m_helicopter; // 0x160
LegoNamedPlane m_jetskiPlane; // 0x164
LegoNamedTexture* m_unk0x1b0; // 0x1b0
LegoNamedTexture* m_unk0x1b4; // 0x1b4
LegoNamedTexture* m_jetskiFront; // 0x1b0
LegoNamedTexture* m_jetskiWindshield; // 0x1b4
Jetski* m_jetski; // 0x1b8
LegoNamedPlane m_dunebuggyPlane; // 0x1bc
LegoNamedTexture* m_unk0x208; // 0x208
LegoNamedTexture* m_dunebuggyFront; // 0x208
DuneBuggy* m_dunebuggy; // 0x20c
LegoNamedPlane m_racecarPlane; // 0x210
LegoNamedTexture* m_unk0x25c; // 0x25c
LegoNamedTexture* m_unk0x260; // 0x260
LegoNamedTexture* m_unk0x264; // 0x264
LegoNamedTexture* m_racecarFront; // 0x25c
LegoNamedTexture* m_racecarBack; // 0x260
LegoNamedTexture* m_racecarTail; // 0x264
RaceCar* m_racecar; // 0x268
};
@ -129,18 +129,18 @@ class Isle : public LegoWorld {
}
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+50
void Add(MxCore* p_object) override; // vtable+58
void ReadyWorld() override; // vtable+0x50
void Add(MxCore* p_object) override; // vtable+0x58
// FUNCTION: LEGO1 0x10030900
MxBool VTable0x5c() override { return TRUE; } // vtable+5c
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10033170
void VTable0x60() override {} // vtable+60
MxBool Escape() override; // vtable+64
void Enable(MxBool p_enable) override; // vtable+68
virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+6c
MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68
virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+0x6c
void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; }
MxBool HasHelicopter() { return m_helicopter != NULL; }

View File

@ -137,6 +137,8 @@ class IslePathActor : public LegoPathActor {
SetState(0);
}
void SetWorld(LegoWorld* p_world) { m_world = p_world; }
static void RegisterSpawnLocations();
protected:

View File

@ -4,27 +4,33 @@
#include "legorace.h"
// VTABLE: LEGO1 0x100d4fa8
// VTABLE: BETA10 0x101bd5d0
// SIZE 0x2c
class JetskiRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dc40
// FUNCTION: BETA10 0x100a8f30
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00ac
// STRING: BETA10 0x101f1d0c
return "JetskiRaceState";
}
// FUNCTION: LEGO1 0x1000dc50
// FUNCTION: BETA10 0x100a8f60
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f680
// SYNTHETIC: BETA10 0x100a9d10
// JetskiRaceState::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4fe8
// VTABLE: BETA10 0x101bd268
// SIZE 0x144
class JetskiRace : public LegoRace {
public:
@ -43,6 +49,7 @@ class JetskiRace : public LegoRace {
}
// FUNCTION: LEGO1 0x1000db00
// FUNCTION: BETA10 0x100a8860
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRace::ClassName()) || LegoRace::IsA(p_name);

View File

@ -78,7 +78,7 @@ class LegoAct2 : public LegoWorld {
undefined m_unk0x10c2; // 0x10c2
undefined4 m_unk0x10c4; // 0x10c4
undefined4 m_unk0x10c8; // 0x10c8
undefined4 m_unk0x10cc; // 0x10cc
LegoAct2State* m_gameState; // 0x10cc
undefined4 m_unk0x10d0; // 0x10d0
char* m_unk0x10d4; // 0x10d4
undefined4 m_unk0x10d8; // 0x10d8

View File

@ -62,9 +62,9 @@ class LegoActor : public LegoEntity {
static const char* GetActorName(MxU8 p_id);
protected:
void Mute(MxBool p_muted);
protected:
MxFloat m_frequencyFactor; // 0x68
LegoCacheSound* m_sound; // 0x6c
MxFloat m_unk0x70; // 0x70

View File

@ -126,9 +126,12 @@ class LegoCarBuild : public LegoWorld {
); // vtable+0x80
MxS16 GetPlacedPartCount();
void SetPlacedPartCount(MxU8 p_placedPartCount);
void InitPresenters();
void FUN_10022f00();
void FUN_10022f30();
void FUN_10023130(MxLong p_x, MxLong p_y);
void FUN_100236d0();
undefined4 FUN_10024250(LegoEventNotificationParam* p_param);
void FUN_100243a0();
undefined4 FUN_10024480(MxActionNotificationParam* p_param);

View File

@ -70,6 +70,7 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
void FUN_10079680(LegoChar* p_param);
LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name);
LegoTreeNode* FindNodeByName(LegoTreeNode* p_treeNode, const LegoChar* p_name);
void FUN_10079790(const LegoChar* p_name);
void RotateAroundYAxis(MxFloat p_angle);
MxBool FUN_10079c30(const LegoChar* p_name);
MxBool PartIsPlaced(const LegoChar* p_name);
@ -77,7 +78,7 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
MxBool StringEqualsPlatform(const LegoChar* p_string);
MxBool StringEqualsShelf(const LegoChar* p_string);
MxBool StringEndsOnY(const LegoChar* p_string);
MxBool StringEndsOnZero(const LegoChar* p_string);
MxBool StringDoesNotEndOnZero(const LegoChar* p_string);
const LegoChar* GetWiredNameByPartName(const LegoChar* p_name);
void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId);
@ -130,7 +131,7 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
MxFloat m_unk0x130; // 0x130
MxFloat m_unk0x134; // 0x134
MxFloat m_unk0x138; // 0x138
MxLong m_unk0x13c; // 0x13c
MxULong m_unk0x13c; // 0x13c
LegoEntity* m_unk0x140; // 0x140
MxS32 m_unk0x144; // 0x144
MxS32 m_unk0x148; // 0x148

View File

@ -45,6 +45,7 @@ class LegoEntity : public MxEntity {
}
// FUNCTION: LEGO1 0x1000c300
// FUNCTION: BETA10 0x100125a0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoEntity::ClassName()) || MxEntity::IsA(p_name);

View File

@ -131,6 +131,9 @@ class LegoGameState {
void WriteScoreHistory();
void FUN_1003ccf0(LegoFile&);
// FUNCTION: BETA10 0x1002c2b0
MxS16 GetCount() { return m_count; }
ScoreItem* GetScore(MxS16 p_index) { return p_index >= m_count ? NULL : &m_scores[p_index]; }
MxS16 m_count; // 0x00

View File

@ -14,13 +14,19 @@ class LegoNamedPlane {
// FUNCTION: LEGO1 0x10033a70
// LegoNamedPlane::~LegoNamedPlane
void SetName(const char* p_name) { m_name = p_name; }
const MxString* GetName() const { return &m_name; }
const char* GetName() const { return m_name.GetData(); }
const Mx3DPointFloat& GetPosition() { return m_position; }
const Mx3DPointFloat& GetDirection() { return m_direction; }
const Mx3DPointFloat& GetUp() { return m_up; }
void SetName(const char* p_name) { m_name = p_name; }
void SetPosition(const Mx3DPointFloat& p_position) { m_position = p_position; }
void SetDirection(const Mx3DPointFloat& p_direction) { m_direction = p_direction; }
void SetUp(const Mx3DPointFloat& p_up) { m_up = p_up; }
MxBool IsPresent() { return strcmp(m_name.GetData(), "") != 0; }
void Reset() { m_name = ""; }
// FUNCTION: LEGO1 0x100344d0
MxResult Serialize(LegoFile* p_file)
{

View File

@ -21,7 +21,7 @@ class LegoNamedTexture {
private:
MxString m_name; // 0x00
LegoTexture* m_texture; // 0x04
LegoTexture* m_texture; // 0x10
};
#endif // LEGONAMEDTEXTURE_H

View File

@ -142,6 +142,7 @@ class LegoPathActor : public LegoActor {
void SetController(LegoPathController* p_controller) { m_controller = p_controller; }
void UpdatePlane(LegoNamedPlane& p_namedPlane);
void PlaceActor(LegoNamedPlane& p_namedPlane);
// SYNTHETIC: LEGO1 0x1002d800
// LegoPathActor::`scalar deleting destructor'

View File

@ -3,6 +3,7 @@
#include "decomp.h"
#include "legogamestate.h"
#include "legoraceactor.h"
#include "legoracemap.h"
#include "legostate.h"
#include "legoworld.h"
@ -17,6 +18,7 @@ class MxNotificationParam;
class LegoPathStructNotificationParam;
// VTABLE: LEGO1 0x100d5e30
// VTABLE: BETA10 0x101be270
// SIZE 0x2c
class RaceState : public LegoState {
public:
@ -34,6 +36,7 @@ class RaceState : public LegoState {
MxS16 GetUnknown0x02() { return m_unk0x02; }
MxS16 GetHighScore() { return m_score; }
// FUNCTION: BETA10 0x100c96f0
MxResult Serialize(LegoFile* p_file)
{
if (p_file->IsReadMode()) {
@ -59,13 +62,16 @@ class RaceState : public LegoState {
RaceState();
// FUNCTION: LEGO1 0x10016010
// FUNCTION: BETA10 0x100a9040
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07d0
// STRING: BETA10 0x101f1d20
return "RaceState";
}
// FUNCTION: LEGO1 0x10016020
// FUNCTION: BETA10 0x100a8fd0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
@ -90,6 +96,7 @@ class RaceState : public LegoState {
};
// VTABLE: LEGO1 0x100d5db0
// VTABLE: BETA10 0x101be1e0
// SIZE 0x144
class LegoRace : public LegoWorld {
public:
@ -113,6 +120,7 @@ class LegoRace : public LegoWorld {
}
// FUNCTION: LEGO1 0x10015bb0
// FUNCTION: BETA10 0x100a88d0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoRace::ClassName()) || LegoWorld::IsA(p_name);
@ -132,8 +140,12 @@ class LegoRace : public LegoWorld {
// FUNCTION: LEGO1 0x1000dab0
virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78
// STUB: LEGO1 0x1000dac0
virtual void VTable0x7c(LegoRaceMap*, undefined4) {} // vtable+0x7c
// FUNCTION: LEGO1 0x1000dac0
// FUNCTION: BETA10 0x100a87d0
virtual void VTable0x7c(LegoRaceActor* p_map, MxU32 p_index) // vtable+0x7c
{
m_unk0x110[p_index] = (LegoRaceActor*) p_map;
}
// SYNTHETIC: LEGO1 0x10015cc0
// LegoRace::`scalar deleting destructor'
@ -145,16 +157,14 @@ class LegoRace : public LegoWorld {
undefined4 m_unk0x104; // 0x104
undefined4 m_unk0x108; // 0x108
undefined4 m_unk0x10c; // 0x10c
undefined4 m_unk0x110; // 0x110
undefined4 m_unk0x114; // 0x114
undefined4 m_unk0x118; // 0x118
LegoRaceActor* m_unk0x110[3]; // 0x110
LegoGameState::Area m_destLocation; // 0x11c
LegoPathActor* m_pathActor; // 0x120
Act1State* m_act1State; // 0x124
undefined4 m_unk0x128; // 0x128
undefined4 m_unk0x12c; // 0x12c
MxStillPresenter* m_unk0x128; // 0x128
MxStillPresenter* m_unk0x12c; // 0x12c
MxRect32 m_unk0x130; // 0x130
undefined4 m_unk0x140; // 0x140
RaceState* m_raceState; // 0x140
};
#endif // LEGORACE_H

View File

@ -75,6 +75,9 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
virtual void FUN_10012ff0(float p_param);
virtual MxU32 HandleSkeletonKicks(float p_param1);
static void FUN_10012de0();
static void FUN_10013670();
// SYNTHETIC: LEGO1 0x10014240
// LegoRaceCar::`scalar deleting destructor'
@ -108,10 +111,10 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
static MxU32 g_srtsl6to10Index;
static MxU32 g_emptySoundKeyListIndex;
static MxU32 g_srtrhIndex;
static Mx3DPointFloat g_unk0x10102af0;
static MxLong g_timeLastSoundPlayed;
static MxS32 g_unk0x100f0b88;
static MxBool g_unk0x100f0b8c;
static Mx3DPointFloat g_unk0x10102af0;
};
#endif // LEGORACERS_H

View File

@ -6,6 +6,7 @@
#include "mxcore.h"
// VTABLE: LEGO1 0x100d46c0
// VTABLE: BETA10 0x101b89d8
// SIZE 0x08
class LegoState : public MxCore {
public:
@ -73,6 +74,7 @@ class LegoState : public MxCore {
return SUCCESS;
}
private:
MxU32* m_objectIds; // 0x00
MxS16 m_length; // 0x04
MxS16 m_mode; // 0x06
@ -83,13 +85,16 @@ class LegoState : public MxCore {
~LegoState() override {}
// FUNCTION: LEGO1 0x100060d0
// FUNCTION: BETA10 0x10017d20
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f01b8
// STRING: BETA10 0x101dcdac
return "LegoState";
}
// FUNCTION: LEGO1 0x100060e0
// FUNCTION: BETA10 0x100a9000
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoState::ClassName()) || MxCore::IsA(p_name);
@ -102,6 +107,7 @@ class LegoState : public MxCore {
virtual MxBool Reset() { return FALSE; } // vtable+0x18
// FUNCTION: LEGO1 0x10005fb0
// FUNCTION: BETA10 0x10017af0
virtual MxResult Serialize(LegoFile* p_file)
{
if (p_file->IsWriteMode()) {

View File

@ -28,6 +28,7 @@ enum Cursor {
e_cursorNone
};
class BoundingSphere;
class MxAtomId;
class LegoEntity;
class LegoFile;
@ -43,6 +44,7 @@ LegoEntity* PickEntity(MxLong, MxLong);
LegoROI* PickROI(MxLong, MxLong);
LegoROI* PickParentROI(MxLong p_a, MxLong p_b);
void FUN_1003dde0(LegoROI* p_param1, MxFloat p_param2);
MxBool SpheresIntersect(const BoundingSphere& p_sphere1, const BoundingSphere& p_sphere2);
MxBool FUN_1003ded0(MxFloat p_param1[2], MxFloat p_param2[3], MxFloat p_param3[3]);
MxBool TransformWorldToScreen(const MxFloat p_world[3], MxFloat p_screen[4]);
MxS16 CountTotalTreeNodes(LegoTreeNode* p_node);
@ -63,7 +65,8 @@ MxS32 UpdateLightPosition(MxS32 p_increase);
void SetLightPosition(MxS32 p_index);
LegoNamedTexture* ReadNamedTexture(LegoFile* p_file);
void FUN_1003f540(LegoFile* p_file, const char* p_filename);
void WriteNamedTexture(LegoFile* p_file, LegoNamedTexture* p_texture);
void WriteNamedTexture(LegoFile* p_file, LegoNamedTexture* p_namedTexture);
void FUN_1003f930(LegoNamedTexture* p_namedTexture);
// FUNCTION: BETA10 0x100260a0
inline void StartIsleAction(IsleScript::Script p_objectId)

View File

@ -28,6 +28,7 @@ struct CoreSetCompare {
typedef set<MxCore*, CoreSetCompare> MxCoreSet;
// VTABLE: LEGO1 0x100d6280
// VTABLE: BETA10 0x101befd8
// SIZE 0xf8
class LegoWorld : public LegoEntity {
public:
@ -46,6 +47,7 @@ class LegoWorld : public LegoEntity {
MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x1001d690
// FUNCTION: BETA10 0x10017660
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0058
@ -53,6 +55,7 @@ class LegoWorld : public LegoEntity {
}
// FUNCTION: LEGO1 0x1001d6a0
// FUNCTION: BETA10 0x100175f0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoWorld::ClassName()) || LegoEntity::IsA(p_name);
@ -104,7 +107,7 @@ class LegoWorld : public LegoEntity {
MxS32 GetWorldId() { return m_worldId; }
MxBool GetUnknown0xd0Empty() { return m_set0xd0.empty(); }
list<LegoROI*>& GetROIList() { return m_roiList; }
LegoHideAnimPresenter* GetHideAnimPresenter() { return m_hideAnimPresenter; }
LegoHideAnimPresenter* GetHideAnimPresenter() { return m_hideAnim; }
void SetWorldId(MxS32 p_worldId) { m_worldId = p_worldId; }
@ -112,21 +115,24 @@ class LegoWorld : public LegoEntity {
// LegoWorld::`scalar deleting destructor'
protected:
LegoPathControllerList m_list0x68; // 0x68
MxPresenterList m_animPresenters; // 0x80
LegoCameraController* m_cameraController; // 0x98
LegoEntityList* m_entityList; // 0x9c
LegoCacheSoundList* m_cacheSoundList; // 0xa0
MxBool m_destroyed; // 0xa4
MxCoreSet m_set0xa8; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8
MxCoreSet m_set0xd0; // 0xd0
list<LegoROI*> m_roiList; // 0xe0
MxS32 m_worldId; // 0xec
LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0
MxS16 m_startupTicks; // 0xf4
MxBool m_worldStarted; // 0xf6
undefined m_unk0xf7; // 0xf7
LegoPathControllerList m_list0x68; // 0x68
MxPresenterList m_animPresenters; // 0x80
LegoCameraController* m_cameraController; // 0x98
LegoEntityList* m_entityList; // 0x9c
LegoCacheSoundList* m_cacheSoundList; // 0xa0
MxBool m_destroyed; // 0xa4
MxCoreSet m_set0xa8; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8
MxCoreSet m_set0xd0; // 0xd0
list<LegoROI*> m_roiList; // 0xe0
MxS32 m_worldId; // 0xec
// name verified by BETA10 0x100c7f59
LegoHideAnimPresenter* m_hideAnim; // 0xf0
MxS16 m_startupTicks; // 0xf4
MxBool m_worldStarted; // 0xf6
undefined m_unk0xf7; // 0xf7
};
// clang-format off

View File

@ -35,7 +35,7 @@ class MxBackgroundAudioManager : public MxCore {
void StartAction(MxParam& p_param);
void StopAction(MxParam& p_param);
MxResult PlayMusic(MxDSAction& p_action, undefined4 p_unk0x140, MxPresenter::TickleState p_tickleState);
MxResult PlayMusic(MxDSAction& p_action, undefined4 p_speed, MxPresenter::TickleState p_tickleState);
void FUN_1007ee70();
void FUN_1007ef40();
@ -48,7 +48,7 @@ class MxBackgroundAudioManager : public MxCore {
void Stop();
void LowerVolume();
void RaiseVolume();
undefined4 FUN_1007f610(MxPresenter* p_unk0x138, MxS32 p_unk0x140, MxPresenter::TickleState p_tickleState);
undefined4 FUN_1007f610(MxPresenter* p_unk0x138, MxS32 p_speed, MxPresenter::TickleState p_tickleState);
// SYNTHETIC: LEGO1 0x1007ec00
// MxBackgroundAudioManager::`scalar deleting destructor'
@ -66,7 +66,9 @@ class MxBackgroundAudioManager : public MxCore {
// name is inferred from context
MxPresenter::TickleState m_tickleState; // 0x13c
MxS32 m_unk0x140; // 0x140
// name inferred from parameter p_speed
MxS32 m_speed; // 0x140
MxS32 m_targetVolume; // 0x144
MxS16 m_unk0x148; // 0x148
MxAtomId m_script; // 0x14c

View File

@ -1,23 +1,49 @@
#include "act2actor.h"
#include "legocachesoundmanager.h"
#include "legosoundmanager.h"
#include "misc.h"
#include "roi/legoroi.h"
DECOMP_SIZE_ASSERT(Act2Actor, 0x1a8)
// STUB: LEGO1 0x100187e0
Act2Actor::Act2Actor()
{
// TODO
m_unk0x1c = 0;
m_unk0x1d = 0;
m_unk0x1f = FALSE;
m_unk0x24 = 0;
m_unk0x20 = 0;
m_unk0x1e = 0;
m_unk0x28 = 4;
m_unk0x2c = 0;
m_unk0x30 = 0;
m_unk0x34 = 0;
m_unk0x44 = 0;
m_unk0x40 = 1;
m_unk0x48 = 0;
m_unk0x4c = 0;
m_unk0x38 = 0;
m_unk0x3c = 0;
}
// STUB: LEGO1 0x10018940
// FUNCTION: LEGO1 0x10018940
void Act2Actor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
{
// TODO
LegoAnimActor::SetROI(p_roi, p_bool1, p_bool2);
m_roi->SetVisibility(FALSE);
}
// STUB: LEGO1 0x100189f0
// FUNCTION: LEGO1 0x100189f0
MxResult Act2Actor::VTable0x94(LegoPathActor*, MxBool)
{
// TODO
if (m_unk0x1f == FALSE) {
m_unk0x1f = TRUE;
m_unk0x20 = 0;
}
SoundManager()->GetCacheSoundManager()->Play("hitactor", NULL, FALSE);
return SUCCESS;
}
@ -34,10 +60,11 @@ void Act2Actor::VTable0x70(float p_und)
// TODO
}
// STUB: LEGO1 0x10019280
// FUNCTION: LEGO1 0x10019280
void Act2Actor::SetWorldSpeed(MxFloat p_worldSpeed)
{
// TODO
LegoAnimActor::SetWorldSpeed(p_worldSpeed);
m_unk0x44 = 0;
}
// STUB: LEGO1 0x100195a0
@ -47,9 +74,12 @@ MxS32 Act2Actor::VTable0xa0()
return 0;
}
// STUB: LEGO1 0x1001a180
MxS32 Act2Actor::VTable0x68(Vector3&, Vector3&, Vector3&)
// FUNCTION: LEGO1 0x1001a180
MxS32 Act2Actor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3)
{
// TODO
return 0;
if (m_unk0x1f) {
return 0;
}
return LegoAnimActor::VTable0x68(p_v1, p_v2, p_v3);
}

View File

@ -1,10 +1,32 @@
#include "act2genactor.h"
#include "legocachesoundmanager.h"
#include "legosoundmanager.h"
#include "misc.h"
#include "mxmisc.h"
#include "mxtimer.h"
#include "roi/legoroi.h"
DECOMP_SIZE_ASSERT(Act2GenActor, 0x154)
// STUB: LEGO1 0x10018740
MxResult Act2GenActor::VTable0x94(LegoPathActor*, MxBool)
// GLOBAL: LEGO1 0x100f0f18
MxLong Act2GenActor::g_lastHitActorTime = 0;
// FUNCTION: LEGO1 0x10018740
// FUNCTION: BETA10 0x1000c7a0
MxResult Act2GenActor::VTable0x94(LegoPathActor* p_actor, MxBool)
{
// TODO
MxLong time = Timer()->GetTime();
MxLong diff = time - g_lastHitActorTime;
if (strcmp(p_actor->GetROI()->GetName(), "pepper")) {
return SUCCESS;
}
g_lastHitActorTime = time;
if (diff > 1000) {
SoundManager()->GetCacheSoundManager()->Play("hitactor", NULL, FALSE);
}
return SUCCESS;
}

View File

@ -1,31 +1,110 @@
#include "doors.h"
#include "legopathboundary.h"
#include "mxmisc.h"
#include "mxtimer.h"
#include "roi/legoroi.h"
#include <assert.h>
DECOMP_SIZE_ASSERT(Doors, 0x1f8)
// FUNCTION: LEGO1 0x10066100
// FUNCTION: BETA10 0x10026850
MxResult Doors::VTable0x94(LegoPathActor* p_actor, MxBool p_bool)
{
assert(m_ltDoor && m_rtDoor);
if (m_unk0x154 == 1) {
m_unk0x154 = 2;
m_unk0x158 = Timer()->GetTime();
m_unk0x164 = m_unk0x15c[2];
m_unk0x1ac = m_unk0x160[2];
m_ltDoorLocal = m_ltDoor->GetLocal2World();
m_rtDoorLocal = m_rtDoor->GetLocal2World();
}
return m_unk0x1f4 < 0.001 ? SUCCESS : FAILURE;
}
// STUB: LEGO1 0x10066250
void Doors::VTable0x70(float p_float)
// STUB: LEGO1 0x10066190
// FUNCTION: BETA10 0x1002696b
double Doors::VTable0xcc(float p_float)
{
// TODO
return 0.0;
}
// STUB: LEGO1 0x100664e0
void Doors::ParseAction(char*)
// FUNCTION: LEGO1 0x10066250
// FUNCTION: BETA10 0x10026a45
void Doors::VTable0x70(float p_float)
{
// TODO
assert(m_ltDoor && m_rtDoor);
// TODO: Match
m_roi->SetVisibility(m_boundary->GetFlag0x10());
switch (m_unk0x154) {
case 0:
m_unk0x154 = 1;
m_state = 0;
break;
case 1:
break;
case 2:
float local8 = VTable0xcc(p_float);
if (local8 > 0.0f) {
MxMatrix local58(m_ltDoorLocal);
Vector3 local10(local58[3]);
local10.Clear();
local58.RotateY(-local8);
local10 = m_ltDoorLocal[3];
m_ltDoor->FUN_100a58f0(local58);
m_ltDoor->VTable0x14();
local58 = m_rtDoorLocal;
local10.Clear();
local58.RotateY(local8);
local10 = m_rtDoorLocal[3];
m_rtDoor->FUN_100a58f0(local58);
m_rtDoor->VTable0x14();
m_unk0x1f4 = local8;
}
if (m_unk0x158 + 6000.0f < p_float) {
m_ltDoor->FUN_100a58f0(m_ltDoorLocal);
m_rtDoor->FUN_100a58f0(m_rtDoorLocal);
m_ltDoor->VTable0x14();
m_rtDoor->VTable0x14();
m_unk0x154 = 1;
m_state = 0;
m_unk0x1f4 = 0;
}
}
}
// FUNCTION: LEGO1 0x100664e0
// FUNCTION: BETA10 0x10026ceb
void Doors::ParseAction(char* p_extra)
{
LegoPathActor::ParseAction(p_extra);
assert(m_ltDoor == NULL && m_rtDoor == NULL);
assert(m_roi);
assert(!strncmp(m_roi->GetName(), "rcdor", 5));
const CompoundObject* comp = m_roi->GetComp();
for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) {
LegoROI* roi = (LegoROI*) *it;
if (roi && (!strnicmp(roi->GetName(), "dor-lt", 6) || !strnicmp(roi->GetName(), "dor-sl", 6))) {
m_ltDoor = roi;
}
else if (roi && (!strnicmp(roi->GetName(), "dor-rt", 6) || !strnicmp(roi->GetName(), "dor-sr", 6))) {
m_rtDoor = roi;
}
}
assert(m_ltDoor && m_rtDoor);
}

View File

@ -21,7 +21,7 @@ MxBackgroundAudioManager::MxBackgroundAudioManager()
m_unk0xa0 = 0;
m_unk0x138 = 0;
m_tickleState = MxPresenter::e_idle;
m_unk0x140 = 0;
m_speed = 0;
m_targetVolume = 0;
m_unk0x148 = 0;
m_enabled = FALSE;
@ -128,8 +128,8 @@ void MxBackgroundAudioManager::FUN_1007ef40()
volume = m_unk0x138->GetVolume();
if (volume < compare) {
if (m_unk0x140 + m_unk0x138->GetVolume() <= compare) {
compare = m_unk0x140 + m_unk0x138->GetVolume();
if (m_speed + m_unk0x138->GetVolume() <= compare) {
compare = m_speed + m_unk0x138->GetVolume();
}
m_unk0x138->SetVolume(compare);
@ -150,8 +150,8 @@ void MxBackgroundAudioManager::FUN_1007ef40()
DeleteObject(*m_unk0xa0->GetAction());
}
else {
if (m_unk0xa0->GetVolume() - m_unk0x140 > 0) {
volume = m_unk0xa0->GetVolume() - m_unk0x140;
if (m_unk0xa0->GetVolume() - m_speed > 0) {
volume = m_unk0xa0->GetVolume() - m_speed;
}
else {
volume = 0;
@ -178,11 +178,11 @@ void MxBackgroundAudioManager::FadeInOrFadeOut()
}
if (volume < compare) {
volume = Min(volume + m_unk0x140, compare);
volume = Min(volume + m_speed, compare);
m_unk0xa0->SetVolume(volume);
}
else if (compare < volume) {
volume = Max(volume - m_unk0x140, compare);
volume = Max(volume - m_speed, compare);
m_unk0xa0->SetVolume(volume);
}
else {
@ -238,12 +238,15 @@ void MxBackgroundAudioManager::StopAction(MxParam& p_param)
}
// FUNCTION: LEGO1 0x1007f2f0
// FUNCTION: BETA10 0x100e90fc
MxResult MxBackgroundAudioManager::PlayMusic(
MxDSAction& p_action,
undefined4 p_unk0x140,
undefined4 p_speed,
MxPresenter::TickleState p_tickleState
)
{
assert(p_speed > 0);
if (!m_enabled) {
return SUCCESS;
}
@ -267,7 +270,7 @@ MxResult MxBackgroundAudioManager::PlayMusic(
if (result == SUCCESS) {
m_tickleState = p_tickleState;
m_unk0x140 = p_unk0x140;
m_speed = p_speed;
}
return result;
@ -307,7 +310,7 @@ void MxBackgroundAudioManager::LowerVolume()
if (m_tickleState == 0) {
m_tickleState = MxPresenter::e_starting;
}
m_unk0x140 = 20;
m_speed = 20;
}
m_unk0x148++;
}
@ -321,7 +324,7 @@ void MxBackgroundAudioManager::RaiseVolume()
if (m_tickleState == 0) {
m_tickleState = MxPresenter::e_starting;
}
m_unk0x140 = 10;
m_speed = 10;
}
}
}
@ -342,7 +345,7 @@ void MxBackgroundAudioManager::Enable(MxBool p_enable)
// FUNCTION: BETA10 0x100e95ee
undefined4 MxBackgroundAudioManager::FUN_1007f610(
MxPresenter* p_unk0x138,
MxS32 p_unk0x140,
MxS32 p_speed,
MxPresenter::TickleState p_tickleState
)
@ -352,12 +355,13 @@ undefined4 MxBackgroundAudioManager::FUN_1007f610(
((MxCompositePresenter*) m_unk0x138)->VTable0x60(NULL);
m_unk0x140 = p_unk0x140;
m_speed = p_speed;
m_tickleState = p_tickleState;
return 0;
}
// FUNCTION: LEGO1 0x1007f650
// FUNCTION: BETA10 0x100e9663
void MxBackgroundAudioManager::Init()
{
this->m_unk0xa0 = 0;

View File

@ -196,7 +196,7 @@ MxResult LegoCarBuild::Create(MxDSAction& p_dsAction)
else if (m_atomId == *g_racecarScript) {
buildStateClassName = "LegoRaceCarBuildState";
GameState()->m_currentArea = LegoGameState::e_racecarbuild;
m_carId = Helicopter_Actor;
m_carId = RaceCar_Actor;
}
LegoGameState* gameState = GameState();
@ -235,6 +235,14 @@ MxS16 LegoCarBuild::GetPlacedPartCount()
}
}
// FUNCTION: LEGO1 0x10022cf0
void LegoCarBuild::SetPlacedPartCount(MxU8 p_placedPartCount)
{
if (m_buildState) {
m_buildState->m_placedPartCount = p_placedPartCount;
}
}
// FUNCTION: LEGO1 0x10022d10
// FUNCTION: BETA10 0x1006b27a
void LegoCarBuild::InitPresenters()
@ -281,6 +289,16 @@ void LegoCarBuild::InitPresenters()
}
}
// FUNCTION: LEGO1 0x10022f00
void LegoCarBuild::FUN_10022f00()
{
if (m_unk0x110) {
VTable0x6c();
m_unk0x258->SetUnknown0xbc(0);
m_unk0x100 = 5;
}
}
// FUNCTION: LEGO1 0x10022f30
// FUNCTION: BETA10 0x1006b835
void LegoCarBuild::FUN_10022f30()
@ -458,10 +476,59 @@ void LegoCarBuild::VTable0x80(MxFloat p_param1[2], MxFloat p_param2[2], MxFloat
p_param4[1] = p_param3;
}
// FUNCTION: LEGO1 0x100236d0
// FUNCTION: BETA10 0x1006c076
void LegoCarBuild::FUN_100236d0()
{
MxS32 pLVar2;
FUN_10024f70(FALSE);
FUN_100250e0(FALSE);
m_unk0x258->FUN_10079790(m_unk0x110->GetName());
m_unk0x258->SetUnknown0xbc(1);
m_unk0x110 = NULL;
m_unk0x100 = 0;
if (m_unk0x258->AllPartsPlaced()) {
// Note the code duplication with LEGO1 0x10025ee0
switch (m_carId) {
case 1:
pLVar2 = 0x2f;
break;
case 2:
pLVar2 = 0x31;
break;
case 3:
pLVar2 = 0x33;
break;
case 4:
pLVar2 = 0x35;
}
BackgroundAudioManager()->Init();
InvokeAction(Extra::e_stop, *g_jukeboxScript, pLVar2, NULL);
if (m_numAnimsRun > 0) {
DeleteObjects(&m_atomId, 500, 510);
}
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
FUN_100243a0();
}
else {
m_buildState->m_unk0x4d = TRUE;
InvokeAction(Extra::e_start, m_atomId, m_carId, NULL);
NotificationManager()->Send(this, MxNotificationParam());
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown4;
m_buildState->m_placedPartCount = 0;
}
}
}
#define LEGOCARBUILD_TICKLE_CASE(subtract, start, end, str) \
if (start < dTime && dTime < end) { \
FUN_10025db0(str, dTime - subtract); \
return SUCCESS; \
break; \
}
// FUNCTION: LEGO1 0x100238b0
@ -493,91 +560,94 @@ MxResult LegoCarBuild::Tickle()
DWORD time = timeGetTime();
DWORD dTime = (time - m_unk0x10c) / 100;
if (m_carId == Helicopter_Actor) {
if (m_carId == RaceCar_Actor) {
switch (m_unk0x10a) {
// TODO: Work out constants
case 500:
case RacecarScript::c_irt001d1_RunAnim:
LEGOCARBUILD_TICKLE_CASE(160, 160, 180, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(260, 260, 280, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(330, 330, 340, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(340, 340, 360, "Platform_Ctl")
LEGOCARBUILD_TICKLE_CASE(390, 390, 410, "Exit_Ctl")
case 503:
break;
case RacecarScript::c_irt004d1_RunAnim:
LEGOCARBUILD_TICKLE_CASE(50, 50, 60, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(63, 65, 70, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(70, 70, 80, "Platform_Ctl")
LEGOCARBUILD_TICKLE_CASE(95, 95, 105, "Exit_Ctl")
case 504:
break;
case RacecarScript::c_irtxx4d1_RunAnim:
LEGOCARBUILD_TICKLE_CASE(22, 24, 29, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(33, 35, 40, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(43, 45, 50, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(56, 58, 63, "Platform_Ctl")
default:
return SUCCESS;
break;
}
}
else if (m_carId == Jetski_Actor) {
switch (m_unk0x10a) {
case 500:
case JetskiScript::c_ijs001d4_RunAnim:
LEGOCARBUILD_TICKLE_CASE(291, 291, 311, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(311, 311, 331, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(412, 412, 432, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(437, 437, 457, "Platform_Ctl")
LEGOCARBUILD_TICKLE_CASE(485, 485, 505, "Exit_Ctl")
case 501:
break;
case JetskiScript::c_ijsxx2d4_RunAnim:
LEGOCARBUILD_TICKLE_CASE(32, 34, 39, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(68, 70, 75, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(105, 105, 115, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(133, 135, 140, "Platform_Ctl")
case 504:
break;
case JetskiScript::c_ijs005d4_RunAnim:
LEGOCARBUILD_TICKLE_CASE(78, 78, 98, "Exit_Ctl")
case 505:
break;
case JetskiScript::c_ijs006d4_RunAnim:
LEGOCARBUILD_TICKLE_CASE(93, 93, 113, "Exit_Ctl")
// default: // not sure if present
// return SUCCESS;
break;
}
}
else if (m_carId == DuneBugy_Actor) {
switch (m_unk0x10a) {
case 500:
case DunecarScript::c_igs001d3_RunAnim:
LEGOCARBUILD_TICKLE_CASE(155, 155, 175, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(215, 215, 235, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(285, 285, 305, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(300, 300, 320, "Platform_Ctl")
LEGOCARBUILD_TICKLE_CASE(340, 340, 360, "Exit_Ctl")
case 501:
break;
case DunecarScript::c_igsxx1d3_RunAnim:
LEGOCARBUILD_TICKLE_CASE(23, 23, 33, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(37, 39, 44, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(105, 105, 115, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(122, 124, 129, "Platform_Ctl")
default:
return SUCCESS;
break;
}
}
else if (m_carId == Helicopter_Actor) {
switch (m_unk0x10a) {
case 500:
case CopterScript::c_ips001d2_RunAnim:
LEGOCARBUILD_TICKLE_CASE(185, 185, 205, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(235, 235, 255, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(292, 292, 312, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(315, 315, 335, "Platform_Ctl")
LEGOCARBUILD_TICKLE_CASE(353, 353, 373, "Exit_Ctl")
case 501:
break;
case CopterScript::c_ipsxx1d2_RunAnim:
LEGOCARBUILD_TICKLE_CASE(43, 45, 50, "Exit_Ctl")
LEGOCARBUILD_TICKLE_CASE(72, 74, 79, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(114, 116, 121, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(128, 130, 135, "Platform_Ctl")
case 505:
break;
case CopterScript::c_ips005d2_RunAnim:
LEGOCARBUILD_TICKLE_CASE(30, 30, 40, "ShelfUp_Ctl")
LEGOCARBUILD_TICKLE_CASE(60, 60, 70, "Yellow_Ctl")
LEGOCARBUILD_TICKLE_CASE(48, 48, 58, "Platform_Ctl")
default:
return SUCCESS;
break;
}
}
}
return 0;
return SUCCESS;
}
// FUNCTION: LEGO1 0x10024050
@ -809,11 +879,49 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
return 1;
}
// STUB: LEGO1 0x100246e0
// FUNCTION: LEGO1 0x100246e0
undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y)
{
// TODO
return 0;
switch (m_unk0x100) {
case 3:
FUN_10022f30();
return 1;
case 4:
FUN_10022f00();
return 1;
case 6:
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) {
if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) {
FUN_10024f70(FALSE);
FUN_100250e0(FALSE);
m_unk0x100 = 0;
m_unk0x110 = NULL;
m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE);
m_unk0x258->SetUnknown0xbc(1);
return 1;
}
}
if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) {
if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) {
m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE);
FUN_100236d0();
return 1;
}
VTable0x6c();
m_unk0x100 = 5;
return 1;
}
VTable0x6c();
m_unk0x100 = 5;
return 1;
default:
return 0;
}
}
// FUNCTION: LEGO1 0x10024850
@ -1048,7 +1156,6 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
entity = (LegoEntity*) Find(m_atomId, m_carId);
if (entity && entity->GetROI()) {
// This function was changed between BETA10 and LEGO1.
// These lines looks like a relic from older code.
LegoWorld* destWorld = NULL;
@ -1063,7 +1170,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_helicopter = (Helicopter*) entity;
gameState->m_helicopterPlane.SetName("");
gameState->m_helicopterPlane.Reset();
break;
case LegoGameState::e_dunecarbuild:
if (gameState->m_dunebuggy) {
@ -1071,7 +1178,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_dunebuggy = (DuneBuggy*) entity;
gameState->m_dunebuggyPlane.SetName("");
gameState->m_dunebuggyPlane.Reset();
break;
case LegoGameState::e_jetskibuild:
if (gameState->m_jetski) {
@ -1079,7 +1186,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_jetski = (Jetski*) entity;
gameState->m_jetskiPlane.SetName("");
gameState->m_jetskiPlane.Reset();
break;
case LegoGameState::e_racecarbuild:
if (gameState->m_racecar) {
@ -1087,7 +1194,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_racecar = (RaceCar*) entity;
gameState->m_racecarPlane.SetName("");
gameState->m_racecarPlane.Reset();
break;
}
@ -1205,7 +1312,7 @@ void LegoCarBuild::TogglePresentersEnabled()
// FUNCTION: BETA10 0x1006e124
void LegoCarBuild::FUN_100250e0(MxBool p_enabled)
{
if (m_unk0x258->StringEndsOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) {
if (m_unk0x258->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) {
if (strnicmp(m_unk0x110->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) {
m_Decal_Bitmap->Enable(p_enabled);
m_Decals_Ctl->Enable(p_enabled);

View File

@ -9,6 +9,7 @@
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h"
#include "misc/legoutil.h"
#include "mxautolock.h"
#include "mxcompositepresenter.h"
#include "mxmisc.h"
@ -507,6 +508,35 @@ LegoTreeNode* LegoCarBuildAnimPresenter::FindNodeByName(LegoTreeNode* p_treeNode
return NULL;
}
// FUNCTION: LEGO1 0x10079790
// FUNCTION: BETA10 0x100720a3
void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name)
{
MxS16 i;
LegoChar buffer[40];
if (strcmpi(m_parts[m_placedPartCount].m_name, p_name) != 0) {
for (i = m_placedPartCount + 1; i < m_numberOfParts; i++) {
if (stricmp(m_parts[i].m_name, p_name) == 0) {
break;
}
}
strcpy(buffer, m_parts[m_placedPartCount].m_name);
strcpy(m_parts[m_placedPartCount].m_name, m_parts[i].m_name);
strcpy(m_parts[i].m_name, buffer);
Swap(m_parts[m_placedPartCount].m_objectId, m_parts[i].m_objectId);
}
FUN_10079050(m_placedPartCount);
m_placedPartCount++;
((LegoCarBuild*) m_currentWorld)->SetPlacedPartCount(m_placedPartCount);
if (m_placedPartCount < m_numberOfParts) {
FUN_10079680(m_parts[m_placedPartCount].m_wiredName);
}
}
// FUNCTION: LEGO1 0x10079920
// FUNCTION: BETA10 0x1007225d
void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
@ -622,9 +652,9 @@ MxBool LegoCarBuildAnimPresenter::StringEndsOnY(const LegoChar* p_string)
// FUNCTION: LEGO1 0x10079d30
// FUNCTION: BETA10 0x1007280e
MxBool LegoCarBuildAnimPresenter::StringEndsOnZero(const LegoChar* p_string)
MxBool LegoCarBuildAnimPresenter::StringDoesNotEndOnZero(const LegoChar* p_string)
{
return (p_string[strlen(p_string) - 2] != '0');
return (p_string[strlen(p_string) - 1] != '0');
}
// FUNCTION: LEGO1 0x10079d60

View File

@ -17,6 +17,8 @@
#include "legoworld.h"
#include "legoworldlist.h"
#include "misc.h"
#include "misc/legocontainer.h"
#include "misc/legoimage.h"
#include "misc/legotree.h"
#include "mxdsaction.h"
#include "mxmisc.h"
@ -71,6 +73,14 @@ void FUN_1003dde0(LegoROI* p_param1, MxFloat p_param2)
// TODO
}
// FUNCTION: LEGO1 0x1003de80
MxBool SpheresIntersect(const BoundingSphere& p_sphere1, const BoundingSphere& p_sphere2)
{
// This doesn't look clean, but it matches.
// p_sphere1.Center().GetData() doesn't work out
return sqrt(DISTSQRD3(&p_sphere1.Center()[0], &p_sphere2.Center()[0])) < p_sphere1.Radius() + p_sphere2.Radius();
}
// FUNCTION: LEGO1 0x1003ded0
// FUNCTION: BETA10 0x100d3802
MxBool FUN_1003ded0(MxFloat p_param1[2], MxFloat p_param2[3], MxFloat p_param3[3])
@ -671,8 +681,18 @@ void FUN_1003f540(LegoFile* p_file, const char* p_filename)
}
// FUNCTION: LEGO1 0x1003f8a0
void WriteNamedTexture(LegoFile* p_file, LegoNamedTexture* p_texture)
void WriteNamedTexture(LegoFile* p_file, LegoNamedTexture* p_namedTexture)
{
p_file->WriteString(*p_texture->GetName());
p_texture->GetTexture()->Write(p_file);
p_file->WriteString(*p_namedTexture->GetName());
p_namedTexture->GetTexture()->Write(p_file);
}
// FUNCTION: LEGO1 0x1003f930
void FUN_1003f930(LegoNamedTexture* p_namedTexture)
{
LegoTextureInfo* textureInfo = TextureContainer()->Get(p_namedTexture->GetName()->GetData());
if (textureInfo != NULL) {
textureInfo->FUN_10066010(p_namedTexture->GetTexture()->GetImage()->GetBits());
}
}

View File

@ -63,8 +63,10 @@ LegoGameState* GameState()
}
// FUNCTION: LEGO1 0x10015770
// FUNCTION: BETA10 0x100e4971
LegoAnimationManager* AnimationManager()
{
assert(LegoOmni::GetInstance());
return LegoOmni::GetInstance()->GetAnimationManager();
}

View File

@ -42,15 +42,17 @@ LegoWorld::LegoWorld() : m_list0x68(TRUE)
m_entityList = NULL;
m_cacheSoundList = NULL;
m_destroyed = FALSE;
m_hideAnimPresenter = NULL;
m_hideAnim = NULL;
m_worldStarted = FALSE;
NotificationManager()->Register(this);
}
// FUNCTION: LEGO1 0x1001d670
// FUNCTION: BETA10 0x10017530
MxBool LegoWorld::VTable0x5c()
{
// The BETA10 match could also be LegoWorld::Escape(), only the child classes might be able to tell
return FALSE;
}
@ -245,6 +247,7 @@ MxLong LegoWorld::Notify(MxParam& p_param)
}
// FUNCTION: LEGO1 0x1001f630
// FUNCTION: BETA10 0x100d9fc2
LegoCameraController* LegoWorld::VTable0x54()
{
MxBool success = FALSE;
@ -413,6 +416,7 @@ MxResult LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_boundaries, MxS32& p_nu
}
// FUNCTION: LEGO1 0x10020220
// FUNCTION: BETA10 0x100da90b
void LegoWorld::Add(MxCore* p_object)
{
if (p_object && !p_object->IsA("LegoWorld") && !p_object->IsA("LegoWorldPresenter")) {
@ -443,7 +447,8 @@ void LegoWorld::Add(MxCore* p_object)
m_entityList->Append((LegoEntity*) p_object);
}
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) {
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") ||
p_object->IsA("LegoLoopingAnimPresenter")) {
MxPresenterListCursor cursor(&m_animPresenters);
if (cursor.Find((MxPresenter*) p_object)) {
@ -454,7 +459,7 @@ void LegoWorld::Add(MxCore* p_object)
m_animPresenters.Append(((MxPresenter*) p_object));
if (p_object->IsA("LegoHideAnimPresenter")) {
m_hideAnimPresenter = (LegoHideAnimPresenter*) p_object;
m_hideAnim = (LegoHideAnimPresenter*) p_object;
}
}
else if (p_object->IsA("LegoCacheSound")) {
@ -497,7 +502,8 @@ void LegoWorld::Remove(MxCore* p_object)
((MxControlPresenter*) p_object)->VTable0x68(TRUE);
}
}
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) {
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") ||
p_object->IsA("LegoLoopingAnimPresenter")) {
MxPresenterListCursor cursor(&m_animPresenters);
if (cursor.Find((MxPresenter*) p_object)) {
@ -505,7 +511,7 @@ void LegoWorld::Remove(MxCore* p_object)
}
if (p_object->IsA("LegoHideAnimPresenter")) {
m_hideAnimPresenter = NULL;
m_hideAnim = NULL;
}
}
else if (p_object->IsA("MxEntity")) {
@ -654,6 +660,7 @@ MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId)
}
// FUNCTION: LEGO1 0x10021a70
// FUNCTION: BETA10 0x100db758
void LegoWorld::Enable(MxBool p_enable)
{
if (p_enable && !m_set0xd0.empty()) {

View File

@ -64,6 +64,7 @@ MxAtomId* g_act2mainScript = NULL;
MxAtomId* g_act3Script = NULL;
// GLOBAL: LEGO1 0x100f456c
// GLOBAL: BETA10 0x102114e0
MxAtomId* g_jukeboxScript = NULL;
// GLOBAL: LEGO1 0x100f4570

View File

@ -728,3 +728,13 @@ void LegoPathActor::UpdatePlane(LegoNamedPlane& p_namedPlane)
p_namedPlane.SetDirection(GetWorldDirection());
p_namedPlane.SetUp(GetWorldUp());
}
// FUNCTION: LEGO1 0x1002f830
void LegoPathActor::PlaceActor(LegoNamedPlane& p_namedPlane)
{
if (p_namedPlane.IsPresent()) {
LegoWorld* world = CurrentWorld();
world->PlaceActor(this, p_namedPlane.GetName(), 0, 0.5f, 1, 0.5f);
SetLocation(p_namedPlane.GetPosition(), p_namedPlane.GetDirection(), p_namedPlane.GetUp(), TRUE);
}
}

View File

@ -19,6 +19,7 @@ DECOMP_SIZE_ASSERT(LegoPathStruct, 0x14)
extern MxU32 g_isleFlags;
// GLOBAL: LEGO1 0x100f119c
// GLOBAL: BETA10 0x100f119c
MxBool g_unk0x100f119c = FALSE;
// FUNCTION: LEGO1 0x1001b700

View File

@ -1,28 +1,154 @@
#include "jetskirace.h"
#include "actions/jetrace_actions.h"
#include "actions/jetski_actions.h"
#include "actions/jukebox_actions.h"
#include "dunebuggy.h"
#include "isle.h"
#include "legoanimationmanager.h"
#include "legocontrolmanager.h"
#include "legohideanimpresenter.h"
#include "legomain.h"
#include "legopathstruct.h"
#include "legoracers.h"
#include "legoracespecial.h"
#include "legoutils.h"
#include "misc.h"
#include "mxactionnotificationparam.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "mxstillpresenter.h"
#include "mxtransitionmanager.h"
#include "mxvariabletable.h"
#include "scripts.h"
// Defined in legopathstruct.cpp
extern MxBool g_unk0x100f119c;
// Defined in jetski.cpp
extern const char* g_varJSFRNTY5;
extern const char* g_varJSWNSHY5;
// Defined in legoracespecial.cpp
extern const char* g_raceState;
extern const char* g_racing;
// Defined in legopathactor.cpp
extern const char* g_strHIT_WALL_SOUND;
DECOMP_SIZE_ASSERT(JetskiRace, 0x144)
// STUB: LEGO1 0x100162c0
// FUNCTION: LEGO1 0x100162c0
// FUNCTION: BETA10 0x100c7e6f
MxResult JetskiRace::Create(MxDSAction& p_dsAction)
{
return SUCCESS;
MxResult result = LegoRace::Create(p_dsAction);
GameState()->m_currentArea = LegoGameState::e_jetrace;
GameState()->StopArea(LegoGameState::e_undefined);
LegoGameState* gameState = GameState();
RaceState* jetskiRaceState = (RaceState*) gameState->GetState("JetskiRaceState");
if (!jetskiRaceState) {
jetskiRaceState = (RaceState*) gameState->CreateState("JetskiRaceState");
}
m_raceState = jetskiRaceState;
if (!jetskiRaceState) {
return FAILURE;
}
m_raceState->m_unk0x28 = 1;
m_unk0x130.SetLeft(397);
m_unk0x130.SetTop(317);
m_unk0x130.SetRight(543);
m_unk0x130.SetBottom(333);
LegoRaceCar::FUN_10013670();
InvokeAction(
Extra::e_start,
m_atomId,
DuneBuggy::GetColorOffset(g_varJSFRNTY5) + (DuneBuggy::GetColorOffset(g_varJSWNSHY5) * 5 + 0xf) * 2,
NULL
);
InvokeAction(Extra::e_start, m_atomId, JetraceScript::c_JetskiDashboard, NULL);
g_unk0x100f119c = TRUE;
return result;
}
// STUB: LEGO1 0x100163b0
// FUNCTION: LEGO1 0x100163b0
// FUNCTION: BETA10 0x100c7f10
void JetskiRace::ReadyWorld()
{
assert(m_hideAnim);
LegoWorld::ReadyWorld();
m_hideAnim->FUN_1006db40(0);
MxDSAction action;
action.SetAtomId(*g_jukeboxScript);
action.SetObjectId(JukeboxScript::c_JetskiRace_Music);
BackgroundAudioManager()->PlayMusic(action, 5, MxPresenter::e_repeating);
AnimationManager()->Resume();
m_unk0x128 = (MxStillPresenter*) Find("MxPresenter", "JetskiLocator2");
m_unk0x128->SetPosition(m_unk0x130.GetLeft(), m_unk0x130.GetTop());
m_unk0x12c = (MxStillPresenter*) Find("MxPresenter", "JetskiLocator3");
m_unk0x12c->SetPosition(m_unk0x130.GetLeft(), m_unk0x130.GetTop());
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
VariableTable()->SetVariable("DISTANCE", "0.036");
InvokeAction(Extra::e_start, *g_jetraceScript, JetraceScript::c_AirHorn_PlayWav, NULL);
}
// STUB: LEGO1 0x10016520
MxLong JetskiRace::HandleEndAction(MxEndActionNotificationParam&)
// FUNCTION: LEGO1 0x10016520
MxLong JetskiRace::HandleEndAction(MxEndActionNotificationParam& p_param)
{
return 0;
MxLong result = 0;
if ((p_param.GetAction()) && (p_param.GetAction()->GetObjectId() == JetraceScript::c_AirHorn_PlayWav)) {
m_unk0x110[0]->Mute(FALSE);
m_unk0x110[1]->Mute(FALSE);
m_unk0x110[2]->Mute(FALSE);
VariableTable()->SetVariable(g_raceState, g_racing);
result = 1;
}
return result;
}
// STUB: LEGO1 0x100165a0
MxLong JetskiRace::HandleClick(LegoEventNotificationParam&)
// FUNCTION: LEGO1 0x100165a0
MxLong JetskiRace::HandleClick(LegoEventNotificationParam& p_param)
{
return 0;
MxLong result = 0;
if (((LegoControlManagerNotificationParam*) &p_param)->m_unk0x28 == 1) {
switch (((LegoControlManagerNotificationParam*) &p_param)->m_clickedObjectId) {
case JetraceScript::c_JetskiArms_Ctl:
m_act1State->m_unk0x018 = 0;
VariableTable()->SetVariable(g_raceState, "");
VariableTable()->SetVariable(g_strHIT_WALL_SOUND, "");
LegoRaceCar::FUN_10012de0();
m_destLocation = LegoGameState::e_jetraceExterior;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
break;
case JetraceScript::c_JetskiInfo_Ctl:
m_act1State->m_unk0x018 = 0;
VariableTable()->SetVariable(g_raceState, "");
VariableTable()->SetVariable(g_strHIT_WALL_SOUND, "");
LegoRaceCar::FUN_10012de0();
m_destLocation = LegoGameState::e_infomain;
result = 1;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
break;
default:
break;
}
}
return result;
}
// STUB: LEGO1 0x100166a0
@ -31,8 +157,15 @@ MxLong JetskiRace::HandlePathStruct(LegoPathStructNotificationParam&)
return 0;
}
// STUB: LEGO1 0x10016a10
// FUNCTION: LEGO1 0x10016a10
MxBool JetskiRace::Escape()
{
AnimationManager()->FUN_10061010(FALSE);
DeleteObjects(&m_atomId, 500, 999);
m_act1State->m_unk0x018 = 0;
VariableTable()->SetVariable(g_raceState, "");
VariableTable()->SetVariable(g_strHIT_WALL_SOUND, "");
m_destLocation = LegoGameState::e_infomain;
LegoRaceCar::FUN_10012de0();
return TRUE;
}

View File

@ -23,10 +23,10 @@ LegoRace::LegoRace()
m_unk0x104 = 0;
m_unk0x108 = 0;
m_unk0x10c = 0;
m_unk0x140 = 0;
m_unk0x110 = 0;
m_unk0x114 = 0;
m_unk0x118 = 0;
m_raceState = NULL;
m_unk0x110[0] = NULL;
m_unk0x110[1] = NULL;
m_unk0x110[2] = NULL;
m_unk0x128 = 0;
m_unk0x12c = 0;
m_pathActor = 0;
@ -54,6 +54,7 @@ MxBool LegoRace::Escape()
}
// FUNCTION: LEGO1 0x10015ce0
// FUNCTION: BETA10 0x100c7a71
MxResult LegoRace::Create(MxDSAction& p_dsAction)
{
MxResult result = LegoWorld::Create(p_dsAction);
@ -150,6 +151,7 @@ RaceState::RaceState()
}
// FUNCTION: LEGO1 0x10016140
// FUNCTION: BETA10 0x100c7d9f
MxResult RaceState::Serialize(LegoFile* p_file)
{
LegoState::Serialize(p_file);

View File

@ -21,6 +21,12 @@ DECOMP_SIZE_ASSERT(EdgeReference, 0x08)
DECOMP_SIZE_ASSERT(SkeletonKickPhase, 0x10)
DECOMP_SIZE_ASSERT(LegoRaceCar, 0x200)
// GLOBAL: LEGO1 0x100f0bac
static undefined4 g_unk0x100f0bac = 0;
// GLOBAL: LEGO1 0x100f0bb0
static undefined4 g_unk0x100f0bb0 = 0;
// GLOBAL: LEGO1 0x100f0a20
// GLOBAL: BETA10 0x101f5e34
EdgeReference LegoRaceCar::g_skBMap[] = {
@ -166,6 +172,14 @@ MxLong LegoRaceCar::Notify(MxParam& p_param)
return LegoRaceMap::Notify(p_param);
}
// FUNCTION: LEGO1 0x10012de0
void LegoRaceCar::FUN_10012de0()
{
g_unk0x100f0b8c = TRUE;
g_timeLastSoundPlayed = 0;
g_unk0x100f0b88 = 0;
}
// FUNCTION: LEGO1 0x10012e60
// FUNCTION: BETA10 0x100cb191
void LegoRaceCar::SetWorldSpeed(MxFloat p_worldSpeed)
@ -513,6 +527,16 @@ MxResult LegoRaceCar::VTable0x9c()
return result;
}
// FUNCTION: LEGO1 0x10013670
void LegoRaceCar::FUN_10013670()
{
g_unk0x100f0bac = (rand() & 0xc) >> 2;
// Inlining the `rand()` causes this function to mismatch
MxU32 uVar1 = rand();
g_unk0x100f0bb0 = uVar1 % 0xc >> 2;
}
// FUNCTION: LEGO1 0x10014500
// FUNCTION: BETA10 0x100cd5e0
MxU32 LegoRaceCar::VTable0x6c(

View File

@ -21,10 +21,33 @@ HistoryBook::HistoryBook()
NotificationManager()->Register(this);
}
// STUB: LEGO1 0x100824d0
// FUNCTION: LEGO1 0x100824d0
// FUNCTION: BETA10 0x1002b63e
HistoryBook::~HistoryBook()
{
// TODO
for (MxS16 scoreIndex = 0; scoreIndex < GameState()->m_history.GetCount(); scoreIndex++) {
if (m_scores[scoreIndex]) {
delete m_scores[scoreIndex]->GetAction();
delete m_scores[scoreIndex];
m_scores[scoreIndex] = NULL;
}
for (MxS16 letterIndex = 0; letterIndex < (MxS16) sizeOfArray(m_names[0]); letterIndex++) {
if (m_names[scoreIndex][letterIndex]) {
delete m_names[scoreIndex][letterIndex]->GetAction();
delete m_names[scoreIndex][letterIndex];
m_names[scoreIndex][letterIndex] = NULL;
}
}
}
InputManager()->UnRegister(this);
if (InputManager()->GetWorld() == this) {
InputManager()->ClearWorld();
}
ControlManager()->Unregister(this);
NotificationManager()->Unregister(this);
}
// FUNCTION: LEGO1 0x10082610

View File

@ -37,6 +37,7 @@
#include "scripts.h"
#include "skateboard.h"
#include "towtrack.h"
#include "viewmanager/viewmanager.h"
DECOMP_SIZE_ASSERT(Act1State, 0x26c)
DECOMP_SIZE_ASSERT(LegoNamedPlane, 0x4c)
@ -279,7 +280,7 @@ void Isle::ReadyWorld()
else if (GameState()->GetLoadedAct() != LegoGameState::e_act1) {
EnableAnimations(TRUE);
FUN_10032620();
m_act1state->FUN_10034d00();
m_act1state->PlaceActors();
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
}
}
@ -541,7 +542,7 @@ void Isle::Enable(MxBool p_enable)
CreateState();
VideoManager()->ResetPalette(FALSE);
m_act1state->FUN_10034d00();
m_act1state->PlaceActors();
if (UserActor() != NULL && UserActor()->GetActorId() != LegoActor::c_none) {
// TODO: Match, most likely an inline function
@ -1292,19 +1293,19 @@ Act1State::Act1State()
m_planeActive = FALSE;
m_currentCptClickDialogue = IsleScript::c_noneIsle;
m_unk0x022 = FALSE;
m_unk0x154 = NULL;
m_unk0x158 = NULL;
m_unk0x15c = NULL;
m_helicopterWindshield = NULL;
m_helicopterJetLeft = NULL;
m_helicopterJetRight = NULL;
m_helicopter = NULL;
m_unk0x1b0 = NULL;
m_jetskiFront = NULL;
m_unk0x021 = 1;
m_unk0x1b4 = NULL;
m_jetskiWindshield = NULL;
m_jetski = NULL;
m_unk0x208 = NULL;
m_dunebuggyFront = NULL;
m_dunebuggy = NULL;
m_unk0x25c = NULL;
m_unk0x260 = NULL;
m_unk0x264 = NULL;
m_racecarFront = NULL;
m_racecarBack = NULL;
m_racecarTail = NULL;
m_racecar = NULL;
Reset();
}
@ -1324,124 +1325,135 @@ MxResult Act1State::Serialize(LegoFile* p_file)
m_racecarPlane.Serialize(p_file);
if (p_file->IsWriteMode()) {
if (m_helicopterPlane.GetName()->Compare("") != 0) {
if (m_unk0x154) {
WriteNamedTexture(p_file, m_unk0x154);
if (m_helicopterPlane.IsPresent()) {
if (m_helicopterWindshield) {
WriteNamedTexture(p_file, m_helicopterWindshield);
}
else {
FUN_1003f540(p_file, "chwind.gif");
}
if (m_unk0x158) {
WriteNamedTexture(p_file, m_unk0x158);
if (m_helicopterJetLeft) {
WriteNamedTexture(p_file, m_helicopterJetLeft);
}
else {
FUN_1003f540(p_file, "chjetl.gif");
}
if (m_unk0x15c) {
WriteNamedTexture(p_file, m_unk0x15c);
if (m_helicopterJetRight) {
WriteNamedTexture(p_file, m_helicopterJetRight);
}
else {
FUN_1003f540(p_file, "chjetr.gif");
}
}
if (m_jetskiPlane.GetName()->Compare("") != 0) {
if (m_unk0x1b0) {
WriteNamedTexture(p_file, m_unk0x1b0);
if (m_jetskiPlane.IsPresent()) {
if (m_jetskiFront) {
WriteNamedTexture(p_file, m_jetskiFront);
}
else {
FUN_1003f540(p_file, "jsfrnt.gif");
}
if (m_unk0x1b4) {
WriteNamedTexture(p_file, m_unk0x1b4);
if (m_jetskiWindshield) {
WriteNamedTexture(p_file, m_jetskiWindshield);
}
else {
FUN_1003f540(p_file, "jswnsh.gif");
}
}
if (m_dunebuggyPlane.GetName()->Compare("") != 0) {
if (m_unk0x208) {
WriteNamedTexture(p_file, m_unk0x208);
if (m_dunebuggyPlane.IsPresent()) {
if (m_dunebuggyFront) {
WriteNamedTexture(p_file, m_dunebuggyFront);
}
else {
FUN_1003f540(p_file, "dbfrfn.gif");
}
}
if (m_racecarPlane.GetName()->Compare("") != 0) {
if (m_unk0x25c) {
WriteNamedTexture(p_file, m_unk0x25c);
if (m_racecarPlane.IsPresent()) {
if (m_racecarFront) {
WriteNamedTexture(p_file, m_racecarFront);
}
else {
FUN_1003f540(p_file, "rcfrnt.gif");
}
if (m_unk0x260) {
WriteNamedTexture(p_file, m_unk0x260);
if (m_racecarBack) {
WriteNamedTexture(p_file, m_racecarBack);
}
else {
FUN_1003f540(p_file, "rcback.gif");
}
if (m_unk0x264) {
WriteNamedTexture(p_file, m_unk0x264);
if (m_racecarTail) {
WriteNamedTexture(p_file, m_racecarTail);
}
else {
FUN_1003f540(p_file, "rctail.gif");
}
}
Write(p_file, m_cptClickDialogue.m_nextIndex);
m_cptClickDialogue.WriteToFile(p_file);
Write(p_file, m_unk0x022);
}
else if (p_file->IsReadMode()) {
if (m_helicopterPlane.GetName()->Compare("") != 0) {
m_unk0x154 = ReadNamedTexture(p_file);
if (m_unk0x154 == NULL) {
if (m_helicopterPlane.IsPresent()) {
m_helicopterWindshield = ReadNamedTexture(p_file);
if (m_helicopterWindshield == NULL) {
return FAILURE;
}
m_unk0x158 = ReadNamedTexture(p_file);
if (m_unk0x158 == NULL) {
m_helicopterJetLeft = ReadNamedTexture(p_file);
if (m_helicopterJetLeft == NULL) {
return FAILURE;
}
m_unk0x15c = ReadNamedTexture(p_file);
if (m_unk0x15c == NULL) {
return FAILURE;
}
}
if (m_jetskiPlane.GetName()->Compare("") != 0) {
m_unk0x1b0 = ReadNamedTexture(p_file);
if (m_unk0x1b0 == NULL) {
return FAILURE;
}
m_unk0x1b4 = ReadNamedTexture(p_file);
if (m_unk0x1b4 == NULL) {
return FAILURE;
}
}
if (m_dunebuggyPlane.GetName()->Compare("") != 0) {
m_unk0x208 = ReadNamedTexture(p_file);
if (m_unk0x208 == NULL) {
return FAILURE;
}
}
if (m_racecarPlane.GetName()->Compare("") != 0) {
m_unk0x25c = ReadNamedTexture(p_file);
if (m_unk0x25c == NULL) {
return FAILURE;
}
m_unk0x260 = ReadNamedTexture(p_file);
if (m_unk0x260 == NULL) {
return FAILURE;
}
m_unk0x264 = ReadNamedTexture(p_file);
if (m_unk0x264 == NULL) {
m_helicopterJetRight = ReadNamedTexture(p_file);
if (m_helicopterJetRight == NULL) {
return FAILURE;
}
}
Read(p_file, &m_cptClickDialogue.m_nextIndex);
if (m_jetskiPlane.IsPresent()) {
m_jetskiFront = ReadNamedTexture(p_file);
if (m_jetskiFront == NULL) {
return FAILURE;
}
m_jetskiWindshield = ReadNamedTexture(p_file);
if (m_jetskiWindshield == NULL) {
return FAILURE;
}
}
if (m_dunebuggyPlane.IsPresent()) {
m_dunebuggyFront = ReadNamedTexture(p_file);
if (m_dunebuggyFront == NULL) {
return FAILURE;
}
}
if (m_racecarPlane.IsPresent()) {
m_racecarFront = ReadNamedTexture(p_file);
if (m_racecarFront == NULL) {
return FAILURE;
}
m_racecarBack = ReadNamedTexture(p_file);
if (m_racecarBack == NULL) {
return FAILURE;
}
m_racecarTail = ReadNamedTexture(p_file);
if (m_racecarTail == NULL) {
return FAILURE;
}
}
m_cptClickDialogue.ReadFromFile(p_file);
Read(p_file, &m_unk0x022);
}
@ -1473,25 +1485,25 @@ void Act1State::StopCptClickDialogue()
// FUNCTION: LEGO1 0x100346d0
MxBool Act1State::Reset()
{
m_motocyclePlane.SetName("");
m_bikePlane.SetName("");
m_skateboardPlane.SetName("");
m_motocyclePlane.Reset();
m_bikePlane.Reset();
m_skateboardPlane.Reset();
m_unk0x022 = FALSE;
m_helicopterPlane.SetName("");
if (m_unk0x154) {
delete m_unk0x154;
m_unk0x154 = NULL;
m_helicopterPlane.Reset();
if (m_helicopterWindshield) {
delete m_helicopterWindshield;
m_helicopterWindshield = NULL;
}
if (m_unk0x158) {
delete m_unk0x158;
m_unk0x158 = NULL;
if (m_helicopterJetLeft) {
delete m_helicopterJetLeft;
m_helicopterJetLeft = NULL;
}
if (m_unk0x15c) {
delete m_unk0x15c;
m_unk0x15c = NULL;
if (m_helicopterJetRight) {
delete m_helicopterJetRight;
m_helicopterJetRight = NULL;
}
if (m_helicopter) {
@ -1499,16 +1511,15 @@ MxBool Act1State::Reset()
m_helicopter = NULL;
}
m_jetskiPlane.SetName("");
if (m_unk0x1b0) {
delete m_unk0x1b0;
m_unk0x1b0 = NULL;
m_jetskiPlane.Reset();
if (m_jetskiFront) {
delete m_jetskiFront;
m_jetskiFront = NULL;
}
if (m_unk0x1b4) {
delete m_unk0x1b4;
m_unk0x1b4 = NULL;
if (m_jetskiWindshield) {
delete m_jetskiWindshield;
m_jetskiWindshield = NULL;
}
if (m_jetski) {
@ -1516,11 +1527,10 @@ MxBool Act1State::Reset()
m_jetski = NULL;
}
m_dunebuggyPlane.SetName("");
if (m_unk0x208) {
delete m_unk0x208;
m_unk0x208 = NULL;
m_dunebuggyPlane.Reset();
if (m_dunebuggyFront) {
delete m_dunebuggyFront;
m_dunebuggyFront = NULL;
}
if (m_dunebuggy) {
@ -1528,21 +1538,20 @@ MxBool Act1State::Reset()
m_dunebuggy = NULL;
}
m_racecarPlane.SetName("");
if (m_unk0x25c) {
delete m_unk0x25c;
m_unk0x25c = NULL;
m_racecarPlane.Reset();
if (m_racecarFront) {
delete m_racecarFront;
m_racecarFront = NULL;
}
if (m_unk0x260) {
delete m_unk0x260;
m_unk0x260 = NULL;
if (m_racecarBack) {
delete m_racecarBack;
m_racecarBack = NULL;
}
if (m_unk0x264) {
delete m_unk0x264;
m_unk0x264 = NULL;
if (m_racecarTail) {
delete m_racecarTail;
m_racecarTail = NULL;
}
if (m_racecar) {
@ -1599,8 +1608,167 @@ void Act1State::RemoveActors()
}
}
// STUB: LEGO1 0x10034d00
void Act1State::FUN_10034d00()
// FUNCTION: LEGO1 0x10034d00
void Act1State::PlaceActors()
{
// TODO
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
if (m_motocyclePlane.IsPresent()) {
isle->m_motocycle->PlaceActor(m_motocyclePlane);
}
else {
isle->PlaceActor(isle->m_motocycle, "INT43", 4, 0.5f, 1, 0.5f);
}
if (m_bikePlane.IsPresent()) {
isle->m_bike->PlaceActor(m_bikePlane);
}
else {
isle->PlaceActor(isle->m_bike, "INT44", 2, 0.5f, 0, 0.5f);
}
if (m_skateboardPlane.IsPresent()) {
isle->m_skateboard->PlaceActor(m_skateboardPlane);
}
else {
isle->PlaceActor(isle->m_skateboard, "EDG02_84", 4, 0.5f, 0, 0.5f);
}
if (m_helicopter != NULL) {
if (!m_helicopterPlane.IsPresent()) {
m_helicopter->SpawnPlayer(LegoGameState::e_unk40, FALSE, 0);
}
else {
isle->PlaceActor(m_helicopter, m_helicopterPlane.GetName(), 0, 0.5f, 1, 0.5f);
m_helicopter->SetLocation(
m_helicopterPlane.GetPosition(),
m_helicopterPlane.GetDirection(),
m_helicopterPlane.GetUp(),
TRUE
);
isle->Add(m_helicopter);
m_helicopter->SetWorld(isle);
}
GetViewManager()->Add(m_helicopter->GetROI());
m_helicopter->GetROI()->SetVisibility(TRUE);
m_helicopterPlane.Reset();
m_helicopter = NULL;
if (m_helicopterWindshield != NULL) {
FUN_1003f930(m_helicopterWindshield);
delete m_helicopterWindshield;
m_helicopterWindshield = NULL;
}
if (m_helicopterJetLeft != NULL) {
FUN_1003f930(m_helicopterJetLeft);
delete m_helicopterJetLeft;
m_helicopterJetLeft = NULL;
}
if (m_helicopterJetRight != NULL) {
FUN_1003f930(m_helicopterJetRight);
delete m_helicopterJetRight;
m_helicopterJetRight = NULL;
}
}
if (m_jetski != NULL) {
if (!m_jetskiPlane.IsPresent()) {
m_jetski->SpawnPlayer(LegoGameState::e_unk45, FALSE, 0);
}
else {
isle->PlaceActor(m_jetski, m_jetskiPlane.GetName(), 0, 0.5f, 1, 0.5f);
m_jetski
->SetLocation(m_jetskiPlane.GetPosition(), m_jetskiPlane.GetDirection(), m_jetskiPlane.GetUp(), TRUE);
isle->Add(m_jetski);
m_jetski->SetWorld(isle);
}
GetViewManager()->Add(m_jetski->GetROI());
m_jetski->GetROI()->SetVisibility(TRUE);
m_jetskiPlane.Reset();
m_jetski = NULL;
if (m_jetskiFront != NULL) {
FUN_1003f930(m_jetskiFront);
delete m_jetskiFront;
m_jetskiFront = NULL;
}
if (m_jetskiWindshield != NULL) {
FUN_1003f930(m_jetskiWindshield);
delete m_jetskiWindshield;
m_jetskiWindshield = NULL;
}
}
if (m_dunebuggy != NULL) {
if (!m_dunebuggyPlane.IsPresent()) {
m_dunebuggy->SpawnPlayer(LegoGameState::e_unk43, FALSE, 0);
}
else {
isle->PlaceActor(m_dunebuggy, m_dunebuggyPlane.GetName(), 0, 0.5f, 1, 0.5f);
m_dunebuggy->SetLocation(
m_dunebuggyPlane.GetPosition(),
m_dunebuggyPlane.GetDirection(),
m_dunebuggyPlane.GetUp(),
TRUE
);
isle->Add(m_dunebuggy);
m_dunebuggy->SetWorld(isle);
}
GetViewManager()->Add(m_dunebuggy->GetROI());
m_dunebuggy->GetROI()->SetVisibility(TRUE);
m_dunebuggyPlane.Reset();
m_dunebuggy = NULL;
if (m_dunebuggyFront != NULL) {
FUN_1003f930(m_dunebuggyFront);
delete m_dunebuggyFront;
m_dunebuggyFront = NULL;
}
}
if (m_racecar != NULL) {
if (!m_racecarPlane.IsPresent()) {
m_racecar->SpawnPlayer(LegoGameState::e_unk44, FALSE, 0);
}
else {
isle->PlaceActor(m_racecar, m_racecarPlane.GetName(), 0, 0.5f, 1, 0.5f);
m_racecar->SetLocation(
m_racecarPlane.GetPosition(),
m_racecarPlane.GetDirection(),
m_racecarPlane.GetUp(),
TRUE
);
isle->Add(m_racecar);
m_racecar->SetWorld(isle);
}
GetViewManager()->Add(m_racecar->GetROI());
m_racecar->GetROI()->SetVisibility(TRUE);
m_racecarPlane.Reset();
m_racecar = NULL;
if (m_racecarFront != NULL) {
FUN_1003f930(m_racecarFront);
delete m_racecarFront;
m_racecarFront = NULL;
}
if (m_racecarBack != NULL) {
FUN_1003f930(m_racecarBack);
delete m_racecarBack;
m_racecarBack = NULL;
}
if (m_racecarTail != NULL) {
FUN_1003f930(m_racecarTail);
delete m_racecarTail;
m_racecarTail = NULL;
}
}
}

View File

@ -1,8 +1,12 @@
#include "legoact2.h"
#include "act2main_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoinputmanager.h"
#include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxticklemanager.h"
@ -40,11 +44,50 @@ LegoAct2::~LegoAct2()
NotificationManager()->Unregister(this);
}
// STUB: LEGO1 0x1004ff20
// FUNCTION: LEGO1 0x1004ff20
// FUNCTION: BETA10 0x1003a7ff
MxResult LegoAct2::Create(MxDSAction& p_dsAction)
{
// TODO
return SUCCESS;
GameState()->FindLoadedAct();
MxResult result = LegoWorld::Create(p_dsAction);
if (result == SUCCESS) {
AnimationManager()->EnableCamAnims(FALSE);
LegoGameState* gameState = GameState();
LegoAct2State* state = (LegoAct2State*) gameState->GetState("LegoAct2State");
if (state == NULL) {
state = (LegoAct2State*) gameState->CreateState("LegoAct2State");
}
m_gameState = state;
m_gameState->m_unk0x08 = 0;
switch (GameState()->GetLoadedAct()) {
case LegoGameState::e_act2:
GameState()->StopArea(LegoGameState::e_infomain);
GameState()->StopArea(LegoGameState::e_act2main);
break;
case LegoGameState::e_act3:
GameState()->StopArea(LegoGameState::e_infomain);
GameState()->StopArea(LegoGameState::e_act3script);
break;
case LegoGameState::e_act1:
case LegoGameState::e_actNotFound:
GameState()->StopArea(LegoGameState::e_undefined);
if (GameState()->GetPreviousArea() == LegoGameState::e_infomain) {
GameState()->StopArea(LegoGameState::e_isle);
}
}
GameState()->m_currentArea = LegoGameState::e_act2main;
GameState()->SetCurrentAct(LegoGameState::e_act2);
InputManager()->Register(this);
GameState()->SetDirty(TRUE);
}
return result;
}
// STUB: LEGO1 0x10050040
@ -87,15 +130,29 @@ void LegoAct2::FUN_10051900()
}
}
// STUB: LEGO1 0x100519c0
// FUNCTION: LEGO1 0x100519c0
void LegoAct2::VTable0x60()
{
// TODO
// empty
}
// STUB: LEGO1 0x100519d0
// FUNCTION: LEGO1 0x100519d0
MxBool LegoAct2::Escape()
{
// TODO
return FALSE;
BackgroundAudioManager()->Stop();
AnimationManager()->FUN_10061010(FALSE);
DeleteObjects(&m_atomId, Act2mainScript::c_snsx50bu_RunAnim, 999);
if (UserActor() != NULL) {
if (UserActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) UserActor())->Exit();
}
}
if (m_gameState != NULL) {
m_gameState->m_unk0x0c = 0;
}
m_unk0x1150 = 2;
return TRUE;
}

View File

@ -13,6 +13,7 @@
#include "legogamestate.h"
#include "legoinputmanager.h"
#include "legopathstruct.h"
#include "legoutils.h"
#include "misc.h"
#include "mxactionnotificationparam.h"
#include "mxbackgroundaudiomanager.h"
@ -330,10 +331,58 @@ void RegistrationBook::WriteInfocenterLetters(MxS16 p_user)
}
}
// STUB: LEGO1 0x100778c0
// FUNCTION: LEGO1 0x100778c0
void RegistrationBook::FUN_100778c0()
{
// TODO
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
if (act1state->m_helicopterPlane.IsPresent()) {
InvokeAction(Extra::e_start, m_atomId, CopterScript::c_Helicopter_Actor, NULL);
NotificationManager()->Send(
this,
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, CopterScript::c_Helicopter_Actor)
);
m_unk0x2b8++;
}
if (act1state->m_jetskiPlane.IsPresent()) {
InvokeAction(Extra::e_start, m_atomId, JetskiScript::c_Jetski_Actor, NULL);
NotificationManager()->Send(
this,
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, JetskiScript::c_Jetski_Actor)
);
m_unk0x2b8++;
}
if (act1state->m_dunebuggyPlane.IsPresent()) {
InvokeAction(Extra::e_start, m_atomId, DunecarScript::c_DuneBugy_Actor, NULL);
NotificationManager()->Send(
this,
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, DunecarScript::c_DuneBugy_Actor)
);
m_unk0x2b8++;
}
if (act1state->m_racecarPlane.IsPresent()) {
InvokeAction(Extra::e_start, m_atomId, RacecarScript::c_RaceCar_Actor, NULL);
NotificationManager()->Send(
this,
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, RacecarScript::c_RaceCar_Actor)
);
m_unk0x2b8++;
}
if (m_unk0x2b8 != 0) {
DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav);
InputManager()->DisableInputProcessing();
SetAppCursor(e_cursorBusy);
}
}
}
// FUNCTION: LEGO1 0x10077cc0

View File

@ -40,6 +40,7 @@ class LegoWEGEdge : public LegoWEEdge {
LegoResult VTable0x04() override; // vtable+0x04
// FUNCTION: BETA10 0x100270c0
LegoU32 GetFlag0x10() { return m_flags & c_bit5 ? FALSE : TRUE; }
// FUNCTION: BETA10 0x1001ff80

View File

@ -91,6 +91,7 @@ class LegoFile : public LegoStorage {
public:
LegoFile();
~LegoFile() override;
LegoResult Read(void* p_buffer, LegoU32 p_size) override; // vtable+0x04
LegoResult Write(const void* p_buffer, LegoU32 p_size) override; // vtable+0x08
LegoResult GetPosition(LegoU32& p_position) override; // vtable+0x0c
@ -100,23 +101,18 @@ class LegoFile : public LegoStorage {
// FUNCTION: LEGO1 0x100343d0
LegoStorage* WriteVector3(Mx3DPointFloat p_vec3)
{
float data = p_vec3[0];
Write(&data, sizeof(float));
data = p_vec3[1];
Write(&data, sizeof(float));
data = p_vec3[2];
Write(&data, sizeof(float));
::Write(this, p_vec3[0]);
::Write(this, p_vec3[1]);
::Write(this, p_vec3[2]);
return this;
}
// FUNCTION: LEGO1 0x10034430
LegoStorage* ReadVector3(Mx3DPointFloat& p_vec3)
{
Read(&p_vec3[0], sizeof(float));
Read(&p_vec3[1], sizeof(float));
Read(&p_vec3[2], sizeof(float));
::Read(this, &p_vec3[0]);
::Read(this, &p_vec3[1]);
::Read(this, &p_vec3[2]);
return this;
}

View File

@ -39,6 +39,9 @@ inline void Swap(T& p_t1, T& p_t2)
p_t2 = t;
}
// TEMPLATE: BETA10 0x10073c20
// Swap
template <class T>
inline T DToR(T p_d)
{

View File

@ -388,6 +388,13 @@ LegoBool LegoLOD::FUN_100aae20(const LegoChar* p_name)
return FALSE;
}
// FUNCTION: LEGO1 0x100aae60
// FUNCTION: BETA10 0x1018e50f
void LegoLOD::FUN_100aae60()
{
m_unk0x1c = 0;
}
inline BOOL GetMeshData(IDirect3DRMMesh*& mesh, D3DRMGROUPINDEX& index, Tgl::Mesh* pMesh)
{
mesh = ((TglImpl::MeshImpl*) pMesh)->ImplementationData()->groupMesh;

View File

@ -32,6 +32,7 @@ class LegoLOD : public ViewLOD {
LegoResult FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
LegoResult FUN_100aad00(LegoTextureInfo* p_textureInfo);
LegoResult FUN_100aad70(LegoTextureInfo* p_textureInfo);
void FUN_100aae60();
LegoResult GetTexture(LegoTextureInfo*& p_textureInfo);
static LegoBool FUN_100aae20(const LegoChar* p_name);

View File

@ -53,6 +53,9 @@ const char* g_unk0x10101390[] = {"rcuser", "jsuser", "dunebugy", "chtrblad", "ch
// GLOBAL: LEGO1 0x101013ac
ROIHandler g_unk0x101013ac = NULL;
// GLOBAL: LEGO1 0x101013b0
TextureHandler g_unk0x101013b0 = NULL;
// FUNCTION: LEGO1 0x100a81b0
void LegoROI::FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name)
{
@ -757,7 +760,7 @@ LegoBool LegoROI::FUN_100a9bf0(const LegoChar* p_param, float& p_red, float& p_g
if (g_unk0x101013ac) {
char buf[32];
if (g_unk0x101013ac(p_param, buf, 32)) {
if (g_unk0x101013ac(p_param, buf, sizeof(buf))) {
p_param = buf;
}
}
@ -782,10 +785,18 @@ LegoBool LegoROI::ColorAliasLookup(const LegoChar* p_param, float& p_red, float&
return FALSE;
}
// STUB: LEGO1 0x100a9cf0
// FUNCTION: LEGO1 0x100a9cf0
LegoBool LegoROI::FUN_100a9cf0(const LegoChar* p_param, unsigned char* paletteEntries, LegoU32 p_numEntries)
{
// TODO
if (p_param == NULL) {
return FALSE;
}
if (g_unk0x101013b0 != NULL) {
return g_unk0x101013b0(p_param, paletteEntries, p_numEntries);
}
paletteEntries[0] = '\0';
return FALSE;
}
@ -812,11 +823,15 @@ void LegoROI::SetName(const LegoChar* p_name)
}
}
// STUB: LEGO1 0x100a9dd0
// STUB: BETA10 0x1018bfdb
// FUNCTION: LEGO1 0x100a9dd0
// FUNCTION: BETA10 0x1018bfdb
void LegoROI::FUN_100a9dd0()
{
// TODO
int lodCount = GetLODCount();
for (LegoS32 i = 0; i < lodCount; i++) {
LegoLOD* lod = (LegoLOD*) GetLOD(i);
lod->FUN_100aae60();
}
}
// FUNCTION: LEGO1 0x100a9e10

View File

@ -5,6 +5,7 @@
#include "viewmanager/viewroi.h"
typedef unsigned char (*ROIHandler)(const char*, char*, unsigned int);
typedef unsigned char (*TextureHandler)(const char*, unsigned char*, unsigned int);
class LegoEntity;
class LegoTextureContainer;

View File

@ -741,4 +741,7 @@
// LIBRARY: BETA10 0x1001d1a0
// `vector constructor iterator'
// LIBRARY: BETA10 0x100f8ad0
// strcmp
#endif

View File

@ -18,6 +18,7 @@ class MxEntity : public MxCore {
~MxEntity() override {}
// FUNCTION: LEGO1 0x1000c180
// FUNCTION: BETA10 0x10012700
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0070
@ -25,6 +26,7 @@ class MxEntity : public MxCore {
}
// FUNCTION: LEGO1 0x1000c190
// FUNCTION: BETA10 0x10012610
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, MxEntity::ClassName()) || MxCore::IsA(p_name);