diff --git a/docs/progress.svg b/docs/progress.svg
index 9dd37a5b2..b02998f70 100644
--- a/docs/progress.svg
+++ b/docs/progress.svg
@@ -580,7 +580,7 @@
-
+
@@ -743,7 +743,7 @@
-
+
@@ -1459,10 +1459,10 @@
-Functions decompiled (count): 25.65%
-Functions decompiled (bytesize): 21.19%
-Functions not decompiled, but with known names (count): 59.12%
-Functions not decompiled, but with known names (bytesize): 61.59%
+Functions decompiled (count): 25.79%
+Functions decompiled (bytesize): 21.89%
+Functions not decompiled, but with known names (count): 58.98%
+Functions not decompiled, but with known names (bytesize): 60.89%
Functions not decompiled, with unknown names (count): 15.23%
Functions not decompiled, with unknown names (bytesize): 17.22%
diff --git a/docs/progress.txt b/docs/progress.txt
index 0eed424be..97fdc7165 100644
--- a/docs/progress.txt
+++ b/docs/progress.txt
@@ -135,9 +135,9 @@ CalculateCamera 0x00410B40 0x0000055D *
StartCinematic 0x004110A0 0x00000183 -
DoCinematic 0x00411240 0x0000012B -
CalculateCinematicCamera 0x00411370 0x00000124 -
-ControlCinematicPlayer 0x004114A0 0x00000045 -
-InitialisePlayer1 0x004114F0 0x000000CD -
-InitialiseGenPlayer 0x004115C0 0x00000027 -
+ControlCinematicPlayer 0x004114A0 0x00000045 *
+InitialisePlayer1 0x004114F0 0x000000CD *
+InitialiseGenPlayer 0x004115C0 0x00000027 *
InGameCinematicCamera 0x004115F0 0x00000190 -
GetCollisionInfo 0x00411780 0x000007DD *
CollideStaticObjects 0x00411FA0 0x000003D6 -
@@ -213,17 +213,17 @@ sub_41A200 0x0041A200 0x0000000F -
ItemNearLara 0x0041A210 0x0000008C -
SoundEffects 0x0041A2A0 0x0000006D *
DoBloodSplat 0x0041A310 0x00000059 *
-ControlBlood1 0x0041A370 0x0000008B -
-ControlExplosion1 0x0041A400 0x0000004C -
+ControlBlood1 0x0041A370 0x0000008B *
+ControlExplosion1 0x0041A400 0x0000004C *
Richochet 0x0041A450 0x00000072 *
-ControlRicochet1 0x0041A4D0 0x00000030 -
-ControlTwinkle 0x0041A500 0x0000004C -
+ControlRicochet1 0x0041A4D0 0x00000030 *
+ControlTwinkle 0x0041A500 0x0000004C *
ItemSparkle 0x0041A550 0x00000115 *
FxLaraBubbles 0x0041A670 0x000000E8 -
-ControlBubble1 0x0041A760 0x000000FF -
+ControlBubble1 0x0041A760 0x000000FF *
Splash 0x0041A860 0x000000CD *
-ControlSplash1 0x0041A930 0x0000007A -
-ControlWaterFall 0x0041A9B0 0x00000120 -
+ControlSplash1 0x0041A930 0x0000007A *
+ControlWaterFall 0x0041A9B0 0x00000120 *
FxFinishLevel 0x0041AAD0 0x0000000B -
FxTurn180 0x0041AAE0 0x0000000B -
FxDinoStomp 0x0041AAF0 0x00000096 -
@@ -497,24 +497,24 @@ DrawMovableBlock 0x0042BD60 0x00000081 *
DrawUnclippedItem 0x0042BDF0 0x00000068 *
AbortionControl 0x0042BE60 0x0000049E *
NatlaControl 0x0042C330 0x0000059F *
-ControlNatlaGun 0x0042C910 0x00000121 -
-InitialiseDoor 0x0042CA40 0x000004AE -
-DoorControl 0x0042CEF0 0x0000023B -
+ControlNatlaGun 0x0042C910 0x00000121 *
+InitialiseDoor 0x0042CA40 0x000004AE *
+DoorControl 0x0042CEF0 0x0000023B *
OnDrawBridge 0x0042D130 0x000000B1 -
-DrawBridgeFloor 0x0042D1F0 0x0000003B -
-DrawBridgeCeiling 0x0042D230 0x0000003F -
-DrawBridgeCollision 0x0042D270 0x0000002F -
-BridgeFlatFloor 0x0042D2A0 0x00000019 -
-BridgeFlatCeiling 0x0042D2C0 0x0000001E -
-BridgeTilt1Floor 0x0042D2E0 0x00000048 -
-BridgeTilt1Ceiling 0x0042D330 0x0000004D -
-BridgeTilt2Floor 0x0042D380 0x00000047 -
-BridgeTilt2Ceiling 0x0042D3D0 0x0000004C -
-CogControl 0x0042D420 0x00000075 -
-CabinControl 0x0042D4A0 0x0000007F -
-BoatControl 0x0042D520 0x0000005B -
-Scion3Control 0x0042D580 0x00000176 -
-EarthQuakeControl 0x0042D700 0x0000006F -
+DrawBridgeFloor 0x0042D1F0 0x0000003B *
+DrawBridgeCeiling 0x0042D230 0x0000003F *
+DrawBridgeCollision 0x0042D270 0x0000002F *
+BridgeFlatFloor 0x0042D2A0 0x00000019 *
+BridgeFlatCeiling 0x0042D2C0 0x0000001E *
+BridgeTilt1Floor 0x0042D2E0 0x00000048 *
+BridgeTilt1Ceiling 0x0042D330 0x0000004D *
+BridgeTilt2Floor 0x0042D380 0x00000047 *
+BridgeTilt2Ceiling 0x0042D3D0 0x0000004C *
+CogControl 0x0042D420 0x00000075 *
+CabinControl 0x0042D4A0 0x0000007F *
+BoatControl 0x0042D520 0x0000005B *
+Scion3Control 0x0042D580 0x00000176 *
+EarthQuakeControl 0x0042D700 0x0000006F *
do_inventory_options 0x0042D770 0x00000180 -
do_passport_option 0x0042D9C0 0x000004D0 -
sub_42DE90 0x0042DE90 0x00000435 -
@@ -541,7 +541,7 @@ S_DrawLightningSegment 0x00430740 0x00000446 -
decomp_pcx 0x00430B90 0x00000141 -
S_DisplayPicture 0x00430CE0 0x00000094 -
Targetable 0x00430D80 0x0000007B -
-ControlGunShot 0x00430E00 0x00000037 -
+ControlGunShot 0x00430E00 0x00000037 *
GunShot 0x00430E40 0x00000066 -
GunHit 0x00430EB0 0x000000ED -
GunMiss 0x00430FA0 0x000000E6 -
@@ -555,19 +555,19 @@ DrawSkateKid 0x00432550 0x0000004C *
CowboyControl 0x004325A0 0x000005A7 *
InitialiseBaldy 0x00432B60 0x00000027 *
BaldyControl 0x00432B90 0x000004CC *
-PickUpCollision 0x00433080 0x000001BF -
-PickUpScionCollision 0x00433240 0x00000164 -
-PickUpScion4Collision 0x004333B0 0x00000108 -
+PickUpCollision 0x00433080 0x000001BF *
+PickUpScionCollision 0x00433240 0x00000164 *
+PickUpScion4Collision 0x004333B0 0x00000108 *
MidasCollision 0x004334C0 0x00000217 *
-SwitchCollision 0x004336F0 0x0000011C -
-SwitchCollision2 0x00433810 0x000000F0 -
-KeyHoleCollision 0x00433900 0x00000227 -
-PuzzleHoleCollision 0x00433B40 0x00000277 -
-SwitchControl 0x00433DE0 0x0000003D -
+SwitchCollision 0x004336F0 0x0000011C *
+SwitchCollision2 0x00433810 0x000000F0 *
+KeyHoleCollision 0x00433900 0x00000227 *
+PuzzleHoleCollision 0x00433B40 0x00000277 *
+SwitchControl 0x00433DE0 0x0000003D *
SwitchTrigger 0x00433E20 0x00000078 -
KeyTrigger 0x00433EA0 0x00000042 -
PickupTrigger 0x00433EF0 0x00000038 -
-InitialiseSaveGameItem 0x00433F30 0x0000001C -
+InitialiseSaveGameItem 0x00433F30 0x0000001C *
RatControl 0x00433F50 0x000002A8 *
VoleControl 0x00434210 0x000002B5 *
InitialiseStartInfo 0x004344D0 0x00000042 -
@@ -584,7 +584,7 @@ InitialiseLevel 0x004362A0 0x00000119 *
InitialiseLevelFlags 0x004363C0 0x00000018 -
BaddyObjects 0x004363E0 0x00000C2F +
TrapObjects 0x00437010 0x00000356 +
-ObjectObjects 0x00437370 0x000006D3 *
+ObjectObjects 0x00437370 0x000006D3 +
InitialiseObjects 0x00437A50 0x00000063 +
sub_437AC0 0x00437AC0 0x00000006 -
WinVidSpinMessageLoop 0x00437AD0 0x00000029 *
@@ -646,9 +646,9 @@ InitialiseRollingBall 0x0043A010 0x00000040 *
RollingBallControl 0x0043A050 0x0000025D *
RollingBallCollision 0x0043A2B0 0x00000264 *
SpikeCollision 0x0043A520 0x0000014E *
-TrapDoorControl 0x0043A670 0x00000053 -
-TrapDoorFloor 0x0043A6D0 0x00000042 -
-TrapDoorCeiling 0x0043A720 0x00000046 -
+TrapDoorControl 0x0043A670 0x00000053 *
+TrapDoorFloor 0x0043A6D0 0x00000042 *
+TrapDoorCeiling 0x0043A720 0x00000046 *
OnTrapDoor 0x0043A770 0x000000A3 -
PendulumControl 0x0043A820 0x0000014B *
FallingBlockControl 0x0043A970 0x000000F9 *
@@ -671,13 +671,13 @@ LavaWedgeControl 0x0043B710 0x00000139 *
CentaurControl 0x0043B850 0x000002B9 *
InitialiseWarrior2 0x0043BB30 0x00000028 *
FlyerControl 0x0043BB60 0x00000625 *
-ControlMissile 0x0043C1C0 0x0000026D -
+ControlMissile 0x0043C1C0 0x0000026D *
ShardGun 0x0043C430 0x00000110 -
RocketGun 0x0043C540 0x00000110 -
InitialiseMummy 0x0043C650 0x0000003A *
MummyControl 0x0043C690 0x000000A0 *
ExplodingDeath 0x0043C730 0x0000039A -
-ControlBodyPart 0x0043CAD0 0x00000195 -
+ControlBodyPart 0x0043CAD0 0x00000195 *
InitialisePod 0x0043CC70 0x000000DC *
PodControl 0x0043CD70 0x00000118 *
InitialiseStatue 0x0043CE90 0x000000E5 *
diff --git a/src/game/objects.h b/src/game/objects.h
new file mode 100644
index 000000000..ac2e3fbde
--- /dev/null
+++ b/src/game/objects.h
@@ -0,0 +1,51 @@
+#ifndef TOMB1MAIN_GAME_OBJECTS_H
+#define TOMB1MAIN_GAME_OBJECTS_H
+
+#include
+
+// clang-format off
+#define InitialiseDoor ((void __cdecl(*)(int16_t item_num))0x0042CA40)
+#define DoorControl ((void __cdecl(*)(int16_t item_num))0x0042CEF0)
+#define DrawBridgeFloor ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D1F0)
+#define DrawBridgeCeiling ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D230)
+#define DrawBridgeCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x0042D270)
+#define CogControl ((void __cdecl(*)(int16_t item_num))0x0042D420)
+#define BridgeFlatFloor ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D2A0)
+#define BridgeFlatCeiling ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D2C0)
+#define BridgeTilt1Floor ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D2E0)
+#define BridgeTilt1Ceiling ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D330)
+#define BridgeTilt2Floor ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D380)
+#define BridgeTilt2Ceiling ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0042D3D0)
+#define SwitchControl ((void __cdecl(*)(int16_t item_num))0x00433DE0)
+#define SwitchCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x004336F0)
+#define SwitchCollision2 ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x00433810)
+#define KeyHoleCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x00433900)
+#define TrapDoorControl ((void __cdecl(*)(int16_t item_num))0x0043A670)
+#define TrapDoorFloor ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0043A6D0)
+#define TrapDoorCeiling ((void __cdecl(*)(ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height))0x0043A720)
+#define PickUpCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x00433080)
+#define InitialiseSaveGameItem ((void __cdecl(*)(int16_t item_num))0x00433F30)
+#define PuzzleHoleCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x00433B40)
+#define CabinControl ((void __cdecl(*)(int16_t item_num))0x0042D4A0)
+#define EarthQuakeControl ((void __cdecl(*)(int16_t item_num))0x0042D700)
+#define InitialisePlayer1 ((void __cdecl(*)(int16_t item_num))0x004114F0)
+#define ControlCinematicPlayer ((void __cdecl(*)(int16_t item_num))0x004114A0)
+#define InitialiseGenPlayer ((void __cdecl(*)(int16_t item_num))0x004115C0)
+#define ControlBubble1 ((void __cdecl(*)(int16_t item_num))0x0041A760)
+#define ControlBlood1 ((void __cdecl(*)(int16_t item_num))0x0041A370)
+#define ControlRicochet1 ((void __cdecl(*)(int16_t item_num))0x0041A4D0)
+#define ControlWaterFall ((void __cdecl(*)(int16_t item_num))0x0041A9B0)
+#define ControlBodyPart ((void __cdecl(*)(int16_t item_num))0x0043CAD0)
+#define ControlNatlaGun ((void __cdecl(*)(int16_t item_num))0x0042C910)
+#define ControlMissile ((void __cdecl(*)(int16_t item_num))0x0043C1C0)
+#define ControlGunShot ((void __cdecl(*)(int16_t item_num))0x00430E00)
+#define ControlTwinkle ((void __cdecl(*)(int16_t item_num))0x0041A500)
+#define ControlExplosion1 ((void __cdecl(*)(int16_t item_num))0x0041A400)
+#define PickUpScionCollision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x00433240)
+#define PickUpScion4Collision ((void __cdecl(*)(int16_t item_num, ITEM_INFO* litem, COLL_INFO* coll))0x004333B0)
+#define BoatControl ((void __cdecl(*)(int16_t item_num))0x0042D520)
+#define Scion3Control ((void __cdecl(*)(int16_t item_num))0x0042D580)
+#define ControlSplash1 ((void __cdecl(*)(int16_t item_num))0x0041A930)
+// clang-format on
+
+#endif
diff --git a/src/game/setup.c b/src/game/setup.c
index a70567d6f..6338616de 100644
--- a/src/game/setup.c
+++ b/src/game/setup.c
@@ -9,6 +9,7 @@
#include "game/lara.h"
#include "game/lion.h"
#include "game/natla.h"
+#include "game/objects.h"
#include "game/people.h"
#include "game/rat.h"
#include "game/setup.h"
@@ -615,6 +616,305 @@ void __cdecl TrapObjects()
Objects[O_LAVA_WEDGE].save_flags = 1;
}
+void __cdecl ObjectObjects()
+{
+ Objects[O_CAMERA_TARGET].draw_routine = DrawDummyItem;
+
+ Objects[O_BRIDGE_FLAT].floor = BridgeFlatFloor;
+ Objects[O_BRIDGE_FLAT].ceiling = BridgeFlatCeiling;
+ Objects[O_BRIDGE_TILT1].floor = BridgeTilt1Floor;
+ Objects[O_BRIDGE_TILT1].ceiling = BridgeTilt1Ceiling;
+ Objects[O_BRIDGE_TILT2].floor = BridgeTilt2Floor;
+ Objects[O_BRIDGE_TILT2].ceiling = BridgeTilt2Ceiling;
+
+ if (Objects[O_DRAW_BRIDGE].loaded) {
+ Objects[O_DRAW_BRIDGE].ceiling = DrawBridgeCeiling;
+ Objects[O_DRAW_BRIDGE].collision = DrawBridgeCollision;
+ Objects[O_DRAW_BRIDGE].control = CogControl;
+ Objects[O_DRAW_BRIDGE].save_anim = 1;
+ Objects[O_DRAW_BRIDGE].save_flags = 1;
+ Objects[O_DRAW_BRIDGE].floor = DrawBridgeFloor;
+ }
+
+ Objects[O_SWITCH_TYPE1].control = SwitchControl;
+ Objects[O_SWITCH_TYPE1].collision = SwitchCollision;
+ Objects[O_SWITCH_TYPE1].save_anim = 1;
+ Objects[O_SWITCH_TYPE1].save_flags = 1;
+
+ Objects[O_SWITCH_TYPE2].control = SwitchControl;
+ Objects[O_SWITCH_TYPE2].collision = SwitchCollision2;
+ Objects[O_SWITCH_TYPE2].save_anim = 1;
+ Objects[O_SWITCH_TYPE2].save_flags = 1;
+
+ Objects[O_DOOR_TYPE1].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE1].control = DoorControl;
+ Objects[O_DOOR_TYPE1].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE1].collision = DoorCollision;
+ Objects[O_DOOR_TYPE1].save_anim = 1;
+ Objects[O_DOOR_TYPE1].save_flags = 1;
+
+ Objects[O_DOOR_TYPE2].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE2].control = DoorControl;
+ Objects[O_DOOR_TYPE2].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE2].collision = DoorCollision;
+ Objects[O_DOOR_TYPE2].save_anim = 1;
+ Objects[O_DOOR_TYPE2].save_flags = 1;
+
+ Objects[O_DOOR_TYPE3].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE3].control = DoorControl;
+ Objects[O_DOOR_TYPE3].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE3].collision = DoorCollision;
+ Objects[O_DOOR_TYPE3].save_anim = 1;
+ Objects[O_DOOR_TYPE3].save_flags = 1;
+
+ Objects[O_DOOR_TYPE4].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE4].control = DoorControl;
+ Objects[O_DOOR_TYPE4].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE4].collision = DoorCollision;
+ Objects[O_DOOR_TYPE4].save_anim = 1;
+ Objects[O_DOOR_TYPE4].save_flags = 1;
+
+ Objects[O_DOOR_TYPE5].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE5].control = DoorControl;
+ Objects[O_DOOR_TYPE5].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE5].collision = DoorCollision;
+ Objects[O_DOOR_TYPE5].save_anim = 1;
+ Objects[O_DOOR_TYPE5].save_flags = 1;
+
+ Objects[O_DOOR_TYPE6].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE6].control = DoorControl;
+ Objects[O_DOOR_TYPE6].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE6].collision = DoorCollision;
+ Objects[O_DOOR_TYPE6].save_anim = 1;
+ Objects[O_DOOR_TYPE6].save_flags = 1;
+
+ Objects[O_DOOR_TYPE7].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE7].control = DoorControl;
+ Objects[O_DOOR_TYPE7].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE7].collision = DoorCollision;
+ Objects[O_DOOR_TYPE7].save_anim = 1;
+ Objects[O_DOOR_TYPE7].save_flags = 1;
+
+ Objects[O_DOOR_TYPE8].initialise = InitialiseDoor;
+ Objects[O_DOOR_TYPE8].control = DoorControl;
+ Objects[O_DOOR_TYPE8].draw_routine = DrawUnclippedItem;
+ Objects[O_DOOR_TYPE8].collision = DoorCollision;
+ Objects[O_DOOR_TYPE8].save_anim = 1;
+ Objects[O_DOOR_TYPE8].save_flags = 1;
+
+ Objects[O_TRAPDOOR].control = TrapDoorControl;
+ Objects[O_TRAPDOOR].floor = TrapDoorFloor;
+ Objects[O_TRAPDOOR].ceiling = TrapDoorCeiling;
+ Objects[O_TRAPDOOR].save_anim = 1;
+ Objects[O_TRAPDOOR].save_flags = 1;
+
+ Objects[O_TRAPDOOR2].control = TrapDoorControl;
+ Objects[O_TRAPDOOR2].floor = TrapDoorFloor;
+ Objects[O_TRAPDOOR2].ceiling = TrapDoorCeiling;
+ Objects[O_TRAPDOOR2].save_anim = 1;
+ Objects[O_TRAPDOOR2].save_flags = 1;
+
+ Objects[O_COG_1].control = CogControl;
+ Objects[O_COG_1].save_flags = 1;
+ Objects[O_COG_2].control = CogControl;
+ Objects[O_COG_2].save_flags = 1;
+ Objects[O_COG_3].control = CogControl;
+ Objects[O_COG_3].save_flags = 1;
+
+ Objects[O_MOVING_BAR].control = CogControl;
+ Objects[O_MOVING_BAR].collision = ObjectCollision;
+ Objects[O_MOVING_BAR].save_flags = 1;
+ Objects[O_MOVING_BAR].save_anim = 1;
+ Objects[O_MOVING_BAR].save_position = 1;
+
+ Objects[O_PICKUP_ITEM1].draw_routine = DrawSpriteItem;
+ Objects[O_PICKUP_ITEM1].collision = PickUpCollision;
+ Objects[O_PICKUP_ITEM1].save_flags = 1;
+
+ Objects[O_PICKUP_ITEM2].draw_routine = DrawSpriteItem;
+ Objects[O_PICKUP_ITEM2].collision = PickUpCollision;
+ Objects[O_PICKUP_ITEM2].save_flags = 1;
+
+ Objects[O_KEY_ITEM1].draw_routine = DrawSpriteItem;
+ Objects[O_KEY_ITEM1].collision = PickUpCollision;
+ Objects[O_KEY_ITEM1].save_flags = 1;
+
+ Objects[O_KEY_ITEM2].draw_routine = DrawSpriteItem;
+ Objects[O_KEY_ITEM2].collision = PickUpCollision;
+ Objects[O_KEY_ITEM2].save_flags = 1;
+
+ Objects[O_KEY_ITEM3].draw_routine = DrawSpriteItem;
+ Objects[O_KEY_ITEM3].collision = PickUpCollision;
+ Objects[O_KEY_ITEM3].save_flags = 1;
+
+ Objects[O_KEY_ITEM4].draw_routine = DrawSpriteItem;
+ Objects[O_KEY_ITEM4].collision = PickUpCollision;
+ Objects[O_KEY_ITEM4].save_flags = 1;
+
+ Objects[O_PUZZLE_ITEM1].draw_routine = DrawSpriteItem;
+ Objects[O_PUZZLE_ITEM1].collision = PickUpCollision;
+ Objects[O_PUZZLE_ITEM1].save_flags = 1;
+
+ Objects[O_PUZZLE_ITEM2].draw_routine = DrawSpriteItem;
+ Objects[O_PUZZLE_ITEM2].collision = PickUpCollision;
+ Objects[O_PUZZLE_ITEM2].save_flags = 1;
+
+ Objects[O_PUZZLE_ITEM3].draw_routine = DrawSpriteItem;
+ Objects[O_PUZZLE_ITEM3].collision = PickUpCollision;
+ Objects[O_PUZZLE_ITEM3].save_flags = 1;
+
+ Objects[O_PUZZLE_ITEM4].draw_routine = DrawSpriteItem;
+ Objects[O_PUZZLE_ITEM4].collision = PickUpCollision;
+ Objects[O_PUZZLE_ITEM4].save_flags = 1;
+
+ Objects[O_GUN_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_GUN_ITEM].collision = PickUpCollision;
+ Objects[O_GUN_ITEM].save_flags = 1;
+
+ Objects[O_SHOTGUN_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_SHOTGUN_ITEM].collision = PickUpCollision;
+ Objects[O_SHOTGUN_ITEM].save_flags = 1;
+
+ Objects[O_MAGNUM_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_MAGNUM_ITEM].collision = PickUpCollision;
+ Objects[O_MAGNUM_ITEM].save_flags = 1;
+
+ Objects[O_UZI_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_UZI_ITEM].collision = PickUpCollision;
+ Objects[O_UZI_ITEM].save_flags = 1;
+
+ Objects[O_GUN_AMMO_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_GUN_AMMO_ITEM].collision = PickUpCollision;
+ Objects[O_GUN_AMMO_ITEM].save_flags = 1;
+
+ Objects[O_SG_AMMO_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_SG_AMMO_ITEM].collision = PickUpCollision;
+ Objects[O_SG_AMMO_ITEM].save_flags = 1;
+
+ Objects[O_MAG_AMMO_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_MAG_AMMO_ITEM].collision = PickUpCollision;
+ Objects[O_MAG_AMMO_ITEM].save_flags = 1;
+
+ Objects[O_UZI_AMMO_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_UZI_AMMO_ITEM].collision = PickUpCollision;
+ Objects[O_UZI_AMMO_ITEM].save_flags = 1;
+
+ Objects[O_EXPLOSIVE_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_EXPLOSIVE_ITEM].collision = PickUpCollision;
+ Objects[O_EXPLOSIVE_ITEM].save_flags = 1;
+
+ Objects[O_MEDI_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_MEDI_ITEM].collision = PickUpCollision;
+ Objects[O_MEDI_ITEM].save_flags = 1;
+
+ Objects[O_BIGMEDI_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_BIGMEDI_ITEM].collision = PickUpCollision;
+ Objects[O_BIGMEDI_ITEM].save_flags = 1;
+
+ Objects[O_SCION_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_SCION_ITEM].collision = PickUpScionCollision;
+
+ Objects[O_SCION_ITEM2].draw_routine = DrawSpriteItem;
+ Objects[O_SCION_ITEM2].collision = PickUpCollision;
+ Objects[O_SCION_ITEM2].save_flags = 1;
+
+ Objects[O_SCION_ITEM3].control = Scion3Control;
+ Objects[O_SCION_ITEM3].hit_points = 5;
+ Objects[O_SCION_ITEM3].save_flags = 1;
+
+ Objects[O_SCION_ITEM4].control = ControlLaraExtra;
+ Objects[O_SCION_ITEM4].collision = PickUpScion4Collision;
+ Objects[O_SCION_ITEM4].save_flags = 1;
+
+ Objects[O_SCION_HOLDER].control = ControlLaraExtra;
+ Objects[O_SCION_HOLDER].collision = ObjectCollision;
+ Objects[O_SCION_HOLDER].save_anim = 1;
+ Objects[O_SCION_HOLDER].save_flags = 1;
+
+ Objects[O_LEADBAR_ITEM].draw_routine = DrawSpriteItem;
+ Objects[O_LEADBAR_ITEM].collision = PickUpCollision;
+ Objects[O_LEADBAR_ITEM].save_flags = 1;
+
+ Objects[O_SAVEGAME_ITEM].initialise = InitialiseSaveGameItem;
+
+ Objects[O_KEY_HOLE1].collision = KeyHoleCollision;
+ Objects[O_KEY_HOLE1].save_flags = 1;
+ Objects[O_KEY_HOLE2].collision = KeyHoleCollision;
+ Objects[O_KEY_HOLE2].save_flags = 1;
+ Objects[O_KEY_HOLE3].collision = KeyHoleCollision;
+ Objects[O_KEY_HOLE3].save_flags = 1;
+ Objects[O_KEY_HOLE4].collision = KeyHoleCollision;
+ Objects[O_KEY_HOLE4].save_flags = 1;
+
+ Objects[O_PUZZLE_HOLE1].collision = PuzzleHoleCollision;
+ Objects[O_PUZZLE_HOLE1].save_flags = 1;
+
+ Objects[O_PUZZLE_HOLE2].collision = PuzzleHoleCollision;
+ Objects[O_PUZZLE_HOLE2].save_flags = 1;
+
+ Objects[O_PUZZLE_HOLE3].collision = PuzzleHoleCollision;
+ Objects[O_PUZZLE_HOLE3].save_flags = 1;
+
+ Objects[O_PUZZLE_HOLE4].collision = PuzzleHoleCollision;
+ Objects[O_PUZZLE_HOLE4].save_flags = 1;
+
+ Objects[O_PUZZLE_DONE1].save_flags = 1;
+ Objects[O_PUZZLE_DONE2].save_flags = 1;
+ Objects[O_PUZZLE_DONE3].save_flags = 1;
+ Objects[O_PUZZLE_DONE4].save_flags = 1;
+
+ Objects[O_PORTACABIN].control = CabinControl;
+ Objects[O_PORTACABIN].draw_routine = DrawUnclippedItem;
+ Objects[O_PORTACABIN].collision = ObjectCollision;
+ Objects[O_PORTACABIN].save_anim = 1;
+ Objects[O_PORTACABIN].save_flags = 1;
+
+ Objects[O_BOAT].control = BoatControl;
+ Objects[O_BOAT].save_flags = 1;
+ Objects[O_BOAT].save_anim = 1;
+ Objects[O_BOAT].save_position = 1;
+
+ Objects[O_EARTHQUAKE].control = EarthQuakeControl;
+ Objects[O_EARTHQUAKE].draw_routine = DrawDummyItem;
+ Objects[O_EARTHQUAKE].save_flags = 1;
+
+ Objects[O_PLAYER_1].initialise = InitialisePlayer1;
+ Objects[O_PLAYER_1].control = ControlCinematicPlayer;
+ Objects[O_PLAYER_1].hit_points = 1;
+
+ Objects[O_PLAYER_2].initialise = InitialiseGenPlayer;
+ Objects[O_PLAYER_2].control = ControlCinematicPlayer;
+ Objects[O_PLAYER_2].hit_points = 1;
+
+ Objects[O_PLAYER_3].initialise = InitialiseGenPlayer;
+ Objects[O_PLAYER_3].control = ControlCinematicPlayer;
+ Objects[O_PLAYER_3].hit_points = 1;
+
+ Objects[O_PLAYER_4].initialise = InitialiseGenPlayer;
+ Objects[O_PLAYER_4].control = ControlLaraExtra;
+ Objects[O_PLAYER_4].hit_points = 1;
+
+ Objects[O_BLOOD1].control = ControlBlood1;
+ Objects[O_BUBBLES1].control = ControlBubble1;
+ Objects[O_EXPLOSION1].control = ControlExplosion1;
+
+ Objects[O_RICOCHET1].control = ControlRicochet1;
+ Objects[O_TWINKLE].control = ControlTwinkle;
+ Objects[O_SPLASH1].control = ControlSplash1;
+ Objects[O_WATERFALL].control = ControlWaterFall;
+ Objects[O_WATERFALL].draw_routine = DrawDummyItem;
+
+ Objects[O_BODY_PART].control = ControlBodyPart;
+ Objects[O_BODY_PART].nmeshes = 0;
+ Objects[O_BODY_PART].loaded = 1;
+
+ Objects[O_MISSILE1].control = ControlNatlaGun;
+ Objects[O_MISSILE2].control = ControlMissile;
+ Objects[O_MISSILE3].control = ControlMissile;
+
+ Objects[O_GUN_FLASH].control = ControlGunShot;
+}
+
void __cdecl InitialiseObjects()
{
for (int i = 0; i < NUMBER_OBJECTS; i++) {
@@ -646,15 +946,15 @@ void __cdecl InitialiseObjects()
Objects[O_MEDI_ITEM].collision = NULL;
Objects[O_MEDI_ITEM].control = NULL;
Objects[O_MEDI_ITEM].draw_routine = DrawDummyItem;
- Objects[O_MEDI_ITEM].ceiling = NULL;
Objects[O_MEDI_ITEM].floor = NULL;
+ Objects[O_MEDI_ITEM].ceiling = NULL;
Objects[O_BIGMEDI_ITEM].initialise = NULL;
Objects[O_BIGMEDI_ITEM].collision = NULL;
Objects[O_BIGMEDI_ITEM].control = NULL;
Objects[O_BIGMEDI_ITEM].draw_routine = DrawDummyItem;
- Objects[O_BIGMEDI_ITEM].ceiling = NULL;
Objects[O_BIGMEDI_ITEM].floor = NULL;
+ Objects[O_BIGMEDI_ITEM].ceiling = NULL;
}
if (Tomb1MConfig.disable_magnums) {
@@ -662,15 +962,15 @@ void __cdecl InitialiseObjects()
Objects[O_MAGNUM_ITEM].collision = NULL;
Objects[O_MAGNUM_ITEM].control = NULL;
Objects[O_MAGNUM_ITEM].draw_routine = DrawDummyItem;
- Objects[O_MAGNUM_ITEM].ceiling = NULL;
Objects[O_MAGNUM_ITEM].floor = NULL;
+ Objects[O_MAGNUM_ITEM].ceiling = NULL;
Objects[O_MAG_AMMO_ITEM].initialise = NULL;
Objects[O_MAG_AMMO_ITEM].collision = NULL;
Objects[O_MAG_AMMO_ITEM].control = NULL;
Objects[O_MAG_AMMO_ITEM].draw_routine = DrawDummyItem;
- Objects[O_MAG_AMMO_ITEM].ceiling = NULL;
Objects[O_MAG_AMMO_ITEM].floor = NULL;
+ Objects[O_MAG_AMMO_ITEM].ceiling = NULL;
}
if (Tomb1MConfig.disable_uzis) {
@@ -678,15 +978,15 @@ void __cdecl InitialiseObjects()
Objects[O_UZI_ITEM].collision = NULL;
Objects[O_UZI_ITEM].control = NULL;
Objects[O_UZI_ITEM].draw_routine = DrawDummyItem;
- Objects[O_UZI_ITEM].ceiling = NULL;
Objects[O_UZI_ITEM].floor = NULL;
+ Objects[O_UZI_ITEM].ceiling = NULL;
Objects[O_UZI_AMMO_ITEM].initialise = NULL;
Objects[O_UZI_AMMO_ITEM].collision = NULL;
Objects[O_UZI_AMMO_ITEM].control = NULL;
Objects[O_UZI_AMMO_ITEM].draw_routine = DrawDummyItem;
- Objects[O_UZI_AMMO_ITEM].ceiling = NULL;
Objects[O_UZI_AMMO_ITEM].floor = NULL;
+ Objects[O_UZI_AMMO_ITEM].ceiling = NULL;
}
if (Tomb1MConfig.disable_shotgun) {
@@ -694,15 +994,15 @@ void __cdecl InitialiseObjects()
Objects[O_SHOTGUN_ITEM].collision = NULL;
Objects[O_SHOTGUN_ITEM].control = NULL;
Objects[O_SHOTGUN_ITEM].draw_routine = DrawDummyItem;
- Objects[O_SHOTGUN_ITEM].ceiling = NULL;
Objects[O_SHOTGUN_ITEM].floor = NULL;
+ Objects[O_SHOTGUN_ITEM].ceiling = NULL;
Objects[O_SG_AMMO_ITEM].initialise = NULL;
Objects[O_SG_AMMO_ITEM].collision = NULL;
Objects[O_SG_AMMO_ITEM].control = NULL;
Objects[O_SG_AMMO_ITEM].draw_routine = DrawDummyItem;
- Objects[O_SG_AMMO_ITEM].ceiling = NULL;
Objects[O_SG_AMMO_ITEM].floor = NULL;
+ Objects[O_SG_AMMO_ITEM].ceiling = NULL;
}
#endif
}
@@ -711,5 +1011,6 @@ void Tomb1MInjectGameSetup()
{
INJECT(0x004363E0, BaddyObjects);
INJECT(0x00437010, TrapObjects);
+ INJECT(0x00437370, ObjectObjects);
INJECT(0x00437A50, InitialiseObjects);
}
diff --git a/src/game/setup.h b/src/game/setup.h
index 4f058495b..cf119b1fe 100644
--- a/src/game/setup.h
+++ b/src/game/setup.h
@@ -2,12 +2,12 @@
#define TOMB1MAIN_GAME_SETUP_H
// clang-format off
-#define ObjectObjects ((void __cdecl(*)())0x00437370)
#define InitialiseLevel ((int32_t __cdecl(*)(int32_t level_number))0x004362A0)
// clang-format on
void __cdecl BaddyObjects();
void __cdecl TrapObjects();
+void __cdecl ObjectObjects();
void __cdecl InitialiseObjects();
void Tomb1MInjectGameSetup();