Merge branch 'master' of https://github.com/isledecomp/isle into legobuildingmanager

This commit is contained in:
Mark Langen 2024-05-05 03:54:18 -07:00
commit fa7207cd58
227 changed files with 2873 additions and 1220 deletions

View File

@ -367,7 +367,8 @@ add_library(lego1 SHARED
LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp
LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp
LEGO1/lego/legoomni/src/isle/radiostate.cpp LEGO1/lego/legoomni/src/isle/radiostate.cpp
LEGO1/lego/legoomni/src/main/legoomni.cpp LEGO1/lego/legoomni/src/main/legomain.cpp
LEGO1/lego/legoomni/src/main/scripts.cpp
LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp
LEGO1/lego/legoomni/src/paths/legoanimactor.cpp LEGO1/lego/legoomni/src/paths/legoanimactor.cpp
LEGO1/lego/legoomni/src/paths/legoextraactor.cpp LEGO1/lego/legoomni/src/paths/legoextraactor.cpp

View File

@ -15,6 +15,8 @@ To access the Ghidra repository, use the following details:
- Address: `server.mattkc.com` - Address: `server.mattkc.com`
- Port: `13100` - Port: `13100`
**Please note that at the time of writing, much of the information found on the Ghidra server is severely outdated**. Generally, the source code found in this repository represents the latest "source of truth" and should be referenced whenever possible.
## General Guidelines ## General Guidelines
If you feel fit to contribute, feel free to create a pull request! Someone will review and merge it (or provide feedback) as soon as possible. If you feel fit to contribute, feel free to create a pull request! Someone will review and merge it (or provide feedback) as soon as possible.
@ -26,6 +28,7 @@ This repository currently has only one goal: accuracy to the original executable
## Overview ## Overview
* [`3rdparty`](/3rdparty): Contains code obtained from third parties, not including Mindscape. Generally, these are libraries that have been placed in the public domain or are freely available on the web. As these are unaltered files, our style guide (see below) does not apply. * [`3rdparty`](/3rdparty): Contains code obtained from third parties, not including Mindscape. Generally, these are libraries that have been placed in the public domain or are freely available on the web. As these are unaltered files, our style guide (see below) does not apply.
* [`CONFIG`](/CONFIG): Decompilation of `CONFIG.EXE`. It depends on some code in `LEGO1`.
* [`ISLE`](/ISLE): Decompilation of `ISLE.EXE`. It depends on some code in `LEGO1`. * [`ISLE`](/ISLE): Decompilation of `ISLE.EXE`. It depends on some code in `LEGO1`.
* [`LEGO1`](/LEGO1): Decompilation of `LEGO1.DLL`. This folder contains code from Mindscape's custom in-house engine called **Omni** (file pattern: `mx*`), the LEGO Island-specific extensions for Omni and the game's code (file pattern: `lego*`) as well as several utility libraries developed by Mindscape. * [`LEGO1`](/LEGO1): Decompilation of `LEGO1.DLL`. This folder contains code from Mindscape's custom in-house engine called **Omni** (file pattern: `mx*`), the LEGO Island-specific extensions for Omni and the game's code (file pattern: `lego*`) as well as several utility libraries developed by Mindscape.
* [`tools`](/tools): A set of tools aiding in the decompilation effort. * [`tools`](/tools): A set of tools aiding in the decompilation effort.
@ -33,7 +36,15 @@ This repository currently has only one goal: accuracy to the original executable
## Tooling ## Tooling
Please make yourself familiar with the [available tooling and annotations](/tools/README.md). Please make yourself familiar with the [available tooling and annotations](/tools/README.md). These are generally required to contribute to the project.
## Notes on MSVC 4.20
As outlined in the [`README`](/README.md), Microsoft Visual C++ 4.20 is the compiler we use to build the game.
One important aspect to know about this compiler in the context of the decompilation project is that the assembly code generation is somewhat erratic. We call this peculiarity "compiler randomness" or entropy. In essence, what it comes down to is that changes to the code base, for instance in a header, can pseudo-randomly affect the code generation of functions in compilation units that include this header, even if the changes are completely unrelated to those functions. For example, by adding an extra (unused) inline function or an enum declaration in a header, the code in some functions may unexpectedly wind up looking different and our main tool, [`reccmp`](/tools/README.md), will report either a (significantly) reduced or increased accuracy for those functions. This issue roughly affects around ~5% of all decompiled functions.
We are currently unaware of the exact nature of this phenomenon. Unfortunately it represents a significant obstacle in our effort to achieve 100% matching binaries. If you or anyone you know has knowledge about the compiler internals that lead to the described observations, please contact us.
## Code Style ## Code Style
@ -41,7 +52,7 @@ In general, we're not exhaustively strict about coding style, but there are some
### Formatting ### Formatting
We are currently using [clang-format](https://clang.llvm.org/docs/ClangFormat.html) with a configuration file that aims to replicate the code formatting employed by the original developers. There are [integrations](https://clang.llvm.org/docs/ClangFormat.html#vim-integration) available for most editors and IDEs. The required `clang-format` version is `17.x`. We are currently using [clang-format](https://clang.llvm.org/docs/ClangFormat.html) and [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) with configuration files that aim to replicate the code formatting employed by the original developers. There are [integrations](https://clang.llvm.org/docs/ClangFormat.html#vim-integration) available for most editors and IDEs. The required `clang-format` version is `17.x`.
### Naming conventions ### Naming conventions

View File

@ -1,17 +1,19 @@
#include "isleapp.h" #include "isleapp.h"
#include "3dmanager/lego3dmanager.h"
#include "decomp.h" #include "decomp.h"
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "legobuildingmanager.h" #include "legobuildingmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoinputmanager.h" #include "legoinputmanager.h"
#include "legomain.h"
#include "legomodelpresenter.h" #include "legomodelpresenter.h"
#include "legoomni.h"
#include "legopartpresenter.h" #include "legopartpresenter.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "legoworldpresenter.h" #include "legoworldpresenter.h"
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxdirectx/mxdirect3d.h"
#include "mxdsaction.h" #include "mxdsaction.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxomnicreateflags.h" #include "mxomnicreateflags.h"
@ -20,7 +22,9 @@
#include "mxticklemanager.h" #include "mxticklemanager.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxtransitionmanager.h" #include "mxtransitionmanager.h"
#include "mxvariabletable.h"
#include "res/resource.h" #include "res/resource.h"
#include "roi/legoroi.h"
#include "viewmanager/viewmanager.h" #include "viewmanager/viewmanager.h"
#include <dsound.h> #include <dsound.h>

View File

@ -1,9 +1,9 @@
#ifndef ACT1STATE_H #ifndef ACT1STATE_H
#define ACT1STATE_H #define ACT1STATE_H
#include "legonamedtexture.h"
#include "legostate.h" #include "legostate.h"
#include "roi/legoroi.h"
class LegoNamedTexture;
// VTABLE: LEGO1 0x100d7028 // VTABLE: LEGO1 0x100d7028
// SIZE 0x26c // SIZE 0x26c
@ -81,16 +81,17 @@ class Act1State : public LegoState {
inline MxU32 GetUnknown18() { return m_unk0x018; } inline MxU32 GetUnknown18() { return m_unk0x018; }
inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; } inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
inline MxS16 GetUnknown21() { return m_unk0x021; } inline MxU8 GetUnknown21() { return m_unk0x021; }
inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; } inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; }
inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; } inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; }
inline void SetUnknown21(MxS16 p_unk0x21) { m_unk0x021 = p_unk0x21; } inline void SetUnknown21(MxU8 p_unk0x21) { m_unk0x021 = p_unk0x21; }
// SYNTHETIC: LEGO1 0x10033960 // SYNTHETIC: LEGO1 0x10033960
// Act1State::`scalar deleting destructor' // Act1State::`scalar deleting destructor'
friend class Isle; friend class Isle;
friend class SkateBoard;
protected: protected:
MxS32* m_unk0x008; // 0x008 FIXME: count for m_unk0x008 MxS32* m_unk0x008; // 0x008 FIXME: count for m_unk0x008
@ -105,7 +106,7 @@ class Act1State : public LegoState {
MxBool m_unk0x01f; // 0x01f MxBool m_unk0x01f; // 0x01f
MxBool m_planeActive; // 0x020 MxBool m_planeActive; // 0x020
undefined m_unk0x021; // 0x021 undefined m_unk0x021; // 0x021
undefined m_unk0x022; // 0x022 MxBool m_unk0x022; // 0x022
undefined m_unk0x023; // 0x023 undefined m_unk0x023; // 0x023
NamedPlane m_unk0x024; // 0x024 NamedPlane m_unk0x024; // 0x024
NamedPlane m_unk0x070; // 0x070 NamedPlane m_unk0x070; // 0x070

View File

@ -1,9 +1,10 @@
#ifndef AMBULANCE_H #ifndef AMBULANCE_H
#define AMBULANCE_H #define AMBULANCE_H
#include "ambulancemissionstate.h"
#include "islepathactor.h" #include "islepathactor.h"
class AmbulanceMissionState;
// VTABLE: LEGO1 0x100d71a8 // VTABLE: LEGO1 0x100d71a8
// SIZE 0x184 // SIZE 0x184
class Ambulance : public IslePathActor { class Ambulance : public IslePathActor {

View File

@ -18,15 +18,16 @@ struct AnimInfo {
char* m_animName; // 0x00 char* m_animName; // 0x00
MxU32 m_objectId; // 0x04 MxU32 m_objectId; // 0x04
MxS16 m_unk0x08; // 0x08 MxS16 m_unk0x08; // 0x08
MxU8 m_unk0x0a; // 0x0a MxBool m_unk0x0a; // 0x0a
MxU8 m_unk0x0b; // 0x0b MxU8 m_unk0x0b; // 0x0b
MxU8 m_unk0x0c; // 0x0c MxU8 m_unk0x0c; // 0x0c
MxU8 m_unk0x0d; // 0x0d MxU8 m_unk0x0d; // 0x0d
MxU32 m_unk0x10[4]; // 0x10 MxU32 m_unk0x10[4]; // 0x10
MxU8 m_modelCount; // 0x20 MxU8 m_modelCount; // 0x20
MxS16 m_unk0x22; // 0x22
ModelInfo* m_models; // 0x24 ModelInfo* m_models; // 0x24
MxU8 m_unk0x28; // 0x28 MxU8 m_unk0x28; // 0x28
MxU8 m_unk0x29; // 0x29 MxBool m_unk0x29; // 0x29
MxS8 m_unk0x2a[3]; // 0x2a MxS8 m_unk0x2a[3]; // 0x2a
}; };

View File

@ -2,12 +2,13 @@
#define GASSTATION_H #define GASSTATION_H
#include "decomp.h" #include "decomp.h"
#include "gasstationstate.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxstillpresenter.h"
#include "radio.h" #include "radio.h"
class GasStationState;
class MxStillPresenter;
// VTABLE: LEGO1 0x100d4650 // VTABLE: LEGO1 0x100d4650
// SIZE 0x128 // SIZE 0x128
class GasStation : public LegoWorld { class GasStation : public LegoWorld {

View File

@ -1,10 +1,11 @@
#ifndef HELICOPTER_H #ifndef HELICOPTER_H
#define HELICOPTER_H #define HELICOPTER_H
#include "helicopterstate.h"
#include "islepathactor.h" #include "islepathactor.h"
#include "realtime/matrix.h" #include "realtime/matrix.h"
class HelicopterState;
// VTABLE: LEGO1 0x100d40f8 // VTABLE: LEGO1 0x100d40f8
// SIZE 0x230 // SIZE 0x230
class Helicopter : public IslePathActor { class Helicopter : public IslePathActor {
@ -25,13 +26,13 @@ class Helicopter : public IslePathActor {
return !strcmp(p_name, Helicopter::ClassName()) || IslePathActor::IsA(p_name); return !strcmp(p_name, Helicopter::ClassName()) || IslePathActor::IsA(p_name);
} }
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void VTable0x70(float p_float) override; // vtable+0x70 void VTable0x70(float p_float) override; // vtable+0x70
void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 void VTable0x74(Matrix4& p_transform) override; // vtable+0x74
MxU32 VTable0xcc() override; // vtable+0xcc MxU32 VTable0xcc() override; // vtable+0xcc
MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4
MxU32 VTable0xd8(MxType18NotificationParam& p_param) override; // vtable+0xd8 MxU32 VTable0xd8(LegoEndAnimNotificationParam& p_param) override; // vtable+0xd8
void VTable0xe4() override; // vtable+0xe4 void VTable0xe4() override; // vtable+0xe4
// SYNTHETIC: LEGO1 0x10003210 // SYNTHETIC: LEGO1 0x10003210
// Helicopter::`scalar deleting destructor' // Helicopter::`scalar deleting destructor'

View File

@ -4,7 +4,8 @@
#include "decomp.h" #include "decomp.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxstillpresenter.h"
class MxStillPresenter;
// VTABLE: LEGO1 0x100da328 // VTABLE: LEGO1 0x100da328
// SIZE 0x3e4 // SIZE 0x3e4

View File

@ -3,11 +3,13 @@
#include "actionsfwd.h" #include "actionsfwd.h"
#include "decomp.h" #include "decomp.h"
#include "hospitalstate.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxstillpresenter.h"
#include "radio.h" class HospitalState;
class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class MxStillPresenter;
// VTABLE: LEGO1 0x100d9730 // VTABLE: LEGO1 0x100d9730
// SIZE 0x12c // SIZE 0x12c

View File

@ -8,6 +8,7 @@
#include "radio.h" #include "radio.h"
class InfocenterState; class InfocenterState;
class MxNotificationParam;
class MxStillPresenter; class MxStillPresenter;
class LegoControlManagerEvent; class LegoControlManagerEvent;

View File

@ -4,7 +4,8 @@
#include "decomp.h" #include "decomp.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legostate.h" #include "legostate.h"
#include "mxstillpresenter.h"
class MxStillPresenter;
// VTABLE: LEGO1 0x100d93a8 // VTABLE: LEGO1 0x100d93a8
// SIZE 0x94 // SIZE 0x94

View File

@ -2,8 +2,10 @@
#define ISLEACTOR_H #define ISLEACTOR_H
#include "legoactor.h" #include "legoactor.h"
#include "legoworld.h"
#include "mxactionnotificationparam.h" class LegoWorld;
class MxEndActionNotificationParam;
class MxNotificationParam;
// VTABLE: LEGO1 0x100d5178 // VTABLE: LEGO1 0x100d5178
// SIZE 0x7c // SIZE 0x7c

View File

@ -1,18 +1,87 @@
#ifndef ISLEPATHACTOR_H #ifndef ISLEPATHACTOR_H
#define ISLEPATHACTOR_H #define ISLEPATHACTOR_H
#include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legopathactor.h" #include "legopathactor.h"
#include "legoworld.h"
#include "mxtype18notificationparam.h"
#include "mxtype19notificationparam.h"
#include "mxtypes.h" #include "mxtypes.h"
class LegoControlManagerEvent;
class LegoEndAnimNotificationParam;
class LegoWorld;
class MxType19NotificationParam;
// VTABLE: LEGO1 0x100d4398 // VTABLE: LEGO1 0x100d4398
// SIZE 0x160 // SIZE 0x160
class IslePathActor : public LegoPathActor { class IslePathActor : public LegoPathActor {
public: public:
enum {
c_LOCATIONS_NUM = 29
};
enum {
c_spawnBit1 = 0x01,
c_playMusic = 0x02,
c_spawnBit3 = 0x04
};
// SIZE 0x38
struct SpawnLocation {
SpawnLocation() {}
// FUNCTION: LEGO1 0x1001b1b0
SpawnLocation(
LegoGameState::Area p_area,
MxAtomId* p_script,
MxS32 p_entityId,
const char* p_path,
MxS16 p_src,
float p_srcScale,
MxS16 p_dest,
float p_destScale,
undefined4 p_unk0x30,
JukeboxScript::Script p_music
)
{
m_area = p_area;
m_script = p_script;
m_entityId = p_entityId;
strcpy(m_path, p_path);
m_src = p_src;
m_srcScale = p_srcScale;
m_dest = p_dest;
m_destScale = p_destScale;
m_unk0x30 = p_unk0x30;
m_music = p_music;
}
// FUNCTION: LEGO1 0x1001b230
SpawnLocation& operator=(const SpawnLocation& p_location)
{
m_area = p_location.m_area;
m_script = p_location.m_script;
m_entityId = p_location.m_entityId;
strcpy(m_path, p_location.m_path);
m_src = p_location.m_src;
m_srcScale = p_location.m_srcScale;
m_dest = p_location.m_dest;
m_destScale = p_location.m_destScale;
m_unk0x30 = p_location.m_unk0x30;
m_music = p_location.m_music;
return *this;
}
LegoGameState::Area m_area; // 0x00
MxAtomId* m_script; // 0x04
MxS32 m_entityId; // 0x08
char m_path[20]; // 0x0c
MxS16 m_src; // 0x20
float m_srcScale; // 0x24
MxS16 m_dest; // 0x28
float m_destScale; // 0x2c
undefined4 m_unk0x30; // 0x30
JukeboxScript::Script m_music; // 0x34
};
IslePathActor(); IslePathActor();
// FUNCTION: LEGO1 0x10002e10 // FUNCTION: LEGO1 0x10002e10
@ -46,15 +115,15 @@ class IslePathActor : public LegoPathActor {
virtual MxU32 VTable0xd4(LegoControlManagerEvent&) { return 0; } // vtable+0xd4 virtual MxU32 VTable0xd4(LegoControlManagerEvent&) { return 0; } // vtable+0xd4
// FUNCTION: LEGO1 0x10002e90 // FUNCTION: LEGO1 0x10002e90
virtual MxU32 VTable0xd8(MxType18NotificationParam&) { return 0; } // vtable+0xd8 virtual MxU32 VTable0xd8(LegoEndAnimNotificationParam&) { return 0; } // vtable+0xd8
// FUNCTION: LEGO1 0x10002e00 // FUNCTION: LEGO1 0x10002e00
virtual MxU32 VTable0xdc(MxType19NotificationParam&) { return 0; } // vtable+0xdc virtual MxU32 VTable0xdc(MxType19NotificationParam&) { return 0; } // vtable+0xdc
virtual void VTable0xe0(); // vtable+0xe0 virtual void VTable0xe0(); // vtable+0xe0
virtual void VTable0xe4(); // vtable+0xe4 virtual void VTable0xe4(); // vtable+0xe4
virtual void VTable0xe8(LegoGameState::Area, MxBool, MxU8); // vtable+0xe8 virtual void SpawnPlayer(LegoGameState::Area p_area, MxBool p_und, MxU8 p_flags); // vtable+0xe8
virtual void VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset); virtual void VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset); // vtable+0xec
// SYNTHETIC: LEGO1 0x10002ff0 // SYNTHETIC: LEGO1 0x10002ff0
// IslePathActor::`scalar deleting destructor' // IslePathActor::`scalar deleting destructor'
@ -64,6 +133,8 @@ class IslePathActor : public LegoPathActor {
void FUN_1001b660(); void FUN_1001b660();
static void RegisterSpawnLocations();
protected: protected:
LegoWorld* m_world; // 0x154 LegoWorld* m_world; // 0x154
IslePathActor* m_unk0x158; // 0x158 IslePathActor* m_unk0x158; // 0x158

View File

@ -3,7 +3,8 @@
#include "decomp.h" #include "decomp.h"
#include "islepathactor.h" #include "islepathactor.h"
#include "legocontrolmanager.h"
class LegoControlManagerEvent;
// VTABLE: LEGO1 0x100d9ec8 // VTABLE: LEGO1 0x100d9ec8
// SIZE 0x164 // SIZE 0x164

View File

@ -2,11 +2,12 @@
#define JUKEBOX_H #define JUKEBOX_H
#include "decomp.h" #include "decomp.h"
#include "jukeboxstate.h"
#include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
class LegoControlManagerEvent;
class JukeBoxState;
// VTABLE: LEGO1 0x100d8958 // VTABLE: LEGO1 0x100d8958
// SIZE 0x104 // SIZE 0x104
class JukeBox : public LegoWorld { class JukeBox : public LegoWorld {

View File

@ -2,8 +2,6 @@
#define LEGOACT2_H #define LEGOACT2_H
#include "act2brick.h" #include "act2brick.h"
#include "legocarraceactor.h"
#include "legopathactor.h"
#include "legoworld.h" #include "legoworld.h"
// VTABLE: LEGO1 0x100d82e0 // VTABLE: LEGO1 0x100d82e0

View File

@ -2,14 +2,15 @@
#define LEGOACTIONCONTROLPRESENTER_H #define LEGOACTIONCONTROLPRESENTER_H
#include "decomp.h" #include "decomp.h"
#include "legoutils.h" #include "extra.h"
#include "mxmediapresenter.h" #include "mxmediapresenter.h"
#include "mxstring.h"
// VTABLE: LEGO1 0x100d5118 // VTABLE: LEGO1 0x100d5118
// SIZE 0x68 // SIZE 0x68
class LegoActionControlPresenter : public MxMediaPresenter { class LegoActionControlPresenter : public MxMediaPresenter {
public: public:
inline LegoActionControlPresenter() { m_unk0x50 = Extra::ActionType::e_none; } LegoActionControlPresenter() { m_unk0x50 = Extra::ActionType::e_none; }
~LegoActionControlPresenter() override { Destroy(TRUE); } // vtable+0x00 ~LegoActionControlPresenter() override { Destroy(TRUE); } // vtable+0x00
// FUNCTION: LEGO1 0x1000d0e0 // FUNCTION: LEGO1 0x1000d0e0

View File

@ -2,9 +2,10 @@
#define LEGOACTOR_H #define LEGOACTOR_H
#include "decomp.h" #include "decomp.h"
#include "legocachsound.h"
#include "legoentity.h" #include "legoentity.h"
class LegoCacheSound;
// VTABLE: LEGO1 0x100d6d68 // VTABLE: LEGO1 0x100d6d68
// SIZE 0x78 // SIZE 0x78
class LegoActor : public LegoEntity { class LegoActor : public LegoEntity {

View File

@ -1,10 +1,11 @@
#ifndef LEGOANIMACTOR_H #ifndef LEGOANIMACTOR_H
#define LEGOANIMACTOR_H #define LEGOANIMACTOR_H
#include "anim/legoanim.h"
#include "decomp.h" #include "decomp.h"
#include "legopathactor.h" #include "legopathactor.h"
class LegoAnim;
// SIZE 0x20 // SIZE 0x20
struct LegoAnimActorStruct { struct LegoAnimActorStruct {
LegoAnimActorStruct(float p_unk0x00, LegoAnim* p_AnimTreePtr, LegoROI** p_roiMap, MxU32 p_numROIs); LegoAnimActorStruct(float p_unk0x00, LegoAnim* p_AnimTreePtr, LegoROI** p_roiMap, MxU32 p_numROIs);

View File

@ -2,14 +2,19 @@
#define LEGOANIMATIONMANAGER_H #define LEGOANIMATIONMANAGER_H
#include "actionsfwd.h" #include "actionsfwd.h"
#include "animstate.h"
#include "decomp.h" #include "decomp.h"
#include "legoentity.h"
#include "legotraninfolist.h" #include "legotraninfolist.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxgeometry/mxgeometry3d.h"
class AnimState;
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoEntity;
class LegoFile;
class LegoPathBoundary;
class LegoROIList; class LegoROIList;
struct ModelInfo;
class MxDSAction;
// SIZE 0x18 // SIZE 0x18
struct Character { struct Character {
@ -36,11 +41,13 @@ struct Vehicle {
// SIZE 0x18 // SIZE 0x18
struct Unknown0x3c { struct Unknown0x3c {
LegoROI* m_roi; // 0x00 LegoROI* m_roi; // 0x00
MxU32 m_id; // 0x04 MxS32 m_characterId; // 0x04
undefined m_unk0x08[0x08]; // 0x08 undefined4 m_unk0x08; // 0x08
float m_unk0x10; // 0x10 undefined m_unk0x0c; // 0x0c
undefined m_unk0x14; // 0x14 MxBool m_unk0x0d; // 0x0d
float m_unk0x10; // 0x10
MxBool m_unk0x14; // 0x14
}; };
// VTABLE: LEGO1 0x100d8c18 // VTABLE: LEGO1 0x100d8c18
@ -67,10 +74,10 @@ class LegoAnimationManager : public MxCore {
} }
void Reset(MxBool p_und); void Reset(MxBool p_und);
void FUN_1005ef10(); void Suspend();
void FUN_1005f0b0(); void Resume();
void FUN_1005f6d0(MxBool); void FUN_1005f6d0(MxBool p_unk0x400);
void FUN_1005f700(MxBool); void FUN_1005f700(MxBool p_unk0x3a);
MxResult LoadScriptInfo(MxS32 p_scriptIndex); MxResult LoadScriptInfo(MxS32 p_scriptIndex);
MxBool FindVehicle(const char* p_name, MxU32& p_index); MxBool FindVehicle(const char* p_name, MxU32& p_index);
MxResult ReadAnimInfo(LegoFile* p_file, AnimInfo* p_info); MxResult ReadAnimInfo(LegoFile* p_file, AnimInfo* p_info);
@ -80,13 +87,13 @@ class LegoAnimationManager : public MxCore {
MxResult FUN_10060dc0( MxResult FUN_10060dc0(
IsleScript::Script p_objectId, IsleScript::Script p_objectId,
MxMatrix* p_matrix, MxMatrix* p_matrix,
undefined p_param3, MxBool p_param3,
undefined p_param4, MxBool p_param4,
undefined4 p_param5, LegoROI* p_roi,
undefined p_param6, MxBool p_param6,
MxBool p_param7, MxBool p_param7,
MxBool p_param8, MxBool p_param8,
undefined p_param9 MxBool p_param9
); );
void FUN_10061010(undefined4); void FUN_10061010(undefined4);
void FUN_100617c0(MxS32, MxU16&, MxU16&); void FUN_100617c0(MxS32, MxU16&, MxU16&);
@ -96,8 +103,8 @@ class LegoAnimationManager : public MxCore {
void FUN_100629b0(MxU32, MxBool); void FUN_100629b0(MxU32, MxBool);
void FUN_10063270(LegoROIList*, LegoAnimPresenter*); void FUN_10063270(LegoROIList*, LegoAnimPresenter*);
void FUN_10063780(LegoROIList* p_list); void FUN_10063780(LegoROIList* p_list);
void FUN_10064670(MxBool); void FUN_10064670(Vector3*);
void FUN_10064740(MxBool); void FUN_10064740(Vector3*);
static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig); static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig);
@ -108,27 +115,43 @@ class LegoAnimationManager : public MxCore {
void Init(); void Init();
MxResult FUN_100605e0( MxResult FUN_100605e0(
MxU32 p_index, MxU32 p_index,
MxU8 p_unk0x0a, MxBool p_unk0x0a,
MxMatrix* p_matrix, MxMatrix* p_matrix,
undefined, MxBool p_bool1,
undefined4, LegoROI* p_roi,
undefined, MxBool p_bool2,
MxBool, MxBool p_bool3,
MxBool, MxBool p_bool4,
undefined MxBool p_bool5
); );
MxResult FUN_100609f0(MxU32 p_objectId, MxMatrix* p_matrix, MxBool p_und1, MxBool p_und2); MxResult FUN_100609f0(MxU32 p_objectId, MxMatrix* p_matrix, MxBool p_und1, MxBool p_und2);
void DeleteAnimations(); void DeleteAnimations();
void FUN_10061530();
MxU16 FUN_10062110(
LegoROI* p_roi,
Vector3& p_direction,
Vector3& p_position,
LegoPathBoundary* p_boundary,
float p_speed,
MxU8 p_und,
MxBool p_unk0x14
);
MxS8 GetCharacterIndex(const char* p_name); MxS8 GetCharacterIndex(const char* p_name);
MxBool FUN_100623a0(AnimInfo& p_info);
void FUN_10062580(AnimInfo& p_info);
MxBool FUN_10062710(AnimInfo& p_info);
void FUN_10063aa0(); void FUN_10063aa0();
void FUN_10063d10();
void FUN_100648f0(LegoTranInfo*, MxLong);
void FUN_10064b50(MxLong p_time);
MxU32 m_scriptIndex; // 0x08 MxS32 m_scriptIndex; // 0x08
MxU16 m_animCount; // 0x0c MxU16 m_animCount; // 0x0c
MxU16 m_unk0x0e; // 0x0e MxU16 m_unk0x0e; // 0x0e
MxU16 m_unk0x10; // 0x10 MxU16 m_unk0x10; // 0x10
AnimInfo* m_anims; // 0x14 AnimInfo* m_anims; // 0x14
undefined2 m_unk0x18; // 0x18 undefined2 m_unk0x18; // 0x18
undefined m_unk0x1a; // 0x1a MxBool m_unk0x1a; // 0x1a
MxU32 m_unk0x1c; // 0x1c MxU32 m_unk0x1c; // 0x1c
LegoTranInfoList* m_tranInfoList; // 0x20 LegoTranInfoList* m_tranInfoList; // 0x20
LegoTranInfoList* m_tranInfoList2; // 0x24 LegoTranInfoList* m_tranInfoList2; // 0x24
@ -136,27 +159,27 @@ class LegoAnimationManager : public MxCore {
MxLong m_unk0x30[2]; // 0x30 MxLong m_unk0x30[2]; // 0x30
MxBool m_unk0x38; // 0x38 MxBool m_unk0x38; // 0x38
MxBool m_unk0x39; // 0x39 MxBool m_unk0x39; // 0x39
undefined m_unk0x3a; // 0x3a MxBool m_unk0x3a; // 0x3a
Unknown0x3c m_unk0x3c[40]; // 0x3c Unknown0x3c m_unk0x3c[40]; // 0x3c
undefined4 m_unk0x3fc; // 0x3fc undefined4 m_unk0x3fc; // 0x3fc
MxU8 m_unk0x400; // 0x400 MxBool m_unk0x400; // 0x400
undefined m_unk0x401; // 0x401 MxBool m_unk0x401; // 0x401
MxU8 m_unk0x402; // 0x402 MxBool m_unk0x402; // 0x402
MxLong m_unk0x404; // 0x404 MxLong m_unk0x404; // 0x404
MxLong m_unk0x408; // 0x408 MxLong m_unk0x408; // 0x408
MxLong m_unk0x40c; // 0x40c MxLong m_unk0x40c; // 0x40c
undefined4 m_unk0x410; // 0x410 MxLong m_unk0x410; // 0x410
undefined4 m_unk0x414; // 0x414 undefined4 m_unk0x414; // 0x414
undefined4 m_unk0x418; // 0x418 MxU32 m_numAllowedExtras; // 0x418
undefined4 m_unk0x41c; // 0x41c undefined4 m_unk0x41c; // 0x41c
AnimState* m_animState; // 0x420 AnimState* m_animState; // 0x420
LegoROIList* m_unk0x424; // 0x424 LegoROIList* m_unk0x424; // 0x424
undefined m_unk0x428; // 0x428 MxBool m_unk0x428; // 0x428
undefined m_unk0x429; // 0x429 MxBool m_unk0x429; // 0x429
undefined m_unk0x42a; // 0x42a MxBool m_unk0x42a; // 0x42a
undefined m_unk0x42b; // 0x42b MxBool m_suspended; // 0x42b
undefined4 m_unk0x42c; // 0x42c LegoTranInfo* m_unk0x42c; // 0x42c
undefined m_unk0x430; // 0x430 MxBool m_unk0x430; // 0x430
undefined4 m_unk0x434[2]; // 0x434 undefined4 m_unk0x434[2]; // 0x434
MxMatrix m_unk0x43c; // 0x43c MxMatrix m_unk0x43c; // 0x43c
MxMatrix m_unk0x484; // 0x484 MxMatrix m_unk0x484; // 0x484

View File

@ -2,12 +2,12 @@
#define LEGOANIMMMPRESENTER_H #define LEGOANIMMMPRESENTER_H
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
#include "mxgeometry/mxmatrix.h"
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoWorld; class LegoWorld;
class LegoROI; class LegoROI;
struct LegoTranInfo; struct LegoTranInfo;
class MxMatrix;
// VTABLE: LEGO1 0x100d7de8 // VTABLE: LEGO1 0x100d7de8
// SIZE 0x74 // SIZE 0x74

View File

@ -1,16 +1,16 @@
#ifndef LEGOANIMPRESENTER_H #ifndef LEGOANIMPRESENTER_H
#define LEGOANIMPRESENTER_H #define LEGOANIMPRESENTER_H
#include "anim/legoanim.h"
#include "legoroilist.h" #include "legoroilist.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxatom.h"
#include "mxgeometry/mxmatrix.h"
#include "mxvideopresenter.h" #include "mxvideopresenter.h"
class LegoAnim;
class LegoWorld; class LegoWorld;
class LegoAnimClass;
class LegoAnimActor; class LegoAnimActor;
class LegoPathBoundary; class LegoPathBoundary;
class MxMatrix;
class Vector3;
struct LegoAnimStructComparator { struct LegoAnimStructComparator {
MxBool operator()(const char* const& p_a, const char* const& p_b) const { return strcmp(p_a, p_b) < 0; } MxBool operator()(const char* const& p_a, const char* const& p_b) const { return strcmp(p_a, p_b) < 0; }

View File

@ -2,13 +2,13 @@
#define LEGOBUILDINGMANAGER_H #define LEGOBUILDINGMANAGER_H
#include "decomp.h" #include "decomp.h"
#include "misc/legostorage.h"
#include "mxcore.h" #include "mxcore.h"
class LegoEntity; class LegoEntity;
class LegoROI; class LegoROI;
class LegoWorld; class LegoWorld;
struct LegoBuildingData; struct LegoBuildingData;
class LegoStorage;
// VTABLE: LEGO1 0x100d6f50 // VTABLE: LEGO1 0x100d6f50
// SIZE 0x30 // SIZE 0x30

View File

@ -6,6 +6,8 @@
#include "mxstl/stlcompat.h" #include "mxstl/stlcompat.h"
#include "mxtypes.h" #include "mxtypes.h"
#pragma warning(disable : 4237)
// SIZE 0x08 // SIZE 0x08
struct LegoCacheSoundEntry { struct LegoCacheSoundEntry {
LegoCacheSoundEntry() : m_sound(NULL), m_name(NULL) {} LegoCacheSoundEntry() : m_sound(NULL), m_name(NULL) {}

View File

@ -2,7 +2,6 @@
#define LEGOCAMERACONTROLLER_H #define LEGOCAMERACONTROLLER_H
#include "legopointofviewcontroller.h" #include "legopointofviewcontroller.h"
#include "mxcore.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxgeometry3d.h"
#include "mxgeometry/mxmatrix.h" #include "mxgeometry/mxmatrix.h"
#include "mxpoint32.h" #include "mxpoint32.h"

View File

@ -1,6 +1,7 @@
#ifndef LEGOCARBUILDANIMPRESENTER_H #ifndef LEGOCARBUILDANIMPRESENTER_H
#define LEGOCARBUILDANIMPRESENTER_H #define LEGOCARBUILDANIMPRESENTER_H
#include "anim/legoanim.h"
#include "legoanimpresenter.h" #include "legoanimpresenter.h"
// VTABLE: LEGO1 0x100d99e0 // VTABLE: LEGO1 0x100d99e0

View File

@ -2,13 +2,14 @@
#define LEGOCHARACTERMANAGER_H #define LEGOCHARACTERMANAGER_H
#include "decomp.h" #include "decomp.h"
#include "legoextraactor.h"
#include "legovariables.h"
#include "misc/legostorage.h"
#include "mxstl/stlcompat.h" #include "mxstl/stlcompat.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "roi/legoroi.h"
class CustomizeAnimFileVariable;
class LegoActor; class LegoActor;
class LegoExtraActor;
class LegoStorage;
class LegoROI; class LegoROI;
#pragma warning(disable : 4237) #pragma warning(disable : 4237)
@ -40,7 +41,7 @@ struct LegoCharacter {
MxU32 m_refCount; // 0x04 MxU32 m_refCount; // 0x04
}; };
struct LegoCharacterData; struct LegoCharacterInfo;
typedef map<char*, LegoCharacter*, LegoCharacterComparator> LegoCharacterMap; typedef map<char*, LegoCharacter*, LegoCharacterComparator> LegoCharacterMap;
@ -64,8 +65,8 @@ class LegoCharacterManager {
void FUN_10083f10(LegoROI* p_roi); void FUN_10083f10(LegoROI* p_roi);
MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo); MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo);
LegoExtraActor* GetActor(const char* p_key); LegoExtraActor* GetActor(const char* p_key);
LegoCharacterData* GetData(const char* p_key); LegoCharacterInfo* GetInfo(const char* p_key);
LegoCharacterData* GetData(LegoROI* p_roi); LegoCharacterInfo* GetInfo(LegoROI* p_roi);
MxBool SwitchHat(LegoROI* p_roi); MxBool SwitchHat(LegoROI* p_roi);
MxU32 FUN_10085140(LegoROI* p_roi, MxBool p_und); MxU32 FUN_10085140(LegoROI* p_roi, MxBool p_und);
LegoROI* FUN_10085210(const char* p_name, const char* p_lodName, MxBool p_createEntity); LegoROI* FUN_10085210(const char* p_name, const char* p_lodName, MxBool p_createEntity);

View File

@ -8,7 +8,7 @@ class LegoExtraActor;
class LegoROI; class LegoROI;
// SIZE 0x108 // SIZE 0x108
struct LegoCharacterData { struct LegoCharacterInfo {
// SIZE 0x18 // SIZE 0x18
struct Part { struct Part {
MxU8* m_unk0x00; // 0x00 MxU8* m_unk0x00; // 0x00
@ -45,7 +45,34 @@ struct LegoCharacterLOD {
float m_up[3]; // 0x4c float m_up[3]; // 0x4c
}; };
extern LegoCharacterData g_characterDataInit[66]; enum LegoCharacterLODs {
c_topLOD,
c_bodyLOD,
c_infohatLOD,
c_infogronLOD,
c_headLOD,
c_armlftLOD,
c_armrtLOD,
c_clawlftLOD,
c_clawrtLOD,
c_leglftLOD,
c_legrtLOD
};
enum LegoCharacterParts {
c_bodyPart,
c_infohatPart,
c_infogronPart,
c_headPart,
c_armlftPart,
c_armrtPart,
c_clawlftPart,
c_clawrtPart,
c_leglftPart,
c_legrtPart
};
extern LegoCharacterInfo g_characterInfoInit[66];
extern LegoCharacterLOD g_characterLODs[11]; extern LegoCharacterLOD g_characterLODs[11];
#endif // LEGOCHARACTERS_H #endif // LEGOCHARACTERS_H

View File

@ -0,0 +1,34 @@
#ifndef LEGOENDANIMNOTIFICATIONPARAM_H
#define LEGOENDANIMNOTIFICATIONPARAM_H
#include "decomp.h"
#include "mxnotificationparam.h"
// VTABLE: LEGO1 0x100d7e80
// SIZE 0x10
class LegoEndAnimNotificationParam : public MxNotificationParam {
public:
LegoEndAnimNotificationParam(NotificationId p_type, MxCore* p_sender, MxU32 p_index)
: MxNotificationParam(p_type, p_sender), m_index(p_index)
{
}
// FUNCTION: LEGO1 0x1004afd0
MxNotificationParam* Clone() const override
{
return new LegoEndAnimNotificationParam(m_type, m_sender, m_index);
} // vtable+0x04
inline MxU32 GetIndex() { return m_index; }
protected:
MxU32 m_index; // 0x0c
};
// SYNTHETIC: LEGO1 0x1004b080
// LegoEndAnimNotificationParam::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1004b0f0
// LegoEndAnimNotificationParam::~LegoEndAnimNotificationParam
#endif // LEGOENDANIMNOTIFICATIONPARAM_H

View File

@ -3,10 +3,11 @@
#include "decomp.h" #include "decomp.h"
#include "extra.h" #include "extra.h"
#include "mxdsaction.h"
#include "mxentity.h" #include "mxentity.h"
#include "realtime/vector.h"
#include "roi/legoroi.h" class LegoROI;
class MxDSAction;
class Vector3;
// VTABLE: LEGO1 0x100d4858 // VTABLE: LEGO1 0x100d4858
// SIZE 0x68 // SIZE 0x68

View File

@ -1,11 +1,10 @@
#ifndef LEGOENTITYLIST_H #ifndef LEGOENTITYLIST_H
#define LEGOENTITYLIST_H #define LEGOENTITYLIST_H
#include "legoentity.h"
#include "mxlist.h" #include "mxlist.h"
#include "mxtypes.h" #include "mxtypes.h"
class LegoEntity;
// VTABLE: LEGO1 0x100d6410 // VTABLE: LEGO1 0x100d6410
// class MxCollection<LegoEntity *> // class MxCollection<LegoEntity *>

View File

@ -4,6 +4,7 @@
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
class LegoEntity; class LegoEntity;
class Vector3;
// VTABLE: LEGO1 0x100d8398 // VTABLE: LEGO1 0x100d8398
// SIZE 0x50 // SIZE 0x50

View File

@ -3,10 +3,11 @@
#include "mxnotificationparam.h" #include "mxnotificationparam.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "roi/legoroi.h"
#include <stdlib.h> #include <stdlib.h>
class LegoROI;
// VTABLE: LEGO1 0x100d6aa0 // VTABLE: LEGO1 0x100d6aa0
// SIZE 0x20 // SIZE 0x20
class LegoEventNotificationParam : public MxNotificationParam { class LegoEventNotificationParam : public MxNotificationParam {

View File

@ -3,14 +3,17 @@
#include "actionsfwd.h" #include "actionsfwd.h"
#include "decomp.h" #include "decomp.h"
#include "legobackgroundcolor.h"
#include "legofullscreenmovie.h"
#include "misc/legostorage.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "mxvariabletable.h"
#include <string.h>
class LegoBackgroundColor;
class LegoFile;
class LegoFullScreenMovie;
class LegoState; class LegoState;
class LegoStorage;
class MxVariable; class MxVariable;
class MxVariableTable;
class MxString; class MxString;
// SIZE 0x08 // SIZE 0x08
@ -54,8 +57,9 @@ class LegoGameState {
e_unk20, e_unk20,
e_unk21, e_unk21,
e_pizzeriaExterior, e_pizzeriaExterior,
e_unk23,
e_garageExterior = 25, e_unk24,
e_garageExterior,
e_garage, e_garage,
e_garadoor, e_garadoor,
e_unk28, e_unk28,
@ -73,14 +77,17 @@ class LegoGameState {
e_unk40, e_unk40,
e_unk41, e_unk41,
e_unk42, e_unk42,
e_unk43,
e_unk45 = 45, e_unk44,
e_unk45,
e_act2main, e_act2main,
e_act3script, e_act3script,
e_unk48, e_unk48,
e_unk49, e_unk49,
e_unk50,
e_jukeboxw = 53, e_unk51,
e_unk52,
e_jukeboxw,
e_unk54, e_unk54,
e_unk55, e_unk55,
e_histbook, e_histbook,

View File

@ -3,14 +3,15 @@
#include "decomp.h" #include "decomp.h"
#include "legoeventnotificationparam.h" #include "legoeventnotificationparam.h"
#include "legoworld.h"
#include "mxlist.h" #include "mxlist.h"
#include "mxpresenter.h" #include "mxpresenter.h"
#include "mxqueue.h" #include "mxqueue.h"
#include <dinput.h> #include <dinput.h>
class LegoCameraController;
class LegoControlManager; class LegoControlManager;
class LegoWorld;
extern MxS32 g_unk0x100f31b0; extern MxS32 g_unk0x100f31b0;
extern const char* g_unk0x100f31b4; extern const char* g_unk0x100f31b4;

View File

@ -1,5 +1,5 @@
#ifndef LEGOOMNI_H #ifndef LEGOMAIN_H
#define LEGOOMNI_H #define LEGOMAIN_H
#include "compat.h" #include "compat.h"
#include "mxdsaction.h" #include "mxdsaction.h"
@ -27,35 +27,6 @@ class MxBackgroundAudioManager;
class MxTransitionManager; class MxTransitionManager;
class ViewLODListManager; class ViewLODListManager;
extern MxAtomId* g_copterScript;
extern MxAtomId* g_dunecarScript;
extern MxAtomId* g_jetskiScript;
extern MxAtomId* g_racecarScript;
extern MxAtomId* g_carraceScript;
extern MxAtomId* g_carracerScript;
extern MxAtomId* g_jetraceScript;
extern MxAtomId* g_jetracerScript;
extern MxAtomId* g_isleScript;
extern MxAtomId* g_elevbottScript;
extern MxAtomId* g_infodoorScript;
extern MxAtomId* g_infomainScript;
extern MxAtomId* g_infoscorScript;
extern MxAtomId* g_regbookScript;
extern MxAtomId* g_histbookScript;
extern MxAtomId* g_hospitalScript;
extern MxAtomId* g_policeScript;
extern MxAtomId* g_garageScript;
extern MxAtomId* g_act2mainScript;
extern MxAtomId* g_act3Script;
extern MxAtomId* g_jukeboxScript;
extern MxAtomId* g_pz5Script;
extern MxAtomId* g_introScript;
extern MxAtomId* g_testScript;
extern MxAtomId* g_jukeboxwScript;
extern MxAtomId* g_sndAnimScript;
extern MxAtomId* g_creditsScript;
extern MxAtomId* g_nocdSourceName;
// VTABLE: LEGO1 0x100d8638 // VTABLE: LEGO1 0x100d8638
// SIZE 0x140 // SIZE 0x140
class LegoOmni : public MxOmni { class LegoOmni : public MxOmni {
@ -103,65 +74,6 @@ class LegoOmni : public MxOmni {
MxAtomId* m_atomId; // 0x18 MxAtomId* m_atomId; // 0x18
}; };
// SIZE 0x38
struct PathContainer {
PathContainer() {}
// FUNCTION: LEGO1 0x1001b1b0
PathContainer(
undefined4 p_unk0x00,
MxAtomId* p_script,
undefined4 p_unk0x04,
const char* p_key,
undefined2 p_unk0x20,
float p_unk0x24,
undefined2 p_unk0x28,
float p_unk0x2c,
undefined4 p_unk0x30,
MxS32 p_unk0x34
)
{
m_unk0x00 = p_unk0x00;
m_script = p_script;
m_unk0x04 = p_unk0x04;
strcpy(m_key, p_key);
m_unk0x20 = p_unk0x20;
m_unk0x24 = p_unk0x24;
m_unk0x28 = p_unk0x28;
m_unk0x2c = p_unk0x2c;
m_unk0x30 = p_unk0x30;
m_unk0x34 = p_unk0x34;
}
// FUNCTION: LEGO1 0x1001b230
PathContainer& operator=(const PathContainer& p_container)
{
m_unk0x00 = p_container.m_unk0x00;
m_script = p_container.m_script;
m_unk0x04 = p_container.m_unk0x04;
strcpy(m_key, p_container.m_key);
m_unk0x20 = p_container.m_unk0x20;
m_unk0x24 = p_container.m_unk0x24;
m_unk0x28 = p_container.m_unk0x28;
m_unk0x2c = p_container.m_unk0x2c;
m_unk0x30 = p_container.m_unk0x30;
m_unk0x34 = p_container.m_unk0x34;
return *this;
}
private:
undefined4 m_unk0x00; // 0x00
MxAtomId* m_script; // 0x04
undefined4 m_unk0x04; // 0x08
char m_key[20]; // 0x0c
undefined2 m_unk0x20; // 0x20
float m_unk0x24; // 0x24
undefined2 m_unk0x28; // 0x28
float m_unk0x2c; // 0x2c
undefined4 m_unk0x30; // 0x30
MxS32 m_unk0x34; // 0x34
};
LegoOmni(); LegoOmni();
~LegoOmni() override; // vtable+00 ~LegoOmni() override; // vtable+00
@ -264,12 +176,4 @@ class LegoOmni : public MxOmni {
MxBool m_unk0x13c; // 0x13c MxBool m_unk0x13c; // 0x13c
}; };
const char* GetNoCD_SourceName(); #endif // LEGOMAIN_H
LegoEntity* PickEntity(MxLong, MxLong);
LegoROI* PickROI(MxLong, MxLong);
void CreateScripts();
void DestroyScripts();
#endif // LEGOOMNI_H

View File

@ -2,6 +2,7 @@
#define LEGOMETERPRESENTER_H #define LEGOMETERPRESENTER_H
#include "mxstillpresenter.h" #include "mxstillpresenter.h"
#include "mxstring.h"
// VTABLE: LEGO1 0x100d7ac8 // VTABLE: LEGO1 0x100d7ac8
// SIZE 0x94 // SIZE 0x94

View File

@ -4,7 +4,8 @@
#include "decomp.h" #include "decomp.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "realtime/vector.h"
class Vector3;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //

View File

@ -2,9 +2,10 @@
#define LEGOPALETTEPRESENTER_H #define LEGOPALETTEPRESENTER_H
#include "decomp.h" #include "decomp.h"
#include "mxpalette.h"
#include "mxvideopresenter.h" #include "mxvideopresenter.h"
class MxPalette;
// VTABLE: LEGO1 0x100d9aa0 // VTABLE: LEGO1 0x100d9aa0
// SIZE 0x68 // SIZE 0x68
class LegoPalettePresenter : public MxVideoPresenter { class LegoPalettePresenter : public MxVideoPresenter {

View File

@ -1,14 +1,15 @@
#ifndef LEGOPATHACTOR_H #ifndef LEGOPATHACTOR_H
#define LEGOPATHACTOR_H #define LEGOPATHACTOR_H
#include "geom/legounkown100db7f4.h"
#include "legoactor.h" #include "legoactor.h"
#include "misc/legounknown.h" #include "misc/legounknown.h"
#include "mxgeometry/mxmatrix.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "realtime/matrix.h"
struct LegoEdge;
class LegoPathBoundary; class LegoPathBoundary;
class LegoPathController; class LegoPathController;
class LegoUnknown100db7f4;
// VTABLE: LEGO1 0x100d6e28 // VTABLE: LEGO1 0x100d6e28
// SIZE 0x154 // SIZE 0x154

View File

@ -3,11 +3,10 @@
#include "geom/legowegedge.h" #include "geom/legowegedge.h"
#include "legoanimpresenter.h" #include "legoanimpresenter.h"
#include "legopathactor.h"
#include "mxstl/stlcompat.h" #include "mxstl/stlcompat.h"
#include "mxtypes.h" #include "mxtypes.h"
class LegoPathActor;
struct LegoPathActorSetCompare { struct LegoPathActorSetCompare {
MxU32 operator()(const LegoPathActor* p_lhs, const LegoPathActor* p_rhs) const MxU32 operator()(const LegoPathActor* p_lhs, const LegoPathActor* p_rhs) const
{ {

View File

@ -2,12 +2,15 @@
#define LEGOPATHCONTROLLER_H #define LEGOPATHCONTROLLER_H
#include "decomp.h" #include "decomp.h"
#include "legopathactor.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxstl/stlcompat.h"
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoPathActor;
class LegoPathBoundary; class LegoPathBoundary;
class LegoWorld; class LegoWorld;
class MxAtomId;
class Vector3;
struct LegoPathControllerComparator { struct LegoPathControllerComparator {
MxBool operator()(const undefined*, const undefined*) const { return 0; } MxBool operator()(const undefined*, const undefined*) const { return 0; }
@ -41,6 +44,14 @@ class LegoPathController : public MxCore {
virtual void VTable0x14(MxU8* p_data, Vector3& p_location, MxAtomId& p_trigger); // vtable+0x14 virtual void VTable0x14(MxU8* p_data, Vector3& p_location, MxAtomId& p_trigger); // vtable+0x14
virtual void Destroy(); // vtable+0x18 virtual void Destroy(); // vtable+0x18
MxResult FUN_10045c20(
LegoPathActor* p_actor,
const char* p_path,
MxS32 p_src,
float p_srcScale,
MxS32 p_dest,
float p_destScale
);
undefined4 FUN_10046770(LegoPathActor* p_actor); undefined4 FUN_10046770(LegoPathActor* p_actor);
void FUN_100468f0(LegoAnimPresenter* p_presenter); void FUN_100468f0(LegoAnimPresenter* p_presenter);
void FUN_10046930(LegoAnimPresenter* p_presenter); void FUN_10046930(LegoAnimPresenter* p_presenter);

View File

@ -1,6 +1,7 @@
#ifndef LEGOPATHPRESENTER_H #ifndef LEGOPATHPRESENTER_H
#define LEGOPATHPRESENTER_H #define LEGOPATHPRESENTER_H
#include "mxatom.h"
#include "mxmediapresenter.h" #include "mxmediapresenter.h"
// VTABLE: LEGO1 0x100d7c10 // VTABLE: LEGO1 0x100d7c10

View File

@ -2,11 +2,11 @@
#define LEGOPLANTMANAGER_H #define LEGOPLANTMANAGER_H
#include "decomp.h" #include "decomp.h"
#include "misc/legostorage.h"
#include "mxcore.h" #include "mxcore.h"
class LegoEntity; class LegoEntity;
class LegoROI; class LegoROI;
class LegoStorage;
// VTABLE: LEGO1 0x100d6758 // VTABLE: LEGO1 0x100d6758
// SIZE 0x2c // SIZE 0x2c

View File

@ -2,7 +2,8 @@
#define LEGORACEACTOR_H #define LEGORACEACTOR_H
#include "legoanimactor.h" #include "legoanimactor.h"
#include "realtime/matrix.h"
class Matrix4;
/* /*
VTABLE: LEGO1 0x100d5b78 LegoAnimActor VTABLE: LEGO1 0x100d5b78 LegoAnimActor

View File

@ -2,7 +2,6 @@
#define LEGORACECAR_H #define LEGORACECAR_H
#include "legocarraceactor.h" #include "legocarraceactor.h"
#include "legopathactor.h"
#include "legoracemap.h" #include "legoracemap.h"
/* /*

View File

@ -1,9 +1,10 @@
#ifndef LEGOSOUNDMANAGER_H #ifndef LEGOSOUNDMANAGER_H
#define LEGOSOUNDMANAGER_H #define LEGOSOUNDMANAGER_H
#include "legocachesoundmanager.h"
#include "mxsoundmanager.h" #include "mxsoundmanager.h"
class LegoCacheSoundManager;
// VTABLE: LEGO1 0x100d6b10 // VTABLE: LEGO1 0x100d6b10
// SIZE 0x44 // SIZE 0x44
class LegoSoundManager : public MxSoundManager { class LegoSoundManager : public MxSoundManager {

View File

@ -4,7 +4,6 @@
#include "decomp.h" #include "decomp.h"
#include "misc/legostorage.h" #include "misc/legostorage.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxstring.h"
// VTABLE: LEGO1 0x100d46c0 // VTABLE: LEGO1 0x100d46c0
// SIZE 0x08 // SIZE 0x08

View File

@ -3,8 +3,12 @@
#include "decomp.h" #include "decomp.h"
#include "mxgeometry/mxmatrix.h" #include "mxgeometry/mxmatrix.h"
#include "mxtypes.h"
struct AnimInfo;
class LegoAnimMMPresenter; class LegoAnimMMPresenter;
class LegoROI;
class MxPresenter;
// SIZE 0x78 // SIZE 0x78
struct LegoTranInfo { struct LegoTranInfo {
@ -30,7 +34,9 @@ struct LegoTranInfo {
m_unk0x2c.SetIdentity(); m_unk0x2c.SetIdentity();
} }
undefined4 m_unk0x00; // 0x00 ~LegoTranInfo() { delete m_unk0x0c; }
AnimInfo* m_animInfo; // 0x00
MxU32 m_index; // 0x04 MxU32 m_index; // 0x04
LegoROI* m_unk0x08; // 0x08 LegoROI* m_unk0x08; // 0x08
MxMatrix* m_unk0x0c; // 0x0c MxMatrix* m_unk0x0c; // 0x0c

View File

@ -3,10 +3,11 @@
#include "decomp.h" #include "decomp.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "roi/legoroi.h"
#include <dsound.h> #include <dsound.h>
class LegoROI;
// VTABLE: LEGO1 0x100d5778 // VTABLE: LEGO1 0x100d5778
// SIZE 0x30 // SIZE 0x30
class LegoUnknown100d5778 { class LegoUnknown100d5778 {

View File

@ -1,27 +1,30 @@
#ifndef LEGOUTILS_H #ifndef LEGOUTILS_H
#define LEGOUTILS_H #define LEGOUTILS_H
#include "decomp.h"
#include "extra.h" #include "extra.h"
#include "misc/legostorage.h"
#include "misc/legotexture.h"
#include "mxstring.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "mxutilities.h"
#include <windows.h> #include <windows.h>
class IslePathActor;
class MxAtomId; class MxAtomId;
class LegoEntity; class LegoEntity;
class LegoFile;
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoNamedTexture; class LegoNamedTexture;
class LegoROI;
class LegoTreeNode; class LegoTreeNode;
LegoEntity* PickEntity(MxLong, MxLong);
LegoROI* PickROI(MxLong, MxLong);
MxS16 CountTotalTreeNodes(LegoTreeNode* p_node); MxS16 CountTotalTreeNodes(LegoTreeNode* p_node);
void FUN_1003e050(LegoAnimPresenter* p_presenter); void FUN_1003e050(LegoAnimPresenter* p_presenter);
Extra::ActionType MatchActionString(const char*); Extra::ActionType MatchActionString(const char*);
void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_targetEntityId, LegoEntity* p_sender); void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_targetEntityId, LegoEntity* p_sender);
void SetCameraControllerFromIsle(); void SetCameraControllerFromIsle();
void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut); void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut);
void FUN_1003ecc0(IslePathActor* p_actor, undefined4, undefined4, MxBool);
void FUN_1003eda0(); void FUN_1003eda0();
MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id); MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id);
void FUN_1003ef00(MxBool); void FUN_1003ef00(MxBool);

View File

@ -28,7 +28,7 @@ class LegoVehicleBuildState : public LegoState {
// SYNTHETIC: LEGO1 0x100260a0 // SYNTHETIC: LEGO1 0x100260a0
// LegoVehicleBuildState::`scalar deleting destructor' // LegoVehicleBuildState::`scalar deleting destructor'
private: // private:
Playlist m_unk0x08[4]; // 0x08 Playlist m_unk0x08[4]; // 0x08
// This can be one of the following: // This can be one of the following:
@ -44,8 +44,8 @@ class LegoVehicleBuildState : public LegoState {
// * 6 == exit(ing) build screen // * 6 == exit(ing) build screen
MxU32 m_animationState; // 0x48 MxU32 m_animationState; // 0x48
undefined m_unk0x4c; // 0x4c undefined m_unk0x4c; // 0x4c
undefined m_unk0x4d; // 0x4d MxBool m_unk0x4d; // 0x4d
undefined m_unk0x4e; // 0x4e MxBool m_unk0x4e; // 0x4e
MxU8 m_placedPartCount; // 0x4f MxU8 m_placedPartCount; // 0x4f
}; };

View File

@ -1,16 +1,21 @@
#ifndef LEGOVIDEOMANAGER_H #ifndef LEGOVIDEOMANAGER_H
#define LEGOVIDEOMANAGER_H #define LEGOVIDEOMANAGER_H
#include "3dmanager/lego3dmanager.h"
#include "decomp.h" #include "decomp.h"
#include "legophonemelist.h" #include "legophonemelist.h"
#include "mxdirectx/mxdirect3d.h"
#include "mxdirectx/mxstopwatch.h"
#include "mxvideomanager.h" #include "mxvideomanager.h"
#include <ddraw.h> #include <ddraw.h>
class Lego3DManager;
class LegoROI; class LegoROI;
class MxDirect3D;
class MxStopWatch;
namespace Tgl
{
class Renderer;
}
// VTABLE: LEGO1 0x100d9c88 // VTABLE: LEGO1 0x100d9c88
// SIZE 0x590 // SIZE 0x590
@ -47,6 +52,8 @@ class LegoVideoManager : public MxVideoManager {
inline LegoROI* GetViewROI() { return this->m_viewROI; } inline LegoROI* GetViewROI() { return this->m_viewROI; }
inline MxDirect3D* GetDirect3D() { return this->m_direct3d; } inline MxDirect3D* GetDirect3D() { return this->m_direct3d; }
inline MxBool GetRender3D() { return this->m_render3d; } inline MxBool GetRender3D() { return this->m_render3d; }
inline double GetElapsedSeconds() { return this->m_elapsedSeconds; }
inline void SetRender3D(MxBool p_render3d) { this->m_render3d = p_render3d; } inline void SetRender3D(MxBool p_render3d) { this->m_render3d = p_render3d; }
inline void SetUnk0x554(MxBool p_unk0x554) { this->m_unk0x554 = p_unk0x554; } inline void SetUnk0x554(MxBool p_unk0x554) { this->m_unk0x554 = p_unk0x554; }

View File

@ -2,15 +2,14 @@
#define LEGOWORLD_H #define LEGOWORLD_H
#include "legocachesoundlist.h" #include "legocachesoundlist.h"
#include "legocachsound.h"
#include "legocameracontroller.h"
#include "legoentity.h" #include "legoentity.h"
#include "legoentitylist.h" #include "legoentitylist.h"
#include "legopathcontrollerlist.h" #include "legopathcontrollerlist.h"
#include "mxpresenter.h"
#include "mxpresenterlist.h" #include "mxpresenterlist.h"
#include "roi/legoroi.h"
class IslePathActor; class IslePathActor;
class LegoCameraController;
class LegoPathBoundary; class LegoPathBoundary;
class LegoHideAnimPresenter; class LegoHideAnimPresenter;
@ -66,6 +65,14 @@ class LegoWorld : public LegoEntity {
MxBool PresentersPending(); MxBool PresentersPending();
void Remove(MxCore* p_object); void Remove(MxCore* p_object);
MxResult FUN_1001f720(
IslePathActor* p_actor,
const char* p_path,
MxS32 p_src,
float p_srcScale,
MxS32 p_dest,
float p_destScale
);
undefined4 FUN_1001fa70(IslePathActor* p_actor); undefined4 FUN_1001fa70(IslePathActor* p_actor);
undefined4 FUN_1001fb70( undefined4 FUN_1001fb70(
IslePathActor* p_actor, IslePathActor* p_actor,

View File

@ -3,9 +3,6 @@
#include "compat.h" #include "compat.h"
#include "decomp.h" #include "decomp.h"
#include "legoinputmanager.h"
#include "legoomni.h"
#include "legovideomanager.h"
// Long include path due to dependency of misc library on LegoOmni // Long include path due to dependency of misc library on LegoOmni
#include "lego/legoomni/include/actions/actionsfwd.h" #include "lego/legoomni/include/actions/actionsfwd.h"
#include "mxtypes.h" #include "mxtypes.h"
@ -16,6 +13,7 @@ class LegoBuildingManager;
class LegoCharacterManager; class LegoCharacterManager;
class LegoControlManager; class LegoControlManager;
class LegoGameState; class LegoGameState;
class LegoInputManager;
class LegoNavController; class LegoNavController;
class LegoOmni; class LegoOmni;
class LegoPlantManager; class LegoPlantManager;
@ -64,10 +62,4 @@ void PlayMusic(JukeboxScript::Script p_script);
void SetIsWorldActive(MxBool p_isWorldActive); void SetIsWorldActive(MxBool p_isWorldActive);
void DeleteObjects(MxAtomId* p_id, MxS32 p_first, MxS32 p_last); void DeleteObjects(MxAtomId* p_id, MxS32 p_first, MxS32 p_last);
// FUNCTION: LEGO1 0x10015890
inline MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction)
{
return LegoOmni::GetInstance()->StartActionIfUnknown0x13c(p_dsAction);
}
#endif // MISC_H #endif // MISC_H

View File

@ -1,13 +1,12 @@
#ifndef MXBACKGROUNDAUDIOMANAGER_H #ifndef MXBACKGROUNDAUDIOMANAGER_H
#define MXBACKGROUNDAUDIOMANAGER_H #define MXBACKGROUNDAUDIOMANAGER_H
#include "mxaudiopresenter.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxdsaction.h" #include "mxdsaction.h"
#include "mxnotificationmanager.h"
#include "mxpresenter.h"
#include "mxtypes.h" #include "mxtypes.h"
class MxAudioPresenter;
// VTABLE: LEGO1 0x100d9fe8 // VTABLE: LEGO1 0x100d9fe8
// SIZE 0x150 // SIZE 0x150
class MxBackgroundAudioManager : public MxCore { class MxBackgroundAudioManager : public MxCore {

View File

@ -4,6 +4,8 @@
#include "decomp.h" #include "decomp.h"
#include "isleactor.h" #include "isleactor.h"
class SkateBoard;
// VTABLE: LEGO1 0x100d7380 // VTABLE: LEGO1 0x100d7380
// SIZE 0x9c // SIZE 0x9c
class Pizza : public IsleActor { class Pizza : public IsleActor {
@ -31,18 +33,23 @@ class Pizza : public IsleActor {
undefined4 HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74 undefined4 HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74
undefined4 VTable0x80(MxParam&) override; // vtable+0x80 undefined4 VTable0x80(MxParam&) override; // vtable+0x80
void FUN_100382b0();
void FUN_10038380();
inline void SetSkateboard(SkateBoard* p_skateboard) { m_skateboard = p_skateboard; }
// SYNTHETIC: LEGO1 0x100380e0 // SYNTHETIC: LEGO1 0x100380e0
// Pizza::`scalar deleting destructor' // Pizza::`scalar deleting destructor'
private: private:
undefined4 m_unk0x7c; // 0x7c undefined4 m_unk0x7c; // 0x7c
undefined4 m_unk0x80; // 0x80 undefined4 m_unk0x80; // 0x80
undefined4 m_unk0x84; // 0x84 SkateBoard* m_skateboard; // 0x84
undefined4 m_unk0x88; // 0x88 undefined4 m_unk0x88; // 0x88
undefined4 m_unk0x8c; // 0x8c undefined4 m_unk0x8c; // 0x8c
undefined4 m_unk0x90; // 0x90 undefined4 m_unk0x90; // 0x90
undefined4 m_unk0x94; // 0x94 undefined4 m_unk0x94; // 0x94
undefined m_unk0x98; // 0x98 undefined m_unk0x98; // 0x98
}; };
#endif // PIZZA_H #endif // PIZZA_H

View File

@ -2,12 +2,13 @@
#define POLICE_H #define POLICE_H
#include "decomp.h" #include "decomp.h"
#include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxdsaction.h"
#include "radio.h" #include "radio.h"
class LegoControlManagerEvent;
class LegoEventNotificationParam;
class MxDSAction;
class PoliceState; class PoliceState;
// VTABLE: LEGO1 0x100d8a80 // VTABLE: LEGO1 0x100d8a80

View File

@ -4,7 +4,6 @@
#include "actionsfwd.h" #include "actionsfwd.h"
#include "decomp.h" #include "decomp.h"
#include "legostate.h" #include "legostate.h"
#include "police.h"
// VTABLE: LEGO1 0x100d8af0 // VTABLE: LEGO1 0x100d8af0
// SIZE 0x10 // SIZE 0x10

View File

@ -1,10 +1,11 @@
#ifndef RADIO_H #ifndef RADIO_H
#define RADIO_H #define RADIO_H
#include "legocontrolmanager.h"
#include "mxactionnotificationparam.h"
#include "mxcore.h" #include "mxcore.h"
#include "radiostate.h"
class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class RadioState;
// VTABLE: LEGO1 0x100d6d10 // VTABLE: LEGO1 0x100d6d10
// SIZE 0x10 // SIZE 0x10

View File

@ -2,7 +2,8 @@
#define RADIOSTATE_H #define RADIOSTATE_H
#include "legostate.h" #include "legostate.h"
#include "mxdsaction.h"
class MxAtomId;
// VTABLE: LEGO1 0x100d6d28 // VTABLE: LEGO1 0x100d6d28
// SIZE 0x30 // SIZE 0x30

View File

@ -1,14 +1,12 @@
#ifndef REGISTRATIONBOOK_H #ifndef REGISTRATIONBOOK_H
#define REGISTRATIONBOOK_H #define REGISTRATIONBOOK_H
#include "jukebox.h"
#include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxcontrolpresenter.h"
#include "mxstillpresenter.h"
class InfocenterState; class InfocenterState;
class MxControlPresenter;
class MxEndActionNotificationParam; class MxEndActionNotificationParam;
class MxStillPresenter;
class LegoControlManagerEvent; class LegoControlManagerEvent;
// VTABLE: LEGO1 0x100d9928 // VTABLE: LEGO1 0x100d9928

View File

@ -1,12 +1,12 @@
#ifndef SCORE_H #ifndef SCORE_H
#define SCORE_H #define SCORE_H
#include "legocontrolmanager.h"
#include "legoeventnotificationparam.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxactionnotificationparam.h"
#include "scorestate.h" class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class ScoreState;
// VTABLE: LEGO1 0x100d4018 // VTABLE: LEGO1 0x100d4018
// SIZE 0x104 // SIZE 0x104

View File

@ -0,0 +1,39 @@
#ifndef SCRIPTS_H
#define SCRIPTS_H
class MxAtomId;
extern MxAtomId* g_copterScript;
extern MxAtomId* g_dunecarScript;
extern MxAtomId* g_jetskiScript;
extern MxAtomId* g_racecarScript;
extern MxAtomId* g_carraceScript;
extern MxAtomId* g_carracerScript;
extern MxAtomId* g_jetraceScript;
extern MxAtomId* g_jetracerScript;
extern MxAtomId* g_isleScript;
extern MxAtomId* g_elevbottScript;
extern MxAtomId* g_infodoorScript;
extern MxAtomId* g_infomainScript;
extern MxAtomId* g_infoscorScript;
extern MxAtomId* g_regbookScript;
extern MxAtomId* g_histbookScript;
extern MxAtomId* g_hospitalScript;
extern MxAtomId* g_policeScript;
extern MxAtomId* g_garageScript;
extern MxAtomId* g_act2mainScript;
extern MxAtomId* g_act3Script;
extern MxAtomId* g_jukeboxScript;
extern MxAtomId* g_pz5Script;
extern MxAtomId* g_introScript;
extern MxAtomId* g_testScript;
extern MxAtomId* g_jukeboxwScript;
extern MxAtomId* g_sndAnimScript;
extern MxAtomId* g_creditsScript;
extern MxAtomId* g_nocdSourceName;
void CreateScripts();
void DestroyScripts();
const char* GetNoCD_SourceName();
#endif // SCRIPTS_H

View File

@ -4,11 +4,14 @@
#include "decomp.h" #include "decomp.h"
#include "islepathactor.h" #include "islepathactor.h"
class Act1State;
// VTABLE: LEGO1 0x100d55f0 // VTABLE: LEGO1 0x100d55f0
// SIZE 0x168 // SIZE 0x168
class SkateBoard : public IslePathActor { class SkateBoard : public IslePathActor {
public: public:
SkateBoard(); SkateBoard();
~SkateBoard() override;
// FUNCTION: LEGO1 0x1000fdd0 // FUNCTION: LEGO1 0x1000fdd0
inline const char* ClassName() const override // vtable+0x0c inline const char* ClassName() const override // vtable+0x0c
@ -35,9 +38,10 @@ class SkateBoard : public IslePathActor {
// SkateBoard::`scalar deleting destructor' // SkateBoard::`scalar deleting destructor'
private: private:
// TODO: SkateBoard types void FUN_10010270(MxBool p_enable);
undefined m_unk0x160;
undefined m_unk0x161[0x7]; MxBool m_unk0x160; // 0x160
Act1State* m_act1state; // 0x164
}; };
#endif // SKATEBOARD_H #endif // SKATEBOARD_H

View File

@ -23,14 +23,14 @@ class TowTrack : public IslePathActor {
return !strcmp(p_name, TowTrack::ClassName()) || IslePathActor::IsA(p_name); return !strcmp(p_name, TowTrack::ClassName()) || IslePathActor::IsA(p_name);
} }
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void VTable0x70(float p_float) override; // vtable+0x70 void VTable0x70(float p_float) override; // vtable+0x70
MxU32 VTable0xcc() override; // vtable+0xcc MxU32 VTable0xcc() override; // vtable+0xcc
MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4
MxU32 VTable0xd8(MxType18NotificationParam& p_param) override; // vtable+0xd8 MxU32 VTable0xd8(LegoEndAnimNotificationParam& p_param) override; // vtable+0xd8
MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc
void VTable0xe4() override; // vtable+0xe4 void VTable0xe4() override; // vtable+0xe4
void FUN_1004dab0(); void FUN_1004dab0();
void FUN_1004dad0(); void FUN_1004dad0();

View File

@ -1,5 +1,6 @@
#include "act1state.h" #include "act1state.h"
#include "legonamedtexture.h"
#include "legoutils.h" #include "legoutils.h"
DECOMP_SIZE_ASSERT(Act1State, 0x26c) DECOMP_SIZE_ASSERT(Act1State, 0x26c)
@ -25,7 +26,7 @@ Act1State::Act1State() : m_unk0x00c(0), m_unk0x00e(0), m_unk0x008(NULL), m_unk0x
m_unk0x01f = FALSE; m_unk0x01f = FALSE;
m_unk0x008 = g_unk0x100f37f0; m_unk0x008 = g_unk0x100f37f0;
m_unk0x014 = -1; m_unk0x014 = -1;
m_unk0x022 = 0; m_unk0x022 = FALSE;
m_unk0x154 = NULL; m_unk0x154 = NULL;
m_unk0x158 = NULL; m_unk0x158 = NULL;
m_unk0x15c = NULL; m_unk0x15c = NULL;
@ -122,8 +123,8 @@ MxResult Act1State::Serialize(LegoFile* p_legoFile)
} }
} }
p_legoFile->Write(&m_unk0x010, sizeof(undefined2)); p_legoFile->Write(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Write(&m_unk0x022, sizeof(undefined)); p_legoFile->Write(&m_unk0x022, sizeof(m_unk0x022));
} }
else if (p_legoFile->IsReadMode()) { else if (p_legoFile->IsReadMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) { if (m_unk0x108.GetName()->Compare("") != 0) {
@ -176,8 +177,8 @@ MxResult Act1State::Serialize(LegoFile* p_legoFile)
} }
} }
p_legoFile->Read(&m_unk0x010, sizeof(undefined2)); p_legoFile->Read(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Read(&m_unk0x022, sizeof(undefined)); p_legoFile->Read(&m_unk0x022, sizeof(m_unk0x022));
} }
// TODO // TODO
@ -205,7 +206,7 @@ MxBool Act1State::SetFlag()
m_unk0x024.SetName(""); m_unk0x024.SetName("");
m_unk0x070.SetName(""); m_unk0x070.SetName("");
m_unk0x0bc.SetName(""); m_unk0x0bc.SetName("");
m_unk0x022 = 0; m_unk0x022 = FALSE;
m_unk0x108.SetName(""); m_unk0x108.SetName("");
if (m_unk0x154) { if (m_unk0x154) {

View File

@ -1,14 +1,17 @@
#include "ambulance.h" #include "ambulance.h"
#include "ambulancemissionstate.h"
#include "decomp.h" #include "decomp.h"
#include "legocontrolmanager.h" #include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h"
#include "legovariables.h" #include "legovariables.h"
#include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxvariabletable.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Ambulance, 0x184) DECOMP_SIZE_ASSERT(Ambulance, 0x184)

View File

@ -3,10 +3,10 @@
#include "isle_actions.h" #include "isle_actions.h"
#include "legocontrolmanager.h" #include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h"
#include "legoutils.h" #include "legoutils.h"
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Bike, 0x164) DECOMP_SIZE_ASSERT(Bike, 0x164)

View File

@ -3,18 +3,20 @@
#include "act1state.h" #include "act1state.h"
#include "act3.h" #include "act3.h"
#include "act3_actions.h" #include "act3_actions.h"
#include "helicopterstate.h"
#include "isle.h" #include "isle.h"
#include "isle_actions.h" #include "isle_actions.h"
#include "jukebox.h" #include "jukebox.h"
#include "jukebox_actions.h" #include "jukebox_actions.h"
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "legocameracontroller.h"
#include "legocontrolmanager.h" #include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h"
#include "legoutils.h" #include "legoutils.h"
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxtransitionmanager.h" #include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Helicopter, 0x230) DECOMP_SIZE_ASSERT(Helicopter, 0x230)
DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14) DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14)
@ -64,17 +66,23 @@ void Helicopter::GetState()
void Helicopter::VTable0xe4() void Helicopter::VTable0xe4()
{ {
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
VTable0xe8(LegoGameState::e_unk40, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk40,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
IslePathActor::VTable0xe4(); IslePathActor::VTable0xe4();
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
GameState()->SetCurrentArea(LegoGameState::e_copter); GameState()->SetCurrentArea(LegoGameState::e_copter);
if (CurrentActor()) { if (CurrentActor() && CurrentActor()->IsA("IslePathActor")) {
if (CurrentActor()->IsA("IslePathActor")) { CurrentActor()->SpawnPlayer(
((IslePathActor*) CurrentActor())->VTable0xe8(LegoGameState::e_unk55, TRUE, 7); LegoGameState::e_unk55,
} TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
} }
@ -115,8 +123,12 @@ MxU32 Helicopter::VTable0xcc()
switch (GameState()->GetCurrentAct()) { switch (GameState()->GetCurrentAct()) {
case LegoGameState::e_act1: case LegoGameState::e_act1:
m_script = *g_isleScript; m_script = *g_isleScript;
AnimationManager()->FUN_10064670(FALSE); AnimationManager()->FUN_10064670(NULL);
VTable0xe8(LegoGameState::e_unk41, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk41,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_copter); ((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_copter);
FUN_10015820(TRUE, 0); FUN_10015820(TRUE, 0);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, TRUE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, TRUE);
@ -248,7 +260,7 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param)
} }
// FUNCTION: LEGO1 0x10003c20 // FUNCTION: LEGO1 0x10003c20
MxU32 Helicopter::VTable0xd8(MxType18NotificationParam& p_param) MxU32 Helicopter::VTable0xd8(LegoEndAnimNotificationParam& p_param)
{ {
MxU32 ret = 0; MxU32 ret = 0;
@ -256,10 +268,18 @@ MxU32 Helicopter::VTable0xd8(MxType18NotificationParam& p_param)
case 1: { case 1: {
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(4); ((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(4);
VTable0xe8(LegoGameState::e_unk42, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk42,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
else { else {
VTable0xe8(LegoGameState::e_unk49, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk49,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
m_state->SetUnknown8(2); m_state->SetUnknown8(2);
@ -293,10 +313,18 @@ MxU32 Helicopter::VTable0xd8(MxType18NotificationParam& p_param)
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(0); ((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(0);
VTable0xe8(LegoGameState::e_unk41, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk41,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
else { else {
VTable0xe8(LegoGameState::e_unk48, TRUE, 7); SpawnPlayer(
LegoGameState::e_unk48,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
} }
m_state->SetUnknown8(0); m_state->SetUnknown8(0);

View File

@ -1,10 +1,10 @@
#include "isleactor.h" #include "isleactor.h"
#include "legoentity.h" #include "legoentity.h"
#include "legoomni.h"
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxnotificationparam.h" #include "mxnotificationparam.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(IsleActor, 0x7c) DECOMP_SIZE_ASSERT(IsleActor, 0x7c)
@ -45,7 +45,7 @@ MxLong IsleActor::Notify(MxParam& p_param)
case c_notificationType11: case c_notificationType11:
result = VTable0x68(); result = VTable0x68();
break; break;
case c_notificationType18: case c_notificationEndAnim:
result = VTable0x70(); result = VTable0x70();
break; break;
case c_notificationType19: case c_notificationType19:

View File

@ -1,13 +1,25 @@
#include "islepathactor.h" #include "islepathactor.h"
#include "3dmanager/lego3dmanager.h"
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "legonavcontroller.h" #include "legonavcontroller.h"
#include "legopathboundary.h" #include "legopathboundary.h"
#include "legoutils.h" #include "legoutils.h"
#include "legovehiclebuildstate.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxnotificationparam.h" #include "mxnotificationparam.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(IslePathActor, 0x160) DECOMP_SIZE_ASSERT(IslePathActor, 0x160)
DECOMP_SIZE_ASSERT(IslePathActor::SpawnLocation, 0x38)
// GLOBAL: LEGO1 0x10102b28
IslePathActor::SpawnLocation g_spawnLocations[IslePathActor::c_LOCATIONS_NUM];
// FUNCTION: LEGO1 0x1001a200 // FUNCTION: LEGO1 0x1001a200
IslePathActor::IslePathActor() IslePathActor::IslePathActor()
@ -47,8 +59,8 @@ MxLong IslePathActor::Notify(MxParam& p_param)
case c_notificationClick: case c_notificationClick:
ret = VTable0xd4((LegoControlManagerEvent&) p_param); ret = VTable0xd4((LegoControlManagerEvent&) p_param);
break; break;
case c_notificationType18: case c_notificationEndAnim:
ret = VTable0xd8((MxType18NotificationParam&) p_param); ret = VTable0xd8((LegoEndAnimNotificationParam&) p_param);
break; break;
case c_notificationType19: case c_notificationType19:
ret = VTable0xdc((MxType19NotificationParam&) p_param); ret = VTable0xdc((MxType19NotificationParam&) p_param);
@ -90,10 +102,454 @@ void IslePathActor::VTable0xe4()
// TODO // TODO
} }
// STUB: LEGO1 0x1001b2a0 // FUNCTION: LEGO1 0x1001a700
void IslePathActor::VTable0xe8(LegoGameState::Area, MxBool, MxU8) void IslePathActor::RegisterSpawnLocations()
{ {
// TODO g_spawnLocations[0] = SpawnLocation(
LegoGameState::e_pizzeriaExterior,
g_isleScript,
0,
"int35",
2,
0.6,
4,
0.4,
0x2a,
JukeboxScript::c_Quiet_Audio
);
g_spawnLocations[1] = SpawnLocation(
LegoGameState::e_unk23,
g_isleScript,
0,
"edg00_49",
1,
0.43,
2,
0.6,
0x27,
JukeboxScript::c_Quiet_Audio
);
g_spawnLocations[2] = SpawnLocation(
LegoGameState::e_unk24,
g_isleScript,
0,
"edg00_191",
2,
0.5,
0,
0.55,
0x26,
JukeboxScript::c_Quiet_Audio
);
g_spawnLocations[3] = SpawnLocation(
LegoGameState::e_unk4,
g_isleScript,
0,
"int46",
0,
0.5,
2,
0.5,
0x10,
JukeboxScript::c_InformationCenter_Music
);
g_spawnLocations[4] = SpawnLocation(
LegoGameState::e_jetraceExterior,
g_isleScript,
0,
"EDG00_46",
0,
0.95,
2,
0.19,
0x17,
JukeboxScript::c_Beach_Music
);
g_spawnLocations[5] = SpawnLocation(
LegoGameState::e_unk17,
g_isleScript,
0,
"EDG00_46",
3,
0.625,
2,
0.03,
0x18,
JukeboxScript::c_Beach_Music
);
g_spawnLocations[6] = SpawnLocation(
LegoGameState::e_jetrace2,
g_isleScript,
0,
"EDG10_63",
0,
0.26,
1,
0.01,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[7] = SpawnLocation(
LegoGameState::e_carraceExterior,
g_isleScript,
0,
"INT15",
5,
0.65,
1,
0.68,
0x33,
JukeboxScript::c_CentralNorthRoad_Music
);
g_spawnLocations[8] = SpawnLocation(
LegoGameState::e_unk20,
g_isleScript,
0,
"INT16",
4,
0.1,
2,
0,
0x34,
JukeboxScript::c_CentralNorthRoad_Music
);
g_spawnLocations[9] = SpawnLocation(
LegoGameState::e_unk21,
g_isleScript,
0,
"INT62",
2,
0.1,
3,
0.7,
0x36,
JukeboxScript::c_CentralNorthRoad_Music
);
g_spawnLocations[10] = SpawnLocation(
LegoGameState::e_garageExterior,
g_isleScript,
0,
"INT24",
0,
0.55,
2,
0.71,
0x08,
JukeboxScript::c_GarageArea_Music
);
g_spawnLocations[11] = SpawnLocation(
LegoGameState::e_unk28,
g_isleScript,
0,
"INT24",
2,
0.73,
4,
0.71,
0x0a,
JukeboxScript::c_GarageArea_Music
);
g_spawnLocations[12] = SpawnLocation(
LegoGameState::e_hospitalExterior,
g_isleScript,
0,
"INT19",
0,
0.85,
1,
0.28,
0,
JukeboxScript::c_Hospital_Music
);
g_spawnLocations[13] = SpawnLocation(
LegoGameState::e_unk31,
g_isleScript,
0,
"EDG02_28",
3,
0.37,
1,
0.52,
0x0c,
JukeboxScript::c_Hospital_Music
);
g_spawnLocations[14] = SpawnLocation(
LegoGameState::e_policeExterior,
g_isleScript,
0,
"INT33",
0,
0.88,
2,
0.74,
0x22,
JukeboxScript::c_PoliceStation_Music
);
g_spawnLocations[15] = SpawnLocation(
LegoGameState::e_unk33,
g_isleScript,
0,
"EDG02_64",
2,
0.24,
0,
0.84,
0x23,
JukeboxScript::c_PoliceStation_Music
);
g_spawnLocations[16] = SpawnLocation(
LegoGameState::e_unk40,
g_isleScript,
0,
"edg02_51",
2,
0.63,
3,
0.01,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[17] = SpawnLocation(
LegoGameState::e_unk41,
g_isleScript,
0,
"edg02_51",
2,
0.63,
0,
0.4,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[18] = SpawnLocation(
LegoGameState::e_unk43,
g_isleScript,
0,
"edg02_35",
2,
0.8,
0,
0.2,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[19] = SpawnLocation(
LegoGameState::e_unk44,
g_isleScript,
0,
"EDG03_01",
2,
0.25,
0,
0.75,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[20] = SpawnLocation(
LegoGameState::e_unk45,
g_isleScript,
0,
"edg10_70",
3,
0.25,
0,
0.7,
0x44,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[21] = SpawnLocation(
LegoGameState::e_unk42,
g_isleScript,
0,
"inv_05",
2,
0.75,
0,
0.19,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[22] = SpawnLocation(
LegoGameState::e_unk48,
g_act3Script,
0,
"edg02_51",
2,
0.63,
0,
0.4,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[23] = SpawnLocation(
LegoGameState::e_unk49,
g_act3Script,
0,
"inv_05",
2,
0.75,
0,
0.19,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[24] = SpawnLocation(
LegoGameState::e_unk50,
g_act2mainScript,
0,
"EDG02_51",
0,
0.64,
1,
0.37,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[25] = SpawnLocation(
LegoGameState::e_unk51,
g_isleScript,
0,
"edg02_32",
0,
0.5,
2,
0.5,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[26] = SpawnLocation(
LegoGameState::e_unk52,
g_isleScript,
0,
"edg02_19",
2,
0.5,
0,
0.5,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[27] = SpawnLocation(
LegoGameState::e_unk54,
g_isleScript,
0,
"int36",
0,
0.2,
4,
0.4,
0,
JukeboxScript::c_noneJukebox
);
g_spawnLocations[28] = SpawnLocation(
LegoGameState::e_unk55,
g_isleScript,
0,
"edg02_50",
2,
0.8,
1,
0.3,
0,
JukeboxScript::c_noneJukebox
);
}
// FUNCTION: LEGO1 0x1001b2a0
// FUNCTION: BETA10 0x100369c6
void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_und, MxU8 p_flags)
{
MxS16 i;
for (i = 0; i < c_LOCATIONS_NUM && g_spawnLocations[i].m_area != p_area; i++) {
}
assert(i != c_LOCATIONS_NUM);
if (i != c_LOCATIONS_NUM) {
LegoWorld* world = FindWorld(*g_spawnLocations[i].m_script, g_spawnLocations[i].m_entityId);
assert(world);
if (m_world != NULL) {
m_world->FUN_1001fc80(this);
m_world->Remove(this);
VideoManager()->Get3DManager()->Remove(*m_roi);
}
m_world = world;
if (p_und) {
VTable0xe0();
}
m_world->FUN_1001f720(
this,
g_spawnLocations[i].m_path,
g_spawnLocations[i].m_src,
g_spawnLocations[i].m_srcScale,
g_spawnLocations[i].m_dest,
g_spawnLocations[i].m_destScale
);
if (GameState()->GetActorId() != m_actorId) {
m_world->Add(this);
}
LegoVehicleBuildState* state = NULL;
if (p_flags & c_spawnBit1) {
MxBool und = FALSE;
IsleScript::Script anim;
switch (g_spawnLocations[i].m_unk0x30) {
case 0x00:
case 0x44:
break;
case 0x0a:
state = (LegoVehicleBuildState*) GameState()->GetState("LegoDuneCarBuildState");
anim = IsleScript::c_igs008na_RunAnim;
break;
case 0x18:
state = (LegoVehicleBuildState*) GameState()->GetState("LegoJetskiBuildState");
anim = IsleScript::c_ijs006sn_RunAnim;
break;
case 0x23:
state = (LegoVehicleBuildState*) GameState()->GetState("LegoCopterBuildState");
anim = IsleScript::c_ips002ro_RunAnim;
break;
case 0x34:
state = (LegoVehicleBuildState*) GameState()->GetState("LegoRaceCarBuildState");
anim = IsleScript::c_irt007in_RunAnim;
break;
default:
und = TRUE;
break;
}
if (state != NULL && state->m_unk0x4d && !state->m_unk0x4e) {
if (AnimationManager()->FUN_10060dc0(anim, NULL, TRUE, FALSE, NULL, FALSE, TRUE, TRUE, TRUE) ==
SUCCESS) {
state->m_unk0x4e = TRUE;
und = FALSE;
}
}
if (und) {
FUN_1003ecc0(this, 0, g_spawnLocations[i].m_unk0x30, TRUE);
}
}
if (m_cameraFlag) {
FUN_1003eda0();
}
if (p_flags & c_playMusic && g_spawnLocations[i].m_music != JukeboxScript::c_noneJukebox) {
MxDSAction action;
action.SetAtomId(*g_jukeboxScript);
action.SetObjectId(g_spawnLocations[i].m_music);
BackgroundAudioManager()->PlayMusic(action, 5, 4);
}
}
} }
// FUNCTION: LEGO1 0x1001b5b0 // FUNCTION: LEGO1 0x1001b5b0

View File

@ -6,13 +6,14 @@
#include "jukebox_actions.h" #include "jukebox_actions.h"
#include "jukeboxstate.h" #include "jukeboxstate.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h"
#include "legoutils.h" #include "legoutils.h"
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxnotificationparam.h"
#include "mxtransitionmanager.h" #include "mxtransitionmanager.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(JukeBoxEntity, 0x6c) DECOMP_SIZE_ASSERT(JukeBoxEntity, 0x6c)

View File

@ -8,13 +8,13 @@ DECOMP_SIZE_ASSERT(Pizza, 0x9c)
// FUNCTION: LEGO1 0x10037ef0 // FUNCTION: LEGO1 0x10037ef0
Pizza::Pizza() Pizza::Pizza()
{ {
this->m_unk0x7c = 0; m_unk0x7c = 0;
this->m_unk0x80 = 0; m_unk0x80 = 0;
this->m_unk0x84 = 0; m_skateboard = NULL;
this->m_unk0x88 = 0; m_unk0x88 = 0;
this->m_unk0x8c = -1; m_unk0x8c = -1;
this->m_unk0x98 = 0; m_unk0x98 = 0;
this->m_unk0x90 = 0x80000000; m_unk0x90 = 0x80000000;
} }
// FUNCTION: LEGO1 0x10038100 // FUNCTION: LEGO1 0x10038100
@ -30,6 +30,16 @@ MxResult Pizza::Create(MxDSAction& p_dsAction)
return SUCCESS; return SUCCESS;
} }
// STUB: LEGO1 0x100382b0
void Pizza::FUN_100382b0()
{
}
// STUB: LEGO1 0x10038380
void Pizza::FUN_10038380()
{
}
// STUB: LEGO1 0x100383f0 // STUB: LEGO1 0x100383f0
undefined4 Pizza::VTable0x68() undefined4 Pizza::VTable0x68()
{ {

View File

@ -3,12 +3,15 @@
#include "isle_actions.h" #include "isle_actions.h"
#include "legocontrolmanager.h" #include "legocontrolmanager.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxactionnotificationparam.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxcontrolpresenter.h" #include "mxcontrolpresenter.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "radiostate.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(Radio, 0x10) DECOMP_SIZE_ASSERT(Radio, 0x10)
@ -80,7 +83,7 @@ void Radio::Stop()
if (m_state->IsActive()) { if (m_state->IsActive()) {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
MxControlPresenter* presenter = (MxControlPresenter*) world->Find(world->GetAtom(), 18); MxControlPresenter* presenter = (MxControlPresenter*) world->Find(world->GetAtom(), IsleScript::c_Radio_Ctl);
if (presenter) { if (presenter) {
presenter->VTable0x6c(0); presenter->VTable0x6c(0);

View File

@ -1,58 +1,165 @@
#include "skateboard.h" #include "skateboard.h"
#include "act1state.h"
#include "decomp.h" #include "decomp.h"
#include "isle.h"
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legoanimationmanager.h"
#include "legocontrolmanager.h"
#include "legoutils.h"
#include "misc.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxstillpresenter.h"
#include "mxtransitionmanager.h"
#include "pizza.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(SkateBoard, 0x168) DECOMP_SIZE_ASSERT(SkateBoard, 0x168)
// FUNCTION: LEGO1 0x1000fd40 // FUNCTION: LEGO1 0x1000fd40
SkateBoard::SkateBoard() SkateBoard::SkateBoard()
{ {
this->m_unk0x160 = 0; m_unk0x160 = FALSE;
this->m_unk0x13c = 15.0; m_unk0x13c = 15.0;
this->m_unk0x150 = 3.5; m_unk0x150 = 3.5;
this->m_unk0x148 = 1; m_unk0x148 = 1;
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// STUB: LEGO1 0x10010000 // FUNCTION: LEGO1 0x1000ff80
SkateBoard::~SkateBoard()
{
ControlManager()->Unregister(this);
NotificationManager()->Unregister(this);
}
// FUNCTION: LEGO1 0x10010000
MxResult SkateBoard::Create(MxDSAction& p_dsAction) MxResult SkateBoard::Create(MxDSAction& p_dsAction)
{ {
// TODO MxResult result = IslePathActor::Create(p_dsAction);
return SUCCESS;
if (result == SUCCESS) {
m_world = CurrentWorld();
m_world->Add(this);
Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor);
if (pizza) {
pizza->SetSkateboard(this);
}
}
return result;
} }
// STUB: LEGO1 0x10010050 // FUNCTION: LEGO1 0x10010050
void SkateBoard::VTable0xe4() void SkateBoard::VTable0xe4()
{ {
// TODO if (m_act1state->m_unk0x018 == 3) {
Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor);
pizza->FUN_10038380();
pizza->FUN_100382b0();
m_unk0x160 = FALSE;
}
IslePathActor::VTable0xe4();
GameState()->m_currentArea = LegoGameState::Area::e_skateboard;
RemoveFromCurrentWorld(*g_isleScript, IsleScript::c_SkateArms_Ctl);
RemoveFromCurrentWorld(*g_isleScript, IsleScript::c_SkatePizza_Bitmap);
ControlManager()->Unregister(this);
} }
// STUB: LEGO1 0x100100e0 // FUNCTION: LEGO1 0x100100e0
MxU32 SkateBoard::VTable0xcc() MxU32 SkateBoard::VTable0xcc()
{ {
// TODO Act1State* state = (Act1State*) GameState()->GetState("Act1State");
return 0;
if (!FUN_1003ef60() && state->m_unk0x018 != 3) {
return 1;
}
FUN_10015820(TRUE, 0);
((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::Area::e_skateboard);
TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, TRUE);
if (GameState()->GetActorId() != CurrentActor()->GetActorId()) {
if (!CurrentActor()->IsA("SkateBoard")) {
CurrentActor()->VTable0xe4();
}
}
if (!CurrentActor()->IsA("SkateBoard")) {
VTable0xe0();
InvokeAction(Extra::ActionType::e_start, *g_isleScript, IsleScript::c_SkateDashboard, NULL);
GetCurrentAction().SetObjectId(-1);
ControlManager()->Register(this);
}
FUN_10010270(m_unk0x160);
Vector3 position = m_roi->GetWorldPosition();
AnimationManager()->FUN_10064670(&position);
AnimationManager()->FUN_10064740(&position);
return 1;
} }
// STUB: LEGO1 0x10010230 // FUNCTION: LEGO1 0x10010230
MxU32 SkateBoard::VTable0xd4(LegoControlManagerEvent& p_param) MxU32 SkateBoard::VTable0xd4(LegoControlManagerEvent& p_param)
{ {
// TODO MxU32 result = 0;
return 0;
if (p_param.GetUnknown0x28() == 1 && p_param.GetClickedObjectId() == IsleScript::c_SkateArms_Ctl) {
VTable0xe4();
GameState()->m_currentArea = LegoGameState::Area::e_unk66;
result = 1;
}
return result;
} }
// STUB: LEGO1 0x100104f0 // FUNCTION: LEGO1 0x10010270
// FUNCTION: BETA10 0x100f5366
void SkateBoard::FUN_10010270(MxBool p_enable)
{
m_act1state = (Act1State*) GameState()->GetState("Act1State");
if (!m_act1state) {
m_act1state = (Act1State*) GameState()->CreateState("Act1State");
}
MxStillPresenter* presenter = (MxStillPresenter*) m_world->Find(*g_isleScript, IsleScript::c_SkatePizza_Bitmap);
if (presenter) {
presenter->Enable(p_enable);
}
else if (m_unk0x160) {
NotificationManager()->Send(this, MxNotificationParam(c_notificationType0, NULL));
}
}
// FUNCTION: LEGO1 0x100104f0
// FUNCTION: BETA10 0x100f5472
MxU32 SkateBoard::VTable0xd0() MxU32 SkateBoard::VTable0xd0()
{ {
// TODO FUN_10010270(m_unk0x160);
return 0; return 1;
} }
// STUB: LEGO1 0x10010510 // FUNCTION: LEGO1 0x10010510
void SkateBoard::FUN_10010510() void SkateBoard::FUN_10010510()
{ {
// TODO if (m_act1state->m_unk0x018 != 3) {
PlayMusic(JukeboxScript::c_BeachBlvd_Music);
if (!m_act1state->m_unk0x022) {
m_act1state->m_unk0x022 = TRUE;
MxMatrix mat(CurrentActor()->GetROI()->GetLocal2World());
mat.TranslateBy(mat[2][0] * 2.5, mat[2][1] + 0.2, mat[2][2] * 2.5);
AnimationManager()
->FUN_10060dc0(IsleScript::c_sns008in_RunAnim, &mat, TRUE, FALSE, NULL, FALSE, TRUE, TRUE, TRUE);
}
}
} }

View File

@ -37,7 +37,7 @@ MxLong TowTrack::Notify(MxParam& p_param)
} }
// STUB: LEGO1 0x1004cd30 // STUB: LEGO1 0x1004cd30
MxU32 TowTrack::VTable0xd8(MxType18NotificationParam& p_param) MxU32 TowTrack::VTable0xd8(LegoEndAnimNotificationParam& p_param)
{ {
// TODO // TODO
return 0; return 0;

View File

@ -1,8 +1,10 @@
#include "legoloadcachesoundpresenter.h" #include "legoloadcachesoundpresenter.h"
#include "legocachesoundmanager.h"
#include "legocachsound.h" #include "legocachsound.h"
#include "legosoundmanager.h" #include "legosoundmanager.h"
#include "misc.h" #include "misc.h"
#include "mxdssubscriber.h"
#include "mxstreamchunk.h" #include "mxstreamchunk.h"
#include "mxwavepresenter.h" #include "mxwavepresenter.h"

View File

@ -1,5 +1,6 @@
#include "legosoundmanager.h" #include "legosoundmanager.h"
#include "legocachesoundmanager.h"
#include "mxautolock.h" #include "mxautolock.h"
#include "mxomni.h" #include "mxomni.h"

View File

@ -1,10 +1,12 @@
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "legoomni.h" #include "legomain.h"
#include "misc.h" #include "misc.h"
#include "mxaudiopresenter.h"
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
#include "mxdssound.h" #include "mxdssound.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxpresenter.h" #include "mxpresenter.h"
#include "mxstreamer.h" #include "mxstreamer.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"

View File

@ -2,6 +2,7 @@
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxnotificationparam.h"
DECOMP_SIZE_ASSERT(BuildingEntity, 0x68) DECOMP_SIZE_ASSERT(BuildingEntity, 0x68)

View File

@ -9,8 +9,8 @@ LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType)
{ {
this->m_className = p_classType; this->m_className = p_classType;
this->m_unk0x4c = 0; this->m_unk0x4c = 0;
this->m_unk0x4d = 0; this->m_unk0x4d = FALSE;
this->m_unk0x4e = 0; this->m_unk0x4e = FALSE;
this->m_placedPartCount = 0; this->m_placedPartCount = 0;
} }

View File

@ -2,13 +2,15 @@
#include "define.h" #include "define.h"
#include "extra.h" #include "extra.h"
#include "legoomni.h" #include "legomain.h"
#include "legoutils.h" #include "legoutils.h"
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
#include "mxdssubscriber.h"
#include "mxmediapresenter.h" #include "mxmediapresenter.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxstreamchunk.h" #include "mxstreamchunk.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
#include "mxutilities.h"
DECOMP_SIZE_ASSERT(LegoActionControlPresenter, 0x68) DECOMP_SIZE_ASSERT(LegoActionControlPresenter, 0x68)

View File

@ -1,18 +1,23 @@
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "animstate.h"
#include "define.h" #include "define.h"
#include "islepathactor.h" #include "islepathactor.h"
#include "legocharactermanager.h" #include "legocharactermanager.h"
#include "legoendanimnotificationparam.h"
#include "legoextraactor.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoomni.h" #include "legomain.h"
#include "legoroilist.h" #include "legoroilist.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxutilities.h" #include "mxutilities.h"
#include "roi/legoroi.h"
#include <io.h> #include <io.h>
@ -22,6 +27,9 @@ DECOMP_SIZE_ASSERT(Vehicle, 0x08)
DECOMP_SIZE_ASSERT(Unknown0x3c, 0x18) DECOMP_SIZE_ASSERT(Unknown0x3c, 0x18)
DECOMP_SIZE_ASSERT(LegoTranInfo, 0x78) DECOMP_SIZE_ASSERT(LegoTranInfo, 0x78)
// GLOBAL: LEGO1 0x100d8b28
MxU8 g_unk0x100d8b28[] = {0, 1, 2, 4, 8, 16};
// GLOBAL: LEGO1 0x100f6d20 // GLOBAL: LEGO1 0x100f6d20
Vehicle g_vehicles[] = { Vehicle g_vehicles[] = {
{"bikebd", 0, FALSE}, {"bikebd", 0, FALSE},
@ -84,9 +92,18 @@ Character g_characters[47] = {
{"jk", FALSE, -1, 0, FALSE, FALSE, TRUE, 1500, 20000, FALSE, 0, 0} {"jk", FALSE, -1, 0, FALSE, FALSE, TRUE, 1500, 20000, FALSE, 0, 0}
}; };
// GLOBAL: LEGO1 0x100f74b0
float g_unk0x100f74b0 = 10.0f;
// GLOBAL: LEGO1 0x100f74ec
float g_unk0x100f74ec = -1.0f;
// GLOBAL: LEGO1 0x100f74f8 // GLOBAL: LEGO1 0x100f74f8
MxS32 g_legoAnimationManagerConfig = 1; MxS32 g_legoAnimationManagerConfig = 1;
// GLOBAL: LEGO1 0x100f7500
float g_unk0x100f7500 = 0.1f;
// FUNCTION: LEGO1 0x1005eb50 // FUNCTION: LEGO1 0x1005eb50
void LegoAnimationManager::configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig) void LegoAnimationManager::configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig)
{ {
@ -152,14 +169,14 @@ LegoAnimationManager::~LegoAnimationManager()
// FUNCTION: BETA10 0x1003fbc0 // FUNCTION: BETA10 0x1003fbc0
void LegoAnimationManager::Reset(MxBool p_und) void LegoAnimationManager::Reset(MxBool p_und)
{ {
m_unk0x402 = 0; m_unk0x402 = FALSE;
if (p_und && m_animState != NULL) { if (p_und && m_animState != NULL) {
m_animState->SetFlag(); m_animState->SetFlag();
} }
undefined unk0x42b = m_unk0x42b; MxBool suspended = m_suspended;
FUN_1005ef10(); Suspend();
if (m_tranInfoList != NULL) { if (m_tranInfoList != NULL) {
delete m_tranInfoList; delete m_tranInfoList;
@ -172,34 +189,105 @@ void LegoAnimationManager::Reset(MxBool p_und)
DeleteAnimations(); DeleteAnimations();
Init(); Init();
m_unk0x42b = unk0x42b; m_suspended = suspended;
m_unk0x428 = m_unk0x3a; m_unk0x428 = m_unk0x3a;
m_unk0x429 = m_unk0x400; m_unk0x429 = m_unk0x400;
m_unk0x42a = m_unk0x402; m_unk0x42a = m_unk0x402;
} }
// STUB: LEGO1 0x1005ef10 // FUNCTION: LEGO1 0x1005ef10
void LegoAnimationManager::FUN_1005ef10() // FUNCTION: BETA10 0x1003fc7a
void LegoAnimationManager::Suspend()
{ {
// TODO m_animState = (AnimState*) GameState()->GetState("AnimState");
if (m_animState == NULL) {
m_animState = (AnimState*) GameState()->CreateState("AnimState");
}
if (m_scriptIndex == 0) {
m_animState->FUN_10065240(m_animCount, m_anims, m_unk0x3fc);
}
if (!m_suspended) {
m_suspended = TRUE;
m_unk0x428 = m_unk0x3a;
m_unk0x429 = m_unk0x400;
m_unk0x42a = m_unk0x402;
m_unk0x402 = FALSE;
FUN_10061010(0);
MxS32 i;
for (i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
LegoROI* roi = m_unk0x3c[i].m_roi;
if (roi != NULL) {
LegoPathActor* actor = CharacterManager()->GetActor(roi->GetName());
if (actor != NULL && actor->GetController() != NULL) {
actor->GetController()->FUN_10046770(actor);
actor->ClearController();
}
CharacterManager()->FUN_10083db0(roi);
}
if (m_unk0x3c[i].m_unk0x14) {
m_unk0x3c[i].m_unk0x14 = FALSE;
MxS32 vehicleId = g_characters[m_unk0x3c[i].m_characterId].m_vehicleId;
if (vehicleId >= 0) {
g_vehicles[vehicleId].m_unk0x05 = FALSE;
LegoROI* roi = Lego()->FindROI(g_vehicles[vehicleId].m_name);
if (roi != NULL) {
roi->SetVisibility(FALSE);
}
}
}
m_unk0x3c[i].m_roi = NULL;
m_unk0x3c[i].m_characterId = -1;
m_unk0x3c[i].m_unk0x10 = -1.0f;
}
m_unk0x18 = 0;
m_unk0x1a = FALSE;
m_unk0x3a = FALSE;
m_unk0x400 = FALSE;
m_unk0x414 = 0;
m_unk0x401 = FALSE;
for (i = 0; i < (MxS32) _countof(g_characters); i++) {
g_characters[i].m_unk0x04 = FALSE;
}
}
} }
// STUB: LEGO1 0x1005f0b0 // FUNCTION: LEGO1 0x1005f0b0
void LegoAnimationManager::FUN_1005f0b0() // FUNCTION: BETA10 0x1003fefe
void LegoAnimationManager::Resume()
{ {
// TODO if (m_suspended) {
m_unk0x408 = m_unk0x40c = m_unk0x404 = Timer()->GetTime();
m_unk0x410 = 5000;
m_unk0x3a = m_unk0x428;
m_unk0x400 = m_unk0x429;
m_unk0x402 = m_unk0x42a;
m_suspended = FALSE;
}
} }
// FUNCTION: LEGO1 0x1005f130 // FUNCTION: LEGO1 0x1005f130
// FUNCTION: BETA10 0x1003ffb7 // FUNCTION: BETA10 0x1003ffb7
void LegoAnimationManager::Init() void LegoAnimationManager::Init()
{ {
m_unk0x402 = 0; m_unk0x402 = FALSE;
m_scriptIndex = -1; m_scriptIndex = -1;
m_animCount = 0; m_animCount = 0;
m_anims = NULL; m_anims = NULL;
m_unk0x18 = 0; m_unk0x18 = 0;
m_unk0x1a = 0; m_unk0x1a = FALSE;
m_tranInfoList = NULL; m_tranInfoList = NULL;
m_tranInfoList2 = NULL; m_tranInfoList2 = NULL;
m_unk0x41c = g_legoAnimationManagerConfig <= 1 ? 10 : 20; m_unk0x41c = g_legoAnimationManagerConfig <= 1 ? 10 : 20;
@ -212,24 +300,24 @@ void LegoAnimationManager::Init()
for (i = 0; i < (MxS32) _countof(m_unk0x3c); i++) { for (i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
m_unk0x3c[i].m_roi = NULL; m_unk0x3c[i].m_roi = NULL;
m_unk0x3c[i].m_id = -1; m_unk0x3c[i].m_characterId = -1;
m_unk0x3c[i].m_unk0x10 = -1.0f; m_unk0x3c[i].m_unk0x10 = -1.0f;
m_unk0x3c[i].m_unk0x14 = 0; m_unk0x3c[i].m_unk0x14 = FALSE;
} }
m_unk0x38 = FALSE; m_unk0x38 = FALSE;
m_unk0x39 = FALSE; m_unk0x39 = FALSE;
m_unk0x3a = 1; m_unk0x3a = TRUE;
m_unk0x3fc = 0; m_unk0x3fc = 0;
m_unk0x400 = 0; m_unk0x400 = FALSE;
m_unk0x414 = 0; m_unk0x414 = 0;
m_unk0x418 = 5; m_numAllowedExtras = 5;
m_unk0x0e = 0; m_unk0x0e = 0;
m_unk0x10 = 0; m_unk0x10 = 0;
m_unk0x401 = 0; m_unk0x401 = FALSE;
m_unk0x42b = 0; m_suspended = FALSE;
m_unk0x430 = 0; m_unk0x430 = FALSE;
m_unk0x42c = 0; m_unk0x42c = NULL;
m_unk0x408 = m_unk0x40c = m_unk0x404 = Timer()->GetTime(); m_unk0x408 = m_unk0x40c = m_unk0x404 = Timer()->GetTime();
m_unk0x410 = 5000; m_unk0x410 = 5000;
@ -251,16 +339,32 @@ void LegoAnimationManager::Init()
m_unk0x424 = new LegoROIList(); m_unk0x424 = new LegoROIList();
} }
// STUB: LEGO1 0x1005f6d0 // FUNCTION: LEGO1 0x1005f6d0
void LegoAnimationManager::FUN_1005f6d0(MxBool) // FUNCTION: BETA10 0x100401e7
void LegoAnimationManager::FUN_1005f6d0(MxBool p_unk0x400)
{ {
// TODO if (m_suspended) {
m_unk0x429 = p_unk0x400;
}
else {
m_unk0x400 = p_unk0x400;
if (!p_unk0x400) {
FUN_100627d0(TRUE);
}
}
} }
// STUB: LEGO1 0x1005f700 // FUNCTION: LEGO1 0x1005f700
void LegoAnimationManager::FUN_1005f700(MxBool) // FUNCTION: BETA10 0x1004024c
void LegoAnimationManager::FUN_1005f700(MxBool p_unk0x3a)
{ {
// TODO if (m_suspended) {
m_unk0x428 = p_unk0x3a;
}
else {
m_unk0x3a = p_unk0x3a;
}
} }
// FUNCTION: LEGO1 0x1005f720 // FUNCTION: LEGO1 0x1005f720
@ -287,8 +391,8 @@ MxResult LegoAnimationManager::LoadScriptInfo(MxS32 p_scriptIndex)
m_unk0x38 = FALSE; m_unk0x38 = FALSE;
m_unk0x39 = FALSE; m_unk0x39 = FALSE;
m_unk0x430 = 0; m_unk0x430 = FALSE;
m_unk0x42c = 0; m_unk0x42c = NULL;
for (j = 0; j < (MxS32) _countof(g_characters); j++) { for (j = 0; j < (MxS32) _countof(g_characters); j++) {
g_characters[j].m_active = FALSE; g_characters[j].m_active = FALSE;
@ -364,7 +468,7 @@ MxResult LegoAnimationManager::LoadScriptInfo(MxS32 p_scriptIndex)
} }
m_anims[j].m_unk0x28 = GetCharacterIndex(m_anims[j].m_animName + strlen(m_anims[j].m_animName) - 2); m_anims[j].m_unk0x28 = GetCharacterIndex(m_anims[j].m_animName + strlen(m_anims[j].m_animName) - 2);
m_anims[j].m_unk0x29 = 0; m_anims[j].m_unk0x29 = FALSE;
for (k = 0; k < 3; k++) { for (k = 0; k < 3; k++) {
m_anims[j].m_unk0x2a[k] = -1; m_anims[j].m_unk0x2a[k] = -1;
@ -400,15 +504,15 @@ MxResult LegoAnimationManager::LoadScriptInfo(MxS32 p_scriptIndex)
FUN_100617c0(-1, m_unk0x0e, m_unk0x10); FUN_100617c0(-1, m_unk0x0e, m_unk0x10);
result = SUCCESS; result = SUCCESS;
m_unk0x402 = 1; m_unk0x402 = TRUE;
if (m_unk0x42b) { if (m_suspended) {
m_unk0x428 = m_unk0x3a; m_unk0x428 = m_unk0x3a;
m_unk0x429 = m_unk0x400; m_unk0x429 = m_unk0x400;
m_unk0x42a = 1; m_unk0x42a = TRUE;
m_unk0x3a = 0; m_unk0x3a = FALSE;
m_unk0x400 = 0; m_unk0x400 = FALSE;
m_unk0x402 = 0; m_unk0x402 = FALSE;
} }
if (p_scriptIndex == 0) { if (p_scriptIndex == 0) {
@ -541,7 +645,7 @@ MxResult LegoAnimationManager::ReadModelInfo(LegoFile* p_file, ModelInfo* p_info
// FUNCTION: LEGO1 0x100603c0 // FUNCTION: LEGO1 0x100603c0
void LegoAnimationManager::DeleteAnimations() void LegoAnimationManager::DeleteAnimations()
{ {
undefined unk0x42b = m_unk0x42b; MxBool suspended = m_suspended;
if (m_anims != NULL) { if (m_anims != NULL) {
for (MxS32 i = 0; i < m_animCount; i++) { for (MxS32 i = 0; i < m_animCount; i++) {
@ -560,7 +664,7 @@ void LegoAnimationManager::DeleteAnimations()
} }
Init(); Init();
m_unk0x42b = unk0x42b; m_suspended = suspended;
} }
// STUB: LEGO1 0x10060570 // STUB: LEGO1 0x10060570
@ -569,22 +673,100 @@ void LegoAnimationManager::FUN_10060570(MxBool)
// TODO // TODO
} }
// STUB: LEGO1 0x100605e0 // FUNCTION: LEGO1 0x100605e0
// FUNCTION: BETA10 0x1004152b // FUNCTION: BETA10 0x1004152b
MxResult LegoAnimationManager::FUN_100605e0( MxResult LegoAnimationManager::FUN_100605e0(
MxU32 p_index, MxU32 p_index,
MxU8 p_unk0x0a, MxBool p_unk0x0a,
MxMatrix* p_matrix, MxMatrix* p_matrix,
undefined, MxBool p_bool1,
undefined4, LegoROI* p_roi,
undefined, MxBool p_bool2,
MxBool, MxBool p_bool3,
MxBool, MxBool p_bool4,
undefined MxBool p_bool5
) )
{ {
// TODO MxResult result = FAILURE;
return FAILURE;
if (m_scriptIndex != -1 && p_index < m_animCount && m_tranInfoList != NULL) {
FUN_100627d0(FALSE);
FUN_10062770();
MxDSAction action;
AnimInfo& animInfo = m_anims[p_index];
if (!p_bool1) {
if (m_unk0x39 || !animInfo.m_unk0x29) {
return FAILURE;
}
if (FUN_100623a0(animInfo)) {
return FAILURE;
}
if (FUN_10062710(animInfo)) {
return FAILURE;
}
}
FUN_10062580(animInfo);
LegoTranInfo* tranInfo = new LegoTranInfo();
tranInfo->m_animInfo = &animInfo;
tranInfo->m_index = ++m_unk0x1c;
tranInfo->m_unk0x10 = 0;
tranInfo->m_unk0x08 = p_roi;
tranInfo->m_unk0x12 = m_anims[p_index].m_unk0x08;
tranInfo->m_unk0x14 = p_unk0x0a;
tranInfo->m_objectId = animInfo.m_objectId;
tranInfo->m_unk0x15 = p_bool2;
if (p_matrix != NULL) {
tranInfo->m_unk0x0c = new MxMatrix(*p_matrix);
}
tranInfo->m_unk0x1c = m_unk0x28;
tranInfo->m_unk0x20 = m_unk0x30;
tranInfo->m_unk0x28 = p_bool3;
tranInfo->m_unk0x29 = p_bool4;
if (m_tranInfoList != NULL) {
m_tranInfoList->Append(tranInfo);
}
char buf[256];
sprintf(buf, "%s:%d", g_strANIMMAN_ID, tranInfo->m_index);
action.SetAtomId(*Lego()->GetScriptAtom(m_scriptIndex));
action.SetObjectId(animInfo.m_objectId);
action.SetUnknown24(-1);
action.AppendExtra(strlen(buf) + 1, buf);
if (StartActionIfUnknown0x13c(action) == SUCCESS) {
BackgroundAudioManager()->LowerVolume();
tranInfo->m_flags |= LegoTranInfo::c_bit2;
animInfo.m_unk0x22++;
m_unk0x404 = Timer()->GetTime();
if (p_bool5) {
FUN_100648f0(tranInfo, m_unk0x404);
}
else if (p_unk0x0a) {
IslePathActor* actor = CurrentActor();
if (actor != NULL) {
actor->SetState(4);
actor->SetWorldSpeed(0.0f);
}
}
m_unk0x39 = TRUE;
result = SUCCESS;
}
}
return result;
} }
// FUNCTION: LEGO1 0x100609f0 // FUNCTION: LEGO1 0x100609f0
@ -597,12 +779,12 @@ MxResult LegoAnimationManager::FUN_100609f0(MxU32 p_objectId, MxMatrix* p_matrix
FUN_100627d0(FALSE); FUN_100627d0(FALSE);
LegoTranInfo* info = new LegoTranInfo(); LegoTranInfo* info = new LegoTranInfo();
info->m_unk0x00 = 0; info->m_animInfo = NULL;
info->m_index = ++m_unk0x1c; info->m_index = ++m_unk0x1c;
info->m_unk0x10 = 0; info->m_unk0x10 = 0;
info->m_unk0x08 = NULL; info->m_unk0x08 = NULL;
info->m_unk0x12 = -1; info->m_unk0x12 = -1;
info->m_unk0x14 = 0; info->m_unk0x14 = FALSE;
info->m_objectId = p_objectId; info->m_objectId = p_objectId;
if (p_matrix != NULL) { if (p_matrix != NULL) {
@ -657,7 +839,7 @@ MxResult LegoAnimationManager::StartEntityAction(MxDSAction& p_dsAction, LegoEnt
for (MxS32 i = 0; i < (MxS32) _countof(m_unk0x3c); i++) { for (MxS32 i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
if (m_unk0x3c[i].m_roi == roi) { if (m_unk0x3c[i].m_roi == roi) {
MxU32 characterId = m_unk0x3c[i].m_id; MxS32 characterId = m_unk0x3c[i].m_characterId;
g_characters[characterId].m_unk0x07 = TRUE; g_characters[characterId].m_unk0x07 = TRUE;
MxS32 vehicleId = g_characters[characterId].m_vehicleId; MxS32 vehicleId = g_characters[characterId].m_vehicleId;
@ -671,7 +853,7 @@ MxResult LegoAnimationManager::StartEntityAction(MxDSAction& p_dsAction, LegoEnt
} }
} }
if (StartActionIfUnknown0x13c(p_dsAction) == SUCCESS) { if (LegoOmni::GetInstance()->StartActionIfUnknown0x13c(p_dsAction) == SUCCESS) {
result = SUCCESS; result = SUCCESS;
} }
@ -683,13 +865,13 @@ MxResult LegoAnimationManager::StartEntityAction(MxDSAction& p_dsAction, LegoEnt
MxResult LegoAnimationManager::FUN_10060dc0( MxResult LegoAnimationManager::FUN_10060dc0(
IsleScript::Script p_objectId, IsleScript::Script p_objectId,
MxMatrix* p_matrix, MxMatrix* p_matrix,
undefined p_param3, MxBool p_param3,
undefined p_param4, MxBool p_param4,
undefined4 p_param5, LegoROI* p_roi,
undefined p_param6, MxBool p_param6,
MxBool p_param7, MxBool p_param7,
MxBool p_param8, MxBool p_param8,
undefined p_param9 MxBool p_param9
) )
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
@ -702,21 +884,21 @@ MxResult LegoAnimationManager::FUN_10060dc0(
for (MxS32 i = 0; i < m_animCount; i++) { for (MxS32 i = 0; i < m_animCount; i++) {
if (m_anims[i].m_objectId == p_objectId) { if (m_anims[i].m_objectId == p_objectId) {
found = TRUE; found = TRUE;
undefined unk0x0a; MxBool unk0x0a;
switch (p_param4) { switch (p_param4) {
case 0: case FALSE:
unk0x0a = m_anims[i].m_unk0x0a; unk0x0a = m_anims[i].m_unk0x0a;
break; break;
case 1: case TRUE:
unk0x0a = 1; unk0x0a = TRUE;
break; break;
default: default:
unk0x0a = 0; unk0x0a = FALSE;
break; break;
} }
result = FUN_100605e0(i, unk0x0a, p_matrix, p_param3, p_param5, p_param6, p_param7, p_param8, p_param9); result = FUN_100605e0(i, unk0x0a, p_matrix, p_param3, p_roi, p_param6, p_param7, p_param8, p_param9);
break; break;
} }
} }
@ -734,6 +916,12 @@ void LegoAnimationManager::FUN_10061010(undefined4)
// TODO // TODO
} }
// STUB: LEGO1 0x10061530
void LegoAnimationManager::FUN_10061530()
{
// TODO
}
// STUB: LEGO1 0x100617c0 // STUB: LEGO1 0x100617c0
void LegoAnimationManager::FUN_100617c0(MxS32, MxU16&, MxU16&) void LegoAnimationManager::FUN_100617c0(MxS32, MxU16&, MxU16&)
{ {
@ -758,20 +946,213 @@ LegoTranInfo* LegoAnimationManager::GetTranInfo(MxU32 p_index)
return NULL; return NULL;
} }
// STUB: LEGO1 0x100619f0 // FUNCTION: LEGO1 0x100619f0
// FUNCTION: BETA10 0x100426b1
MxLong LegoAnimationManager::Notify(MxParam& p_param) MxLong LegoAnimationManager::Notify(MxParam& p_param)
{ {
// TODO if (((MxNotificationParam&) p_param).GetSender() == this) {
if (((MxNotificationParam&) p_param).GetType() == c_notificationEndAnim) {
FUN_100605e0(m_unk0x18, TRUE, NULL, TRUE, NULL, FALSE, TRUE, TRUE, TRUE);
}
}
else if (((MxNotificationParam&) p_param).GetType() == c_notificationEndAnim && m_tranInfoList != NULL) {
LegoTranInfoListCursor cursor(m_tranInfoList);
LegoTranInfo* tranInfo;
MxU32 index = ((LegoEndAnimNotificationParam&) p_param).GetIndex();
MxBool found = FALSE;
while (cursor.Next(tranInfo)) {
if (tranInfo->m_index == index) {
if (m_unk0x430 && m_unk0x42c == tranInfo) {
FUN_10064b50(-1);
}
if (tranInfo->m_flags & LegoTranInfo::c_bit2) {
BackgroundAudioManager()->RaiseVolume();
}
m_unk0x39 = FALSE;
m_unk0x404 = Timer()->GetTime();
found = TRUE;
cursor.Detach();
delete tranInfo;
for (MxS32 i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
LegoROI* roi = m_unk0x3c[i].m_roi;
if (roi != NULL) {
LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName());
if (actor != NULL) {
actor->Restart();
}
}
}
break;
}
}
if (m_unk0x1a && found) {
m_unk0x18++;
if (m_animCount <= m_unk0x18) {
m_unk0x1a = FALSE;
}
else {
LegoEndAnimNotificationParam param(c_notificationEndAnim, this, 0);
NotificationManager()->Send(this, param);
}
}
}
return 0; return 0;
} }
// STUB: LEGO1 0x10061cc0 // FUNCTION: LEGO1 0x10061cc0
// FUNCTION: BETA10 0x1004293c
MxResult LegoAnimationManager::Tickle() MxResult LegoAnimationManager::Tickle()
{ {
// TODO FUN_10061530();
if (!m_unk0x402) {
return SUCCESS;
}
IslePathActor* actor = CurrentActor();
LegoROI* roi;
if (actor == NULL || (roi = actor->GetROI()) == NULL) {
return SUCCESS;
}
if (m_unk0x401) {
for (MxS32 i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
LegoROI* roi = m_unk0x3c[i].m_roi;
if (roi != NULL && m_unk0x3c[i].m_unk0x0d) {
LegoPathActor* actor = CharacterManager()->GetActor(roi->GetName());
if (actor != NULL && actor->GetController() != NULL) {
actor->GetController()->FUN_10046770(actor);
actor->ClearController();
}
CharacterManager()->FUN_10083db0(roi);
if (m_unk0x3c[i].m_unk0x14) {
m_unk0x3c[i].m_unk0x14 = FALSE;
MxS32 vehicleId = g_characters[m_unk0x3c[i].m_characterId].m_vehicleId;
if (vehicleId >= 0) {
g_vehicles[vehicleId].m_unk0x05 = FALSE;
LegoROI* roi = Lego()->FindROI(g_vehicles[vehicleId].m_name);
if (roi != NULL) {
roi->SetVisibility(FALSE);
}
}
}
m_unk0x3c[i].m_roi = NULL;
g_characters[m_unk0x3c[i].m_characterId].m_unk0x04 = FALSE;
g_characters[m_unk0x3c[i].m_characterId].m_unk0x07 = FALSE;
m_unk0x3c[i].m_characterId = -1;
m_unk0x3c[i].m_unk0x0d = FALSE;
m_unk0x414--;
}
}
m_unk0x401 = FALSE;
}
MxLong time = Timer()->GetTime();
float speed = actor->GetWorldSpeed();
FUN_10064b50(time);
if (!m_unk0x39 && time - m_unk0x404 > 10000 && speed < g_unk0x100f74b0 && speed > g_unk0x100f74ec) {
LegoPathBoundary* boundary = actor->GetBoundary();
Mx3DPointFloat position(roi->GetWorldPosition());
Mx3DPointFloat direction(roi->GetWorldDirection());
MxU8 und = 0;
MxU8 actorId = GameState()->GetActorId();
if (actorId <= 5) {
und = g_unk0x100d8b28[actorId];
}
for (MxS32 i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
LegoROI* roi = m_unk0x3c[i].m_roi;
if (roi != NULL) {
MxU16 result = FUN_10062110(roi, direction, position, boundary, speed, und, m_unk0x3c[i].m_unk0x14);
if (result) {
MxMatrix mat;
mat = roi->GetLocal2World();
if (FUN_100605e0(result & USHRT_MAX, FALSE, &mat, TRUE, roi, FALSE, TRUE, TRUE, TRUE) == SUCCESS) {
m_unk0x404 = time;
return SUCCESS;
}
}
}
}
}
if (time - m_unk0x40c > 1000) {
FUN_10063d10();
m_unk0x40c = time;
}
if (time - m_unk0x408 < m_unk0x410) {
return SUCCESS;
}
m_unk0x410 = (rand() * 10000 / SHRT_MAX) + 5000;
m_unk0x408 = time;
if (time - m_unk0x404 > 10000) {
FUN_100629b0(-1, FALSE);
}
double elapsedSeconds = VideoManager()->GetElapsedSeconds();
if (elapsedSeconds < 1.0 && elapsedSeconds > 0.01) {
g_unk0x100f7500 = (g_unk0x100f7500 * 2.0 + elapsedSeconds) / 3.0;
if (elapsedSeconds > 0.2 && m_numAllowedExtras > 2) {
m_numAllowedExtras--;
}
else if (g_unk0x100f7500 < 0.16 && m_numAllowedExtras < m_unk0x41c) {
m_numAllowedExtras++;
}
}
return SUCCESS; return SUCCESS;
} }
// STUB: LEGO1 0x10062110
// FUNCTION: BETA10 0x10042f41
MxU16 LegoAnimationManager::FUN_10062110(
LegoROI* p_roi,
Vector3& p_direction,
Vector3& p_position,
LegoPathBoundary* p_boundary,
float p_speed,
MxU8 p_und,
MxBool p_unk0x14
)
{
// TODO
return 0;
}
// FUNCTION: LEGO1 0x10062360 // FUNCTION: LEGO1 0x10062360
// FUNCTION: BETA10 0x100432dd // FUNCTION: BETA10 0x100432dd
MxS8 LegoAnimationManager::GetCharacterIndex(const char* p_name) MxS8 LegoAnimationManager::GetCharacterIndex(const char* p_name)
@ -787,6 +1168,29 @@ MxS8 LegoAnimationManager::GetCharacterIndex(const char* p_name)
return -1; return -1;
} }
// STUB: LEGO1 0x100623a0
// FUNCTION: BETA10 0x10043342
MxBool LegoAnimationManager::FUN_100623a0(AnimInfo& p_info)
{
// TODO
return FALSE;
}
// STUB: LEGO1 0x10062580
// FUNCTION: BETA10 0x10043552
void LegoAnimationManager::FUN_10062580(AnimInfo& p_info)
{
// TODO
}
// STUB: LEGO1 0x10062710
// FUNCTION: BETA10 0x10043787
MxBool LegoAnimationManager::FUN_10062710(AnimInfo& p_info)
{
// TODO
return FALSE;
}
// FUNCTION: LEGO1 0x10062770 // FUNCTION: LEGO1 0x10062770
// FUNCTION: BETA10 0x1004381a // FUNCTION: BETA10 0x1004381a
void LegoAnimationManager::FUN_10062770() void LegoAnimationManager::FUN_10062770()
@ -811,6 +1215,7 @@ void LegoAnimationManager::FUN_100627d0(MxBool)
} }
// STUB: LEGO1 0x100629b0 // STUB: LEGO1 0x100629b0
// FUNCTION: BETA10 0x10043c10
void LegoAnimationManager::FUN_100629b0(MxU32, MxBool) void LegoAnimationManager::FUN_100629b0(MxU32, MxBool)
{ {
// TODO // TODO
@ -851,14 +1256,35 @@ void LegoAnimationManager::FUN_10063aa0()
} }
} }
// STUB: LEGO1 0x10063d10
// FUNCTION: BETA10 0x10045034
void LegoAnimationManager::FUN_10063d10()
{
// TODO
}
// STUB: LEGO1 0x10064670 // STUB: LEGO1 0x10064670
void LegoAnimationManager::FUN_10064670(MxBool) void LegoAnimationManager::FUN_10064670(Vector3*)
{ {
// TODO // TODO
} }
// STUB: LEGO1 0x10064740 // STUB: LEGO1 0x10064740
void LegoAnimationManager::FUN_10064740(MxBool) void LegoAnimationManager::FUN_10064740(Vector3*)
{
// TODO
}
// STUB: LEGO1 0x100648f0
// FUNCTION: BETA10 0x10045daf
void LegoAnimationManager::FUN_100648f0(LegoTranInfo*, MxLong)
{
// TODO
}
// STUB: LEGO1 0x10064b50
// FUNCTION: BETA10 0x10045f14
void LegoAnimationManager::FUN_10064b50(MxLong p_time)
{ {
// TODO // TODO
} }

View File

@ -1,10 +1,12 @@
#include "legoanimmmpresenter.h" #include "legoanimmmpresenter.h"
#include "3dmanager/lego3dmanager.h"
#include "decomp.h" #include "decomp.h"
#include "define.h" #include "define.h"
#include "islepathactor.h" #include "islepathactor.h"
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "legoanimpresenter.h" #include "legoanimpresenter.h"
#include "legoendanimnotificationparam.h"
#include "legotraninfo.h" #include "legotraninfo.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "legoworld.h" #include "legoworld.h"
@ -15,7 +17,6 @@
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxobjectfactory.h" #include "mxobjectfactory.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxtype18notificationparam.h"
#include "mxutilities.h" #include "mxutilities.h"
DECOMP_SIZE_ASSERT(LegoAnimMMPresenter, 0x74) DECOMP_SIZE_ASSERT(LegoAnimMMPresenter, 0x74)
@ -123,7 +124,7 @@ void LegoAnimMMPresenter::EndAction()
m_tranInfo = NULL; m_tranInfo = NULL;
MxType18NotificationParam param(c_notificationType18, NULL, m_animmanId); LegoEndAnimNotificationParam param(c_notificationEndAnim, NULL, m_animmanId);
if (m_animmanId != 0) { if (m_animmanId != 0) {
NotificationManager()->Send(AnimationManager(), param); NotificationManager()->Send(AnimationManager(), param);
} }

View File

@ -1,10 +1,13 @@
#include "legobackgroundcolor.h" #include "legobackgroundcolor.h"
#include "3dmanager/lego3dmanager.h"
#include "decomp.h" #include "decomp.h"
#include "legoutils.h" #include "legoutils.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "misc.h" #include "misc.h"
#include <stdio.h>
DECOMP_SIZE_ASSERT(LegoBackgroundColor, 0x30) DECOMP_SIZE_ASSERT(LegoBackgroundColor, 0x30)
// GLOBAL: LEGO1 0x100f3fb0 // GLOBAL: LEGO1 0x100f3fb0

View File

@ -1,15 +1,20 @@
#include "legocharactermanager.h" #include "legocharactermanager.h"
#include "3dmanager/lego3dmanager.h"
#include "legoanimactor.h" #include "legoanimactor.h"
#include "legocharacters.h" #include "legocharacters.h"
#include "legoextraactor.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legovariables.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "misc.h" #include "misc.h"
#include "misc/legocontainer.h" #include "misc/legocontainer.h"
#include "misc/legostorage.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxvariabletable.h"
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "roi/legolod.h" #include "roi/legolod.h"
#include "roi/legoroi.h" #include "viewmanager/viewmanager.h"
#include <vec.h> #include <vec.h>
@ -35,7 +40,7 @@ MxU32 g_unk0x100fc4ec = 2;
MxU32 g_unk0x100fc4f0 = 0; MxU32 g_unk0x100fc4f0 = 0;
// GLOBAL: LEGO1 0x10104f20 // GLOBAL: LEGO1 0x10104f20
LegoCharacterData g_characterData[66]; LegoCharacterInfo g_chracterInfo[66];
// FUNCTION: LEGO1 0x10082a20 // FUNCTION: LEGO1 0x10082a20
LegoCharacterManager::LegoCharacterManager() LegoCharacterManager::LegoCharacterManager()
@ -50,22 +55,22 @@ LegoCharacterManager::LegoCharacterManager()
// FUNCTION: LEGO1 0x10083270 // FUNCTION: LEGO1 0x10083270
void LegoCharacterManager::Init() void LegoCharacterManager::Init()
{ {
for (MxS32 i = 0; i < _countof(g_characterData); i++) { for (MxS32 i = 0; i < _countof(g_chracterInfo); i++) {
g_characterData[i] = g_characterDataInit[i]; g_chracterInfo[i] = g_characterInfoInit[i];
} }
} }
// FUNCTION: LEGO1 0x100832a0 // FUNCTION: LEGO1 0x100832a0
void LegoCharacterManager::FUN_100832a0() void LegoCharacterManager::FUN_100832a0()
{ {
for (MxS32 i = 0; i < _countof(g_characterData); i++) { for (MxS32 i = 0; i < _countof(g_chracterInfo); i++) {
LegoCharacterData* data = GetData(g_characterData[i].m_name); LegoCharacterInfo* info = GetInfo(g_chracterInfo[i].m_name);
if (data != NULL) { if (info != NULL) {
LegoExtraActor* actor = data->m_actor; LegoExtraActor* actor = info->m_actor;
if (actor != NULL && actor->IsA("LegoExtraActor")) { if (actor != NULL && actor->IsA("LegoExtraActor")) {
LegoROI* roi = g_characterData[i].m_roi; LegoROI* roi = g_chracterInfo[i].m_roi;
MxU32 refCount = GetRefCount(roi); MxU32 refCount = GetRefCount(roi);
while (refCount != 0) { while (refCount != 0) {
@ -82,37 +87,46 @@ MxResult LegoCharacterManager::Write(LegoStorage* p_storage)
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
for (MxS32 i = 0; i < _countof(g_characterData); i++) { for (MxS32 i = 0; i < _countof(g_chracterInfo); i++) {
LegoCharacterData* data = &g_characterData[i]; LegoCharacterInfo* info = &g_chracterInfo[i];
if (p_storage->Write(&data->m_unk0x0c, sizeof(data->m_unk0x0c)) != SUCCESS) { if (p_storage->Write(&info->m_unk0x0c, sizeof(info->m_unk0x0c)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_unk0x10, sizeof(data->m_unk0x10)) != SUCCESS) { if (p_storage->Write(&info->m_unk0x10, sizeof(info->m_unk0x10)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_unk0x14, sizeof(data->m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_unk0x14, sizeof(info->m_unk0x14)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[1].m_unk0x08, sizeof(data->m_parts[1].m_unk0x08)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[1].m_unk0x14, sizeof(data->m_parts[1].m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(info->m_parts[c_infohatPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[2].m_unk0x14, sizeof(data->m_parts[2].m_unk0x14)) != SUCCESS) { if (p_storage->Write(
&info->m_parts[c_infogronPart].m_unk0x14,
sizeof(info->m_parts[c_infogronPart].m_unk0x14)
) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[4].m_unk0x14, sizeof(data->m_parts[4].m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(info->m_parts[c_armlftPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[5].m_unk0x14, sizeof(data->m_parts[5].m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(info->m_parts[c_armrtPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[8].m_unk0x14, sizeof(data->m_parts[8].m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(info->m_parts[c_leglftPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&data->m_parts[9].m_unk0x14, sizeof(data->m_parts[9].m_unk0x14)) != SUCCESS) { if (p_storage->Write(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(info->m_parts[c_legrtPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
} }
@ -128,37 +142,46 @@ MxResult LegoCharacterManager::Read(LegoStorage* p_storage)
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
for (MxS32 i = 0; i < _countof(g_characterData); i++) { for (MxS32 i = 0; i < _countof(g_chracterInfo); i++) {
LegoCharacterData* data = &g_characterData[i]; LegoCharacterInfo* info = &g_chracterInfo[i];
if (p_storage->Read(&data->m_unk0x0c, sizeof(data->m_unk0x0c)) != SUCCESS) { if (p_storage->Read(&info->m_unk0x0c, sizeof(info->m_unk0x0c)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_unk0x10, sizeof(data->m_unk0x10)) != SUCCESS) { if (p_storage->Read(&info->m_unk0x10, sizeof(info->m_unk0x10)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_unk0x14, sizeof(data->m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_unk0x14, sizeof(info->m_unk0x14)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[1].m_unk0x08, sizeof(data->m_parts[1].m_unk0x08)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[1].m_unk0x14, sizeof(data->m_parts[1].m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(info->m_parts[c_infohatPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[2].m_unk0x14, sizeof(data->m_parts[2].m_unk0x14)) != SUCCESS) { if (p_storage->Read(
&info->m_parts[c_infogronPart].m_unk0x14,
sizeof(info->m_parts[c_infogronPart].m_unk0x14)
) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[4].m_unk0x14, sizeof(data->m_parts[4].m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(info->m_parts[c_armlftPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[5].m_unk0x14, sizeof(data->m_parts[5].m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(info->m_parts[c_armrtPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[8].m_unk0x14, sizeof(data->m_parts[8].m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(info->m_parts[c_leglftPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&data->m_parts[9].m_unk0x14, sizeof(data->m_parts[9].m_unk0x14)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(info->m_parts[c_legrtPart].m_unk0x14)) !=
SUCCESS) {
goto done; goto done;
} }
} }
@ -213,7 +236,7 @@ LegoROI* LegoCharacterManager::GetROI(const char* p_key, MxBool p_createEntity)
actor->SetROI(character->m_roi, FALSE, FALSE); actor->SetROI(character->m_roi, FALSE, FALSE);
actor->SetType(LegoEntity::e_character); actor->SetType(LegoEntity::e_character);
actor->SetFlag(LegoActor::c_bit2); actor->SetFlag(LegoActor::c_bit2);
GetData(p_key)->m_actor = actor; GetInfo(p_key)->m_actor = actor;
} }
return character->m_roi; return character->m_roi;
@ -250,7 +273,7 @@ void LegoCharacterManager::FUN_10083c30(const char* p_name)
character = (*it).second; character = (*it).second;
if (character->RemoveRef() == 0) { if (character->RemoveRef() == 0) {
LegoCharacterData* data = GetData(p_name); LegoCharacterInfo* info = GetInfo(p_name);
LegoEntity* entity = character->m_roi->GetEntity(); LegoEntity* entity = character->m_roi->GetEntity();
if (entity != NULL) { if (entity != NULL) {
@ -264,18 +287,18 @@ void LegoCharacterManager::FUN_10083c30(const char* p_name)
m_characters->erase(it); m_characters->erase(it);
if (data != NULL) { if (info != NULL) {
if (data->m_actor != NULL) { if (info->m_actor != NULL) {
data->m_actor->ClearFlag(LegoEntity::c_bit2); info->m_actor->ClearFlag(LegoEntity::c_bit2);
delete data->m_actor; delete info->m_actor;
} }
else if (entity != NULL && entity->GetFlagsIsSet(LegoEntity::c_bit2)) { else if (entity != NULL && entity->GetFlagsIsSet(LegoEntity::c_bit2)) {
entity->ClearFlag(LegoEntity::c_bit2); entity->ClearFlag(LegoEntity::c_bit2);
delete entity; delete entity;
} }
data->m_roi = NULL; info->m_roi = NULL;
data->m_actor = NULL; info->m_actor = NULL;
} }
} }
} }
@ -292,7 +315,7 @@ void LegoCharacterManager::FUN_10083db0(LegoROI* p_roi)
if (character->m_roi == p_roi) { if (character->m_roi == p_roi) {
if (character->RemoveRef() == 0) { if (character->RemoveRef() == 0) {
LegoCharacterData* data = GetData(character->m_roi->GetName()); LegoCharacterInfo* info = GetInfo(character->m_roi->GetName());
LegoEntity* entity = character->m_roi->GetEntity(); LegoEntity* entity = character->m_roi->GetEntity();
if (entity != NULL) { if (entity != NULL) {
@ -306,18 +329,18 @@ void LegoCharacterManager::FUN_10083db0(LegoROI* p_roi)
m_characters->erase(it); m_characters->erase(it);
if (data != NULL) { if (info != NULL) {
if (data->m_actor != NULL) { if (info->m_actor != NULL) {
data->m_actor->ClearFlag(LegoEntity::c_bit2); info->m_actor->ClearFlag(LegoEntity::c_bit2);
delete data->m_actor; delete info->m_actor;
} }
else if (entity != NULL && entity->GetFlagsIsSet(LegoEntity::c_bit2)) { else if (entity != NULL && entity->GetFlagsIsSet(LegoEntity::c_bit2)) {
entity->ClearFlag(LegoEntity::c_bit2); entity->ClearFlag(LegoEntity::c_bit2);
delete entity; delete entity;
} }
data->m_roi = NULL; info->m_roi = NULL;
data->m_actor = NULL; info->m_actor = NULL;
} }
} }
@ -381,39 +404,39 @@ LegoROI* LegoCharacterManager::CreateROI(const char* p_key)
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
ViewLODListManager* lodManager = GetViewLODListManager(); ViewLODListManager* lodManager = GetViewLODListManager();
LegoTextureContainer* textureContainer = TextureContainer(); LegoTextureContainer* textureContainer = TextureContainer();
LegoCharacterData* data = GetData(p_key); LegoCharacterInfo* info = GetInfo(p_key);
if (data == NULL) { if (info == NULL) {
goto done; goto done;
} }
if (!strcmpi(p_key, "pep")) { if (!strcmpi(p_key, "pep")) {
LegoCharacterData* pepper = GetData("pepper"); LegoCharacterInfo* pepper = GetInfo("pepper");
data->m_unk0x0c = pepper->m_unk0x0c; info->m_unk0x0c = pepper->m_unk0x0c;
data->m_unk0x10 = pepper->m_unk0x10; info->m_unk0x10 = pepper->m_unk0x10;
data->m_unk0x14 = pepper->m_unk0x14; info->m_unk0x14 = pepper->m_unk0x14;
for (i = 0; i < _countof(data->m_parts); i++) { for (i = 0; i < _countof(info->m_parts); i++) {
data->m_parts[i] = pepper->m_parts[i]; info->m_parts[i] = pepper->m_parts[i];
} }
} }
roi = new LegoROI(renderer); roi = new LegoROI(renderer);
roi->SetName(p_key); roi->SetName(p_key);
boundingSphere.Center()[0] = g_characterLODs[0].m_boundingSphere[0]; boundingSphere.Center()[0] = g_characterLODs[c_topLOD].m_boundingSphere[0];
boundingSphere.Center()[1] = g_characterLODs[0].m_boundingSphere[1]; boundingSphere.Center()[1] = g_characterLODs[c_topLOD].m_boundingSphere[1];
boundingSphere.Center()[2] = g_characterLODs[0].m_boundingSphere[2]; boundingSphere.Center()[2] = g_characterLODs[c_topLOD].m_boundingSphere[2];
boundingSphere.Radius() = g_characterLODs[0].m_boundingSphere[3]; boundingSphere.Radius() = g_characterLODs[c_topLOD].m_boundingSphere[3];
roi->SetBoundingSphere(boundingSphere); roi->SetBoundingSphere(boundingSphere);
boundingBox.Min()[0] = g_characterLODs[0].m_boundingBox[0]; boundingBox.Min()[0] = g_characterLODs[c_topLOD].m_boundingBox[0];
boundingBox.Min()[1] = g_characterLODs[0].m_boundingBox[1]; boundingBox.Min()[1] = g_characterLODs[c_topLOD].m_boundingBox[1];
boundingBox.Min()[2] = g_characterLODs[0].m_boundingBox[2]; boundingBox.Min()[2] = g_characterLODs[c_topLOD].m_boundingBox[2];
boundingBox.Max()[0] = g_characterLODs[0].m_boundingBox[3]; boundingBox.Max()[0] = g_characterLODs[c_topLOD].m_boundingBox[3];
boundingBox.Max()[1] = g_characterLODs[0].m_boundingBox[4]; boundingBox.Max()[1] = g_characterLODs[c_topLOD].m_boundingBox[4];
boundingBox.Max()[2] = g_characterLODs[0].m_boundingBox[5]; boundingBox.Max()[2] = g_characterLODs[c_topLOD].m_boundingBox[5];
roi->SetUnknown0x80(boundingBox); roi->SetUnknown0x80(boundingBox);
comp = new CompoundObject(); comp = new CompoundObject();
@ -421,7 +444,7 @@ LegoROI* LegoCharacterManager::CreateROI(const char* p_key)
for (i = 0; i < _countof(g_characterLODs) - 1; i++) { for (i = 0; i < _countof(g_characterLODs) - 1; i++) {
char lodName[256]; char lodName[256];
LegoCharacterData::Part& part = data->m_parts[i]; LegoCharacterInfo::Part& part = info->m_parts[i];
const char* parentName; const char* parentName;
if (i == 0 || i == 1) { if (i == 0 || i == 1) {
@ -495,14 +518,14 @@ LegoROI* LegoCharacterManager::CreateROI(const char* p_key)
} }
CalcLocalTransform( CalcLocalTransform(
Mx3DPointFloat(g_characterLODs[0].m_position), Mx3DPointFloat(g_characterLODs[c_topLOD].m_position),
Mx3DPointFloat(g_characterLODs[0].m_direction), Mx3DPointFloat(g_characterLODs[c_topLOD].m_direction),
Mx3DPointFloat(g_characterLODs[0].m_up), Mx3DPointFloat(g_characterLODs[c_topLOD].m_up),
mat mat
); );
roi->WrappedSetLocalTransform(mat); roi->WrappedSetLocalTransform(mat);
data->m_roi = roi; info->m_roi = roi;
success = TRUE; success = TRUE;
done: done:
@ -519,12 +542,12 @@ LegoROI* LegoCharacterManager::CreateROI(const char* p_key)
MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo) MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo)
{ {
LegoResult result = SUCCESS; LegoResult result = SUCCESS;
LegoROI* head = FindChildROI(p_roi, g_characterLODs[4].m_name); LegoROI* head = FindChildROI(p_roi, g_characterLODs[c_headLOD].m_name);
if (head != NULL) { if (head != NULL) {
char lodName[256]; char lodName[256];
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_characterLODs[4].m_parentName); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_characterLODs[c_headLOD].m_parentName);
MxS32 lodSize = lodList->Size(); MxS32 lodSize = lodList->Size();
sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_unk0x100fc4e8++); sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_unk0x100fc4e8++);
ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize); ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize);
@ -532,8 +555,8 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
if (p_textureInfo == NULL) { if (p_textureInfo == NULL) {
LegoCharacterData* info = GetData(p_roi->GetName()); LegoCharacterInfo* info = GetInfo(p_roi->GetName());
LegoCharacterData::Part& part = info->m_parts[3]; LegoCharacterInfo::Part& part = info->m_parts[c_headPart];
p_textureInfo = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); p_textureInfo = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]);
} }
@ -565,8 +588,8 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
// FUNCTION: LEGO1 0x10084c00 // FUNCTION: LEGO1 0x10084c00
MxBool LegoCharacterManager::Exists(const char* p_key) MxBool LegoCharacterManager::Exists(const char* p_key)
{ {
for (MxU32 i = 0; i < _countof(g_characterData); i++) { for (MxU32 i = 0; i < _countof(g_chracterInfo); i++) {
if (!strcmpi(g_characterData[i].m_name, p_key)) { if (!strcmpi(g_chracterInfo[i].m_name, p_key)) {
return TRUE; return TRUE;
} }
} }
@ -577,46 +600,46 @@ MxBool LegoCharacterManager::Exists(const char* p_key)
// FUNCTION: LEGO1 0x10084c40 // FUNCTION: LEGO1 0x10084c40
LegoExtraActor* LegoCharacterManager::GetActor(const char* p_key) LegoExtraActor* LegoCharacterManager::GetActor(const char* p_key)
{ {
LegoCharacterData* data = GetData(p_key); LegoCharacterInfo* info = GetInfo(p_key);
if (data != NULL) { if (info != NULL) {
return data->m_actor; return info->m_actor;
} }
return NULL; return NULL;
} }
// FUNCTION: LEGO1 0x10084c60 // FUNCTION: LEGO1 0x10084c60
LegoCharacterData* LegoCharacterManager::GetData(const char* p_key) LegoCharacterInfo* LegoCharacterManager::GetInfo(const char* p_key)
{ {
MxU32 i; MxU32 i;
for (i = 0; i < _countof(g_characterData); i++) { for (i = 0; i < _countof(g_chracterInfo); i++) {
if (!strcmpi(g_characterData[i].m_name, p_key)) { if (!strcmpi(g_chracterInfo[i].m_name, p_key)) {
break; break;
} }
} }
if (i < _countof(g_characterData)) { if (i < _countof(g_chracterInfo)) {
return &g_characterData[i]; return &g_chracterInfo[i];
} }
return NULL; return NULL;
} }
// FUNCTION: LEGO1 0x10084cb0 // FUNCTION: LEGO1 0x10084cb0
LegoCharacterData* LegoCharacterManager::GetData(LegoROI* p_roi) LegoCharacterInfo* LegoCharacterManager::GetInfo(LegoROI* p_roi)
{ {
MxU32 i; MxU32 i;
for (i = 0; i < _countof(g_characterData); i++) { for (i = 0; i < _countof(g_chracterInfo); i++) {
if (g_characterData[i].m_roi == p_roi) { if (g_chracterInfo[i].m_roi == p_roi) {
break; break;
} }
} }
if (i < _countof(g_characterData)) { if (i < _countof(g_chracterInfo)) {
return &g_characterData[i]; return &g_chracterInfo[i];
} }
return NULL; return NULL;
@ -646,13 +669,13 @@ LegoROI* LegoCharacterManager::FindChildROI(LegoROI* p_roi, const char* p_name)
// FUNCTION: LEGO1 0x10084ec0 // FUNCTION: LEGO1 0x10084ec0
MxBool LegoCharacterManager::SwitchHat(LegoROI* p_roi) MxBool LegoCharacterManager::SwitchHat(LegoROI* p_roi)
{ {
LegoCharacterData* data = GetData(p_roi->GetName()); LegoCharacterInfo* info = GetInfo(p_roi->GetName());
if (data == NULL) { if (info == NULL) {
return FALSE; return FALSE;
} }
LegoCharacterData::Part& part = data->m_parts[1]; LegoCharacterInfo::Part& part = info->m_parts[c_infohatPart];
part.m_unk0x08++; part.m_unk0x08++;
MxU8 unk0x00 = part.m_unk0x00[part.m_unk0x08]; MxU8 unk0x00 = part.m_unk0x00[part.m_unk0x08];
@ -662,7 +685,7 @@ MxBool LegoCharacterManager::SwitchHat(LegoROI* p_roi)
unk0x00 = part.m_unk0x00[part.m_unk0x08]; unk0x00 = part.m_unk0x00[part.m_unk0x08];
} }
LegoROI* childROI = FindChildROI(p_roi, g_characterLODs[2].m_name); LegoROI* childROI = FindChildROI(p_roi, g_characterLODs[c_infohatLOD].m_name);
if (childROI != NULL) { if (childROI != NULL) {
char lodName[256]; char lodName[256];
@ -700,14 +723,14 @@ MxBool LegoCharacterManager::SwitchHat(LegoROI* p_roi)
// FUNCTION: LEGO1 0x10085140 // FUNCTION: LEGO1 0x10085140
MxU32 LegoCharacterManager::FUN_10085140(LegoROI* p_roi, MxBool p_und) MxU32 LegoCharacterManager::FUN_10085140(LegoROI* p_roi, MxBool p_und)
{ {
LegoCharacterData* data = GetData(p_roi); LegoCharacterInfo* info = GetInfo(p_roi);
if (p_und) { if (p_und) {
return data->m_unk0x14 + g_unk0x100fc4dc; return info->m_unk0x14 + g_unk0x100fc4dc;
} }
if (data != NULL) { if (info != NULL) {
return data->m_unk0x0c + g_unk0x100fc4d8; return info->m_unk0x0c + g_unk0x100fc4d8;
} }
return 0; return 0;

View File

@ -1,7 +1,7 @@
#include "legocharacters.h" #include "legocharacters.h"
DECOMP_SIZE_ASSERT(LegoCharacterData, 0x108) DECOMP_SIZE_ASSERT(LegoCharacterInfo, 0x108)
DECOMP_SIZE_ASSERT(LegoCharacterData::Part, 0x18) DECOMP_SIZE_ASSERT(LegoCharacterInfo::Part, 0x18)
DECOMP_SIZE_ASSERT(LegoCharacterLOD, 0x58) DECOMP_SIZE_ASSERT(LegoCharacterLOD, 0x58)
// Unclear whether g_characterLODs[0] (top) is its own global, see: LegoCharacterManager::CreateROI // Unclear whether g_characterLODs[0] (top) is its own global, see: LegoCharacterManager::CreateROI
@ -172,7 +172,7 @@ const char* g_unk0x100f80a0[] =
{"lego white", "lego black", "lego yellow", "lego red", "lego blue", "lego brown", "lego lt grey", "lego green"}; {"lego white", "lego black", "lego yellow", "lego red", "lego blue", "lego brown", "lego lt grey", "lego green"};
// GLOBAL: LEGO1 0x100f80c0 // GLOBAL: LEGO1 0x100f80c0
LegoCharacterData g_characterDataInit[] = { LegoCharacterInfo g_characterInfoInit[] = {
{"pepper", {"pepper",
NULL, NULL,
NULL, NULL,

View File

@ -1,5 +1,6 @@
#include "legogamestate.h" #include "legogamestate.h"
#include "3dmanager/lego3dmanager.h"
#include "act1state.h" #include "act1state.h"
#include "act2main_actions.h" #include "act2main_actions.h"
#include "act3_actions.h" #include "act3_actions.h"
@ -28,10 +29,12 @@
#include "jukebox_actions.h" #include "jukebox_actions.h"
#include "jukeboxw_actions.h" #include "jukeboxw_actions.h"
#include "legoanimationmanager.h" #include "legoanimationmanager.h"
#include "legobackgroundcolor.h"
#include "legobuildingmanager.h" #include "legobuildingmanager.h"
#include "legocharactermanager.h" #include "legocharactermanager.h"
#include "legofullscreenmovie.h"
#include "legomain.h"
#include "legonavcontroller.h" #include "legonavcontroller.h"
#include "legoomni.h"
#include "legoplantmanager.h" #include "legoplantmanager.h"
#include "legostate.h" #include "legostate.h"
#include "legoutils.h" #include "legoutils.h"
@ -40,14 +43,18 @@
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxnotificationparam.h"
#include "mxobjectfactory.h" #include "mxobjectfactory.h"
#include "mxstring.h" #include "mxstring.h"
#include "mxutilities.h"
#include "mxvariabletable.h" #include "mxvariabletable.h"
#include "police_actions.h" #include "police_actions.h"
#include "racecar.h" #include "racecar.h"
#include "racecar_actions.h" #include "racecar_actions.h"
#include "regbook_actions.h" #include "regbook_actions.h"
#include "roi/legoroi.h" #include "roi/legoroi.h"
#include "scripts.h"
#include "sndanim_actions.h" #include "sndanim_actions.h"
#include <stdio.h> #include <stdio.h>
@ -791,7 +798,7 @@ void LegoGameState::SwitchArea(Area p_area)
FUN_10015820(TRUE, LegoOmni::c_disableInput | LegoOmni::c_disable3d); FUN_10015820(TRUE, LegoOmni::c_disableInput | LegoOmni::c_disable3d);
BackgroundAudioManager()->Stop(); BackgroundAudioManager()->Stop();
AnimationManager()->FUN_1005ef10(); AnimationManager()->Suspend();
VideoManager()->SetUnk0x554(FALSE); VideoManager()->SetUnk0x554(FALSE);
switch (p_area) { switch (p_area) {
@ -896,10 +903,14 @@ void LegoGameState::SwitchArea(Area p_area)
else { else {
SetCameraControllerFromIsle(); SetCameraControllerFromIsle();
CurrentActor()->ResetWorldTransform(TRUE); CurrentActor()->ResetWorldTransform(TRUE);
AnimationManager()->FUN_1005f0b0(); AnimationManager()->Resume();
} }
CurrentActor()->VTable0xe8(p_area, TRUE, 7); CurrentActor()->SpawnPlayer(
p_area,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
break; break;
} }
case e_hospital: case e_hospital:
@ -910,8 +921,12 @@ void LegoGameState::SwitchArea(Area p_area)
LoadIsle(); LoadIsle();
SetCameraControllerFromIsle(); SetCameraControllerFromIsle();
CurrentActor()->ResetWorldTransform(TRUE); CurrentActor()->ResetWorldTransform(TRUE);
AnimationManager()->FUN_1005f0b0(); AnimationManager()->Resume();
CurrentActor()->VTable0xe8(p_area, TRUE, 7); CurrentActor()->SpawnPlayer(
p_area,
TRUE,
IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3
);
break; break;
case e_police: case e_police:
VideoManager()->SetUnk0x554(TRUE); VideoManager()->SetUnk0x554(TRUE);
@ -1083,28 +1098,28 @@ void LegoGameState::Init()
if (m_loadedAct == e_act1) { if (m_loadedAct == e_act1) {
Isle* isle = (Isle*) FindWorld(*g_isleScript, 0); Isle* isle = (Isle*) FindWorld(*g_isleScript, 0);
Helicopter* copter = (Helicopter*) isle->Find(*g_copterScript, 1); Helicopter* copter = (Helicopter*) isle->Find(*g_copterScript, CopterScript::c_Helicopter_Actor);
if (copter) { if (copter) {
isle->FUN_1001fc80(copter); isle->FUN_1001fc80(copter);
isle->VTable0x6c(copter); isle->VTable0x6c(copter);
delete copter; delete copter;
} }
DuneBuggy* dunebuggy = (DuneBuggy*) isle->Find(*g_dunecarScript, 2); DuneBuggy* dunebuggy = (DuneBuggy*) isle->Find(*g_dunecarScript, DunecarScript::c_DuneBugy_Actor);
if (dunebuggy) { if (dunebuggy) {
isle->FUN_1001fc80(dunebuggy); isle->FUN_1001fc80(dunebuggy);
isle->VTable0x6c(dunebuggy); isle->VTable0x6c(dunebuggy);
delete dunebuggy; delete dunebuggy;
} }
Jetski* jetski = (Jetski*) isle->Find(*g_jetskiScript, 3); Jetski* jetski = (Jetski*) isle->Find(*g_jetskiScript, JetskiScript::c_Jetski_Actor);
if (jetski) { if (jetski) {
isle->FUN_1001fc80(jetski); isle->FUN_1001fc80(jetski);
isle->VTable0x6c(jetski); isle->VTable0x6c(jetski);
delete jetski; delete jetski;
} }
RaceCar* racecar = (RaceCar*) isle->Find(*g_racecarScript, 4); RaceCar* racecar = (RaceCar*) isle->Find(*g_racecarScript, RacecarScript::c_RaceCar_Actor);
if (racecar) { if (racecar) {
isle->FUN_1001fc80(racecar); isle->FUN_1001fc80(racecar);
isle->VTable0x6c(racecar); isle->VTable0x6c(racecar);

View File

@ -4,6 +4,7 @@
#include "misc.h" #include "misc.h"
#include "misc/legoimage.h" #include "misc/legoimage.h"
#include "misc/legotexture.h" #include "misc/legotexture.h"
#include "mxdirectx/mxdirect3d.h"
#include "tgl/d3drm/impl.h" #include "tgl/d3drm/impl.h"
DECOMP_SIZE_ASSERT(LegoTextureInfo, 0x10) DECOMP_SIZE_ASSERT(LegoTextureInfo, 0x10)

View File

@ -1,27 +1,47 @@
#include "legoutils.h" #include "legoutils.h"
#include "3dmanager/lego3dmanager.h"
#include "act1state.h" #include "act1state.h"
#include "anim/legoanim.h"
#include "islepathactor.h" #include "islepathactor.h"
#include "legoanimpresenter.h" #include "legoanimpresenter.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legoinputmanager.h" #include "legoinputmanager.h"
#include "legomain.h"
#include "legonamedtexture.h" #include "legonamedtexture.h"
#include "legoomni.h"
#include "legosoundmanager.h" #include "legosoundmanager.h"
#include "legovideomanager.h"
#include "legoworld.h" #include "legoworld.h"
#include "legoworldlist.h" #include "legoworldlist.h"
#include "misc.h" #include "misc.h"
#include "misc/legotree.h"
#include "mxdsaction.h" #include "mxdsaction.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxstreamer.h" #include "mxstreamer.h"
#include "mxtypes.h" #include "mxtypes.h"
#include "mxutilities.h"
#include "mxvariabletable.h"
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "scripts.h"
#include <process.h> #include <process.h>
#include <string.h> #include <string.h>
#include <vec.h> #include <vec.h>
// FUNCTION: LEGO1 0x1003dd70
LegoROI* PickROI(MxLong p_a, MxLong p_b)
{
return (LegoROI*) VideoManager()->Get3DManager()->GetLego3DView()->Pick(p_a, p_b);
}
// STUB: LEGO1 0x1003ddc0
LegoEntity* PickEntity(MxLong, MxLong)
{
// TODO
return NULL;
}
// FUNCTION: LEGO1 0x1003df90 // FUNCTION: LEGO1 0x1003df90
MxS16 CountTotalTreeNodes(LegoTreeNode* p_node) MxS16 CountTotalTreeNodes(LegoTreeNode* p_node)
{ {
@ -320,7 +340,15 @@ void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bO
} }
} }
// STUB: LEGO1 0x1003ecc0
// FUNCTION: BETA10 0x100d4b38
void FUN_1003ecc0(IslePathActor* p_actor, undefined4, undefined4, MxBool)
{
// TODO
}
// FUNCTION: LEGO1 0x1003eda0 // FUNCTION: LEGO1 0x1003eda0
// FUNCTION: BETA10 0x100d4bf4
void FUN_1003eda0() void FUN_1003eda0()
{ {
Mx3DPointFloat vec; Mx3DPointFloat vec;

View File

@ -1,5 +1,6 @@
#include "legovariables.h" #include "legovariables.h"
#include "3dmanager/lego3dmanager.h"
#include "legobuildingmanager.h" #include "legobuildingmanager.h"
#include "legocharactermanager.h" #include "legocharactermanager.h"
#include "legogamestate.h" #include "legogamestate.h"

View File

@ -1,7 +1,13 @@
#include "misc.h" #include "misc.h"
#include "3dmanager/lego3dmanager.h"
#include "legoinputmanager.h"
#include "legomain.h"
#include "legovideomanager.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "roi/legoroi.h"
#include "scripts.h"
// GLOBAL: LEGO1 0x100f4c58 // GLOBAL: LEGO1 0x100f4c58
MxBool g_isWorldActive = TRUE; MxBool g_isWorldActive = TRUE;
@ -136,6 +142,13 @@ void SetCurrentActor(IslePathActor* p_currentActor)
LegoOmni::GetInstance()->SetCurrentActor(p_currentActor); LegoOmni::GetInstance()->SetCurrentActor(p_currentActor);
} }
// FUNCTION: LEGO1 0x10015890
// FUNCTION: BETA10 0x100e4d80
MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction)
{
return LegoOmni::GetInstance()->StartActionIfUnknown0x13c(p_dsAction);
}
// FUNCTION: LEGO1 0x100158b0 // FUNCTION: LEGO1 0x100158b0
void DeleteAction() void DeleteAction()
{ {

View File

@ -331,7 +331,6 @@ MxBool MxControlPresenter::HasTickleStatePassed(TickleState p_tickleState)
{ {
MxCompositePresenterList::iterator it = m_list.begin(); MxCompositePresenterList::iterator it = m_list.begin();
for (MxS16 i = m_unk0x4e; i > 0; i--, it++) { for (MxS16 i = m_unk0x4e; i > 0; i--, it++) {
;
} }
return (*it)->HasTickleStatePassed(p_tickleState); return (*it)->HasTickleStatePassed(p_tickleState);

View File

@ -6,6 +6,7 @@
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxdisplaysurface.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxparam.h" #include "mxparam.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"

View File

@ -4,6 +4,7 @@
#include "legovideomanager.h" #include "legovideomanager.h"
#include "misc.h" #include "misc.h"
#include "mxcontrolpresenter.h" #include "mxcontrolpresenter.h"
#include "mxdsaction.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxpresenter.h" #include "mxpresenter.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"

View File

@ -2,6 +2,7 @@
#include "decomp.h" #include "decomp.h"
#include "mxbitmap.h" #include "mxbitmap.h"
#include "mxdsaction.h"
#include "mxutilities.h" #include "mxutilities.h"
DECOMP_SIZE_ASSERT(LegoMeterPresenter, 0x94) DECOMP_SIZE_ASSERT(LegoMeterPresenter, 0x94)

View File

@ -1,9 +1,11 @@
#include "legoactor.h" #include "legoactor.h"
#include "define.h" #include "define.h"
#include "legocachesoundmanager.h"
#include "legosoundmanager.h" #include "legosoundmanager.h"
#include "misc.h" #include "misc.h"
#include "mxutilities.h" #include "mxutilities.h"
#include "roi/legoroi.h"
DECOMP_SIZE_ASSERT(LegoActor, 0x78) DECOMP_SIZE_ASSERT(LegoActor, 0x78)

View File

@ -1,5 +1,6 @@
#include "legocameracontroller.h" #include "legocameracontroller.h"
#include "3dmanager/lego3dmanager.h"
#include "legoinputmanager.h" #include "legoinputmanager.h"
#include "legonotify.h" #include "legonotify.h"
#include "legosoundmanager.h" #include "legosoundmanager.h"
@ -8,6 +9,7 @@
#include "mxmisc.h" #include "mxmisc.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "roi/legoroi.h"
#include <vec.h> #include <vec.h>

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