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/jukeboxstate.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/paths/legoanimactor.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`
- 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
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
* [`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`.
* [`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.
@ -33,7 +36,15 @@ This repository currently has only one goal: accuracy to the original executable
## 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
@ -41,7 +52,7 @@ In general, we're not exhaustively strict about coding style, but there are some
### 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

View File

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

View File

@ -1,9 +1,9 @@
#ifndef ACT1STATE_H
#define ACT1STATE_H
#include "legonamedtexture.h"
#include "legostate.h"
#include "roi/legoroi.h"
class LegoNamedTexture;
// VTABLE: LEGO1 0x100d7028
// SIZE 0x26c
@ -81,16 +81,17 @@ class Act1State : public LegoState {
inline MxU32 GetUnknown18() { return m_unk0x018; }
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 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
// Act1State::`scalar deleting destructor'
friend class Isle;
friend class SkateBoard;
protected:
MxS32* m_unk0x008; // 0x008 FIXME: count for m_unk0x008
@ -105,7 +106,7 @@ class Act1State : public LegoState {
MxBool m_unk0x01f; // 0x01f
MxBool m_planeActive; // 0x020
undefined m_unk0x021; // 0x021
undefined m_unk0x022; // 0x022
MxBool m_unk0x022; // 0x022
undefined m_unk0x023; // 0x023
NamedPlane m_unk0x024; // 0x024
NamedPlane m_unk0x070; // 0x070

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,18 +1,87 @@
#ifndef ISLEPATHACTOR_H
#define ISLEPATHACTOR_H
#include "legocontrolmanager.h"
#include "legogamestate.h"
#include "legopathactor.h"
#include "legoworld.h"
#include "mxtype18notificationparam.h"
#include "mxtype19notificationparam.h"
#include "mxtypes.h"
class LegoControlManagerEvent;
class LegoEndAnimNotificationParam;
class LegoWorld;
class MxType19NotificationParam;
// VTABLE: LEGO1 0x100d4398
// SIZE 0x160
class IslePathActor : public LegoPathActor {
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();
// FUNCTION: LEGO1 0x10002e10
@ -46,15 +115,15 @@ class IslePathActor : public LegoPathActor {
virtual MxU32 VTable0xd4(LegoControlManagerEvent&) { return 0; } // vtable+0xd4
// FUNCTION: LEGO1 0x10002e90
virtual MxU32 VTable0xd8(MxType18NotificationParam&) { return 0; } // vtable+0xd8
virtual MxU32 VTable0xd8(LegoEndAnimNotificationParam&) { return 0; } // vtable+0xd8
// FUNCTION: LEGO1 0x10002e00
virtual MxU32 VTable0xdc(MxType19NotificationParam&) { return 0; } // vtable+0xdc
virtual void VTable0xe0(); // vtable+0xe0
virtual void VTable0xe4(); // vtable+0xe4
virtual void VTable0xe8(LegoGameState::Area, MxBool, MxU8); // vtable+0xe8
virtual void VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset);
virtual void VTable0xe0(); // vtable+0xe0
virtual void VTable0xe4(); // vtable+0xe4
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); // vtable+0xec
// SYNTHETIC: LEGO1 0x10002ff0
// IslePathActor::`scalar deleting destructor'
@ -64,6 +133,8 @@ class IslePathActor : public LegoPathActor {
void FUN_1001b660();
static void RegisterSpawnLocations();
protected:
LegoWorld* m_world; // 0x154
IslePathActor* m_unk0x158; // 0x158

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,16 +1,16 @@
#ifndef LEGOANIMPRESENTER_H
#define LEGOANIMPRESENTER_H
#include "anim/legoanim.h"
#include "legoroilist.h"
#include "mxgeometry/mxgeometry3d.h"
#include "mxgeometry/mxmatrix.h"
#include "mxatom.h"
#include "mxvideopresenter.h"
class LegoAnim;
class LegoWorld;
class LegoAnimClass;
class LegoAnimActor;
class LegoPathBoundary;
class MxMatrix;
class Vector3;
struct LegoAnimStructComparator {
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
#include "decomp.h"
#include "misc/legostorage.h"
#include "mxcore.h"
class LegoEntity;
class LegoROI;
class LegoWorld;
struct LegoBuildingData;
class LegoStorage;
// VTABLE: LEGO1 0x100d6f50
// SIZE 0x30

View File

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

View File

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

View File

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

View File

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

View File

@ -8,7 +8,7 @@ class LegoExtraActor;
class LegoROI;
// SIZE 0x108
struct LegoCharacterData {
struct LegoCharacterInfo {
// SIZE 0x18
struct Part {
MxU8* m_unk0x00; // 0x00
@ -45,7 +45,34 @@ struct LegoCharacterLOD {
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];
#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 "extra.h"
#include "mxdsaction.h"
#include "mxentity.h"
#include "realtime/vector.h"
#include "roi/legoroi.h"
class LegoROI;
class MxDSAction;
class Vector3;
// VTABLE: LEGO1 0x100d4858
// SIZE 0x68

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
#ifndef LEGOOMNI_H
#define LEGOOMNI_H
#ifndef LEGOMAIN_H
#define LEGOMAIN_H
#include "compat.h"
#include "mxdsaction.h"
@ -27,35 +27,6 @@ class MxBackgroundAudioManager;
class MxTransitionManager;
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
// SIZE 0x140
class LegoOmni : public MxOmni {
@ -103,65 +74,6 @@ class LegoOmni : public MxOmni {
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() override; // vtable+00
@ -264,12 +176,4 @@ class LegoOmni : public MxOmni {
MxBool m_unk0x13c; // 0x13c
};
const char* GetNoCD_SourceName();
LegoEntity* PickEntity(MxLong, MxLong);
LegoROI* PickROI(MxLong, MxLong);
void CreateScripts();
void DestroyScripts();
#endif // LEGOOMNI_H
#endif // LEGOMAIN_H

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,12 +2,15 @@
#define LEGOPATHCONTROLLER_H
#include "decomp.h"
#include "legopathactor.h"
#include "mxcore.h"
#include "mxstl/stlcompat.h"
class LegoAnimPresenter;
class LegoPathActor;
class LegoPathBoundary;
class LegoWorld;
class MxAtomId;
class Vector3;
struct LegoPathControllerComparator {
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 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);
void FUN_100468f0(LegoAnimPresenter* p_presenter);
void FUN_10046930(LegoAnimPresenter* p_presenter);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,15 +2,14 @@
#define LEGOWORLD_H
#include "legocachesoundlist.h"
#include "legocachsound.h"
#include "legocameracontroller.h"
#include "legoentity.h"
#include "legoentitylist.h"
#include "legopathcontrollerlist.h"
#include "mxpresenter.h"
#include "mxpresenterlist.h"
#include "roi/legoroi.h"
class IslePathActor;
class LegoCameraController;
class LegoPathBoundary;
class LegoHideAnimPresenter;
@ -66,6 +65,14 @@ class LegoWorld : public LegoEntity {
MxBool PresentersPending();
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_1001fb70(
IslePathActor* p_actor,

View File

@ -3,9 +3,6 @@
#include "compat.h"
#include "decomp.h"
#include "legoinputmanager.h"
#include "legoomni.h"
#include "legovideomanager.h"
// Long include path due to dependency of misc library on LegoOmni
#include "lego/legoomni/include/actions/actionsfwd.h"
#include "mxtypes.h"
@ -16,6 +13,7 @@ class LegoBuildingManager;
class LegoCharacterManager;
class LegoControlManager;
class LegoGameState;
class LegoInputManager;
class LegoNavController;
class LegoOmni;
class LegoPlantManager;
@ -64,10 +62,4 @@ void PlayMusic(JukeboxScript::Script p_script);
void SetIsWorldActive(MxBool p_isWorldActive);
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

View File

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

View File

@ -4,6 +4,8 @@
#include "decomp.h"
#include "isleactor.h"
class SkateBoard;
// VTABLE: LEGO1 0x100d7380
// SIZE 0x9c
class Pizza : public IsleActor {
@ -31,18 +33,23 @@ class Pizza : public IsleActor {
undefined4 HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74
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
// Pizza::`scalar deleting destructor'
private:
undefined4 m_unk0x7c; // 0x7c
undefined4 m_unk0x80; // 0x80
undefined4 m_unk0x84; // 0x84
undefined4 m_unk0x88; // 0x88
undefined4 m_unk0x8c; // 0x8c
undefined4 m_unk0x90; // 0x90
undefined4 m_unk0x94; // 0x94
undefined m_unk0x98; // 0x98
undefined4 m_unk0x7c; // 0x7c
undefined4 m_unk0x80; // 0x80
SkateBoard* m_skateboard; // 0x84
undefined4 m_unk0x88; // 0x88
undefined4 m_unk0x8c; // 0x8c
undefined4 m_unk0x90; // 0x90
undefined4 m_unk0x94; // 0x94
undefined m_unk0x98; // 0x98
};
#endif // PIZZA_H

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,12 +1,12 @@
#ifndef SCORE_H
#define SCORE_H
#include "legocontrolmanager.h"
#include "legoeventnotificationparam.h"
#include "legogamestate.h"
#include "legoworld.h"
#include "mxactionnotificationparam.h"
#include "scorestate.h"
class LegoControlManagerEvent;
class MxEndActionNotificationParam;
class ScoreState;
// VTABLE: LEGO1 0x100d4018
// 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 "islepathactor.h"
class Act1State;
// VTABLE: LEGO1 0x100d55f0
// SIZE 0x168
class SkateBoard : public IslePathActor {
public:
SkateBoard();
~SkateBoard() override;
// FUNCTION: LEGO1 0x1000fdd0
inline const char* ClassName() const override // vtable+0x0c
@ -35,9 +38,10 @@ class SkateBoard : public IslePathActor {
// SkateBoard::`scalar deleting destructor'
private:
// TODO: SkateBoard types
undefined m_unk0x160;
undefined m_unk0x161[0x7];
void FUN_10010270(MxBool p_enable);
MxBool m_unk0x160; // 0x160
Act1State* m_act1state; // 0x164
};
#endif // SKATEBOARD_H

View File

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

View File

@ -1,5 +1,6 @@
#include "act1state.h"
#include "legonamedtexture.h"
#include "legoutils.h"
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_unk0x008 = g_unk0x100f37f0;
m_unk0x014 = -1;
m_unk0x022 = 0;
m_unk0x022 = FALSE;
m_unk0x154 = NULL;
m_unk0x158 = 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_unk0x022, sizeof(undefined));
p_legoFile->Write(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Write(&m_unk0x022, sizeof(m_unk0x022));
}
else if (p_legoFile->IsReadMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) {
@ -176,8 +177,8 @@ MxResult Act1State::Serialize(LegoFile* p_legoFile)
}
}
p_legoFile->Read(&m_unk0x010, sizeof(undefined2));
p_legoFile->Read(&m_unk0x022, sizeof(undefined));
p_legoFile->Read(&m_unk0x010, sizeof(m_unk0x010));
p_legoFile->Read(&m_unk0x022, sizeof(m_unk0x022));
}
// TODO
@ -205,7 +206,7 @@ MxBool Act1State::SetFlag()
m_unk0x024.SetName("");
m_unk0x070.SetName("");
m_unk0x0bc.SetName("");
m_unk0x022 = 0;
m_unk0x022 = FALSE;
m_unk0x108.SetName("");
if (m_unk0x154) {

View File

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

View File

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

View File

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

View File

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

View File

@ -1,13 +1,25 @@
#include "islepathactor.h"
#include "3dmanager/lego3dmanager.h"
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legoanimationmanager.h"
#include "legonavcontroller.h"
#include "legopathboundary.h"
#include "legoutils.h"
#include "legovehiclebuildstate.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxnotificationparam.h"
#include "scripts.h"
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
IslePathActor::IslePathActor()
@ -47,8 +59,8 @@ MxLong IslePathActor::Notify(MxParam& p_param)
case c_notificationClick:
ret = VTable0xd4((LegoControlManagerEvent&) p_param);
break;
case c_notificationType18:
ret = VTable0xd8((MxType18NotificationParam&) p_param);
case c_notificationEndAnim:
ret = VTable0xd8((LegoEndAnimNotificationParam&) p_param);
break;
case c_notificationType19:
ret = VTable0xdc((MxType19NotificationParam&) p_param);
@ -90,10 +102,454 @@ void IslePathActor::VTable0xe4()
// TODO
}
// STUB: LEGO1 0x1001b2a0
void IslePathActor::VTable0xe8(LegoGameState::Area, MxBool, MxU8)
// FUNCTION: LEGO1 0x1001a700
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

View File

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

View File

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

View File

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

View File

@ -1,58 +1,165 @@
#include "skateboard.h"
#include "act1state.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 "mxnotificationmanager.h"
#include "mxstillpresenter.h"
#include "mxtransitionmanager.h"
#include "pizza.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(SkateBoard, 0x168)
// FUNCTION: LEGO1 0x1000fd40
SkateBoard::SkateBoard()
{
this->m_unk0x160 = 0;
this->m_unk0x13c = 15.0;
this->m_unk0x150 = 3.5;
this->m_unk0x148 = 1;
m_unk0x160 = FALSE;
m_unk0x13c = 15.0;
m_unk0x150 = 3.5;
m_unk0x148 = 1;
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)
{
// TODO
return SUCCESS;
MxResult result = IslePathActor::Create(p_dsAction);
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()
{
// 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()
{
// TODO
return 0;
Act1State* state = (Act1State*) GameState()->GetState("Act1State");
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)
{
// TODO
return 0;
MxU32 result = 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()
{
// TODO
return 0;
FUN_10010270(m_unk0x160);
return 1;
}
// STUB: LEGO1 0x10010510
// FUNCTION: LEGO1 0x10010510
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
MxU32 TowTrack::VTable0xd8(MxType18NotificationParam& p_param)
MxU32 TowTrack::VTable0xd8(LegoEndAnimNotificationParam& p_param)
{
// TODO
return 0;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,18 +1,23 @@
#include "legoanimationmanager.h"
#include "animstate.h"
#include "define.h"
#include "islepathactor.h"
#include "legocharactermanager.h"
#include "legoendanimnotificationparam.h"
#include "legoextraactor.h"
#include "legogamestate.h"
#include "legoomni.h"
#include "legomain.h"
#include "legoroilist.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxticklemanager.h"
#include "mxtimer.h"
#include "mxutilities.h"
#include "roi/legoroi.h"
#include <io.h>
@ -22,6 +27,9 @@ DECOMP_SIZE_ASSERT(Vehicle, 0x08)
DECOMP_SIZE_ASSERT(Unknown0x3c, 0x18)
DECOMP_SIZE_ASSERT(LegoTranInfo, 0x78)
// GLOBAL: LEGO1 0x100d8b28
MxU8 g_unk0x100d8b28[] = {0, 1, 2, 4, 8, 16};
// GLOBAL: LEGO1 0x100f6d20
Vehicle g_vehicles[] = {
{"bikebd", 0, FALSE},
@ -84,9 +92,18 @@ Character g_characters[47] = {
{"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
MxS32 g_legoAnimationManagerConfig = 1;
// GLOBAL: LEGO1 0x100f7500
float g_unk0x100f7500 = 0.1f;
// FUNCTION: LEGO1 0x1005eb50
void LegoAnimationManager::configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig)
{
@ -152,14 +169,14 @@ LegoAnimationManager::~LegoAnimationManager()
// FUNCTION: BETA10 0x1003fbc0
void LegoAnimationManager::Reset(MxBool p_und)
{
m_unk0x402 = 0;
m_unk0x402 = FALSE;
if (p_und && m_animState != NULL) {
m_animState->SetFlag();
}
undefined unk0x42b = m_unk0x42b;
FUN_1005ef10();
MxBool suspended = m_suspended;
Suspend();
if (m_tranInfoList != NULL) {
delete m_tranInfoList;
@ -172,34 +189,105 @@ void LegoAnimationManager::Reset(MxBool p_und)
DeleteAnimations();
Init();
m_unk0x42b = unk0x42b;
m_suspended = suspended;
m_unk0x428 = m_unk0x3a;
m_unk0x429 = m_unk0x400;
m_unk0x42a = m_unk0x402;
}
// STUB: LEGO1 0x1005ef10
void LegoAnimationManager::FUN_1005ef10()
// FUNCTION: LEGO1 0x1005ef10
// 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
void LegoAnimationManager::FUN_1005f0b0()
// FUNCTION: LEGO1 0x1005f0b0
// 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: BETA10 0x1003ffb7
void LegoAnimationManager::Init()
{
m_unk0x402 = 0;
m_unk0x402 = FALSE;
m_scriptIndex = -1;
m_animCount = 0;
m_anims = NULL;
m_unk0x18 = 0;
m_unk0x1a = 0;
m_unk0x1a = FALSE;
m_tranInfoList = NULL;
m_tranInfoList2 = NULL;
m_unk0x41c = g_legoAnimationManagerConfig <= 1 ? 10 : 20;
@ -212,24 +300,24 @@ void LegoAnimationManager::Init()
for (i = 0; i < (MxS32) _countof(m_unk0x3c); i++) {
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_unk0x14 = 0;
m_unk0x3c[i].m_unk0x14 = FALSE;
}
m_unk0x38 = FALSE;
m_unk0x39 = FALSE;
m_unk0x3a = 1;
m_unk0x3a = TRUE;
m_unk0x3fc = 0;
m_unk0x400 = 0;
m_unk0x400 = FALSE;
m_unk0x414 = 0;
m_unk0x418 = 5;
m_numAllowedExtras = 5;
m_unk0x0e = 0;
m_unk0x10 = 0;
m_unk0x401 = 0;
m_unk0x42b = 0;
m_unk0x430 = 0;
m_unk0x42c = 0;
m_unk0x401 = FALSE;
m_suspended = FALSE;
m_unk0x430 = FALSE;
m_unk0x42c = NULL;
m_unk0x408 = m_unk0x40c = m_unk0x404 = Timer()->GetTime();
m_unk0x410 = 5000;
@ -251,16 +339,32 @@ void LegoAnimationManager::Init()
m_unk0x424 = new LegoROIList();
}
// STUB: LEGO1 0x1005f6d0
void LegoAnimationManager::FUN_1005f6d0(MxBool)
// FUNCTION: LEGO1 0x1005f6d0
// 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
void LegoAnimationManager::FUN_1005f700(MxBool)
// FUNCTION: LEGO1 0x1005f700
// 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
@ -287,8 +391,8 @@ MxResult LegoAnimationManager::LoadScriptInfo(MxS32 p_scriptIndex)
m_unk0x38 = FALSE;
m_unk0x39 = FALSE;
m_unk0x430 = 0;
m_unk0x42c = 0;
m_unk0x430 = FALSE;
m_unk0x42c = NULL;
for (j = 0; j < (MxS32) _countof(g_characters); j++) {
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_unk0x29 = 0;
m_anims[j].m_unk0x29 = FALSE;
for (k = 0; k < 3; k++) {
m_anims[j].m_unk0x2a[k] = -1;
@ -400,15 +504,15 @@ MxResult LegoAnimationManager::LoadScriptInfo(MxS32 p_scriptIndex)
FUN_100617c0(-1, m_unk0x0e, m_unk0x10);
result = SUCCESS;
m_unk0x402 = 1;
m_unk0x402 = TRUE;
if (m_unk0x42b) {
if (m_suspended) {
m_unk0x428 = m_unk0x3a;
m_unk0x429 = m_unk0x400;
m_unk0x42a = 1;
m_unk0x3a = 0;
m_unk0x400 = 0;
m_unk0x402 = 0;
m_unk0x42a = TRUE;
m_unk0x3a = FALSE;
m_unk0x400 = FALSE;
m_unk0x402 = FALSE;
}
if (p_scriptIndex == 0) {
@ -541,7 +645,7 @@ MxResult LegoAnimationManager::ReadModelInfo(LegoFile* p_file, ModelInfo* p_info
// FUNCTION: LEGO1 0x100603c0
void LegoAnimationManager::DeleteAnimations()
{
undefined unk0x42b = m_unk0x42b;
MxBool suspended = m_suspended;
if (m_anims != NULL) {
for (MxS32 i = 0; i < m_animCount; i++) {
@ -560,7 +664,7 @@ void LegoAnimationManager::DeleteAnimations()
}
Init();
m_unk0x42b = unk0x42b;
m_suspended = suspended;
}
// STUB: LEGO1 0x10060570
@ -569,22 +673,100 @@ void LegoAnimationManager::FUN_10060570(MxBool)
// TODO
}
// STUB: LEGO1 0x100605e0
// FUNCTION: LEGO1 0x100605e0
// FUNCTION: BETA10 0x1004152b
MxResult LegoAnimationManager::FUN_100605e0(
MxU32 p_index,
MxU8 p_unk0x0a,
MxBool p_unk0x0a,
MxMatrix* p_matrix,
undefined,
undefined4,
undefined,
MxBool,
MxBool,
undefined
MxBool p_bool1,
LegoROI* p_roi,
MxBool p_bool2,
MxBool p_bool3,
MxBool p_bool4,
MxBool p_bool5
)
{
// TODO
return FAILURE;
MxResult result = 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
@ -597,12 +779,12 @@ MxResult LegoAnimationManager::FUN_100609f0(MxU32 p_objectId, MxMatrix* p_matrix
FUN_100627d0(FALSE);
LegoTranInfo* info = new LegoTranInfo();
info->m_unk0x00 = 0;
info->m_animInfo = NULL;
info->m_index = ++m_unk0x1c;
info->m_unk0x10 = 0;
info->m_unk0x08 = NULL;
info->m_unk0x12 = -1;
info->m_unk0x14 = 0;
info->m_unk0x14 = FALSE;
info->m_objectId = p_objectId;
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++) {
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;
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;
}
@ -683,13 +865,13 @@ MxResult LegoAnimationManager::StartEntityAction(MxDSAction& p_dsAction, LegoEnt
MxResult LegoAnimationManager::FUN_10060dc0(
IsleScript::Script p_objectId,
MxMatrix* p_matrix,
undefined p_param3,
undefined p_param4,
undefined4 p_param5,
undefined p_param6,
MxBool p_param3,
MxBool p_param4,
LegoROI* p_roi,
MxBool p_param6,
MxBool p_param7,
MxBool p_param8,
undefined p_param9
MxBool p_param9
)
{
MxResult result = FAILURE;
@ -702,21 +884,21 @@ MxResult LegoAnimationManager::FUN_10060dc0(
for (MxS32 i = 0; i < m_animCount; i++) {
if (m_anims[i].m_objectId == p_objectId) {
found = TRUE;
undefined unk0x0a;
MxBool unk0x0a;
switch (p_param4) {
case 0:
case FALSE:
unk0x0a = m_anims[i].m_unk0x0a;
break;
case 1:
unk0x0a = 1;
case TRUE:
unk0x0a = TRUE;
break;
default:
unk0x0a = 0;
unk0x0a = FALSE;
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;
}
}
@ -734,6 +916,12 @@ void LegoAnimationManager::FUN_10061010(undefined4)
// TODO
}
// STUB: LEGO1 0x10061530
void LegoAnimationManager::FUN_10061530()
{
// TODO
}
// STUB: LEGO1 0x100617c0
void LegoAnimationManager::FUN_100617c0(MxS32, MxU16&, MxU16&)
{
@ -758,20 +946,213 @@ LegoTranInfo* LegoAnimationManager::GetTranInfo(MxU32 p_index)
return NULL;
}
// STUB: LEGO1 0x100619f0
// FUNCTION: LEGO1 0x100619f0
// FUNCTION: BETA10 0x100426b1
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;
}
// STUB: LEGO1 0x10061cc0
// FUNCTION: LEGO1 0x10061cc0
// FUNCTION: BETA10 0x1004293c
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;
}
// 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: BETA10 0x100432dd
MxS8 LegoAnimationManager::GetCharacterIndex(const char* p_name)
@ -787,6 +1168,29 @@ MxS8 LegoAnimationManager::GetCharacterIndex(const char* p_name)
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: BETA10 0x1004381a
void LegoAnimationManager::FUN_10062770()
@ -811,6 +1215,7 @@ void LegoAnimationManager::FUN_100627d0(MxBool)
}
// STUB: LEGO1 0x100629b0
// FUNCTION: BETA10 0x10043c10
void LegoAnimationManager::FUN_100629b0(MxU32, MxBool)
{
// TODO
@ -851,14 +1256,35 @@ void LegoAnimationManager::FUN_10063aa0()
}
}
// STUB: LEGO1 0x10063d10
// FUNCTION: BETA10 0x10045034
void LegoAnimationManager::FUN_10063d10()
{
// TODO
}
// STUB: LEGO1 0x10064670
void LegoAnimationManager::FUN_10064670(MxBool)
void LegoAnimationManager::FUN_10064670(Vector3*)
{
// TODO
}
// 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
}

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
#include "legocharacters.h"
DECOMP_SIZE_ASSERT(LegoCharacterData, 0x108)
DECOMP_SIZE_ASSERT(LegoCharacterData::Part, 0x18)
DECOMP_SIZE_ASSERT(LegoCharacterInfo, 0x108)
DECOMP_SIZE_ASSERT(LegoCharacterInfo::Part, 0x18)
DECOMP_SIZE_ASSERT(LegoCharacterLOD, 0x58)
// 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"};
// GLOBAL: LEGO1 0x100f80c0
LegoCharacterData g_characterDataInit[] = {
LegoCharacterInfo g_characterInfoInit[] = {
{"pepper",
NULL,
NULL,

View File

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

View File

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

View File

@ -1,27 +1,47 @@
#include "legoutils.h"
#include "3dmanager/lego3dmanager.h"
#include "act1state.h"
#include "anim/legoanim.h"
#include "islepathactor.h"
#include "legoanimpresenter.h"
#include "legogamestate.h"
#include "legoinputmanager.h"
#include "legomain.h"
#include "legonamedtexture.h"
#include "legoomni.h"
#include "legosoundmanager.h"
#include "legovideomanager.h"
#include "legoworld.h"
#include "legoworldlist.h"
#include "misc.h"
#include "misc/legotree.h"
#include "mxdsaction.h"
#include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxstreamer.h"
#include "mxtypes.h"
#include "mxutilities.h"
#include "mxvariabletable.h"
#include "realtime/realtime.h"
#include "scripts.h"
#include <process.h>
#include <string.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
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: BETA10 0x100d4bf4
void FUN_1003eda0()
{
Mx3DPointFloat vec;

View File

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

View File

@ -1,7 +1,13 @@
#include "misc.h"
#include "3dmanager/lego3dmanager.h"
#include "legoinputmanager.h"
#include "legomain.h"
#include "legovideomanager.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "roi/legoroi.h"
#include "scripts.h"
// GLOBAL: LEGO1 0x100f4c58
MxBool g_isWorldActive = TRUE;
@ -136,6 +142,13 @@ void SetCurrentActor(IslePathActor* 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
void DeleteAction()
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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