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();