diff --git a/src/game/objects/general/keyhole.c b/src/game/objects/general/keyhole.c index 11d463ffa..9f4bab4af 100644 --- a/src/game/objects/general/keyhole.c +++ b/src/game/objects/general/keyhole.c @@ -26,15 +26,24 @@ int32_t g_PickUpX; int32_t g_PickUpY; int32_t g_PickUpZ; +static const OBJECT_BOUNDS *KeyHole_Bounds(void); + +static const OBJECT_BOUNDS *KeyHole_Bounds(void) +{ + return &m_KeyHoleBounds; +} + void KeyHole_Setup(OBJECT_INFO *obj) { obj->collision = KeyHole_Collision; obj->save_flags = 1; + obj->bounds = KeyHole_Bounds; } void KeyHole_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (lara_item->current_anim_state != LS_STOP) { return; @@ -45,7 +54,7 @@ void KeyHole_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) return; } - if (!Lara_TestPosition(item, &m_KeyHoleBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } diff --git a/src/game/objects/general/pickup.c b/src/game/objects/general/pickup.c index 58e9a99bf..ff0f2fdbf 100644 --- a/src/game/objects/general/pickup.c +++ b/src/game/objects/general/pickup.c @@ -87,6 +87,18 @@ void Pickup_Setup(OBJECT_INFO *obj) obj->draw_routine = Object_DrawPickupItem; obj->collision = Pickup_Collision; obj->save_flags = 1; + obj->bounds = Pickup_Bounds; +} + +const OBJECT_BOUNDS *Pickup_Bounds(void) +{ + if (g_Lara.water_status == LWS_UNDERWATER) { + return &m_PickUpBoundsUW; + } else if (g_Config.walk_to_items) { + return &m_PickUpBoundsControlled; + } else { + return &m_PickUpBounds; + } } void Pickup_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) @@ -97,6 +109,7 @@ void Pickup_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) } ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; int16_t rotx = item->rot.x; int16_t roty = item->rot.y; int16_t rotz = item->rot.z; @@ -105,7 +118,7 @@ void Pickup_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) if (g_Lara.water_status == LWS_ABOVE_WATER) { item->rot.x = 0; - if (!Lara_TestPosition(item, &m_PickUpBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { goto cleanup; } @@ -128,7 +141,7 @@ void Pickup_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) } } else if (g_Lara.water_status == LWS_UNDERWATER) { item->rot.x = -25 * PHD_DEGREE; - if (!Lara_TestPosition(item, &m_PickUpBoundsUW)) { + if (!Lara_TestPosition(item, obj->bounds())) { goto cleanup; } @@ -159,6 +172,7 @@ void Pickup_CollisionControlled( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (item->status == IS_INVISIBLE) { return; @@ -182,7 +196,7 @@ void Pickup_CollisionControlled( have_item = false; item->rot.x = 0; - if (Lara_TestPosition(item, &m_PickUpBoundsControlled)) { + if (Lara_TestPosition(item, obj->bounds())) { m_PickUpPosition.y = lara_item->pos.y - item->pos.y; if (Lara_MovePosition(item, &m_PickUpPosition)) { Item_SwitchToAnim(lara_item, LA_PICKUP, 0); @@ -220,7 +234,7 @@ void Pickup_CollisionControlled( || (g_Lara.interact_target.is_moving && g_Lara.interact_target.item_num == item_num)) { - if (Lara_TestPosition(item, &m_PickUpBoundsUW)) { + if (Lara_TestPosition(item, obj->bounds())) { if (Lara_MovePosition(item, &m_PickUpPositionUW)) { Item_SwitchToAnim(lara_item, LA_PICKUP_UW, 0); lara_item->current_anim_state = LS_PICKUP; diff --git a/src/game/objects/general/pickup.h b/src/game/objects/general/pickup.h index 6bdf8d5f2..0c341866f 100644 --- a/src/game/objects/general/pickup.h +++ b/src/game/objects/general/pickup.h @@ -6,6 +6,7 @@ #include void Pickup_Setup(OBJECT_INFO *obj); +const OBJECT_BOUNDS *Pickup_Bounds(void); void Pickup_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll); void Pickup_CollisionControlled( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll); diff --git a/src/game/objects/general/puzzle_hole.c b/src/game/objects/general/puzzle_hole.c index e999f0f5b..72b7eb505 100644 --- a/src/game/objects/general/puzzle_hole.c +++ b/src/game/objects/general/puzzle_hole.c @@ -12,7 +12,9 @@ #define LF_USEPUZZLE 80 -XYZ_32 g_PuzzleHolePosition = { 0, 0, WALL_L / 2 - LARA_RAD - 85 }; +static XYZ_32 m_PuzzleHolePosition = { .x = 0, + .y = 0, + .z = WALL_L / 2 - LARA_RAD - 85 }; static const OBJECT_BOUNDS m_PuzzleHoleBounds = { .shift = { @@ -33,10 +35,18 @@ static const OBJECT_BOUNDS m_PuzzleHoleBounds = { }, }; +static const OBJECT_BOUNDS *PuzzleHole_Bounds(void); + +static const OBJECT_BOUNDS *PuzzleHole_Bounds(void) +{ + return &m_PuzzleHoleBounds; +} + void PuzzleHole_Setup(OBJECT_INFO *obj) { obj->collision = PuzzleHole_Collision; obj->save_flags = 1; + obj->bounds = PuzzleHole_Bounds; } void PuzzleHole_SetupDone(OBJECT_INFO *obj) @@ -48,9 +58,10 @@ void PuzzleHole_Collision( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (lara_item->current_anim_state == LS_USE_PUZZLE) { - if (!Lara_TestPosition(item, &m_PuzzleHoleBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } @@ -152,7 +163,7 @@ void PuzzleHole_Collision( g_InvChosen = -1; if (correct) { - Lara_AlignPosition(item, &g_PuzzleHolePosition); + Lara_AlignPosition(item, &m_PuzzleHolePosition); Lara_AnimateUntil(lara_item, LS_USE_PUZZLE); lara_item->goal_anim_state = LS_STOP; g_Lara.gun_status = LGS_HANDS_BUSY; diff --git a/src/game/objects/general/save_crystal.c b/src/game/objects/general/save_crystal.c index ed719bb1d..594863e7e 100644 --- a/src/game/objects/general/save_crystal.c +++ b/src/game/objects/general/save_crystal.c @@ -9,7 +9,7 @@ #include "global/const.h" #include "global/vars.h" -static const OBJECT_BOUNDS m_CrystalBounds = { +static const OBJECT_BOUNDS m_SaveCrystal_Bounds = { .shift = { .min = { .x = -256, .y = -100, .z = -256, }, .max = { .x = +256, .y = +100, .z = +256, }, @@ -20,6 +20,13 @@ static const OBJECT_BOUNDS m_CrystalBounds = { }, }; +static const OBJECT_BOUNDS *SaveCrystal_Bounds(void); + +static const OBJECT_BOUNDS *SaveCrystal_Bounds(void) +{ + return &m_SaveCrystal_Bounds; +} + void SaveCrystal_Setup(OBJECT_INFO *obj) { obj->initialise = SaveCrystal_Initialise; @@ -28,6 +35,7 @@ void SaveCrystal_Setup(OBJECT_INFO *obj) obj->collision = SaveCrystal_Collision; obj->save_flags = 1; } + obj->bounds = SaveCrystal_Bounds; } void SaveCrystal_Initialise(int16_t item_num) @@ -49,6 +57,7 @@ void SaveCrystal_Collision( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; Object_Collision(item_num, lara_item, coll); @@ -64,7 +73,7 @@ void SaveCrystal_Collision( item->rot.y = lara_item->rot.y; item->rot.z = 0; item->rot.x = 0; - if (!Lara_TestPosition(item, &m_CrystalBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } diff --git a/src/game/objects/general/scion.c b/src/game/objects/general/scion.c index 301629ed3..6f793d009 100644 --- a/src/game/objects/general/scion.c +++ b/src/game/objects/general/scion.c @@ -45,11 +45,25 @@ static const OBJECT_BOUNDS m_Scion_Bounds4 = { }, }; +static const OBJECT_BOUNDS *Scion_Bounds(void); +static const OBJECT_BOUNDS *Scion_Bounds4(void); + +static const OBJECT_BOUNDS *Scion_Bounds(void) +{ + return &m_Scion_Bounds; +} + +static const OBJECT_BOUNDS *Scion_Bounds4(void) +{ + return &m_Scion_Bounds4; +} + void Scion_Setup1(OBJECT_INFO *obj) { g_Objects[O_SCION_ITEM].draw_routine = Object_DrawPickupItem; g_Objects[O_SCION_ITEM].collision = Scion_Collision; g_Objects[O_SCION_ITEM].save_flags = 1; + g_Objects[O_SCION_ITEM].bounds = Scion_Bounds; } void Scion_Setup2(OBJECT_INFO *obj) @@ -57,6 +71,7 @@ void Scion_Setup2(OBJECT_INFO *obj) g_Objects[O_SCION_ITEM2].draw_routine = Object_DrawPickupItem; g_Objects[O_SCION_ITEM2].collision = Pickup_Collision; g_Objects[O_SCION_ITEM2].save_flags = 1; + g_Objects[O_SCION_ITEM2].bounds = Pickup_Bounds; } void Scion_Setup3(OBJECT_INFO *obj) @@ -71,6 +86,7 @@ void Scion_Setup4(OBJECT_INFO *obj) g_Objects[O_SCION_ITEM4].control = Scion_Control; g_Objects[O_SCION_ITEM4].collision = Scion_Collision4; g_Objects[O_SCION_ITEM4].save_flags = 1; + g_Objects[O_SCION_ITEM4].bounds = Scion_Bounds4; } void Scion_SetupHolder(OBJECT_INFO *obj) @@ -134,6 +150,7 @@ void Scion_Control3(int16_t item_num) void Scion_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; int16_t rotx = item->rot.x; int16_t roty = item->rot.y; int16_t rotz = item->rot.z; @@ -141,7 +158,7 @@ void Scion_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) item->rot.x = 0; item->rot.z = 0; - if (!Lara_TestPosition(item, &m_Scion_Bounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { goto cleanup; } @@ -179,6 +196,7 @@ void Scion_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) void Scion_Collision4(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; int16_t rotx = item->rot.x; int16_t roty = item->rot.y; int16_t rotz = item->rot.z; @@ -186,7 +204,7 @@ void Scion_Collision4(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) item->rot.x = 0; item->rot.z = 0; - if (!Lara_TestPosition(item, &m_Scion_Bounds4)) { + if (!Lara_TestPosition(item, obj->bounds())) { goto cleanup; } diff --git a/src/game/objects/general/switch.c b/src/game/objects/general/switch.c index 681763de2..8f76a9e08 100644 --- a/src/game/objects/general/switch.c +++ b/src/game/objects/general/switch.c @@ -41,12 +41,29 @@ static const OBJECT_BOUNDS m_Switch_BoundsUW = { }, }; +static const OBJECT_BOUNDS *Switch_Bounds(void); +static const OBJECT_BOUNDS *Switch_BoundsUW(void); + +static const OBJECT_BOUNDS *Switch_Bounds(void) +{ + if (g_Config.walk_to_items) { + return &m_Switch_BoundsControlled; + } + return &m_Switch_Bounds; +} + +static const OBJECT_BOUNDS *Switch_BoundsUW(void) +{ + return &m_Switch_BoundsUW; +} + void Switch_Setup(OBJECT_INFO *obj) { obj->control = Switch_Control; obj->collision = Switch_Collision; obj->save_anim = 1; obj->save_flags = 1; + obj->bounds = Switch_Bounds; } void Switch_SetupUW(OBJECT_INFO *obj) @@ -55,6 +72,7 @@ void Switch_SetupUW(OBJECT_INFO *obj) obj->collision = Switch_CollisionUW; obj->save_anim = 1; obj->save_flags = 1; + obj->bounds = Switch_BoundsUW; } void Switch_Control(int16_t item_num) @@ -76,6 +94,7 @@ void Switch_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) } ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (!g_Input.action || item->status != IS_NOT_ACTIVE || g_Lara.gun_status != LGS_ARMLESS || lara_item->gravity_status) { @@ -86,7 +105,7 @@ void Switch_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) return; } - if (!Lara_TestPosition(item, &m_Switch_Bounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } @@ -169,6 +188,7 @@ void Switch_CollisionControlled( void Switch_CollisionUW(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (!g_Input.action || item->status != IS_NOT_ACTIVE || g_Lara.water_status != LWS_UNDERWATER) { @@ -179,7 +199,7 @@ void Switch_CollisionUW(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) return; } - if (!Lara_TestPosition(item, &m_Switch_BoundsUW)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } diff --git a/src/game/objects/traps/midas_touch.c b/src/game/objects/traps/midas_touch.c index 6b33d5b80..4658a149a 100644 --- a/src/game/objects/traps/midas_touch.c +++ b/src/game/objects/traps/midas_touch.c @@ -15,7 +15,7 @@ #define MIDAS_RANGE_H (STEP_L * 2) #define MIDAS_RANGE_V (STEP_L * 3) -static const OBJECT_BOUNDS m_MidasBounds = { +static const OBJECT_BOUNDS m_MidasTouch_Bounds = { .shift = { .min = { .x = -700, .y = +384 - 100, .z = -700, }, .max = { .x = +700, .y = +384 + 100 + 512, .z = +700, }, @@ -26,16 +26,23 @@ static const OBJECT_BOUNDS m_MidasBounds = { }, }; +static const OBJECT_BOUNDS *MidasTouch_Bounds(void) +{ + return &m_MidasTouch_Bounds; +} + void MidasTouch_Setup(OBJECT_INFO *obj) { obj->collision = MidasTouch_Collision; obj->draw_routine = Object_DrawDummyItem; + obj->bounds = MidasTouch_Bounds; } void MidasTouch_Collision( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (lara_item->current_anim_state == LS_USE_MIDAS) { if (Item_TestFrameEqual(lara_item, LF_PICKUP_GOLD_BAR)) { @@ -90,7 +97,7 @@ void MidasTouch_Collision( break; } - if (!Lara_TestPosition(item, &m_MidasBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } diff --git a/src/game/objects/traps/movable_block.c b/src/game/objects/traps/movable_block.c index 8a29898ee..bf320955a 100644 --- a/src/game/objects/traps/movable_block.c +++ b/src/game/objects/traps/movable_block.c @@ -22,7 +22,7 @@ typedef enum { MBS_PULL = 3, } MOVABLE_BLOCK_STATE; -static const OBJECT_BOUNDS m_MovingBlockBounds = { +static const OBJECT_BOUNDS m_MovableBlock_Bounds = { .shift = { .min = { .x = -300, .y = 0, .z = -WALL_L / 2 - (LARA_RAD + 80), }, .max = { .x = +300, .y = 0, .z = -WALL_L / 2, }, @@ -33,6 +33,7 @@ static const OBJECT_BOUNDS m_MovingBlockBounds = { }, }; +static const OBJECT_BOUNDS *MovableBlock_Bounds(void); static bool MovableBlock_TestDoor(ITEM_INFO *lara_item, COLL_INFO *coll); static bool MovableBlock_TestDestination(ITEM_INFO *item, int32_t block_height); static bool MovableBlock_TestPush( @@ -40,6 +41,11 @@ static bool MovableBlock_TestPush( static bool MovableBlock_TestPull( ITEM_INFO *item, int32_t block_height, DIRECTION quadrant); +static const OBJECT_BOUNDS *MovableBlock_Bounds(void) +{ + return &m_MovableBlock_Bounds; +} + static bool MovableBlock_TestDoor(ITEM_INFO *lara_item, COLL_INFO *coll) { // OG fix: stop pushing blocks through doors @@ -216,6 +222,7 @@ void MovableBlock_Setup(OBJECT_INFO *obj) obj->save_position = 1; obj->save_anim = 1; obj->save_flags = 1; + obj->bounds = MovableBlock_Bounds; } void MovableBlock_Initialise(int16_t item_num) @@ -280,6 +287,7 @@ void MovableBlock_Collision( int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) { ITEM_INFO *item = &g_Items[item_num]; + const OBJECT_INFO *const obj = &g_Objects[item->object_number]; if (item->current_anim_state == MBS_STILL) { item->priv = (void *)false; @@ -312,7 +320,7 @@ void MovableBlock_Collision( break; } - if (!Lara_TestPosition(item, &m_MovingBlockBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } @@ -353,7 +361,7 @@ void MovableBlock_Collision( return; } - if (!Lara_TestPosition(item, &m_MovingBlockBounds)) { + if (!Lara_TestPosition(item, obj->bounds())) { return; } diff --git a/src/global/types.h b/src/global/types.h index 9679646f2..85139003b 100644 --- a/src/global/types.h +++ b/src/global/types.h @@ -1766,6 +1766,7 @@ typedef struct OBJECT_INFO { ITEM_INFO *item, int32_t x, int32_t y, int32_t z, int16_t *height); void (*draw_routine)(ITEM_INFO *item); void (*collision)(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll); + const OBJECT_BOUNDS *(*bounds)(void); int16_t anim_index; int16_t hit_points; int16_t pivot_length;