Skip to content

Commit

Permalink
objects: add bounds routine
Browse files Browse the repository at this point in the history
  • Loading branch information
rr- committed Apr 6, 2024
1 parent 292a567 commit a981a9a
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 19 deletions.
11 changes: 10 additions & 1 deletion src/game/objects/general/keyhole.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand Down
22 changes: 18 additions & 4 deletions src/game/objects/general/pickup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/game/objects/general/pickup.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <stdint.h>

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);
Expand Down
17 changes: 14 additions & 3 deletions src/game/objects/general/puzzle_hole.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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)
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
13 changes: 11 additions & 2 deletions src/game/objects/general/save_crystal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, },
Expand All @@ -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;
Expand All @@ -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)
Expand All @@ -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);

Expand All @@ -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;
}

Expand Down
22 changes: 20 additions & 2 deletions src/game/objects/general/scion.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,33 @@ 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)
{
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)
Expand All @@ -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)
Expand Down Expand Up @@ -134,14 +150,15 @@ 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;
item->rot.y = lara_item->rot.y;
item->rot.x = 0;
item->rot.z = 0;

if (!Lara_TestPosition(item, &m_Scion_Bounds)) {
if (!Lara_TestPosition(item, obj->bounds())) {
goto cleanup;
}

Expand Down Expand Up @@ -179,14 +196,15 @@ 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;
item->rot.y = lara_item->rot.y;
item->rot.x = 0;
item->rot.z = 0;

if (!Lara_TestPosition(item, &m_Scion_Bounds4)) {
if (!Lara_TestPosition(item, obj->bounds())) {
goto cleanup;
}

Expand Down
24 changes: 22 additions & 2 deletions src/game/objects/general/switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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) {
Expand All @@ -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;
}

Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
Loading

0 comments on commit a981a9a

Please sign in to comment.