From 9ef8f22f6de4511c377752380336be16d2f1947c Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 21 Sep 2024 11:07:34 +0200 Subject: [PATCH 1/7] console/cmd: move /fly to libtrx --- CHANGELOG.md | 1 + meson.build | 1 - src/game/console/cmd/fly.c | 22 ---------------------- src/game/console/cmd/fly.h | 5 ----- src/game/console/setup.c | 2 +- subprojects/libtrx | 2 +- 6 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 src/game/console/cmd/fly.c delete mode 100644 src/game/console/cmd/fly.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 337081067..267b0e289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ## [Unreleased](https://github.com/LostArtefacts/TR1X/compare/stable...develop) - ××××-××-×× +- fixed double "Fly mode enabled" message when using `/fly` console command (regression from 4.0) ## [4.4](https://github.com/LostArtefacts/TR1X/compare/4.3-102-g458cd96...4.4) - 2024-09-20 - added `/exit` command (#1462) diff --git a/meson.build b/meson.build index 03b5536d6..80ba99a58 100644 --- a/meson.build +++ b/meson.build @@ -108,7 +108,6 @@ sources = [ 'src/game/console/cmd/exit_game.c', 'src/game/console/cmd/exit_to_title.c', 'src/game/console/cmd/flipmap.c', - 'src/game/console/cmd/fly.c', 'src/game/console/cmd/fps.c', 'src/game/console/cmd/load_game.c', 'src/game/console/cmd/play_demo.c', diff --git a/src/game/console/cmd/fly.c b/src/game/console/cmd/fly.c deleted file mode 100644 index 5900ef5f3..000000000 --- a/src/game/console/cmd/fly.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "game/console/cmd/fly.h" - -#include "game/game.h" -#include "game/game_string.h" -#include "game/lara/lara_cheat.h" - -static COMMAND_RESULT M_Entrypoint(const char *const args); - -static COMMAND_RESULT M_Entrypoint(const char *const args) -{ - if (!Game_IsPlayable()) { - return CR_UNAVAILABLE; - } - Console_Log(GS(OSD_FLY_MODE_ON)); - Lara_Cheat_EnterFlyMode(); - return CR_SUCCESS; -} - -CONSOLE_COMMAND g_Console_Cmd_Fly = { - .prefix = "fly", - .proc = M_Entrypoint, -}; diff --git a/src/game/console/cmd/fly.h b/src/game/console/cmd/fly.h deleted file mode 100644 index 24e195a5f..000000000 --- a/src/game/console/cmd/fly.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -extern CONSOLE_COMMAND g_Console_Cmd_Fly; diff --git a/src/game/console/setup.c b/src/game/console/setup.c index 3cc728d26..5fe2de66b 100644 --- a/src/game/console/setup.c +++ b/src/game/console/setup.c @@ -7,7 +7,6 @@ #include "game/console/cmd/exit_game.h" #include "game/console/cmd/exit_to_title.h" #include "game/console/cmd/flipmap.h" -#include "game/console/cmd/fly.h" #include "game/console/cmd/fps.h" #include "game/console/cmd/load_game.h" #include "game/console/cmd/play_demo.h" @@ -19,6 +18,7 @@ #include "game/console/cmd/wireframe.h" #include +#include #include #include #include diff --git a/subprojects/libtrx b/subprojects/libtrx index 41cd1a09e..52fe1f64c 160000 --- a/subprojects/libtrx +++ b/subprojects/libtrx @@ -1 +1 @@ -Subproject commit 41cd1a09e3ea1c445df702cd9fa0d7682761459f +Subproject commit 52fe1f64cd32b27a11cf84f18725f27d02f218d1 From eb4f92d7c49493b9a013a3b995be6fa7f0d25620 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 21 Sep 2024 12:04:30 +0200 Subject: [PATCH 2/7] types: move many types to libtrx --- src/game/box.c | 102 +++--- src/game/box.h | 10 +- src/game/carrier.c | 3 +- src/game/collide.c | 18 +- src/game/console/cmd/teleport.c | 2 +- src/game/creature.c | 126 +++---- src/game/effect_routines/lara_effects.c | 8 +- src/game/effects.c | 4 +- src/game/effects/exploding_death.c | 6 +- src/game/gameflow.c | 16 +- src/game/gun/gun.c | 2 +- src/game/inject.c | 82 ++--- src/game/interpolation.c | 2 +- src/game/items.c | 49 ++- src/game/items.h | 9 +- src/game/lara/lara.c | 31 +- src/game/lara/lara_cheat.c | 2 +- src/game/lara/lara_control.c | 6 +- src/game/lara/lara_draw.c | 12 +- src/game/lara/lara_hair.c | 20 +- src/game/lara/lara_state.c | 2 +- src/game/level.c | 41 +-- src/game/lot.c | 36 +- src/game/objects/common.c | 15 +- src/game/objects/creatures/ape.c | 2 +- src/game/objects/creatures/bacon_lara.c | 4 +- src/game/objects/creatures/baldy.c | 2 +- src/game/objects/creatures/bat.c | 2 +- src/game/objects/creatures/bear.c | 2 +- src/game/objects/creatures/centaur.c | 2 +- src/game/objects/creatures/cowboy.c | 2 +- src/game/objects/creatures/crocodile.c | 16 +- src/game/objects/creatures/larson.c | 2 +- src/game/objects/creatures/lion.c | 6 +- src/game/objects/creatures/mummy.c | 2 +- src/game/objects/creatures/mutant.c | 16 +- src/game/objects/creatures/natla.c | 20 +- src/game/objects/creatures/pierre.c | 10 +- src/game/objects/creatures/pod.c | 4 +- src/game/objects/creatures/raptor.c | 2 +- src/game/objects/creatures/rat.c | 4 +- src/game/objects/creatures/skate_kid.c | 4 +- src/game/objects/creatures/statue.c | 4 +- src/game/objects/creatures/torso.c | 2 +- src/game/objects/creatures/trex.c | 4 +- src/game/objects/creatures/wolf.c | 2 +- src/game/objects/traps/lightning_emitter.c | 2 +- src/game/objects/traps/midas_touch.c | 2 + src/game/objects/traps/movable_block.c | 10 +- src/game/objects/traps/thors_hammer_handle.c | 2 +- src/game/overlay.c | 8 +- src/game/phase/phase_cutscene.c | 2 +- src/game/phase/phase_inventory.c | 7 +- src/game/room.c | 36 +- src/game/room_draw.c | 4 +- src/game/savegame/savegame.c | 12 +- src/game/savegame/savegame_bson.c | 6 +- src/game/savegame/savegame_legacy.c | 6 +- src/game/text.c | 2 +- src/global/types.h | 366 +------------------ src/global/vars.c | 6 +- src/global/vars.h | 6 +- subprojects/libtrx | 2 +- 63 files changed, 431 insertions(+), 766 deletions(-) diff --git a/src/game/box.c b/src/game/box.c index d12c1f19c..81935d193 100644 --- a/src/game/box.c +++ b/src/game/box.c @@ -7,25 +7,25 @@ #include -bool Box_SearchLOT(LOT_INFO *LOT, int32_t expansion) +bool Box_SearchLOT(LOT_INFO *lot, int32_t expansion) { int16_t *zone; - if (LOT->fly) { + if (lot->fly) { zone = g_FlyZone[g_FlipStatus]; - } else if (LOT->step == STEP_L) { + } else if (lot->step == STEP_L) { zone = g_GroundZone[g_FlipStatus]; } else { zone = g_GroundZone2[g_FlipStatus]; } - int16_t search_zone = zone[LOT->head]; + int16_t search_zone = zone[lot->head]; for (int i = 0; i < expansion; i++) { - if (LOT->head == NO_BOX) { + if (lot->head == NO_BOX) { return false; } - BOX_NODE *node = &LOT->node[LOT->head]; - BOX_INFO *box = &g_Boxes[LOT->head]; + BOX_NODE *node = &lot->node[lot->head]; + BOX_INFO *box = &g_Boxes[lot->head]; int done = 0; int index = box->overlap_index & OVERLAP_INDEX; @@ -41,11 +41,11 @@ bool Box_SearchLOT(LOT_INFO *LOT, int32_t expansion) } int change = g_Boxes[box_num].height - box->height; - if (change > LOT->step || change < LOT->drop) { + if (change > lot->step || change < lot->drop) { continue; } - BOX_NODE *expand = &LOT->node[box_num]; + BOX_NODE *expand = &lot->node[box_num]; if ((node->search_num & SEARCH_NUMBER) < (expand->search_num & SEARCH_NUMBER)) { continue; @@ -64,66 +64,66 @@ bool Box_SearchLOT(LOT_INFO *LOT, int32_t expansion) continue; } - if (g_Boxes[box_num].overlap_index & LOT->block_mask) { + if (g_Boxes[box_num].overlap_index & lot->block_mask) { expand->search_num = node->search_num | BLOCKED_SEARCH; } else { expand->search_num = node->search_num; - expand->exit_box = LOT->head; + expand->exit_box = lot->head; } } - if (expand->next_expansion == NO_BOX && box_num != LOT->tail) { - LOT->node[LOT->tail].next_expansion = box_num; - LOT->tail = box_num; + if (expand->next_expansion == NO_BOX && box_num != lot->tail) { + lot->node[lot->tail].next_expansion = box_num; + lot->tail = box_num; } } while (!done); - LOT->head = node->next_expansion; + lot->head = node->next_expansion; node->next_expansion = NO_BOX; } return true; } -bool Box_UpdateLOT(LOT_INFO *LOT, int32_t expansion) +bool Box_UpdateLOT(LOT_INFO *lot, int32_t expansion) { - if (LOT->required_box != NO_BOX && LOT->required_box != LOT->target_box) { - LOT->target_box = LOT->required_box; + if (lot->required_box != NO_BOX && lot->required_box != lot->target_box) { + lot->target_box = lot->required_box; - BOX_NODE *expand = &LOT->node[LOT->target_box]; - if (expand->next_expansion == NO_BOX && LOT->tail != LOT->target_box) { - expand->next_expansion = LOT->head; + BOX_NODE *expand = &lot->node[lot->target_box]; + if (expand->next_expansion == NO_BOX && lot->tail != lot->target_box) { + expand->next_expansion = lot->head; - if (LOT->head == NO_BOX) { - LOT->tail = LOT->target_box; + if (lot->head == NO_BOX) { + lot->tail = lot->target_box; } - LOT->head = LOT->target_box; + lot->head = lot->target_box; } - expand->search_num = ++LOT->search_num; + expand->search_num = ++lot->search_num; expand->exit_box = NO_BOX; } - return Box_SearchLOT(LOT, expansion); + return Box_SearchLOT(lot, expansion); } -void Box_TargetBox(LOT_INFO *LOT, int16_t box_num) +void Box_TargetBox(LOT_INFO *lot, int16_t box_num) { box_num &= BOX_NUMBER; BOX_INFO *box = &g_Boxes[box_num]; - LOT->target.z = box->left + WALL_L / 2 + lot->target.z = box->left + WALL_L / 2 + (Random_GetControl() * (box->right - box->left - WALL_L) >> 15); - LOT->target.x = box->top + WALL_L / 2 + lot->target.x = box->top + WALL_L / 2 + (Random_GetControl() * (box->bottom - box->top - WALL_L) >> 15); - LOT->required_box = box_num; + lot->required_box = box_num; - if (LOT->fly) { - LOT->target.y = box->height - STEP_L * 3 / 2; + if (lot->fly) { + lot->target.y = box->height - STEP_L * 3 / 2; } else { - LOT->target.y = box->height; + lot->target.y = box->height; } } @@ -180,9 +180,9 @@ bool Box_ValidBox(ITEM_INFO *item, int16_t zone_num, int16_t box_num) CREATURE_INFO *creature = item->data; int16_t *zone; - if (creature->LOT.fly) { + if (creature->lot.fly) { zone = g_FlyZone[g_FlipStatus]; - } else if (creature->LOT.step == STEP_L) { + } else if (creature->lot.step == STEP_L) { zone = g_GroundZone[g_FlipStatus]; } else { zone = g_GroundZone2[g_FlipStatus]; @@ -193,7 +193,7 @@ bool Box_ValidBox(ITEM_INFO *item, int16_t zone_num, int16_t box_num) } BOX_INFO *box = &g_Boxes[box_num]; - if (box->overlap_index & creature->LOT.block_mask) { + if (box->overlap_index & creature->lot.block_mask) { return false; } @@ -205,14 +205,14 @@ bool Box_ValidBox(ITEM_INFO *item, int16_t zone_num, int16_t box_num) return true; } -TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) +TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *lot) { int32_t left = 0; int32_t right = 0; int32_t top = 0; int32_t bottom = 0; - Box_UpdateLOT(LOT, MAX_EXPANSION); + Box_UpdateLOT(lot, MAX_EXPANSION); target->x = item->pos.x; target->y = item->pos.y; @@ -228,7 +228,7 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) do { box = &g_Boxes[box_num]; - if (LOT->fly) { + if (lot->fly) { if (target->y > box->height - WALL_L) { target->y = box->height - WALL_L; } @@ -358,9 +358,9 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) } } - if (box_num == LOT->target_box) { + if (box_num == lot->target_box) { if (prime_free & (CLIP_LEFT | CLIP_RIGHT)) { - target->z = LOT->target.z; + target->z = lot->target.z; } else if (!(prime_free & SECONDARY_CLIP)) { if (target->z < box->left + BIFF) { target->z = box->left + BIFF; @@ -370,7 +370,7 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) } if (prime_free & (CLIP_TOP | CLIP_BOTTOM)) { - target->x = LOT->target.x; + target->x = lot->target.x; } else if (!(prime_free & SECONDARY_CLIP)) { if (target->x < box->top + BIFF) { target->x = box->top + BIFF; @@ -379,13 +379,13 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) } } - target->y = LOT->target.y; + target->y = lot->target.y; return TARGET_PRIMARY; } - box_num = LOT->node[box_num].exit_box; + box_num = lot->node[box_num].exit_box; if (box_num != NO_BOX - && (g_Boxes[box_num].overlap_index & LOT->block_mask)) { + && (g_Boxes[box_num].overlap_index & lot->block_mask)) { break; } } while (box_num != NO_BOX); @@ -412,7 +412,7 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) } } - if (!LOT->fly) { + if (!lot->fly) { target->y = box->height; } else { target->y = box->height - STEP_L * 3 / 2; @@ -423,27 +423,27 @@ TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT) bool Box_BadFloor( int32_t x, int32_t y, int32_t z, int16_t box_height, int16_t next_height, - int16_t room_num, LOT_INFO *LOT) + int16_t room_num, LOT_INFO *lot) { const SECTOR_INFO *const sector = Room_GetSector(x, y, z, &room_num); if (sector->box == NO_BOX) { return true; } - if (g_Boxes[sector->box].overlap_index & LOT->block_mask) { + if (g_Boxes[sector->box].overlap_index & lot->block_mask) { return true; } const int32_t height = g_Boxes[sector->box].height; - if (box_height - height > LOT->step || box_height - height < LOT->drop) { + if (box_height - height > lot->step || box_height - height < lot->drop) { return true; } - if (box_height - height < -LOT->step && height > next_height) { + if (box_height - height < -lot->step && height > next_height) { return true; } - if (LOT->fly && y > height + LOT->fly) { + if (lot->fly && y > height + lot->fly) { return true; } diff --git a/src/game/box.h b/src/game/box.h index 5dbe9a5b7..1babbd430 100644 --- a/src/game/box.h +++ b/src/game/box.h @@ -5,13 +5,13 @@ #include #include -bool Box_SearchLOT(LOT_INFO *LOT, int32_t expansion); -bool Box_UpdateLOT(LOT_INFO *LOT, int32_t expansion); -void Box_TargetBox(LOT_INFO *LOT, int16_t box_num); +bool Box_SearchLOT(LOT_INFO *lot, int32_t expansion); +bool Box_UpdateLOT(LOT_INFO *lot, int32_t expansion); +void Box_TargetBox(LOT_INFO *lot, int16_t box_num); bool Box_StalkBox(ITEM_INFO *item, int16_t box_num); bool Box_EscapeBox(ITEM_INFO *item, int16_t box_num); bool Box_ValidBox(ITEM_INFO *item, int16_t zone_num, int16_t box_num); -TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *LOT); +TARGET_TYPE Box_CalculateTarget(XYZ_32 *target, ITEM_INFO *item, LOT_INFO *lot); bool Box_BadFloor( int32_t x, int32_t y, int32_t z, int16_t box_height, int16_t next_height, - int16_t room_num, LOT_INFO *LOT); + int16_t room_num, LOT_INFO *lot); diff --git a/src/game/carrier.c b/src/game/carrier.c index e2f7ff8c4..723abb66d 100644 --- a/src/game/carrier.c +++ b/src/game/carrier.c @@ -151,7 +151,8 @@ void Carrier_TestItemDrops(int16_t item_num) ITEM_INFO *carrier = &g_Items[item_num]; CARRIED_ITEM *item = carrier->carried_item; if (carrier->hit_points > 0 || !item - || (carrier->object_id == O_PIERRE && !(carrier->flags & IF_ONESHOT))) { + || (carrier->object_id == O_PIERRE + && !(carrier->flags & IF_ONE_SHOT))) { return; } diff --git a/src/game/collide.c b/src/game/collide.c index e637483b3..60e82fad0 100644 --- a/src/game/collide.c +++ b/src/game/collide.c @@ -261,6 +261,9 @@ void Collide_GetCollisionInfo( coll->shift.x = Room_FindGridShift(xpos + xfront, xpos); coll->shift.z = coll->old.z - zpos; break; + + default: + break; } coll->coll_type = COLL_FRONT; @@ -286,6 +289,9 @@ void Collide_GetCollisionInfo( case DIR_WEST: coll->shift.z = Room_FindGridShift(zpos + zleft, zpos + zfront); break; + + default: + break; } coll->coll_type = COLL_LEFT; @@ -304,6 +310,9 @@ void Collide_GetCollisionInfo( case DIR_WEST: coll->shift.z = Room_FindGridShift(zpos + zright, zpos + zfront); break; + + default: + break; } coll->coll_type = COLL_RIGHT; @@ -463,6 +472,9 @@ bool Collide_CollideStaticObjects( coll->coll_type = COLL_RIGHT; } break; + + default: + break; } coll->hit_static = 1; @@ -506,8 +518,8 @@ int32_t Collide_GetSpheres(ITEM_INFO *item, SPHERE *ptr, int32_t world_space) Matrix_RotYXZpack(*packed_rotation++); OBJECT_INFO *object = &g_Objects[item->object_id]; - int16_t **meshpp = &g_Meshes[object->mesh_index]; - int32_t *bone = &g_AnimBones[object->bone_index]; + int16_t **meshpp = &g_Meshes[object->mesh_idx]; + int32_t *bone = &g_AnimBones[object->bone_idx]; int16_t *objptr = *meshpp++; Matrix_Push(); @@ -608,7 +620,7 @@ void Collide_GetJointAbsPosition(ITEM_INFO *item, XYZ_32 *vec, int32_t joint) int32_t *packed_rotation = frame->mesh_rots; Matrix_RotYXZpack(*packed_rotation++); - int32_t *bone = &g_AnimBones[object->bone_index]; + int32_t *bone = &g_AnimBones[object->bone_idx]; int16_t *extra_rotation = (int16_t *)item->data; for (int i = 0; i < joint; i++) { diff --git a/src/game/console/cmd/teleport.c b/src/game/console/cmd/teleport.c index 4a24cb673..082671017 100644 --- a/src/game/console/cmd/teleport.c +++ b/src/game/console/cmd/teleport.c @@ -111,7 +111,7 @@ static COMMAND_RESULT M_Entrypoint(const char *const args) continue; } - if (item->flags & IF_KILLED_ITEM) { + if (item->flags & IF_KILLED) { continue; } diff --git a/src/game/creature.c b/src/game/creature.c index b2cd50c06..658e2a9d3 100644 --- a/src/game/creature.c +++ b/src/game/creature.c @@ -44,9 +44,9 @@ void Creature_AIInfo(ITEM_INFO *item, AI_INFO *info) } int16_t *zone; - if (creature->LOT.fly) { + if (creature->lot.fly) { zone = g_FlyZone[g_FlipStatus]; - } else if (creature->LOT.step == STEP_L) { + } else if (creature->lot.step == STEP_L) { zone = g_GroundZone[g_FlipStatus]; } else { zone = g_GroundZone2[g_FlipStatus]; @@ -64,11 +64,11 @@ void Creature_AIInfo(ITEM_INFO *item, AI_INFO *info) g_LaraItem->box_num = r->sectors[z_sector + x_sector * r->z_size].box; info->enemy_zone = zone[g_LaraItem->box_num]; - if (g_Boxes[g_LaraItem->box_num].overlap_index & creature->LOT.block_mask) { + if (g_Boxes[g_LaraItem->box_num].overlap_index & creature->lot.block_mask) { info->enemy_zone |= BLOCKED; } else if ( - creature->LOT.node[item->box_num].search_num - == (creature->LOT.search_num | BLOCKED_SEARCH)) { + creature->lot.node[item->box_num].search_num + == (creature->lot.search_num | BLOCKED_SEARCH)) { info->enemy_zone |= BLOCKED; } @@ -99,18 +99,18 @@ void Creature_Mood(ITEM_INFO *item, AI_INFO *info, bool violent) return; } - LOT_INFO *LOT = &creature->LOT; - if (LOT->node[item->box_num].search_num - == (LOT->search_num | BLOCKED_SEARCH)) { - LOT->required_box = NO_BOX; + LOT_INFO *lot = &creature->lot; + if (lot->node[item->box_num].search_num + == (lot->search_num | BLOCKED_SEARCH)) { + lot->required_box = NO_BOX; } - if (creature->mood != MOOD_ATTACK && LOT->required_box != NO_BOX - && !Box_ValidBox(item, info->zone_num, LOT->target_box)) { + if (creature->mood != MOOD_ATTACK && lot->required_box != NO_BOX + && !Box_ValidBox(item, info->zone_num, lot->target_box)) { if (info->zone_num == info->enemy_zone) { creature->mood = MOOD_BORED; } - LOT->required_box = NO_BOX; + lot->required_box = NO_BOX; } MOOD_TYPE mood = creature->mood; @@ -161,7 +161,7 @@ void Creature_Mood(ITEM_INFO *item, AI_INFO *info, bool violent) } else if (info->zone_num == info->enemy_zone) { if (info->distance < ATTACK_RANGE || (creature->mood == MOOD_STALK - && LOT->required_box == NO_BOX)) { + && lot->required_box == NO_BOX)) { creature->mood = MOOD_ATTACK; } else { creature->mood = MOOD_STALK; @@ -180,50 +180,50 @@ void Creature_Mood(ITEM_INFO *item, AI_INFO *info, bool violent) if (mood != creature->mood) { if (mood == MOOD_ATTACK) { - Box_TargetBox(LOT, LOT->target_box); + Box_TargetBox(lot, lot->target_box); } - LOT->required_box = NO_BOX; + lot->required_box = NO_BOX; } switch (creature->mood) { case MOOD_ATTACK: if (Random_GetControl() < g_Objects[item->object_id].smartness) { - LOT->target.x = g_LaraItem->pos.x; - LOT->target.y = g_LaraItem->pos.y; - LOT->target.z = g_LaraItem->pos.z; - LOT->required_box = g_LaraItem->box_num; - if (LOT->fly && g_Lara.water_status == LWS_ABOVE_WATER) { + lot->target.x = g_LaraItem->pos.x; + lot->target.y = g_LaraItem->pos.y; + lot->target.z = g_LaraItem->pos.z; + lot->required_box = g_LaraItem->box_num; + if (lot->fly && g_Lara.water_status == LWS_ABOVE_WATER) { const FRAME_INFO *const frame = Item_GetBestFrame(g_LaraItem); - LOT->target.y += frame->bounds.min.y; + lot->target.y += frame->bounds.min.y; } } break; case MOOD_BORED: { int box_num = - LOT->node[Random_GetControl() * LOT->zone_count / 0x7FFF].box_num; + lot->node[Random_GetControl() * lot->zone_count / 0x7FFF].box_num; if (Box_ValidBox(item, info->zone_num, box_num)) { if (Box_StalkBox(item, box_num)) { - Box_TargetBox(LOT, box_num); + Box_TargetBox(lot, box_num); creature->mood = MOOD_STALK; - } else if (LOT->required_box == NO_BOX) { - Box_TargetBox(LOT, box_num); + } else if (lot->required_box == NO_BOX) { + Box_TargetBox(lot, box_num); } } break; } case MOOD_STALK: { - if (LOT->required_box == NO_BOX - || !Box_StalkBox(item, LOT->required_box)) { + if (lot->required_box == NO_BOX + || !Box_StalkBox(item, lot->required_box)) { int box_num = - LOT->node[Random_GetControl() * LOT->zone_count / 0x7FFF] + lot->node[Random_GetControl() * lot->zone_count / 0x7FFF] .box_num; if (Box_ValidBox(item, info->zone_num, box_num)) { if (Box_StalkBox(item, box_num)) { - Box_TargetBox(LOT, box_num); - } else if (LOT->required_box == NO_BOX) { - Box_TargetBox(LOT, box_num); + Box_TargetBox(lot, box_num); + } else if (lot->required_box == NO_BOX) { + Box_TargetBox(lot, box_num); if (info->zone_num != info->enemy_zone) { creature->mood = MOOD_BORED; } @@ -235,15 +235,15 @@ void Creature_Mood(ITEM_INFO *item, AI_INFO *info, bool violent) case MOOD_ESCAPE: { int box_num = - LOT->node[Random_GetControl() * LOT->zone_count / 0x7FFF].box_num; + lot->node[Random_GetControl() * lot->zone_count / 0x7FFF].box_num; if (Box_ValidBox(item, info->zone_num, box_num) - && LOT->required_box == NO_BOX) { + && lot->required_box == NO_BOX) { if (Box_EscapeBox(item, box_num)) { - Box_TargetBox(LOT, box_num); + Box_TargetBox(lot, box_num); } else if ( info->zone_num == info->enemy_zone && Box_StalkBox(item, box_num)) { - Box_TargetBox(LOT, box_num); + Box_TargetBox(lot, box_num); creature->mood = MOOD_STALK; } } @@ -251,11 +251,11 @@ void Creature_Mood(ITEM_INFO *item, AI_INFO *info, bool violent) } } - if (LOT->target_box == NO_BOX) { - Box_TargetBox(LOT, item->box_num); + if (lot->target_box == NO_BOX) { + Box_TargetBox(lot, item->box_num); } - Box_CalculateTarget(&creature->target, item, &creature->LOT); + Box_CalculateTarget(&creature->target, item, &creature->lot); } int16_t Creature_Turn(ITEM_INFO *item, int16_t maximum_turn) @@ -399,7 +399,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) if (!creature) { return false; } - LOT_INFO *LOT = &creature->LOT; + LOT_INFO *lot = &creature->lot; XYZ_32 old = { .x = item->pos.x, @@ -410,9 +410,9 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) int32_t box_height = g_Boxes[item->box_num].height; int16_t *zone; - if (LOT->fly) { + if (lot->fly) { zone = g_FlyZone[g_FlipStatus]; - } else if (LOT->step == STEP_L) { + } else if (lot->step == STEP_L) { zone = g_GroundZone[g_FlipStatus]; } else { zone = g_GroundZone2[g_FlipStatus]; @@ -435,7 +435,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) const SECTOR_INFO *sector = Room_GetSector(item->pos.x, y, item->pos.z, &room_num); int32_t height = g_Boxes[sector->box].height; - int16_t next_box = LOT->node[sector->box].exit_box; + int16_t next_box = lot->node[sector->box].exit_box; int32_t next_height; if (next_box != NO_BOX) { next_height = g_Boxes[next_box].height; @@ -448,7 +448,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) int32_t shift_x; int32_t shift_z; if (sector->box == NO_BOX || zone[item->box_num] != zone[sector->box] - || box_height - height > LOT->step || box_height - height < LOT->drop) { + || box_height - height > lot->step || box_height - height < lot->drop) { pos_x = item->pos.x >> WALL_SHIFT; shift_x = old.x >> WALL_SHIFT; @@ -468,7 +468,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) sector = Room_GetSector(item->pos.x, y, item->pos.z, &room_num); height = g_Boxes[sector->box].height; - next_box = LOT->node[sector->box].exit_box; + next_box = lot->node[sector->box].exit_box; if (next_box != NO_BOX) { next_height = g_Boxes[next_box].height; } else { @@ -488,19 +488,19 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) if (pos_z < radius) { if (Box_BadFloor( - x, y, z - radius, height, next_height, room_num, LOT)) { + x, y, z - radius, height, next_height, room_num, lot)) { shift_z = radius - pos_z; } if (pos_x < radius) { if (Box_BadFloor( - x - radius, y, z, height, next_height, room_num, LOT)) { + x - radius, y, z, height, next_height, room_num, lot)) { shift_x = radius - pos_x; } else if ( !shift_z && Box_BadFloor( x - radius, y, z - radius, height, next_height, room_num, - LOT)) { + lot)) { if (item->rot.y > -PHD_135 && item->rot.y < PHD_45) { shift_z = radius - pos_z; } else { @@ -509,13 +509,13 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) } } else if (pos_x > WALL_L - radius) { if (Box_BadFloor( - x + radius, y, z, height, next_height, room_num, LOT)) { + x + radius, y, z, height, next_height, room_num, lot)) { shift_x = WALL_L - radius - pos_x; } else if ( !shift_z && Box_BadFloor( x + radius, y, z - radius, height, next_height, room_num, - LOT)) { + lot)) { if (item->rot.y > -PHD_45 && item->rot.y < PHD_135) { shift_z = radius - pos_z; } else { @@ -525,19 +525,19 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) } } else if (pos_z > WALL_L - radius) { if (Box_BadFloor( - x, y, z + radius, height, next_height, room_num, LOT)) { + x, y, z + radius, height, next_height, room_num, lot)) { shift_z = WALL_L - radius - pos_z; } if (pos_x < radius) { if (Box_BadFloor( - x - radius, y, z, height, next_height, room_num, LOT)) { + x - radius, y, z, height, next_height, room_num, lot)) { shift_x = radius - pos_x; } else if ( !shift_z && Box_BadFloor( x - radius, y, z + radius, height, next_height, room_num, - LOT)) { + lot)) { if (item->rot.y > -PHD_45 && item->rot.y < PHD_135) { shift_x = radius - pos_x; } else { @@ -546,13 +546,13 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) } } else if (pos_x > WALL_L - radius) { if (Box_BadFloor( - x + radius, y, z, height, next_height, room_num, LOT)) { + x + radius, y, z, height, next_height, room_num, lot)) { shift_x = WALL_L - radius - pos_x; } else if ( !shift_z && Box_BadFloor( x + radius, y, z + radius, height, next_height, room_num, - LOT)) { + lot)) { if (item->rot.y > -PHD_135 && item->rot.y < PHD_45) { shift_x = WALL_L - radius - pos_x; } else { @@ -562,12 +562,12 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) } } else if (pos_x < radius) { if (Box_BadFloor( - x - radius, y, z, height, next_height, room_num, LOT)) { + x - radius, y, z, height, next_height, room_num, lot)) { shift_x = radius - pos_x; } } else if (pos_x > WALL_L - radius) { if (Box_BadFloor( - x + radius, y, z, height, next_height, room_num, LOT)) { + x + radius, y, z, height, next_height, room_num, lot)) { shift_x = WALL_L - radius - pos_x; } } @@ -589,12 +589,12 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) return true; } - if (LOT->fly) { + if (lot->fly) { int32_t dy = creature->target.y - item->pos.y; - if (dy > LOT->fly) { - dy = LOT->fly; - } else if (dy < -LOT->fly) { - dy = -LOT->fly; + if (dy > lot->fly) { + dy = lot->fly; + } else if (dy < -lot->fly) { + dy = -lot->fly; } height = Room_GetHeight(sector, item->pos.x, y, item->pos.z); @@ -602,7 +602,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) if (item->pos.y > height) { item->pos.x = old.x; item->pos.z = old.z; - dy = -LOT->fly; + dy = -lot->fly; } else { dy = 0; item->pos.y = height; @@ -616,7 +616,7 @@ bool Creature_Animate(int16_t item_num, int16_t angle, int16_t tilt) if (item->pos.y + min_y < ceiling) { item->pos.x = old.x; item->pos.z = old.z; - dy = LOT->fly; + dy = lot->fly; } else { dy = 0; } diff --git a/src/game/effect_routines/lara_effects.c b/src/game/effect_routines/lara_effects.c index 500cbfee8..ae4e49763 100644 --- a/src/game/effect_routines/lara_effects.c +++ b/src/game/effect_routines/lara_effects.c @@ -29,10 +29,10 @@ void FX_LaraDrawRightGun(ITEM_INFO *item) OBJECT_INFO *obj2 = &g_Objects[O_PISTOL_ANIM]; SWAP( - g_Meshes[obj->mesh_index + LM_THIGH_R], - g_Meshes[obj2->mesh_index + LM_THIGH_R], tmp_mesh); + g_Meshes[obj->mesh_idx + LM_THIGH_R], + g_Meshes[obj2->mesh_idx + LM_THIGH_R], tmp_mesh); SWAP( - g_Meshes[obj->mesh_index + LM_HAND_R], - g_Meshes[obj2->mesh_index + LM_HAND_R], tmp_mesh); + g_Meshes[obj->mesh_idx + LM_HAND_R], + g_Meshes[obj2->mesh_idx + LM_HAND_R], tmp_mesh); } diff --git a/src/game/effects.c b/src/game/effects.c index d58895080..9891303a9 100644 --- a/src/game/effects.c +++ b/src/game/effects.c @@ -130,7 +130,7 @@ void Effect_Draw(const int16_t fxnum) if (object->nmeshes < 0) { Output_DrawSprite( fx->interp.result.pos.x, fx->interp.result.pos.y, - fx->interp.result.pos.z, object->mesh_index - fx->frame_num, 4096); + fx->interp.result.pos.z, object->mesh_idx - fx->frame_num, 4096); } else { Matrix_Push(); Matrix_TranslateAbs( @@ -143,7 +143,7 @@ void Effect_Draw(const int16_t fxnum) fx->interp.result.rot.z); if (object->nmeshes) { Output_CalculateStaticLight(fx->shade); - Output_DrawPolygons(g_Meshes[object->mesh_index], -1); + Output_DrawPolygons(g_Meshes[object->mesh_idx], -1); } else { Output_CalculateLight( fx->interp.result.pos.x, fx->interp.result.pos.y, diff --git a/src/game/effects/exploding_death.c b/src/game/effects/exploding_death.c index 8c3f73ba6..eb1645af4 100644 --- a/src/game/effects/exploding_death.c +++ b/src/game/effects/exploding_death.c @@ -23,7 +23,7 @@ int32_t Effect_ExplodingDeath( int32_t *packed_rotation = frame->mesh_rots; Matrix_RotYXZpack(*packed_rotation++); - int32_t *bone = &g_AnimBones[object->bone_index]; + int32_t *bone = &g_AnimBones[object->bone_idx]; #if 0 // XXX: present in OG, removed by GLrage on the grounds that it sometimes // crashes. @@ -48,7 +48,7 @@ int32_t Effect_ExplodingDeath( fx->fall_speed = -Random_GetControl() >> 8; } fx->counter = damage; - fx->frame_num = object->mesh_index; + fx->frame_num = object->mesh_idx; fx->object_id = O_BODY_PART; } item->mesh_bits -= bit; @@ -101,7 +101,7 @@ int32_t Effect_ExplodingDeath( } fx->counter = damage; fx->object_id = O_BODY_PART; - fx->frame_num = object->mesh_index + i; + fx->frame_num = object->mesh_idx + i; } item->mesh_bits -= bit; } diff --git a/src/game/gameflow.c b/src/game/gameflow.c index a94454eab..cce8b0822 100644 --- a/src/game/gameflow.c +++ b/src/game/gameflow.c @@ -1304,15 +1304,15 @@ GameFlow_InterpretSequence(int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type) int16_t *temp; temp = g_Meshes - [g_Objects[swap_data->object1_id].mesh_index + [g_Objects[swap_data->object1_id].mesh_idx + swap_data->mesh_num]; g_Meshes - [g_Objects[swap_data->object1_id].mesh_index + [g_Objects[swap_data->object1_id].mesh_idx + swap_data->mesh_num] = g_Meshes - [g_Objects[swap_data->object2_id].mesh_index + [g_Objects[swap_data->object2_id].mesh_idx + swap_data->mesh_num]; g_Meshes - [g_Objects[swap_data->object2_id].mesh_index + [g_Objects[swap_data->object2_id].mesh_idx + swap_data->mesh_num] = temp; break; } @@ -1432,15 +1432,15 @@ GameFlow_StorySoFar(int32_t level_num, int32_t savegame_level) case GFS_MESH_SWAP: { GAMEFLOW_MESH_SWAP_DATA *swap_data = seq->data; int16_t *temp = g_Meshes - [g_Objects[swap_data->object1_id].mesh_index + [g_Objects[swap_data->object1_id].mesh_idx + swap_data->mesh_num]; g_Meshes - [g_Objects[swap_data->object1_id].mesh_index + [g_Objects[swap_data->object1_id].mesh_idx + swap_data->mesh_num] = g_Meshes - [g_Objects[swap_data->object2_id].mesh_index + [g_Objects[swap_data->object2_id].mesh_idx + swap_data->mesh_num]; g_Meshes - [g_Objects[swap_data->object2_id].mesh_index + [g_Objects[swap_data->object2_id].mesh_idx + swap_data->mesh_num] = temp; break; } diff --git a/src/game/gun/gun.c b/src/game/gun/gun.c index 6d1f7e6cf..a4c0d7366 100644 --- a/src/game/gun/gun.c +++ b/src/game/gun/gun.c @@ -286,7 +286,7 @@ void Gun_DrawFlash(LARA_GUN_TYPE weapon_type, int32_t clip) Matrix_RotYXZ(0, -90 * PHD_DEGREE, (PHD_ANGLE)(Random_GetDraw() * 2)); Output_CalculateStaticLight(light); if (g_Objects[O_GUN_FLASH].loaded) { - Output_DrawPolygons(g_Meshes[g_Objects[O_GUN_FLASH].mesh_index], clip); + Output_DrawPolygons(g_Meshes[g_Objects[O_GUN_FLASH].mesh_idx], clip); } } diff --git a/src/game/inject.c b/src/game/inject.c index e5add3ac4..f7fc86d61 100644 --- a/src/game/inject.c +++ b/src/game/inject.c @@ -82,7 +82,7 @@ typedef struct VERTEX_EDIT { typedef struct MESH_EDIT { GAME_OBJECT_ID object_id; - int16_t mesh_index; + int16_t mesh_idx; XYZ_16 centre_shift; int32_t radius_shift; int32_t face_edit_count; @@ -445,17 +445,17 @@ static void M_TextureData( for (int32_t i = 0; i < inj_info->sprite_count; i++) { const GAME_OBJECT_ID object_id = VFile_ReadS32(fp); const int16_t num_meshes = VFile_ReadS16(fp); - const int16_t mesh_index = VFile_ReadS16(fp); + const int16_t mesh_idx = VFile_ReadS16(fp); if (object_id < O_NUMBER_OF) { OBJECT_INFO *object = &g_Objects[object_id]; object->nmeshes = num_meshes; - object->mesh_index = mesh_index + level_info->sprite_info_count; + object->mesh_idx = mesh_idx + level_info->sprite_info_count; object->loaded = 1; } else if (object_id - O_NUMBER_OF < STATIC_NUMBER_OF) { STATIC_INFO *object = &g_StaticObjects[object_id - O_NUMBER_OF]; object->nmeshes = num_meshes; - object->mesh_num = mesh_index + level_info->sprite_info_count; + object->mesh_num = mesh_idx + level_info->sprite_info_count; object->loaded = true; } level_info->sprite_info_count -= num_meshes; @@ -497,14 +497,14 @@ static void M_AnimData(INJECTION *injection, LEVEL_INFO *level_info) VFILE *const fp = injection->fp; for (int32_t i = 0; i < inj_info->anim_change_count; i++) { - ANIM_CHANGE_STRUCT *anim_change = + ANIM_CHANGE *anim_change = &g_AnimChanges[level_info->anim_change_count + i]; anim_change->goal_anim_state = VFile_ReadS16(fp); - anim_change->number_ranges = VFile_ReadS16(fp); - anim_change->range_index = VFile_ReadS16(fp); + anim_change->num_ranges = VFile_ReadS16(fp); + anim_change->range_idx = VFile_ReadS16(fp); } for (int32_t i = 0; i < inj_info->anim_range_count; i++) { - ANIM_RANGE_STRUCT *anim_range = + ANIM_RANGE *anim_range = &g_AnimRanges[level_info->anim_range_count + i]; anim_range->start_frame = VFile_ReadS16(fp); anim_range->end_frame = VFile_ReadS16(fp); @@ -546,7 +546,7 @@ static void M_AnimData(INJECTION *injection, LEVEL_INFO *level_info) assert(VFile_GetPos(fp) == frame_data_end); for (int32_t i = 0; i < inj_info->anim_count; i++) { - ANIM_STRUCT *anim = &g_Anims[level_info->anim_count + i]; + ANIM *anim = &g_Anims[level_info->anim_count + i]; anim->frame_ofs = VFile_ReadU32(fp); anim->interpolation = VFile_ReadS16(fp); @@ -557,10 +557,10 @@ static void M_AnimData(INJECTION *injection, LEVEL_INFO *level_info) anim->frame_end = VFile_ReadS16(fp); anim->jump_anim_num = VFile_ReadS16(fp); anim->jump_frame_num = VFile_ReadS16(fp); - anim->number_changes = VFile_ReadS16(fp); - anim->change_index = VFile_ReadS16(fp); - anim->number_commands = VFile_ReadS16(fp); - anim->command_index = VFile_ReadS16(fp); + anim->num_changes = VFile_ReadS16(fp); + anim->change_idx = VFile_ReadS16(fp); + anim->num_commands = VFile_ReadS16(fp); + anim->command_idx = VFile_ReadS16(fp); // Re-align to the level. anim->jump_anim_num += level_info->anim_count; @@ -576,17 +576,17 @@ static void M_AnimData(INJECTION *injection, LEVEL_INFO *level_info) } anim->frame_ofs += level_info->anim_frame_data_count * 2; assert(found); - if (anim->number_changes) { - anim->change_index += level_info->anim_change_count; + if (anim->num_changes) { + anim->change_idx += level_info->anim_change_count; } - if (anim->number_commands) { - anim->command_index += level_info->anim_command_count; + if (anim->num_commands) { + anim->command_idx += level_info->anim_command_count; } } // Re-align to the level. for (int32_t i = 0; i < inj_info->anim_change_count; i++) { - g_AnimChanges[level_info->anim_change_count++].range_index += + g_AnimChanges[level_info->anim_change_count++].range_idx += level_info->anim_range_count; } @@ -611,7 +611,7 @@ static void M_AnimRangeEdits(INJECTION *injection) for (int32_t i = 0; i < inj_info->anim_range_edit_count; i++) { const GAME_OBJECT_ID object_id = VFile_ReadS32(fp); - const int16_t anim_index = VFile_ReadS16(fp); + const int16_t anim_idx = VFile_ReadS16(fp); const int32_t edit_count = VFile_ReadS32(fp); if (object_id < 0 || object_id >= O_NUMBER_OF) { @@ -627,30 +627,28 @@ static void M_AnimRangeEdits(INJECTION *injection) continue; } - ANIM_STRUCT *anim = &g_Anims[object->anim_index + anim_index]; + ANIM *anim = &g_Anims[object->anim_idx + anim_idx]; for (int32_t j = 0; j < edit_count; j++) { - const int16_t change_index = VFile_ReadS16(fp); - const int16_t range_index = VFile_ReadS16(fp); + const int16_t change_idx = VFile_ReadS16(fp); + const int16_t range_idx = VFile_ReadS16(fp); const int16_t low_frame = VFile_ReadS16(fp); const int16_t high_frame = VFile_ReadS16(fp); - if (change_index >= anim->number_changes) { + if (change_idx >= anim->num_changes) { LOG_WARNING( - "Change %d is invalid for animation %d", change_index, - anim_index); + "Change %d is invalid for animation %d", change_idx, + anim_idx); continue; } - ANIM_CHANGE_STRUCT *change = - &g_AnimChanges[anim->change_index + change_index]; + ANIM_CHANGE *change = &g_AnimChanges[anim->change_idx + change_idx]; - if (range_index >= change->number_ranges) { + if (range_idx >= change->num_ranges) { LOG_WARNING( "Range %d is invalid for change %d, animation %d", - range_index, change_index, anim_index); + range_idx, change_idx, anim_idx); continue; } - ANIM_RANGE_STRUCT *range = - &g_AnimRanges[change->range_index + range_index]; + ANIM_RANGE *range = &g_AnimRanges[change->range_idx + range_idx]; range->start_frame = low_frame; range->end_frame = high_frame; @@ -675,21 +673,21 @@ static void M_ObjectData( OBJECT_INFO *object = &g_Objects[object_id]; const int16_t num_meshes = VFile_ReadS16(fp); - const int16_t mesh_index = VFile_ReadS16(fp); - const int32_t bone_index = VFile_ReadS32(fp); + const int16_t mesh_idx = VFile_ReadS16(fp); + const int32_t bone_idx = VFile_ReadS32(fp); // When mesh data has been omitted from the injection, this indicates // that we wish to retain what's already defined so to avoid duplicate // packing. if (!object->loaded || num_meshes) { object->nmeshes = num_meshes; - object->mesh_index = mesh_index + level_info->mesh_ptr_count; - object->bone_index = bone_index + level_info->anim_bone_count; + object->mesh_idx = mesh_idx + level_info->mesh_ptr_count; + object->bone_idx = bone_idx + level_info->anim_bone_count; } const int32_t frame_offset = VFile_ReadS32(fp); - object->anim_index = VFile_ReadS16(fp); - object->anim_index += level_info->anim_count; + object->anim_idx = VFile_ReadS16(fp); + object->anim_idx += level_info->anim_count; object->loaded = 1; if (inj_info->anim_frame_count > 0) { @@ -756,7 +754,7 @@ static void M_SFXData(INJECTION *injection, LEVEL_INFO *level_info) static void M_AlignTextureReferences( OBJECT_INFO *object, uint16_t *palette_map, int32_t page_base) { - int16_t **mesh = &g_Meshes[object->mesh_index]; + int16_t **mesh = &g_Meshes[object->mesh_idx]; for (int32_t i = 0; i < object->nmeshes; i++) { int16_t *data_ptr = *mesh++; data_ptr += 5; // Skip centre and collision radius @@ -832,7 +830,7 @@ static void M_MeshEdits(INJECTION *injection, uint16_t *palette_map) for (int32_t i = 0; i < inj_info->mesh_edit_count; i++) { MESH_EDIT *mesh_edit = &mesh_edits[i]; mesh_edit->object_id = VFile_ReadS32(fp); - mesh_edit->mesh_index = VFile_ReadS16(fp); + mesh_edit->mesh_idx = VFile_ReadS16(fp); if (injection->version >= INJ_VERSION_6) { mesh_edit->centre_shift.x = VFile_ReadS16(fp); @@ -892,8 +890,8 @@ static void M_ApplyMeshEdit(MESH_EDIT *mesh_edit, uint16_t *palette_map) return; } - int16_t **mesh = &g_Meshes[object.mesh_index]; - int16_t *data_ptr = *(mesh + mesh_edit->mesh_index); + int16_t **mesh = &g_Meshes[object.mesh_idx]; + int16_t *data_ptr = *(mesh + mesh_edit->mesh_idx); *data_ptr++ += mesh_edit->centre_shift.x; *data_ptr++ += mesh_edit->centre_shift.y; @@ -996,7 +994,7 @@ static int16_t *M_GetMeshTexture(FACE_EDIT *face_edit) return NULL; } - int16_t **mesh = &g_Meshes[object.mesh_index]; + int16_t **mesh = &g_Meshes[object.mesh_idx]; int16_t *data_ptr = *(mesh + face_edit->source_identifier); data_ptr += 5; // Skip centre and collision radius diff --git a/src/game/interpolation.c b/src/game/interpolation.c index c0d35c568..39df418b0 100644 --- a/src/game/interpolation.c +++ b/src/game/interpolation.c @@ -107,7 +107,7 @@ void Interpolation_Commit(void) for (int i = 0; i < Item_GetTotalCount(); i++) { ITEM_INFO *const item = &g_Items[i]; - if ((item->flags & IF_KILLED_ITEM) || item->status == IS_NOT_ACTIVE + if ((item->flags & IF_KILLED) || item->status == IS_NOT_ACTIVE || item->object_id == O_BAT) { COMMIT(item, pos.x); COMMIT(item, pos.y); diff --git a/src/game/items.c b/src/game/items.c index e956ac683..02546add8 100644 --- a/src/game/items.c +++ b/src/game/items.c @@ -81,14 +81,14 @@ void Item_Kill(int16_t item_num) } item->hit_points = -1; - item->flags |= IF_KILLED_ITEM; + item->flags |= IF_KILLED; if (item_num >= g_LevelItemCount) { item->next_item = m_NextItemFree; m_NextItemFree = item_num; } while (m_MaxUsedItemCount > 0 - && g_Items[m_MaxUsedItemCount - 1].flags & IF_KILLED_ITEM) { + && g_Items[m_MaxUsedItemCount - 1].flags & IF_KILLED) { m_MaxUsedItemCount--; } } @@ -131,9 +131,9 @@ void Item_Initialise(int16_t item_num) item->priv = NULL; item->carried_item = NULL; - if (item->flags & IF_NOT_VISIBLE) { + if (item->flags & IF_INVISIBLE) { item->status = IS_INVISIBLE; - item->flags &= ~IF_NOT_VISIBLE; + item->flags &= ~IF_INVISIBLE; } if ((item->flags & IF_CODE_BITS) == IF_CODE_BITS) { @@ -548,21 +548,20 @@ void Item_Translate(ITEM_INFO *item, int32_t x, int32_t y, int32_t z) item->pos.z += (c * z - s * x) >> W2V_SHIFT; } -bool Item_TestAnimEqual(ITEM_INFO *item, int16_t anim_index) +bool Item_TestAnimEqual(ITEM_INFO *item, int16_t anim_idx) { - return item->anim_num == g_Objects[item->object_id].anim_index + anim_index; + return item->anim_num == g_Objects[item->object_id].anim_idx + anim_idx; } -void Item_SwitchToAnim(ITEM_INFO *item, int16_t anim_index, int16_t frame) +void Item_SwitchToAnim(ITEM_INFO *item, int16_t anim_idx, int16_t frame) { - Item_SwitchToObjAnim(item, anim_index, frame, item->object_id); + Item_SwitchToObjAnim(item, anim_idx, frame, item->object_id); } void Item_SwitchToObjAnim( - ITEM_INFO *item, int16_t anim_index, int16_t frame, - GAME_OBJECT_ID object_id) + ITEM_INFO *item, int16_t anim_idx, int16_t frame, GAME_OBJECT_ID object_id) { - item->anim_num = g_Objects[object_id].anim_index + anim_index; + item->anim_num = g_Objects[object_id].anim_idx + anim_idx; if (frame < 0) { item->frame_num = g_Anims[item->anim_num].frame_end + frame + 1; } else { @@ -575,11 +574,11 @@ void Item_Animate(ITEM_INFO *item) item->touch_bits = 0; item->hit_status = 0; - ANIM_STRUCT *anim = &g_Anims[item->anim_num]; + ANIM *anim = &g_Anims[item->anim_num]; item->frame_num++; - if (anim->number_changes > 0) { + if (anim->num_changes > 0) { if (Item_GetAnimChange(item, anim)) { anim = &g_Anims[item->anim_num]; item->current_anim_state = anim->current_anim_state; @@ -591,9 +590,9 @@ void Item_Animate(ITEM_INFO *item) } if (item->frame_num > anim->frame_end) { - if (anim->number_commands > 0) { - int16_t *command = &g_AnimCommands[anim->command_index]; - for (int i = 0; i < anim->number_commands; i++) { + if (anim->num_commands > 0) { + int16_t *command = &g_AnimCommands[anim->command_idx]; + for (int i = 0; i < anim->num_commands; i++) { switch (*command++) { case AC_MOVE_ORIGIN: Item_Translate(item, command[0], command[1], command[2]); @@ -630,9 +629,9 @@ void Item_Animate(ITEM_INFO *item) } } - if (anim->number_commands > 0) { - int16_t *command = &g_AnimCommands[anim->command_index]; - for (int i = 0; i < anim->number_commands; i++) { + if (anim->num_commands > 0) { + int16_t *command = &g_AnimCommands[anim->command_idx]; + for (int i = 0; i < anim->num_commands; i++) { switch (*command++) { case AC_MOVE_ORIGIN: command += 3; @@ -673,17 +672,17 @@ void Item_Animate(ITEM_INFO *item) item->pos.z += (Math_Cos(item->rot.y) * item->speed) >> W2V_SHIFT; } -bool Item_GetAnimChange(ITEM_INFO *item, ANIM_STRUCT *anim) +bool Item_GetAnimChange(ITEM_INFO *item, ANIM *anim) { if (item->current_anim_state == item->goal_anim_state) { return false; } - ANIM_CHANGE_STRUCT *change = &g_AnimChanges[anim->change_index]; - for (int i = 0; i < anim->number_changes; i++, change++) { + ANIM_CHANGE *change = &g_AnimChanges[anim->change_idx]; + for (int i = 0; i < anim->num_changes; i++, change++) { if (change->goal_anim_state == item->goal_anim_state) { - ANIM_RANGE_STRUCT *range = &g_AnimRanges[change->range_index]; - for (int j = 0; j < change->number_ranges; j++, range++) { + ANIM_RANGE *range = &g_AnimRanges[change->range_idx]; + for (int j = 0; j < change->num_ranges; j++, range++) { if (Item_TestFrameRange( item, range->start_frame - g_Anims[item->anim_num].frame_base, @@ -781,7 +780,7 @@ const BOUNDS_16 *Item_GetBoundsAccurate(const ITEM_INFO *item) int32_t Item_GetFrames( const ITEM_INFO *item, FRAME_INFO *frmptr[], int32_t *rate) { - const ANIM_STRUCT *anim = &g_Anims[item->anim_num]; + const ANIM *anim = &g_Anims[item->anim_num]; const int32_t cur_frame_num = item->frame_num - anim->frame_base; const int32_t last_frame_num = anim->frame_end - anim->frame_base; diff --git a/src/game/items.h b/src/game/items.h index 6c3060074..ca9b24558 100644 --- a/src/game/items.h +++ b/src/game/items.h @@ -41,13 +41,12 @@ void Item_ShiftCol(ITEM_INFO *item, COLL_INFO *coll); void Item_Translate(ITEM_INFO *item, int32_t x, int32_t y, int32_t z); int32_t Item_GetDistance(const ITEM_INFO *item, const XYZ_32 *target); -bool Item_TestAnimEqual(ITEM_INFO *item, int16_t anim_index); -void Item_SwitchToAnim(ITEM_INFO *item, int16_t anim_index, int16_t frame); +bool Item_TestAnimEqual(ITEM_INFO *item, int16_t anim_idx); +void Item_SwitchToAnim(ITEM_INFO *item, int16_t anim_idx, int16_t frame); void Item_SwitchToObjAnim( - ITEM_INFO *item, int16_t anim_index, int16_t frame, - GAME_OBJECT_ID object_id); + ITEM_INFO *item, int16_t anim_idx, int16_t frame, GAME_OBJECT_ID object_id); void Item_Animate(ITEM_INFO *item); -bool Item_GetAnimChange(ITEM_INFO *item, ANIM_STRUCT *anim); +bool Item_GetAnimChange(ITEM_INFO *item, ANIM *anim); void Item_PlayAnimSFX(ITEM_INFO *item, int16_t *command, uint16_t flags); bool Item_IsTriggerActive(ITEM_INFO *item); diff --git a/src/game/lara/lara.c b/src/game/lara/lara.c index ec4c7f0d5..aa2115fb6 100644 --- a/src/game/lara/lara.c +++ b/src/game/lara/lara.c @@ -31,6 +31,11 @@ #define LARA_MOVE_SPEED 16 #define LARA_UW_DAMAGE 5 +LARA_INFO *Lara_GetLaraInfo(void) +{ + return &g_Lara; +} + ITEM_INFO *Lara_GetItem(void) { return g_LaraItem; @@ -222,25 +227,25 @@ void Lara_SwapMeshExtra(void) void Lara_SwapSingleMesh(const LARA_MESH mesh, const GAME_OBJECT_ID object_id) { - g_Lara.mesh_ptrs[mesh] = g_Meshes[g_Objects[object_id].mesh_index + mesh]; + g_Lara.mesh_ptrs[mesh] = g_Meshes[g_Objects[object_id].mesh_idx + mesh]; } void Lara_Animate(ITEM_INFO *item) { int16_t *command; - ANIM_STRUCT *anim; + ANIM *anim; item->frame_num++; anim = &g_Anims[item->anim_num]; - if (anim->number_changes > 0 && Item_GetAnimChange(item, anim)) { + if (anim->num_changes > 0 && Item_GetAnimChange(item, anim)) { anim = &g_Anims[item->anim_num]; item->current_anim_state = anim->current_anim_state; } if (item->frame_num > anim->frame_end) { - if (anim->number_commands > 0) { - command = &g_AnimCommands[anim->command_index]; - for (int i = 0; i < anim->number_commands; i++) { + if (anim->num_commands > 0) { + command = &g_AnimCommands[anim->command_idx]; + for (int i = 0; i < anim->num_commands; i++) { switch (*command++) { case AC_MOVE_ORIGIN: Item_Translate(item, command[0], command[1], command[2]); @@ -277,9 +282,9 @@ void Lara_Animate(ITEM_INFO *item) item->current_anim_state = anim->current_anim_state; } - if (anim->number_commands > 0) { - command = &g_AnimCommands[anim->command_index]; - for (int i = 0; i < anim->number_commands; i++) { + if (anim->num_commands > 0) { + command = &g_AnimCommands[anim->command_idx]; + for (int i = 0; i < anim->num_commands; i++) { switch (*command++) { case AC_MOVE_ORIGIN: command += 3; @@ -503,10 +508,10 @@ void Lara_Initialise(int32_t level_num) g_Lara.current_active = 0; - LOT_InitialiseLOT(&g_Lara.LOT); - g_Lara.LOT.step = WALL_L * 20; - g_Lara.LOT.drop = -WALL_L * 20; - g_Lara.LOT.fly = STEP_L; + LOT_InitialiseLOT(&g_Lara.lot); + g_Lara.lot.step = WALL_L * 20; + g_Lara.lot.drop = -WALL_L * 20; + g_Lara.lot.fly = STEP_L; Lara_InitialiseInventory(level_num); } diff --git a/src/game/lara/lara_cheat.c b/src/game/lara/lara_cheat.c index 9f1d1c591..b4090c544 100644 --- a/src/game/lara/lara_cheat.c +++ b/src/game/lara/lara_cheat.c @@ -367,7 +367,7 @@ bool Lara_Cheat_KillEnemy(const int16_t item_num) Sound_Effect(SFX_EXPLOSION_CHEAT, &item->pos, SPM_NORMAL); Item_Kill(item_num); LOT_DisableBaddieAI(item_num); - item->flags |= IF_ONESHOT; + item->flags |= IF_ONE_SHOT; Carrier_TestItemDrops(item_num); return true; } diff --git a/src/game/lara/lara_control.c b/src/game/lara/lara_control.c index 434732974..33d59fcb3 100644 --- a/src/game/lara/lara_control.c +++ b/src/game/lara/lara_control.c @@ -41,7 +41,7 @@ static void M_WaterCurrent(COLL_INFO *coll) + ((item->pos.x - r->x) >> WALL_SHIFT) * r->z_size]; item->box_num = sector->box; - if (Box_CalculateTarget(&target, item, &g_Lara.LOT) == TARGET_NONE) { + if (Box_CalculateTarget(&target, item, &g_Lara.lot) == TARGET_NONE) { return; } @@ -290,7 +290,7 @@ void Lara_HandleSurface(ITEM_INFO *item, COLL_INFO *coll) if (g_Lara.current_active && g_Lara.water_status != LWS_CHEAT) { M_WaterCurrent(coll); } else { - LOT_ClearLOT(&g_Lara.LOT); + LOT_ClearLOT(&g_Lara.lot); } Lara_Animate(item); @@ -362,7 +362,7 @@ void Lara_HandleUnderwater(ITEM_INFO *item, COLL_INFO *coll) if (g_Lara.current_active && g_Lara.water_status != LWS_CHEAT) { M_WaterCurrent(coll); } else { - LOT_ClearLOT(&g_Lara.LOT); + LOT_ClearLOT(&g_Lara.lot); } Lara_Animate(item); diff --git a/src/game/lara/lara_draw.c b/src/game/lara/lara_draw.c index 76eeb951e..e659b9ab5 100644 --- a/src/game/lara/lara_draw.c +++ b/src/game/lara/lara_draw.c @@ -43,16 +43,16 @@ void Lara_Draw(ITEM_INFO *item) switch (g_Lara.hit_direction) { default: case DIR_NORTH: - frame = g_Anims[object->anim_index + LA_SPAZ_FORWARD].frame_ptr; + frame = g_Anims[object->anim_idx + LA_SPAZ_FORWARD].frame_ptr; break; case DIR_EAST: - frame = g_Anims[object->anim_index + LA_SPAZ_RIGHT].frame_ptr; + frame = g_Anims[object->anim_idx + LA_SPAZ_RIGHT].frame_ptr; break; case DIR_SOUTH: - frame = g_Anims[object->anim_index + LA_SPAZ_BACK].frame_ptr; + frame = g_Anims[object->anim_idx + LA_SPAZ_BACK].frame_ptr; break; case DIR_WEST: - frame = g_Anims[object->anim_index + LA_SPAZ_LEFT].frame_ptr; + frame = g_Anims[object->anim_idx + LA_SPAZ_LEFT].frame_ptr; break; } @@ -84,7 +84,7 @@ void Lara_Draw(ITEM_INFO *item) Output_CalculateObjectLighting(item, &frame->bounds); - int32_t *bone = &g_AnimBones[object->bone_index]; + int32_t *bone = &g_AnimBones[object->bone_idx]; int32_t *packed_rotation = frame->mesh_rots; Matrix_TranslateRel(frame->offset.x, frame->offset.y, frame->offset.z); @@ -356,7 +356,7 @@ void Lara_Draw_I( Output_CalculateObjectLighting(item, &frame1->bounds); - int32_t *bone = &g_AnimBones[object->bone_index]; + int32_t *bone = &g_AnimBones[object->bone_idx]; int32_t *packed_rotation1 = frame1->mesh_rots; int32_t *packed_rotation2 = frame2->mesh_rots; diff --git a/src/game/lara/lara_hair.c b/src/game/lara/lara_hair.c index fc1b74110..1e77aa6e3 100644 --- a/src/game/lara/lara_hair.c +++ b/src/game/lara/lara_hair.c @@ -57,7 +57,7 @@ void Lara_Hair_Initialise(void) m_FirstHair = true; Lara_Hair_SetLaraType(O_LARA); - int32_t *bone = &g_AnimBones[g_Objects[O_HAIR].bone_index]; + int32_t *bone = &g_AnimBones[g_Objects[O_HAIR].bone_idx]; m_Hair[0].rot.y = 0; m_Hair[0].rot.x = -PHD_90; @@ -110,10 +110,10 @@ void Lara_Hair_Control(void) in_cutscene = m_LaraType != O_LARA; object = &g_Objects[m_LaraType]; - mesh_base = &g_Meshes[object->mesh_index]; + mesh_base = &g_Meshes[object->mesh_idx]; if (!in_cutscene && g_Lara.hit_direction >= 0) { - int16_t spaz = object->anim_index; + int16_t spaz = object->anim_idx; switch (g_Lara.hit_direction) { case DIR_NORTH: @@ -147,7 +147,7 @@ void Lara_Hair_Control(void) g_LaraItem->pos.x, g_LaraItem->pos.y, g_LaraItem->pos.z); Matrix_RotYXZ(g_LaraItem->rot.y, g_LaraItem->rot.x, g_LaraItem->rot.z); - bone = &g_AnimBones[object->bone_index]; + bone = &g_AnimBones[object->bone_idx]; if (frac) { Matrix_InitInterpolate(frac, rate); int32_t *packed_rotation1 = frmptr[0]->mesh_rots; @@ -178,7 +178,7 @@ void Lara_Hair_Control(void) g_Lara.interp.result.torso_rot.y, g_Lara.interp.result.torso_rot.x, g_Lara.interp.result.torso_rot.z); Matrix_Push_I(); - objptr = g_Meshes[object->mesh_index + LM_TORSO]; // ignore shotgun + objptr = g_Meshes[object->mesh_idx + LM_TORSO]; // ignore shotgun Matrix_TranslateRel_I(objptr[0], objptr[1], objptr[2]); Matrix_Interpolate(); sphere[1].x = g_MatrixPtr->_03 >> W2V_SHIFT; @@ -261,7 +261,7 @@ void Lara_Hair_Control(void) g_Lara.interp.result.torso_rot.y, g_Lara.interp.result.torso_rot.x, g_Lara.interp.result.torso_rot.z); Matrix_Push(); - objptr = g_Meshes[object->mesh_index + LM_TORSO]; // ignore shotgun + objptr = g_Meshes[object->mesh_idx + LM_TORSO]; // ignore shotgun Matrix_TranslateRel(objptr[0], objptr[1], objptr[2]); sphere[1].x = g_MatrixPtr->_03 >> W2V_SHIFT; sphere[1].y = g_MatrixPtr->_13 >> W2V_SHIFT; @@ -319,7 +319,7 @@ void Lara_Hair_Control(void) pos.z = g_MatrixPtr->_23 >> W2V_SHIFT; Matrix_Pop(); - bone = &g_AnimBones[g_Objects[O_HAIR].bone_index]; + bone = &g_AnimBones[g_Objects[O_HAIR].bone_idx]; m_Hair[0].pos = pos; @@ -449,12 +449,12 @@ void Lara_Hair_Draw(void) } OBJECT_INFO *object = &g_Objects[O_HAIR]; - int16_t mesh_index = object->mesh_index; + int16_t mesh_idx = object->mesh_idx; if ((g_Lara.mesh_effects & (1 << LM_HEAD)) && object->nmeshes >= HAIR_SEGMENTS * 2) { - mesh_index += HAIR_SEGMENTS; + mesh_idx += HAIR_SEGMENTS; } - int16_t **mesh = &g_Meshes[mesh_index]; + int16_t **mesh = &g_Meshes[mesh_idx]; for (int i = 0; i < HAIR_SEGMENTS; i++) { Matrix_Push(); diff --git a/src/game/lara/lara_state.c b/src/game/lara/lara_state.c index 912e6b8b6..20e48da48 100644 --- a/src/game/lara/lara_state.c +++ b/src/game/lara/lara_state.c @@ -124,7 +124,7 @@ void Lara_State_Run(ITEM_INFO *item, COLL_INFO *coll) } if (g_Config.enable_tr2_jumping) { - int16_t anim = item->anim_num - g_Objects[item->object_id].anim_index; + int16_t anim = item->anim_num - g_Objects[item->object_id].anim_idx; if (anim == LA_RUN_START) { m_JumpPermitted = false; } else if ( diff --git a/src/game/level.c b/src/game/level.c index 9240f4496..039ddff43 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -309,11 +309,10 @@ static void M_LoadAnims(VFILE *file) m_LevelInfo.anim_count = VFile_ReadS32(file); LOG_INFO("%d anims", m_LevelInfo.anim_count); g_Anims = GameBuf_Alloc( - sizeof(ANIM_STRUCT) - * (m_LevelInfo.anim_count + m_InjectionInfo->anim_count), + sizeof(ANIM) * (m_LevelInfo.anim_count + m_InjectionInfo->anim_count), GBUF_ANIMS); for (int i = 0; i < m_LevelInfo.anim_count; i++) { - ANIM_STRUCT *anim = g_Anims + i; + ANIM *anim = g_Anims + i; anim->frame_ofs = VFile_ReadU32(file); anim->interpolation = VFile_ReadS16(file); @@ -324,10 +323,10 @@ static void M_LoadAnims(VFILE *file) anim->frame_end = VFile_ReadS16(file); anim->jump_anim_num = VFile_ReadS16(file); anim->jump_frame_num = VFile_ReadS16(file); - anim->number_changes = VFile_ReadS16(file); - anim->change_index = VFile_ReadS16(file); - anim->number_commands = VFile_ReadS16(file); - anim->command_index = VFile_ReadS16(file); + anim->num_changes = VFile_ReadS16(file); + anim->change_idx = VFile_ReadS16(file); + anim->num_commands = VFile_ReadS16(file); + anim->command_idx = VFile_ReadS16(file); } Benchmark_End(benchmark, NULL); } @@ -338,15 +337,15 @@ static void M_LoadAnimChanges(VFILE *file) m_LevelInfo.anim_change_count = VFile_ReadS32(file); LOG_INFO("%d anim changes", m_LevelInfo.anim_change_count); g_AnimChanges = GameBuf_Alloc( - sizeof(ANIM_CHANGE_STRUCT) + sizeof(ANIM_CHANGE) * (m_LevelInfo.anim_change_count + m_InjectionInfo->anim_change_count), GBUF_ANIM_CHANGES); for (int32_t i = 0; i < m_LevelInfo.anim_change_count; i++) { - ANIM_CHANGE_STRUCT *anim_change = &g_AnimChanges[i]; + ANIM_CHANGE *anim_change = &g_AnimChanges[i]; anim_change->goal_anim_state = VFile_ReadS16(file); - anim_change->number_ranges = VFile_ReadS16(file); - anim_change->range_index = VFile_ReadS16(file); + anim_change->num_ranges = VFile_ReadS16(file); + anim_change->range_idx = VFile_ReadS16(file); } Benchmark_End(benchmark, NULL); } @@ -357,12 +356,12 @@ static void M_LoadAnimRanges(VFILE *file) m_LevelInfo.anim_range_count = VFile_ReadS32(file); LOG_INFO("%d anim ranges", m_LevelInfo.anim_range_count); g_AnimRanges = GameBuf_Alloc( - sizeof(ANIM_RANGE_STRUCT) + sizeof(ANIM_RANGE) * (m_LevelInfo.anim_range_count + m_InjectionInfo->anim_range_count), GBUF_ANIM_RANGES); for (int32_t i = 0; i < m_LevelInfo.anim_range_count; i++) { - ANIM_RANGE_STRUCT *anim_range = &g_AnimRanges[i]; + ANIM_RANGE *anim_range = &g_AnimRanges[i]; anim_range->start_frame = VFile_ReadS16(file); anim_range->end_frame = VFile_ReadS16(file); anim_range->link_anim_num = VFile_ReadS16(file); @@ -463,7 +462,7 @@ static void M_LoadAnimFrames(VFILE *file) Memory_FreePointer(&raw_data); for (int i = 0; i < m_LevelInfo.anim_count; i++) { - ANIM_STRUCT *anim = &g_Anims[i]; + ANIM *anim = &g_Anims[i]; bool found = false; for (int j = 0; j < m_LevelInfo.anim_frame_count; j++) { if (m_LevelInfo.anim_frame_offsets[j] == (signed)anim->frame_ofs) { @@ -488,11 +487,11 @@ static void M_LoadObjects(VFILE *file) OBJECT_INFO *object = &g_Objects[object_id]; object->nmeshes = VFile_ReadS16(file); - object->mesh_index = VFile_ReadS16(file); - object->bone_index = VFile_ReadS32(file); + object->mesh_idx = VFile_ReadS16(file); + object->bone_idx = VFile_ReadS32(file); const int32_t frame_offset = VFile_ReadS32(file); - object->anim_index = VFile_ReadS16(file); + object->anim_idx = VFile_ReadS16(file); bool found = false; for (int j = 0; j < m_LevelInfo.anim_frame_count; j++) { @@ -582,17 +581,17 @@ static void M_LoadSprites(VFILE *file) for (int i = 0; i < m_LevelInfo.sprite_count; i++) { const GAME_OBJECT_ID object_id = VFile_ReadS32(file); const int16_t num_meshes = VFile_ReadS16(file); - const int16_t mesh_index = VFile_ReadS16(file); + const int16_t mesh_idx = VFile_ReadS16(file); if (object_id < O_NUMBER_OF) { OBJECT_INFO *object = &g_Objects[object_id]; object->nmeshes = num_meshes; - object->mesh_index = mesh_index; + object->mesh_idx = mesh_idx; object->loaded = 1; } else if (object_id - O_NUMBER_OF < STATIC_NUMBER_OF) { STATIC_INFO *object = &g_StaticObjects[object_id - O_NUMBER_OF]; object->nmeshes = num_meshes; - object->mesh_num = mesh_index; + object->mesh_num = mesh_idx; object->loaded = true; } } @@ -1019,7 +1018,7 @@ static size_t M_CalculateMaxVertices(void) for (int32_t j = 0; j < object_info->nmeshes; j++) { max_vertices = - MAX(max_vertices, *(g_Meshes[object_info->mesh_index + j] + 5)); + MAX(max_vertices, *(g_Meshes[object_info->mesh_idx + j] + 5)); } } diff --git a/src/game/lot.c b/src/game/lot.c index 69c43adaf..adbb4cc51 100644 --- a/src/game/lot.c +++ b/src/game/lot.c @@ -20,7 +20,7 @@ void LOT_InitialiseArray(void) for (int i = 0; i < NUM_SLOTS; i++) { CREATURE_INFO *creature = &m_BaddieSlots[i]; creature->item_num = NO_ITEM; - creature->LOT.node = + creature->lot.node = GameBuf_Alloc(sizeof(BOX_NODE) * g_NumberBoxes, GBUF_CREATURE_LOT); } m_SlotsUsed = 0; @@ -99,43 +99,43 @@ void LOT_InitialiseSlot(int16_t item_num, int32_t slot) creature->maximum_turn = PHD_DEGREE; creature->flags = 0; - creature->LOT.step = STEP_L; - creature->LOT.drop = -STEP_L; - creature->LOT.block_mask = BLOCKED; - creature->LOT.fly = 0; + creature->lot.step = STEP_L; + creature->lot.drop = -STEP_L; + creature->lot.block_mask = BLOCKED; + creature->lot.fly = 0; switch (item->object_id) { case O_BAT: case O_ALLIGATOR: case O_FISH: - creature->LOT.step = WALL_L * 20; - creature->LOT.drop = -WALL_L * 20; - creature->LOT.fly = STEP_L / 16; + creature->lot.step = WALL_L * 20; + creature->lot.drop = -WALL_L * 20; + creature->lot.fly = STEP_L / 16; break; case O_TREX: case O_WARRIOR_1: case O_CENTAUR: - creature->LOT.block_mask = BLOCKABLE; + creature->lot.block_mask = BLOCKABLE; break; case O_WOLF: case O_LION: case O_LIONESS: case O_PUMA: - creature->LOT.drop = -WALL_L; + creature->lot.drop = -WALL_L; break; case O_APE: - creature->LOT.step = STEP_L * 2; - creature->LOT.drop = -WALL_L; + creature->lot.step = STEP_L * 2; + creature->lot.drop = -WALL_L; break; default: break; } - LOT_ClearLOT(&creature->LOT); + LOT_ClearLOT(&creature->lot); LOT_CreateZone(item); m_SlotsUsed++; @@ -147,10 +147,10 @@ void LOT_CreateZone(ITEM_INFO *item) int16_t *zone; int16_t *flip; - if (creature->LOT.fly) { + if (creature->lot.fly) { zone = g_FlyZone[0]; flip = g_FlyZone[1]; - } else if (creature->LOT.step == STEP_L) { + } else if (creature->lot.step == STEP_L) { zone = g_GroundZone[0]; flip = g_GroundZone[1]; } else { @@ -166,13 +166,13 @@ void LOT_CreateZone(ITEM_INFO *item) int16_t zone_num = zone[item->box_num]; int16_t flip_num = flip[item->box_num]; - creature->LOT.zone_count = 0; - BOX_NODE *node = creature->LOT.node; + creature->lot.zone_count = 0; + BOX_NODE *node = creature->lot.node; for (int i = 0; i < g_NumberBoxes; i++) { if (zone[i] == zone_num || flip[i] == flip_num) { node->box_num = i; node++; - creature->LOT.zone_count++; + creature->lot.zone_count++; } } } diff --git a/src/game/objects/common.c b/src/game/objects/common.c index 9d9e43b2b..2c75efada 100644 --- a/src/game/objects/common.c +++ b/src/game/objects/common.c @@ -336,7 +336,7 @@ void Object_DrawSpriteItem(ITEM_INFO *item) Output_DrawSprite( item->interp.result.pos.x, item->interp.result.pos.y, item->interp.result.pos.z, - g_Objects[item->object_id].mesh_index - item->frame_num, item->shade); + g_Objects[item->object_id].mesh_idx - item->frame_num, item->shade); } void Object_DrawPickupItem(ITEM_INFO *item) @@ -385,8 +385,7 @@ void Object_DrawPickupItem(ITEM_INFO *item) // No, now we need to move it a bit. // First get the sprite that was to be used, - int16_t spr_num = - g_Objects[item->object_id].mesh_index - item->frame_num; + int16_t spr_num = g_Objects[item->object_id].mesh_idx - item->frame_num; PHD_SPRITE *sprite = &g_PhdSpriteInfo[spr_num]; // and get the animation bounding box, which is not the mesh one. @@ -456,8 +455,8 @@ void Object_DrawPickupItem(ITEM_INFO *item) // of the code in DrawAnimatingItem starting with the line that // matches the following line. int32_t bit = 1; - int16_t **meshpp = &g_Meshes[object->mesh_index]; - int32_t *bone = &g_AnimBones[object->bone_index]; + int16_t **meshpp = &g_Meshes[object->mesh_idx]; + int32_t *bone = &g_AnimBones[object->bone_idx]; Matrix_TranslateRel(frame->offset.x, frame->offset.y, frame->offset.z); @@ -509,8 +508,8 @@ void Object_DrawInterpolatedObject( Matrix_Push(); int32_t mesh_num = 1; - int16_t **meshpp = &g_Meshes[object->mesh_index]; - int32_t *bone = &g_AnimBones[object->bone_index]; + int16_t **meshpp = &g_Meshes[object->mesh_idx]; + int32_t *bone = &g_AnimBones[object->bone_idx]; assert(rate); if (!frac) { @@ -660,7 +659,7 @@ void Object_SetMeshReflective( if (!object->loaded) { return; } - int16_t *obj_ptr = g_Meshes[object->mesh_index + mesh_idx]; + int16_t *obj_ptr = g_Meshes[object->mesh_idx + mesh_idx]; TOGGLE_REFLECTION_ENABLED(obj_ptr[3], enabled); diff --git a/src/game/objects/creatures/ape.c b/src/game/objects/creatures/ape.c index 918390a67..8faaf6977 100644 --- a/src/game/objects/creatures/ape.c +++ b/src/game/objects/creatures/ape.c @@ -126,7 +126,7 @@ void Ape_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 52] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 52] |= BEB_ROT_Y; } void Ape_Control(int16_t item_num) diff --git a/src/game/objects/creatures/bacon_lara.c b/src/game/objects/creatures/bacon_lara.c index cb58a82dd..73eb39710 100644 --- a/src/game/objects/creatures/bacon_lara.c +++ b/src/game/objects/creatures/bacon_lara.c @@ -30,7 +30,7 @@ void BaconLara_Setup(OBJECT_INFO *obj) void BaconLara_Initialise(int16_t item_num) { - g_Objects[O_BACON_LARA].anim_index = g_Objects[O_LARA].anim_index; + g_Objects[O_BACON_LARA].anim_idx = g_Objects[O_LARA].anim_idx; g_Objects[O_BACON_LARA].frame_base = g_Objects[O_LARA].frame_base; g_Items[item_num].data = NULL; } @@ -78,7 +78,7 @@ void BaconLara_Control(int16_t item_num) sector, g_LaraItem->pos.x, g_LaraItem->pos.y, g_LaraItem->pos.z); int16_t relative_anim = - g_LaraItem->anim_num - g_Objects[g_LaraItem->object_id].anim_index; + g_LaraItem->anim_num - g_Objects[g_LaraItem->object_id].anim_idx; int16_t relative_frame = g_LaraItem->frame_num - g_Anims[g_LaraItem->anim_num].frame_base; Item_SwitchToObjAnim(item, relative_anim, relative_frame, O_LARA); diff --git a/src/game/objects/creatures/baldy.c b/src/game/objects/creatures/baldy.c index 4a91d957d..d1c9fa7bd 100644 --- a/src/game/objects/creatures/baldy.c +++ b/src/game/objects/creatures/baldy.c @@ -46,7 +46,7 @@ void Baldy_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx] |= BEB_ROT_Y; } void Baldy_Initialise(int16_t item_num) diff --git a/src/game/objects/creatures/bat.c b/src/game/objects/creatures/bat.c index 111359de5..f0ca49283 100644 --- a/src/game/objects/creatures/bat.c +++ b/src/game/objects/creatures/bat.c @@ -48,7 +48,7 @@ static void M_FixEmbeddedPosition(int16_t item_num) // The bats animation and frame have to be changed to the hanging // one to properly measure them. Save it so it can be restored // after. - int16_t old_anim = item->anim_num - g_Objects[item->object_id].anim_index; + int16_t old_anim = item->anim_num - g_Objects[item->object_id].anim_idx; int16_t old_frame = item->frame_num - g_Anims[item->anim_num].frame_base; Item_SwitchToAnim(item, 0, 0); diff --git a/src/game/objects/creatures/bear.c b/src/game/objects/creatures/bear.c index bfa7513a9..41150d463 100644 --- a/src/game/objects/creatures/bear.c +++ b/src/game/objects/creatures/bear.c @@ -69,7 +69,7 @@ void Bear_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 52] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 52] |= BEB_ROT_Y; } void Bear_Control(int16_t item_num) diff --git a/src/game/objects/creatures/centaur.c b/src/game/objects/creatures/centaur.c index 859fca5de..66dd6eafd 100644 --- a/src/game/objects/creatures/centaur.c +++ b/src/game/objects/creatures/centaur.c @@ -57,7 +57,7 @@ void Centaur_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 40] |= BEB_ROT_X | BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 40] |= BEB_ROT_X | BEB_ROT_Y; } void Centaur_Control(int16_t item_num) diff --git a/src/game/objects/creatures/cowboy.c b/src/game/objects/creatures/cowboy.c index 86d4cfaa2..8c2cbc15e 100644 --- a/src/game/objects/creatures/cowboy.c +++ b/src/game/objects/creatures/cowboy.c @@ -49,7 +49,7 @@ void Cowboy_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx] |= BEB_ROT_Y; } void Cowboy_Control(int16_t item_num) diff --git a/src/game/objects/creatures/crocodile.c b/src/game/objects/creatures/crocodile.c index ac8f2348f..18950f5fb 100644 --- a/src/game/objects/creatures/crocodile.c +++ b/src/game/objects/creatures/crocodile.c @@ -81,7 +81,7 @@ void Croc_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 28] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 28] |= BEB_ROT_Y; } void Croc_Control(int16_t item_num) @@ -189,9 +189,9 @@ void Croc_Control(int16_t item_num) // Test conversion to alligator and set relevant pathfinding values. int32_t wh; if (Creature_EnsureHabitat(item_num, &wh, &m_CrocodileInfo) && croc) { - croc->LOT.step = WALL_L * 20; - croc->LOT.drop = -WALL_L * 20; - croc->LOT.fly = STEP_L / 16; + croc->lot.step = WALL_L * 20; + croc->lot.drop = -WALL_L * 20; + croc->lot.fly = STEP_L / 16; } if (croc) { @@ -219,7 +219,7 @@ void Alligator_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 28] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 28] |= BEB_ROT_Y; } void Alligator_Control(int16_t item_num) @@ -321,9 +321,9 @@ void Alligator_Control(int16_t item_num) // Test alive conversion to crocodile and set relevant pathfinding values. if (Creature_EnsureHabitat(item_num, &wh, &m_CrocodileInfo)) { - gator->LOT.step = STEP_L; - gator->LOT.drop = -STEP_L; - gator->LOT.fly = 0; + gator->lot.step = STEP_L; + gator->lot.drop = -STEP_L; + gator->lot.fly = 0; } else if (item->pos.y < wh + STEP_L) { item->pos.y = wh + STEP_L; } diff --git a/src/game/objects/creatures/larson.c b/src/game/objects/creatures/larson.c index 664bb0275..5d2abad95 100644 --- a/src/game/objects/creatures/larson.c +++ b/src/game/objects/creatures/larson.c @@ -49,7 +49,7 @@ void Larson_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 24] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 24] |= BEB_ROT_Y; } void Larson_Control(int16_t item_num) diff --git a/src/game/objects/creatures/lion.c b/src/game/objects/creatures/lion.c index af804699d..c556b6f46 100644 --- a/src/game/objects/creatures/lion.c +++ b/src/game/objects/creatures/lion.c @@ -57,7 +57,7 @@ static void M_SetupBase(OBJECT_INFO *const obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 76] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 76] |= BEB_ROT_Y; } void Lion_SetupLion(OBJECT_INFO *obj) @@ -112,10 +112,10 @@ void Lion_Control(int16_t item_num) if (item->hit_points <= 0) { if (item->current_anim_state != LION_DEATH) { item->current_anim_state = LION_DEATH; - int16_t anim_index = + int16_t anim_idx = item->object_id == O_PUMA ? PUMA_DIE_ANIM : LION_DIE_ANIM; Item_SwitchToAnim( - item, anim_index + (int16_t)(Random_GetControl() / 0x4000), 0); + item, anim_idx + (int16_t)(Random_GetControl() / 0x4000), 0); } } else { AI_INFO info; diff --git a/src/game/objects/creatures/mummy.c b/src/game/objects/creatures/mummy.c index 983555a3d..215d896db 100644 --- a/src/game/objects/creatures/mummy.c +++ b/src/game/objects/creatures/mummy.c @@ -31,7 +31,7 @@ void Mummy_Setup(OBJECT_INFO *obj) obj->save_flags = 1; obj->save_hitpoints = 1; obj->save_anim = 1; - g_AnimBones[obj->bone_index + 8] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 8] |= BEB_ROT_Y; } void Mummy_Initialise(int16_t item_num) diff --git a/src/game/objects/creatures/mutant.c b/src/game/objects/creatures/mutant.c index 4ee953862..265a5b8f9 100644 --- a/src/game/objects/creatures/mutant.c +++ b/src/game/objects/creatures/mutant.c @@ -78,8 +78,8 @@ void Mutant_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index] |= BEB_ROT_Y; - g_AnimBones[obj->bone_index + 8] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 8] |= BEB_ROT_Y; } void Mutant_Setup2(OBJECT_INFO *obj) @@ -126,9 +126,9 @@ void Mutant_FlyerControl(int16_t item_num) return; } } else { - flyer->LOT.step = STEP_L; - flyer->LOT.drop = -STEP_L; - flyer->LOT.fly = 0; + flyer->lot.step = STEP_L; + flyer->lot.drop = -STEP_L; + flyer->lot.fly = 0; AI_INFO info; Creature_AIInfo(item, &info); @@ -157,9 +157,9 @@ void Mutant_FlyerControl(int16_t item_num) Creature_Mood(item, &info, true); } - flyer->LOT.step = WALL_L * 30; - flyer->LOT.drop = -WALL_L * 30; - flyer->LOT.fly = STEP_L / 8; + flyer->lot.step = WALL_L * 30; + flyer->lot.drop = -WALL_L * 30; + flyer->lot.fly = STEP_L / 8; Creature_AIInfo(item, &info); } else if ( (info.zone_num != info.enemy_zone && !shoot1 && !shoot2 diff --git a/src/game/objects/creatures/natla.c b/src/game/objects/creatures/natla.c index c13578c99..7f4c1d2b3 100644 --- a/src/game/objects/creatures/natla.c +++ b/src/game/objects/creatures/natla.c @@ -60,7 +60,7 @@ void Natla_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 8] |= BEB_ROT_Z | BEB_ROT_X; + g_AnimBones[obj->bone_idx + 8] |= BEB_ROT_Z | BEB_ROT_X; } void Natla_Control(int16_t item_num) @@ -85,9 +85,9 @@ void Natla_Control(int16_t item_num) if (item->hit_points <= 0 && item->hit_points > DONT_TARGET) { item->goal_anim_state = NATLA_DEATH; } else if (item->hit_points <= NATLA_NEAR_DEATH) { - natla->LOT.step = STEP_L; - natla->LOT.drop = -STEP_L; - natla->LOT.fly = 0; + natla->lot.step = STEP_L; + natla->lot.drop = -STEP_L; + natla->lot.fly = 0; AI_INFO info; Creature_AIInfo(item, &info); @@ -185,9 +185,9 @@ void Natla_Control(int16_t item_num) break; } } else { - natla->LOT.step = STEP_L; - natla->LOT.drop = -STEP_L; - natla->LOT.fly = 0; + natla->lot.step = STEP_L; + natla->lot.drop = -STEP_L; + natla->lot.fly = 0; AI_INFO info; Creature_AIInfo(item, &info); @@ -203,9 +203,9 @@ void Natla_Control(int16_t item_num) if (!(natla->flags & NATLA_FLY_MODE)) { Creature_Mood(item, &info, true); } - natla->LOT.step = WALL_L * 20; - natla->LOT.drop = -WALL_L * 20; - natla->LOT.fly = STEP_L / 8; + natla->lot.step = WALL_L * 20; + natla->lot.drop = -WALL_L * 20; + natla->lot.fly = STEP_L / 8; Creature_AIInfo(item, &info); } else if (!shoot) { natla->flags |= NATLA_FLY_MODE; diff --git a/src/game/objects/creatures/pierre.c b/src/game/objects/creatures/pierre.c index ecd5c4cc5..b9fc8b6dc 100644 --- a/src/game/objects/creatures/pierre.c +++ b/src/game/objects/creatures/pierre.c @@ -57,7 +57,7 @@ void Pierre_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 24] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 24] |= BEB_ROT_Y; } void Pierre_Control(int16_t item_num) @@ -69,8 +69,8 @@ void Pierre_Control(int16_t item_num) m_PierreItemNum = item_num; } else if (m_PierreItemNum != item_num) { ITEM_INFO *old_pierre = &g_Items[m_PierreItemNum]; - if (old_pierre->flags & IF_ONESHOT) { - if (!(item->flags & IF_ONESHOT)) { + if (old_pierre->flags & IF_ONE_SHOT) { + if (!(item->flags & IF_ONE_SHOT)) { Item_Kill(item_num); } } else { @@ -82,7 +82,7 @@ void Pierre_Control(int16_t item_num) if (m_PierreItemNum == NO_ITEM) { m_PierreItemNum = item_num; } else if (m_PierreItemNum != item_num) { - if (item->flags & IF_ONESHOT) { + if (item->flags & IF_ONE_SHOT) { Item_Kill(m_PierreItemNum); } else { Item_Kill(item_num); @@ -103,7 +103,7 @@ void Pierre_Control(int16_t item_num) int16_t tilt = 0; if (item->hit_points <= PIERRE_RUN_HITPOINTS - && !(item->flags & IF_ONESHOT)) { + && !(item->flags & IF_ONE_SHOT)) { item->hit_points = PIERRE_RUN_HITPOINTS; pierre->flags++; } diff --git a/src/game/objects/creatures/pod.c b/src/game/objects/creatures/pod.c index 63dff13cb..8a79852a1 100644 --- a/src/game/objects/creatures/pod.c +++ b/src/game/objects/creatures/pod.c @@ -60,7 +60,7 @@ void Pod_Initialise(int16_t item_num) bug->pos.y = item->pos.y; bug->pos.z = item->pos.z; bug->rot.y = item->rot.y; - bug->flags = IF_NOT_VISIBLE; + bug->flags = IF_INVISIBLE; bug->shade = -1; Item_Initialise(bug_item_num); @@ -82,7 +82,7 @@ void Pod_Control(int16_t item_num) if (item->goal_anim_state != POD_EXPLODE) { int32_t explode = 0; - if (item->flags & IF_ONESHOT) { + if (item->flags & IF_ONE_SHOT) { explode = 1; } else if (item->object_id == O_BIG_POD) { explode = 1; diff --git a/src/game/objects/creatures/raptor.c b/src/game/objects/creatures/raptor.c index dbf6e8cb9..3286126c5 100644 --- a/src/game/objects/creatures/raptor.c +++ b/src/game/objects/creatures/raptor.c @@ -58,7 +58,7 @@ void Raptor_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 84] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 84] |= BEB_ROT_Y; } void Raptor_Control(int16_t item_num) diff --git a/src/game/objects/creatures/rat.c b/src/game/objects/creatures/rat.c index 2687fceda..70868e257 100644 --- a/src/game/objects/creatures/rat.c +++ b/src/game/objects/creatures/rat.c @@ -75,7 +75,7 @@ void Rat_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 4] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 4] |= BEB_ROT_Y; } void Rat_Control(int16_t item_num) @@ -185,7 +185,7 @@ void Vole_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 4] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 4] |= BEB_ROT_Y; } void Vole_Control(int16_t item_num) diff --git a/src/game/objects/creatures/skate_kid.c b/src/game/objects/creatures/skate_kid.c index 4ffd950be..da59c1f72 100644 --- a/src/game/objects/creatures/skate_kid.c +++ b/src/game/objects/creatures/skate_kid.c @@ -57,7 +57,7 @@ void SkateKid_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx] |= BEB_ROT_Y; if (!g_Objects[O_SKATEBOARD].loaded) { LOG_WARNING( @@ -180,7 +180,7 @@ void SkateKid_Draw(ITEM_INFO *item) } int16_t relative_anim = - item->anim_num - g_Objects[item->object_id].anim_index; + item->anim_num - g_Objects[item->object_id].anim_idx; int16_t relative_frame = item->frame_num - g_Anims[item->anim_num].frame_base; item->object_id = O_SKATEBOARD; diff --git a/src/game/objects/creatures/statue.c b/src/game/objects/creatures/statue.c index 2f63090d7..d0606f06c 100644 --- a/src/game/objects/creatures/statue.c +++ b/src/game/objects/creatures/statue.c @@ -44,7 +44,7 @@ void Statue_Initialise(int16_t item_num) centaur->pos.x = item->pos.x; centaur->pos.y = item->pos.y; centaur->pos.z = item->pos.z; - centaur->flags = IF_NOT_VISIBLE; + centaur->flags = IF_INVISIBLE; centaur->shade = -1; Item_Initialise(centaur_item_num); @@ -63,7 +63,7 @@ void Statue_Initialise(int16_t item_num) void Statue_Control(int16_t item_num) { ITEM_INFO *item = &g_Items[item_num]; - if (item->flags & IF_KILLED_ITEM) { + if (item->flags & IF_KILLED) { return; } diff --git a/src/game/objects/creatures/torso.c b/src/game/objects/creatures/torso.c index dc60aa940..23411104a 100644 --- a/src/game/objects/creatures/torso.c +++ b/src/game/objects/creatures/torso.c @@ -68,7 +68,7 @@ void Torso_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 4] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 4] |= BEB_ROT_Y; } void Torso_Control(int16_t item_num) diff --git a/src/game/objects/creatures/trex.c b/src/game/objects/creatures/trex.c index 09d0d686a..2454a186a 100644 --- a/src/game/objects/creatures/trex.c +++ b/src/game/objects/creatures/trex.c @@ -58,8 +58,8 @@ void TRex_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 40] |= BEB_ROT_Y; - g_AnimBones[obj->bone_index + 44] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 40] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 44] |= BEB_ROT_Y; } void TRex_Collision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll) diff --git a/src/game/objects/creatures/wolf.c b/src/game/objects/creatures/wolf.c index c85bd8eda..a7e8e1807 100644 --- a/src/game/objects/creatures/wolf.c +++ b/src/game/objects/creatures/wolf.c @@ -65,7 +65,7 @@ void Wolf_Setup(OBJECT_INFO *obj) obj->save_hitpoints = 1; obj->save_anim = 1; obj->save_flags = 1; - g_AnimBones[obj->bone_index + 8] |= BEB_ROT_Y; + g_AnimBones[obj->bone_idx + 8] |= BEB_ROT_Y; } void Wolf_Initialise(int16_t item_num) diff --git a/src/game/objects/traps/lightning_emitter.c b/src/game/objects/traps/lightning_emitter.c index 966abacea..8a4e4c136 100644 --- a/src/game/objects/traps/lightning_emitter.c +++ b/src/game/objects/traps/lightning_emitter.c @@ -188,7 +188,7 @@ void LightningEmitter_Draw(ITEM_INFO *item) int32_t z1 = g_MatrixPtr->_23; Output_DrawPolygons( - g_Meshes[g_Objects[O_LIGHTNING_EMITTER].mesh_index], clip); + g_Meshes[g_Objects[O_LIGHTNING_EMITTER].mesh_idx], clip); Matrix_Pop(); diff --git a/src/game/objects/traps/midas_touch.c b/src/game/objects/traps/midas_touch.c index 003d36566..61427bab2 100644 --- a/src/game/objects/traps/midas_touch.c +++ b/src/game/objects/traps/midas_touch.c @@ -58,6 +58,8 @@ void MidasTouch_Collision( case DIR_WEST: item->rot.y = -PHD_90; break; + default: + break; } if (lara_item->current_anim_state == LS_USE_MIDAS diff --git a/src/game/objects/traps/movable_block.c b/src/game/objects/traps/movable_block.c index ed25860fa..dd4808c48 100644 --- a/src/game/objects/traps/movable_block.c +++ b/src/game/objects/traps/movable_block.c @@ -116,6 +116,8 @@ static bool M_TestPush( case DIR_WEST: x -= WALL_L; break; + default: + break; } const SECTOR_INFO *sector = Room_GetSector(x, y, z, &room_num); @@ -160,6 +162,8 @@ static bool M_TestPull( case DIR_WEST: x_add = WALL_L; break; + default: + break; } int32_t x = item->pos.x + x_add; @@ -237,7 +241,7 @@ void MovableBlock_Control(int16_t item_num) { ITEM_INFO *item = &g_Items[item_num]; - if (item->flags & IF_ONESHOT) { + if (item->flags & IF_ONE_SHOT) { Room_AlterFloorHeight(item, WALL_L); Item_Kill(item_num); return; @@ -313,6 +317,8 @@ void MovableBlock_Collision( case DIR_WEST: item->rot.y = -PHD_90; break; + default: + break; } if (!Lara_TestPosition(item, obj->bounds())) { @@ -341,6 +347,8 @@ void MovableBlock_Collision( lara_item->pos.x &= -WALL_L; lara_item->pos.x += LARA_RAD; break; + default: + break; } lara_item->rot.y = item->rot.y; diff --git a/src/game/objects/traps/thors_hammer_handle.c b/src/game/objects/traps/thors_hammer_handle.c index 353e65aa0..36f0941cc 100644 --- a/src/game/objects/traps/thors_hammer_handle.c +++ b/src/game/objects/traps/thors_hammer_handle.c @@ -135,7 +135,7 @@ void ThorsHammerHandle_Control(int16_t item_num) ITEM_INFO *head_item = item->data; int16_t relative_anim = - item->anim_num - g_Objects[item->object_id].anim_index; + item->anim_num - g_Objects[item->object_id].anim_idx; int16_t relative_frame = item->frame_num - g_Anims[item->anim_num].frame_base; Item_SwitchToAnim(head_item, relative_anim, relative_frame); diff --git a/src/game/overlay.c b/src/game/overlay.c index 49f11630c..6b7c5a573 100644 --- a/src/game/overlay.c +++ b/src/game/overlay.c @@ -379,7 +379,7 @@ static void M_DrawPickup3D(DISPLAY_PICKUP_INFO *pu) Output_SetupAboveWater(false); OBJECT_INFO *obj = &g_Objects[Inv_GetItemOption(pu->object_id)]; - const FRAME_INFO *const frame = g_Anims[obj->anim_index].frame_ptr; + const FRAME_INFO *const frame = g_Anims[obj->anim_idx].frame_ptr; Matrix_Push(); Matrix_TranslateRel(frame->offset.x, frame->offset.y, frame->offset.z); @@ -387,8 +387,8 @@ static void M_DrawPickup3D(DISPLAY_PICKUP_INFO *pu) -(frame->bounds.min.x + frame->bounds.max.x) / 2, -(frame->bounds.min.y + frame->bounds.max.y) / 2, -(frame->bounds.min.z + frame->bounds.max.z) / 2); - int16_t **meshpp = &g_Meshes[obj->mesh_index]; - int32_t *bone = &g_AnimBones[obj->bone_index]; + int16_t **meshpp = &g_Meshes[obj->mesh_idx]; + int32_t *bone = &g_AnimBones[obj->bone_idx]; int32_t *packed_rotation = frame->mesh_rots; Matrix_RotYXZpack(*packed_rotation++); @@ -486,7 +486,7 @@ static void M_DrawPickupsSprites(void) const int32_t y = Viewport_GetHeight() - sprite_height - sprite_height * pu->grid_y; const int32_t scale = Screen_GetRenderScaleGLRage(12288); - const int16_t sprite_num = g_Objects[pu->object_id].mesh_index; + const int16_t sprite_num = g_Objects[pu->object_id].mesh_idx; Output_DrawUISprite(x, y, scale, sprite_num, 4096); } } diff --git a/src/game/phase/phase_cutscene.c b/src/game/phase/phase_cutscene.c index 46d38dd86..8f79303c2 100644 --- a/src/game/phase/phase_cutscene.c +++ b/src/game/phase/phase_cutscene.c @@ -57,7 +57,7 @@ static void M_InitialiseHair(int32_t level_num) Lara_Initialise(level_num); Item_SwitchToObjAnim(g_LaraItem, 0, 0, lara_type); - ANIM_STRUCT *cut_anim = &g_Anims[g_LaraItem->anim_num]; + ANIM *cut_anim = &g_Anims[g_LaraItem->anim_num]; g_LaraItem->current_anim_state = g_LaraItem->goal_anim_state = g_LaraItem->required_anim_state = cut_anim->current_anim_state; } diff --git a/src/game/phase/phase_inventory.c b/src/game/phase/phase_inventory.c index 2f66a7568..17086b9a0 100644 --- a/src/game/phase/phase_inventory.c +++ b/src/game/phase/phase_inventory.c @@ -495,7 +495,7 @@ static void Inv_DrawItem(INVENTORY_ITEM *const inv_item, const int32_t frames) OBJECT_INFO *obj = &g_Objects[inv_item->object_id]; if (obj->nmeshes < 0) { - Output_DrawSpriteRel(0, 0, 0, obj->mesh_index, 4096); + Output_DrawSpriteRel(0, 0, 0, obj->mesh_idx, 4096); return; } @@ -518,8 +518,7 @@ static void Inv_DrawItem(INVENTORY_ITEM *const inv_item, const int32_t frames) Output_DrawScreenSprite( sx + spr->x, sy + spr->y, spr->z, spr->param1, spr->param2, - g_Objects[O_ALPHABET].mesh_index + spr->sprnum, 4096, - 0); + g_Objects[O_ALPHABET].mesh_idx + spr->sprnum, 4096, 0); break; case SHAPE_LINE: Output_DrawScreenLine( @@ -551,7 +550,7 @@ static void Inv_DrawItem(INVENTORY_ITEM *const inv_item, const int32_t frames) const int32_t frac = InvItem_GetFrames(inv_item, &frame1, &frame2, &rate); if (inv_item->object_id == O_MAP_OPTION) { const int16_t extra_rotation[1] = { Option_Compass_GetNeedleAngle() }; - int32_t *const bone = &g_AnimBones[obj->bone_index]; + int32_t *const bone = &g_AnimBones[obj->bone_idx]; bone[0] |= BEB_ROT_Y; Object_DrawInterpolatedObject( obj, inv_item->drawn_meshes, extra_rotation, frame1, frame2, frac, diff --git a/src/game/room.c b/src/game/room.c index 141a19f57..6a5f21732 100644 --- a/src/game/room.c +++ b/src/game/room.c @@ -57,7 +57,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger) // handle g_Lara gym routines switch (track) { case MX_GYM_HINT_03: - if ((g_MusicTrackFlags[track] & IF_ONESHOT) + if ((g_MusicTrackFlags[track] & IF_ONE_SHOT) && g_LaraItem->current_anim_state == LS_JUMP_UP) { track = MX_GYM_HINT_04; } @@ -76,7 +76,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger) break; case MX_GYM_HINT_17: - if ((g_MusicTrackFlags[track] & IF_ONESHOT) + if ((g_MusicTrackFlags[track] & IF_ONE_SHOT) && g_LaraItem->current_anim_state == LS_HANG) { track = MX_GYM_HINT_18; } @@ -89,7 +89,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger) break; case MX_GYM_HINT_25: - if (g_MusicTrackFlags[track] & IF_ONESHOT) { + if (g_MusicTrackFlags[track] & IF_ONE_SHOT) { static int16_t gym_completion_counter = 0; gym_completion_counter++; if (gym_completion_counter == LOGIC_FPS * 4) { @@ -103,7 +103,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger) } // end of g_Lara gym routines - if (g_MusicTrackFlags[track] & IF_ONESHOT) { + if (g_MusicTrackFlags[track] & IF_ONE_SHOT) { return; } @@ -117,7 +117,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger) if ((g_MusicTrackFlags[track] & IF_CODE_BITS) == IF_CODE_BITS) { if (trigger->one_shot) { - g_MusicTrackFlags[track] |= IF_ONESHOT; + g_MusicTrackFlags[track] |= IF_ONE_SHOT; } Music_Play(track); } else { @@ -676,7 +676,7 @@ void Room_PopulateSectorData( const int16_t trig_setup = *data++; trigger->type = TRIG_TYPE(fd_entry); trigger->timer = trig_setup & 0xFF; - trigger->one_shot = trig_setup & IF_ONESHOT; + trigger->one_shot = trig_setup & IF_ONE_SHOT; trigger->mask = trig_setup & IF_CODE_BITS; trigger->item_index = NO_ITEM; trigger->command_count = 0; @@ -721,7 +721,7 @@ void Room_PopulateSectorData( command = *command_data++; cam_data->timer = command & 0xFF; cam_data->glide = (command & IF_CODE_BITS) >> 6; - cam_data->one_shot = command & IF_ONESHOT; + cam_data->one_shot = command & IF_ONE_SHOT; } else { cmd->parameter = (void *)(intptr_t)(command & VALUE_BITS); } @@ -857,7 +857,7 @@ static void M_TestSectorTrigger( case TO_OBJECT: { const int16_t item_num = (int16_t)(intptr_t)cmd->parameter; ITEM_INFO *const item = &g_Items[item_num]; - if (item->flags & IF_ONESHOT) { + if (item->flags & IF_ONE_SHOT) { break; } @@ -879,7 +879,7 @@ static void M_TestSectorTrigger( } if (trigger->one_shot) { - item->flags |= IF_ONESHOT; + item->flags |= IF_ONE_SHOT; } if (!item->active) { @@ -910,7 +910,7 @@ static void M_TestSectorTrigger( case TO_CAMERA: { const TRIGGER_CAMERA_DATA *const cam_data = (TRIGGER_CAMERA_DATA *)cmd->parameter; - if (g_Camera.fixed[cam_data->camera_num].flags & IF_ONESHOT) { + if (g_Camera.fixed[cam_data->camera_num].flags & IF_ONE_SHOT) { break; } @@ -939,7 +939,7 @@ static void M_TestSectorTrigger( } if (cam_data->one_shot) { - g_Camera.fixed[g_Camera.number].flags |= IF_ONESHOT; + g_Camera.fixed[g_Camera.number].flags |= IF_ONE_SHOT; } g_Camera.speed = cam_data->glide + 1; @@ -955,11 +955,11 @@ static void M_TestSectorTrigger( const OBJECT_VECTOR *const obvector = &g_Camera.fixed[(int16_t)(intptr_t)cmd->parameter]; - if (g_Lara.LOT.required_box != obvector->flags) { - g_Lara.LOT.target.x = obvector->x; - g_Lara.LOT.target.y = obvector->y; - g_Lara.LOT.target.z = obvector->z; - g_Lara.LOT.required_box = obvector->flags; + if (g_Lara.lot.required_box != obvector->flags) { + g_Lara.lot.target.x = obvector->x; + g_Lara.lot.target.y = obvector->y; + g_Lara.lot.target.z = obvector->z; + g_Lara.lot.required_box = obvector->flags; } g_Lara.current_active = obvector->data * 6; @@ -968,7 +968,7 @@ static void M_TestSectorTrigger( case TO_FLIPMAP: { const int16_t flip_slot = (int16_t)(intptr_t)cmd->parameter; - if (g_FlipMapTable[flip_slot] & IF_ONESHOT) { + if (g_FlipMapTable[flip_slot] & IF_ONE_SHOT) { break; } @@ -980,7 +980,7 @@ static void M_TestSectorTrigger( if ((g_FlipMapTable[flip_slot] & IF_CODE_BITS) == IF_CODE_BITS) { if (trigger->one_shot) { - g_FlipMapTable[flip_slot] |= IF_ONESHOT; + g_FlipMapTable[flip_slot] |= IF_ONE_SHOT; } if (!g_FlipStatus) { diff --git a/src/game/room_draw.c b/src/game/room_draw.c index e00cdea4a..190803d24 100644 --- a/src/game/room_draw.c +++ b/src/game/room_draw.c @@ -254,9 +254,9 @@ static void M_DrawSkybox(void) g_MatrixPtr->_23 = 0; const OBJECT_INFO skybox = g_Objects[O_SKYBOX]; - const FRAME_INFO *const frame = g_Anims[skybox.anim_index].frame_ptr; + const FRAME_INFO *const frame = g_Anims[skybox.anim_idx].frame_ptr; Matrix_RotYXZpack(frame->mesh_rots[0]); - Output_DrawSkybox(g_Meshes[skybox.mesh_index]); + Output_DrawSkybox(g_Meshes[skybox.mesh_idx]); Matrix_Pop(); } diff --git a/src/game/savegame/savegame.c b/src/game/savegame/savegame.c index 47c2cbea0..d3696ecde 100644 --- a/src/game/savegame/savegame.c +++ b/src/game/savegame/savegame.c @@ -131,20 +131,20 @@ static void M_LoadPostprocess(void) } if (item->object_id == O_PIERRE && item->hit_points <= 0 - && (item->flags & IF_ONESHOT)) { - g_MusicTrackFlags[MX_PIERRE_SPEECH] |= IF_ONESHOT; + && (item->flags & IF_ONE_SHOT)) { + g_MusicTrackFlags[MX_PIERRE_SPEECH] |= IF_ONE_SHOT; } if (item->object_id == O_COWBOY && item->hit_points <= 0) { - g_MusicTrackFlags[MX_COWBOY_SPEECH] |= IF_ONESHOT; + g_MusicTrackFlags[MX_COWBOY_SPEECH] |= IF_ONE_SHOT; } if (item->object_id == O_BALDY && item->hit_points <= 0) { - g_MusicTrackFlags[MX_BALDY_SPEECH] |= IF_ONESHOT; + g_MusicTrackFlags[MX_BALDY_SPEECH] |= IF_ONE_SHOT; } if (item->object_id == O_LARSON && item->hit_points <= 0) { - g_MusicTrackFlags[MX_BALDY_SPEECH] |= IF_ONESHOT; + g_MusicTrackFlags[MX_BALDY_SPEECH] |= IF_ONE_SHOT; } } @@ -152,7 +152,7 @@ static void M_LoadPostprocess(void) g_Config.profile.new_game_plus_unlock = true; } - LOT_ClearLOT(&g_Lara.LOT); + LOT_ClearLOT(&g_Lara.lot); } void Savegame_Init(void) diff --git a/src/game/savegame/savegame_bson.c b/src/game/savegame/savegame_bson.c index 0cd49dcea..ff4e05194 100644 --- a/src/game/savegame/savegame_bson.c +++ b/src/game/savegame/savegame_bson.c @@ -542,7 +542,7 @@ static bool M_LoadItems(struct json_array_s *items_arr, uint16_t header_version) item->flags = json_object_get_int(item_obj, "flags", item->flags); item->timer = json_object_get_int(item_obj, "timer", item->timer); - if (item->flags & IF_KILLED_ITEM) { + if (item->flags & IF_KILLED) { Item_Kill(i); item->status = IS_DEACTIVATED; } else { @@ -865,7 +865,7 @@ static bool M_LoadLara(struct json_object_s *lara_obj, LARA_INFO *lara) return false; } - if (!M_LoadLOT(json_object_get_object(lara_obj, "lot"), &lara->LOT)) { + if (!M_LoadLOT(json_object_get_object(lara_obj, "lot"), &lara->lot)) { return false; } @@ -1256,7 +1256,7 @@ static struct json_object_s *M_DumpLara(LARA_INFO *lara) json_object_append_object(lara_obj, "magnums", M_DumpAmmo(&lara->magnums)); json_object_append_object(lara_obj, "uzis", M_DumpAmmo(&lara->uzis)); json_object_append_object(lara_obj, "shotgun", M_DumpAmmo(&lara->shotgun)); - json_object_append_object(lara_obj, "lot", M_DumpLOT(&lara->LOT)); + json_object_append_object(lara_obj, "lot", M_DumpLOT(&lara->lot)); return lara_obj; } diff --git a/src/game/savegame/savegame_legacy.c b/src/game/savegame/savegame_legacy.c index 8b9447582..6bbfa3358 100644 --- a/src/game/savegame/savegame_legacy.c +++ b/src/game/savegame/savegame_legacy.c @@ -271,7 +271,7 @@ static void M_WriteLara(LARA_INFO *lara) M_Write(&lara->shotgun.ammo, sizeof(int32_t)); M_Write(&lara->shotgun.hit, sizeof(int32_t)); M_Write(&lara->shotgun.miss, sizeof(int32_t)); - M_WriteLOT(&lara->LOT); + M_WriteLOT(&lara->lot); } static void M_WriteArm(LARA_ARM *arm) @@ -373,7 +373,7 @@ static void M_ReadLara(LARA_INFO *lara) M_Read(&lara->shotgun.ammo, sizeof(int32_t)); M_Read(&lara->shotgun.hit, sizeof(int32_t)); M_Read(&lara->shotgun.miss, sizeof(int32_t)); - M_ReadLOT(&lara->LOT); + M_ReadLOT(&lara->lot); } static void M_ReadArm(LARA_ARM *arm) @@ -605,7 +605,7 @@ bool Savegame_Legacy_LoadFromFile(MYFILE *fp, GAME_INFO *game_info) M_Read(&item->flags, sizeof(int16_t)); M_Read(&item->timer, sizeof(int16_t)); - if (item->flags & IF_KILLED_ITEM) { + if (item->flags & IF_KILLED) { Item_Kill(i); item->status = IS_DEACTIVATED; } else { diff --git a/src/game/text.c b/src/game/text.c index 7d5b0caa4..014f52966 100644 --- a/src/game/text.c +++ b/src/game/text.c @@ -542,7 +542,7 @@ void Text_DrawText(TEXTSTRING *textstring) sv = Screen_GetRenderScale(textstring->scale.v, RSR_TEXT); Output_DrawScreenSprite2D( - sx, sy, 0, sh, sv, g_Objects[O_ALPHABET].mesh_index + sprite_num, + sx, sy, 0, sh, sv, g_Objects[O_ALPHABET].mesh_idx + sprite_num, 16 << 8, 0, 0); if (letter == '(' || letter == ')' || letter == '$' || letter == '~') { diff --git a/src/global/types.h b/src/global/types.h index c7841362d..a6cba0448 100644 --- a/src/global/types.h +++ b/src/global/types.h @@ -2,8 +2,13 @@ #include "global/const.h" +#include #include +#include +#include #include +#include +#include #include #include @@ -350,207 +355,6 @@ typedef enum MUSIC_TRACK_ID { MX_NUMBER_OF, } MUSIC_TRACK_ID; -typedef enum LARA_SHOTGUN_ANIMATION_FRAME { - LF_SG_AIM_START = 0, - LF_SG_AIM_BEND = 1, - LF_SG_AIM_END = 12, - LF_SG_DRAW_START = 13, - LF_SG_DRAW_SFX = 23, - LF_SG_RECOIL_START = 47, - LF_SG_RECOILING = 48, - LF_SG_RECOIL_SFX = 57, - LF_SG_RECOIL_UNDRAW_RESET = 59, - LF_SG_RECOIL_RESET_OG = 60, - LF_SG_RECOIL_RESET_FIX = 63, - LF_SG_RECOIL_END = 79, - LF_SG_UNDRAW_START = 80, - LF_SG_UNDRAW_SFX = 100, - LF_SG_UNDRAW_END = 113, - LF_SG_UNAIM_START = 114, - LF_SG_UNAIM_RAISE = 126, - LF_SG_UNAIM_END = 127, -} LARA_SHOTGUN_ANIMATION_FRAME; - -typedef enum LARA_GUN_ANIMATION_FRAME { - LF_G_AIM_START = 0, - LF_G_AIM_BEND = 1, - LF_G_AIM_EXTEND = 3, - LF_G_AIM_END = 4, - LF_G_UNDRAW_START = 5, - LF_G_UNDRAW_BEND = 6, - LF_G_UNDRAW_END = 12, - LF_G_DRAW_START = 13, - LF_G_DRAW_END = 23, - LF_G_RECOIL_START = 24, - LF_G_RECOIL_END = 32, -} LARA_GUN_ANIMATION_FRAME; - -typedef enum LARA_ANIMATION { - LA_RUN = 0, - LA_WALK_FORWARD = 1, - LA_RUN_START = 6, - LA_WALK_BACK = 40, - LA_VAULT_12 = 50, - LA_VAULT_34 = 42, - LA_FAST_FALL = 32, - LA_STOP = 11, - LA_FALL_DOWN = 34, - LA_STOP_LEFT = 2, - LA_STOP_RIGHT = 3, - LA_HIT_WALL_LEFT = 53, - LA_HIT_WALL_RIGHT = 54, - LA_RUN_STEP_UP_LEFT = 56, - LA_RUN_STEP_UP_RIGHT = 55, - LA_WALK_STEP_UP_LEFT = 57, - LA_WALK_STEP_UP_RIGHT = 58, - LA_WALK_STEP_DOWN_LEFT = 60, - LA_WALK_STEP_DOWN_RIGHT = 59, - LA_BACK_STEP_DOWN_LEFT = 61, - LA_BACK_STEP_DOWN_RIGHT = 62, - LA_WALL_SWITCH_DOWN = 63, - LA_WALL_SWITCH_UP = 64, - LA_SIDE_STEP_LEFT = 65, - LA_SIDE_STEP_RIGHT = 67, - LA_LAND_FAR = 24, - LA_GRAB_LEDGE = 96, - LA_SWIM_GLIDE = 87, - LA_FALL_BACK = 93, - LA_HANG = 96, - LA_STOP_HANG = 28, - LA_SLIDE = 70, - LA_SLIDE_BACK = 104, - LA_TREAD = 108, - LA_SURF_TREAD = 114, - LA_SURF_DIVE = 119, - LA_SURF_CLIMB = 111, - LA_JUMP_IN = 112, - LA_PUSHABLE_GRAB = 120, - LA_ROLL = 146, - LA_PICKUP_UW = 130, - LA_PICKUP = 135, - LA_ROLLING_BALL_DEATH = 139, - LA_SPIKE_DEATH = 149, - LA_GRAB_LEDGE_IN = 150, - LA_SPAZ_FORWARD = 125, - LA_SPAZ_BACK = 126, - LA_SPAZ_RIGHT = 127, - LA_SPAZ_LEFT = 128, -} LARA_ANIMATION; - -typedef enum LARA_WATER_STATUS { - LWS_ABOVE_WATER = 0, - LWS_UNDERWATER = 1, - LWS_SURFACE = 2, - LWS_CHEAT = 3, -} LARA_WATER_STATUS; - -typedef enum LARA_STATE { - LS_WALK = 0, - LS_RUN = 1, - LS_STOP = 2, - LS_JUMP_FORWARD = 3, - LS_POSE = 4, - LS_FAST_BACK = 5, - LS_TURN_R = 6, - LS_TURN_L = 7, - LS_DEATH = 8, - LS_FAST_FALL = 9, - LS_HANG = 10, - LS_REACH = 11, - LS_SPLAT = 12, - LS_TREAD = 13, - LS_LAND = 14, - LS_COMPRESS = 15, - LS_BACK = 16, - LS_SWIM = 17, - LS_GLIDE = 18, - LS_CLIMB_UP = 19, - LS_FAST_TURN = 20, - LS_STEP_RIGHT = 21, - LS_STEP_LEFT = 22, - LS_HIT = 23, - LS_SLIDE = 24, - LS_JUMP_BACK = 25, - LS_JUMP_RIGHT = 26, - LS_JUMP_LEFT = 27, - LS_JUMP_UP = 28, - LS_FALL_BACK = 29, - LS_HANG_LEFT = 30, - LS_HANG_RIGHT = 31, - LS_SLIDE_BACK = 32, - LS_SURF_TREAD = 33, - LS_SURF_SWIM = 34, - LS_DIVE = 35, - LS_PUSH_BLOCK = 36, - LS_PULL_BLOCK = 37, - LS_PP_READY = 38, - LS_PICKUP = 39, - LS_SWITCH_ON = 40, - LS_SWITCH_OFF = 41, - LS_USE_KEY = 42, - LS_USE_PUZZLE = 43, - LS_UW_DEATH = 44, - LS_ROLL = 45, - LS_SPECIAL = 46, - LS_SURF_BACK = 47, - LS_SURF_LEFT = 48, - LS_SURF_RIGHT = 49, - LS_USE_MIDAS = 50, - LS_DIE_MIDAS = 51, - LS_SWAN_DIVE = 52, - LS_FAST_DIVE = 53, - LS_GYMNAST = 54, - LS_WATER_OUT = 55, - LS_CONTROLLED = 56, - LS_TWIST = 57, - LS_UW_ROLL = 58, -} LARA_STATE; - -typedef enum LARA_GUN_STATE { - LGS_ARMLESS = 0, - LGS_HANDS_BUSY = 1, - LGS_DRAW = 2, - LGS_UNDRAW = 3, - LGS_READY = 4, -} LARA_GUN_STATE; - -typedef enum LARA_GUN_TYPE { - LGT_UNKNOWN = -1, // for legacy saves - LGT_UNARMED = 0, - LGT_PISTOLS = 1, - LGT_MAGNUMS = 2, - LGT_UZIS = 3, - LGT_SHOTGUN = 4, - NUM_WEAPONS = 5 -} LARA_GUN_TYPE; - -typedef enum LARA_MESH { - LM_HIPS = 0, - LM_THIGH_L = 1, - LM_CALF_L = 2, - LM_FOOT_L = 3, - LM_THIGH_R = 4, - LM_CALF_R = 5, - LM_FOOT_R = 6, - LM_TORSO = 7, - LM_UARM_R = 8, - LM_LARM_R = 9, - LM_HAND_R = 10, - LM_UARM_L = 11, - LM_LARM_L = 12, - LM_HAND_L = 13, - LM_HEAD = 14, - LM_FIRST = LM_HIPS, - LM_NUMBER_OF = 15, -} LARA_MESH; - -typedef enum MOOD_TYPE { - MOOD_BORED = 0, - MOOD_ATTACK = 1, - MOOD_ESCAPE = 2, - MOOD_STALK = 3, -} MOOD_TYPE; - typedef enum TARGET_TYPE { TARGET_NONE = 0, TARGET_PRIMARY = 1, @@ -645,14 +449,6 @@ typedef enum TRIGGER_OBJECT { TO_SECRET = 10, } TRIGGER_OBJECT; -typedef enum ITEM_FLAG { - IF_ONESHOT = 0x0100, - IF_CODE_BITS = 0x3E00, - IF_REVERSE = 0x4000, - IF_NOT_VISIBLE = 0x0100, - IF_KILLED_ITEM = 0x8000, -} ITEM_FLAG; - typedef enum INV_MODE { INV_GAME_MODE = 0, INV_TITLE_MODE = 1, @@ -1067,117 +863,6 @@ typedef struct CINE_POSITION { XYZ_16 rot; } CINE_POSITION; -typedef struct LARA_ARM { - FRAME_INFO *frame_base; - int16_t frame_num; - int16_t lock; - XYZ_16 rot; - uint16_t flash_gun; - - struct { - struct { - XYZ_16 rot; - } result, prev; - } interp; -} LARA_ARM; - -typedef struct AMMO_INFO { - int32_t ammo; - int32_t hit; - int32_t miss; -} AMMO_INFO; - -typedef struct BOX_NODE { - int16_t exit_box; - uint16_t search_num; - int16_t next_expansion; - int16_t box_num; -} BOX_NODE; - -typedef struct LOT_INFO { - BOX_NODE *node; - int16_t head; - int16_t tail; - uint16_t search_num; - uint16_t block_mask; - int16_t step; - int16_t drop; - int16_t fly; - int16_t zone_count; - int16_t target_box; - int16_t required_box; - XYZ_32 target; -} LOT_INFO; - -typedef struct FX_INFO { - XYZ_32 pos; - XYZ_16 rot; - int16_t room_num; - GAME_OBJECT_ID object_id; - int16_t next_draw; - int16_t next_active; - int16_t next_free; - int16_t speed; - int16_t fall_speed; - int16_t frame_num; - int16_t counter; - int16_t shade; - - struct { - struct { - XYZ_32 pos; - XYZ_16 rot; - } result, prev; - } interp; -} FX_INFO; - -typedef struct LARA_INFO { - int16_t item_num; - int16_t gun_status; - LARA_GUN_TYPE gun_type; - LARA_GUN_TYPE request_gun_type; - LARA_GUN_TYPE holsters_gun_type; - LARA_GUN_TYPE back_gun_type; - int16_t calc_fall_speed; - int16_t water_status; - int16_t pose_count; - int16_t hit_frame; - int16_t hit_direction; - int16_t air; - int16_t dive_timer; - int16_t death_timer; - int16_t current_active; - int16_t spaz_effect_count; - FX_INFO *spaz_effect; - int32_t mesh_effects; - int16_t *mesh_ptrs[LM_NUMBER_OF]; - ITEM_INFO *target; - PHD_ANGLE target_angles[2]; - int16_t turn_rate; - int16_t move_angle; - XYZ_16 head_rot; - XYZ_16 torso_rot; - LARA_ARM left_arm; - LARA_ARM right_arm; - AMMO_INFO pistols; - AMMO_INFO magnums; - AMMO_INFO uzis; - AMMO_INFO shotgun; - LOT_INFO LOT; - struct { - int32_t item_num; - int32_t move_count; - bool is_moving; - } interact_target; - - struct { - struct { - XYZ_16 head_rot; - XYZ_16 torso_rot; - } result, prev; - } interp; -} LARA_INFO; - typedef struct GAME_STATS { uint32_t timer; uint32_t death_count; @@ -1236,17 +921,6 @@ typedef struct GAME_INFO { bool ask_for_save; } GAME_INFO; -typedef struct CREATURE_INFO { - int16_t head_rotation; - int16_t neck_rotation; - int16_t maximum_turn; - uint16_t flags; - int16_t item_num; - MOOD_TYPE mood; - LOT_INFO LOT; - XYZ_32 target; -} CREATURE_INFO; - typedef enum { TS_HEADING = 0, TS_BACKGROUND = 1, @@ -1436,36 +1110,6 @@ typedef struct CAMERA_INFO { } interp; } CAMERA_INFO; -typedef struct ANIM_STRUCT { - FRAME_INFO *frame_ptr; - uint32_t frame_ofs; - int16_t interpolation; - int16_t current_anim_state; - int32_t velocity; - int32_t acceleration; - int16_t frame_base; - int16_t frame_end; - int16_t jump_anim_num; - int16_t jump_frame_num; - int16_t number_changes; - int16_t change_index; - int16_t number_commands; - int16_t command_index; -} ANIM_STRUCT; - -typedef struct ANIM_CHANGE_STRUCT { - int16_t goal_anim_state; - int16_t number_ranges; - int16_t range_index; -} ANIM_CHANGE_STRUCT; - -typedef struct ANIM_RANGE_STRUCT { - int16_t start_frame; - int16_t end_frame; - int16_t link_anim_num; - int16_t link_frame_num; -} ANIM_RANGE_STRUCT; - typedef struct DOOR_VBUF { int32_t xv; int32_t yv; diff --git a/src/global/vars.c b/src/global/vars.c index 4e7fc4b44..4ef0fbd82 100644 --- a/src/global/vars.c +++ b/src/global/vars.c @@ -76,9 +76,9 @@ uint16_t *g_Overlap = NULL; int16_t *g_GroundZone[2] = { NULL }; int16_t *g_GroundZone2[2] = { NULL }; int16_t *g_FlyZone[2] = { NULL }; -ANIM_STRUCT *g_Anims = NULL; -ANIM_CHANGE_STRUCT *g_AnimChanges = NULL; -ANIM_RANGE_STRUCT *g_AnimRanges = NULL; +ANIM *g_Anims = NULL; +ANIM_CHANGE *g_AnimChanges = NULL; +ANIM_RANGE *g_AnimRanges = NULL; TEXTURE_RANGE *g_AnimTextureRanges = NULL; int16_t *g_AnimCommands = NULL; int32_t *g_AnimBones = NULL; diff --git a/src/global/vars.h b/src/global/vars.h index 4bedbfc15..dfbe9e98c 100644 --- a/src/global/vars.h +++ b/src/global/vars.h @@ -63,9 +63,9 @@ extern uint16_t *g_Overlap; extern int16_t *g_GroundZone[2]; extern int16_t *g_GroundZone2[2]; extern int16_t *g_FlyZone[2]; -extern ANIM_STRUCT *g_Anims; -extern ANIM_CHANGE_STRUCT *g_AnimChanges; -extern ANIM_RANGE_STRUCT *g_AnimRanges; +extern ANIM *g_Anims; +extern ANIM_CHANGE *g_AnimChanges; +extern ANIM_RANGE *g_AnimRanges; extern TEXTURE_RANGE *g_AnimTextureRanges; extern int16_t *g_AnimCommands; extern int32_t *g_AnimBones; diff --git a/subprojects/libtrx b/subprojects/libtrx index 52fe1f64c..99c5dd40f 160000 --- a/subprojects/libtrx +++ b/subprojects/libtrx @@ -1 +1 @@ -Subproject commit 52fe1f64cd32b27a11cf84f18725f27d02f218d1 +Subproject commit 99c5dd40f02f975cad20ed1bb0eefa6e140865c9 From 00e3162667c225f18efd9d2aef8cc13bd4368335 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 21 Sep 2024 12:48:00 +0200 Subject: [PATCH 3/7] console/cmd: move /abortion to libtrx --- meson.build | 1 - src/game/console/cmd/die.c | 32 -------------------------------- src/game/console/cmd/die.h | 5 ----- src/game/console/setup.c | 2 +- src/game/lara/lara.c | 2 +- src/game/lara/lara_cheat.c | 2 +- src/game/lara/lara_draw.c | 2 +- subprojects/libtrx | 2 +- 8 files changed, 5 insertions(+), 43 deletions(-) delete mode 100644 src/game/console/cmd/die.c delete mode 100644 src/game/console/cmd/die.h diff --git a/meson.build b/meson.build index 80ba99a58..825fd9373 100644 --- a/meson.build +++ b/meson.build @@ -103,7 +103,6 @@ sources = [ 'src/game/collide.c', 'src/game/console/cmd/braid.c', 'src/game/console/cmd/cheats.c', - 'src/game/console/cmd/die.c', 'src/game/console/cmd/end_level.c', 'src/game/console/cmd/exit_game.c', 'src/game/console/cmd/exit_to_title.c', diff --git a/src/game/console/cmd/die.c b/src/game/console/cmd/die.c deleted file mode 100644 index 3dc79934e..000000000 --- a/src/game/console/cmd/die.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "game/console/cmd/die.h" - -#include "game/effects.h" -#include "game/effects/exploding_death.h" -#include "game/objects/common.h" -#include "game/sound.h" -#include "global/vars.h" - -static COMMAND_RESULT M_Entrypoint(const char *args); - -static COMMAND_RESULT M_Entrypoint(const char *args) -{ - if (!g_Objects[O_LARA].loaded) { - return CR_UNAVAILABLE; - } - - if (g_LaraItem->hit_points <= 0) { - return CR_UNAVAILABLE; - } - - Effect_ExplodingDeath(g_Lara.item_num, -1, 0); - Sound_Effect(SFX_EXPLOSION_CHEAT, &g_LaraItem->pos, SPM_NORMAL); - Sound_Effect(SFX_LARA_FALL, &g_LaraItem->pos, SPM_NORMAL); - g_LaraItem->hit_points = 0; - g_LaraItem->flags |= IS_INVISIBLE; - return CR_SUCCESS; -} - -CONSOLE_COMMAND g_Console_Cmd_Die = { - .prefix = "abortion|natlastinks", - .proc = M_Entrypoint, -}; diff --git a/src/game/console/cmd/die.h b/src/game/console/cmd/die.h deleted file mode 100644 index bf50d44b5..000000000 --- a/src/game/console/cmd/die.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -extern CONSOLE_COMMAND g_Console_Cmd_Die; diff --git a/src/game/console/setup.c b/src/game/console/setup.c index 5fe2de66b..01fb8a383 100644 --- a/src/game/console/setup.c +++ b/src/game/console/setup.c @@ -2,7 +2,6 @@ #include "game/console/cmd/braid.h" #include "game/console/cmd/cheats.h" -#include "game/console/cmd/die.h" #include "game/console/cmd/end_level.h" #include "game/console/cmd/exit_game.h" #include "game/console/cmd/exit_to_title.h" @@ -18,6 +17,7 @@ #include "game/console/cmd/wireframe.h" #include +#include #include #include #include diff --git a/src/game/lara/lara.c b/src/game/lara/lara.c index aa2115fb6..35960448b 100644 --- a/src/game/lara/lara.c +++ b/src/game/lara/lara.c @@ -170,7 +170,7 @@ void Lara_Control(void) // is resurrected with DOZY, she should no longer aim at the target. g_Lara.target = NULL; - if (g_LaraItem->flags & IS_INVISIBLE) { + if (g_LaraItem->flags & IF_INVISIBLE) { return; } } diff --git a/src/game/lara/lara_cheat.c b/src/game/lara/lara_cheat.c index b4090c544..5ea76f7d3 100644 --- a/src/game/lara/lara_cheat.c +++ b/src/game/lara/lara_cheat.c @@ -116,7 +116,7 @@ void Lara_Cheat_Control(void) Effect_ExplodingDeath(g_Lara.item_num, -1, 0); Sound_Effect(SFX_EXPLOSION_CHEAT, &g_LaraItem->pos, SPM_NORMAL); g_LaraItem->hit_points = 0; - g_LaraItem->flags |= IS_INVISIBLE; + g_LaraItem->flags |= IF_INVISIBLE; } cheat_mode = 0; } diff --git a/src/game/lara/lara_draw.c b/src/game/lara/lara_draw.c index e659b9ab5..4172581ca 100644 --- a/src/game/lara/lara_draw.c +++ b/src/game/lara/lara_draw.c @@ -20,7 +20,7 @@ void Lara_Draw(ITEM_INFO *item) int32_t bottom = g_PhdBottom; int32_t right = g_PhdRight; - if (g_LaraItem->flags & IS_INVISIBLE) { + if (g_LaraItem->flags & IF_INVISIBLE) { return; } diff --git a/subprojects/libtrx b/subprojects/libtrx index 99c5dd40f..c984f369d 160000 --- a/subprojects/libtrx +++ b/subprojects/libtrx @@ -1 +1 @@ -Subproject commit 99c5dd40f02f975cad20ed1bb0eefa6e140865c9 +Subproject commit c984f369d2e7903ec0cd4c5fa5724aeaa8d571b2 From acccb72fe4b6e6d7990c9bc033bbe28a9bc20c8b Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 21 Sep 2024 12:56:31 +0200 Subject: [PATCH 4/7] lara: tidy structure --- meson.build | 17 +- src/game/console/cmd/end_level.c | 2 +- src/game/console/cmd/teleport.c | 2 +- src/game/creature.c | 2 +- src/game/game/game.c | 2 +- src/game/game/game_draw.c | 4 +- src/game/gameflow.c | 2 +- src/game/gun/gun.c | 2 +- src/game/interpolation.c | 2 +- src/game/lara/{lara_cheat.c => cheat.c} | 4 +- src/game/lara/{lara_cheat.h => cheat.h} | 0 src/game/lara/{lara_col.c => col.c} | 6 +- src/game/lara/{lara_col.h => col.h} | 0 src/game/lara/{lara.c => common.c} | 6 +- src/game/{lara.h => lara/common.h} | 0 src/game/lara/{lara_control.c => control.c} | 12 +- src/game/lara/{lara_control.h => control.h} | 0 src/game/lara/{lara_draw.c => draw.c} | 4 +- src/game/lara/{lara_draw.h => draw.h} | 0 src/game/lara/{lara_hair.c => hair.c} | 2 +- src/game/lara/{lara_hair.h => hair.h} | 0 src/game/lara/lara_misc.c | 779 ------------------- src/game/lara/{lara_look.c => look.c} | 2 +- src/game/lara/{lara_look.h => look.h} | 0 src/game/lara/misc.c | 778 +++++++++++++++++- src/game/lara/{lara_misc.h => misc.h} | 4 +- src/game/lara/{lara_state.c => state.c} | 6 +- src/game/lara/{lara_state.h => state.h} | 0 src/game/level.c | 2 +- src/game/objects/common.c | 2 +- src/game/objects/creatures/ape.c | 2 +- src/game/objects/creatures/bacon_lara.c | 4 +- src/game/objects/creatures/bat.c | 2 +- src/game/objects/creatures/bear.c | 2 +- src/game/objects/creatures/centaur.c | 2 +- src/game/objects/creatures/crocodile.c | 2 +- src/game/objects/creatures/lion.c | 2 +- src/game/objects/creatures/mutant.c | 2 +- src/game/objects/creatures/raptor.c | 2 +- src/game/objects/creatures/rat.c | 2 +- src/game/objects/creatures/torso.c | 2 +- src/game/objects/creatures/trex.c | 2 +- src/game/objects/creatures/wolf.c | 2 +- src/game/objects/effects/body_part.c | 2 +- src/game/objects/effects/ember.c | 2 +- src/game/objects/effects/flame.c | 4 +- src/game/objects/effects/missile.c | 2 +- src/game/objects/general/door.c | 2 +- src/game/objects/general/keyhole.c | 2 +- src/game/objects/general/pickup.c | 2 +- src/game/objects/general/puzzle_hole.c | 2 +- src/game/objects/general/save_crystal.c | 2 +- src/game/objects/general/scion1.c | 2 +- src/game/objects/general/scion4.c | 2 +- src/game/objects/general/switch.c | 2 +- src/game/objects/setup.c | 4 +- src/game/objects/traps/damocles_sword.c | 2 +- src/game/objects/traps/dart.c | 2 +- src/game/objects/traps/falling_ceiling.c | 2 +- src/game/objects/traps/lava_wedge.c | 2 +- src/game/objects/traps/lightning_emitter.c | 2 +- src/game/objects/traps/midas_touch.c | 2 +- src/game/objects/traps/movable_block.c | 2 +- src/game/objects/traps/pendulum.c | 2 +- src/game/objects/traps/rolling_ball.c | 2 +- src/game/objects/traps/spikes.c | 2 +- src/game/objects/traps/teeth_trap.c | 2 +- src/game/objects/traps/thors_hammer_handle.c | 2 +- src/game/objects/traps/thors_hammer_head.c | 2 +- src/game/phase/phase_cutscene.c | 4 +- src/game/phase/phase_demo.c | 6 +- src/game/phase/phase_game.c | 6 +- src/game/phase/phase_inventory.c | 2 +- src/game/room.c | 2 +- src/game/room_draw.c | 2 +- src/game/savegame/savegame_bson.c | 2 +- src/game/savegame/savegame_legacy.c | 2 +- 77 files changed, 874 insertions(+), 878 deletions(-) rename src/game/lara/{lara_cheat.c => cheat.c} (99%) rename src/game/lara/{lara_cheat.h => cheat.h} (100%) rename src/game/lara/{lara_col.c => col.c} (99%) rename src/game/lara/{lara_col.h => col.h} (100%) rename src/game/lara/{lara.c => common.c} (99%) rename src/game/{lara.h => lara/common.h} (100%) rename src/game/lara/{lara_control.c => control.c} (98%) rename src/game/lara/{lara_control.h => control.h} (100%) rename src/game/lara/{lara_draw.c => draw.c} (99%) rename src/game/lara/{lara_draw.h => draw.h} (100%) rename src/game/lara/{lara_hair.c => hair.c} (99%) rename src/game/lara/{lara_hair.h => hair.h} (100%) delete mode 100644 src/game/lara/lara_misc.c rename src/game/lara/{lara_look.c => look.c} (98%) rename src/game/lara/{lara_look.h => look.h} (100%) rename src/game/lara/{lara_misc.h => misc.h} (96%) rename src/game/lara/{lara_state.c => state.c} (99%) rename src/game/lara/{lara_state.h => state.h} (100%) diff --git a/meson.build b/meson.build index 825fd9373..80070d51f 100644 --- a/meson.build +++ b/meson.build @@ -158,16 +158,15 @@ sources = [ 'src/game/inventory/inventory_ring.c', 'src/game/inventory/inventory_vars.c', 'src/game/items.c', - 'src/game/lara/lara.c', - 'src/game/lara/lara_cheat.c', - 'src/game/lara/lara_col.c', - 'src/game/lara/lara_control.c', - 'src/game/lara/lara_draw.c', - 'src/game/lara/lara_hair.c', - 'src/game/lara/lara_look.c', - 'src/game/lara/lara_misc.c', - 'src/game/lara/lara_state.c', + 'src/game/lara/cheat.c', + 'src/game/lara/col.c', + 'src/game/lara/common.c', + 'src/game/lara/control.c', + 'src/game/lara/draw.c', + 'src/game/lara/hair.c', + 'src/game/lara/look.c', 'src/game/lara/misc.c', + 'src/game/lara/state.c', 'src/game/level.c', 'src/game/los.c', 'src/game/lot.c', diff --git a/src/game/console/cmd/end_level.c b/src/game/console/cmd/end_level.c index ab05033f0..19357b89c 100644 --- a/src/game/console/cmd/end_level.c +++ b/src/game/console/cmd/end_level.c @@ -1,6 +1,6 @@ #include "game/console/cmd/end_level.h" -#include "game/lara/lara_cheat.h" +#include "game/lara/cheat.h" #include diff --git a/src/game/console/cmd/teleport.c b/src/game/console/cmd/teleport.c index 082671017..75d6b8b3d 100644 --- a/src/game/console/cmd/teleport.c +++ b/src/game/console/cmd/teleport.c @@ -2,7 +2,7 @@ #include "game/game_string.h" #include "game/items.h" -#include "game/lara/lara_cheat.h" +#include "game/lara/cheat.h" #include "game/objects/common.h" #include "game/objects/names.h" #include "game/random.h" diff --git a/src/game/creature.c b/src/game/creature.c index 658e2a9d3..99ce64235 100644 --- a/src/game/creature.c +++ b/src/game/creature.c @@ -6,7 +6,7 @@ #include "game/effects.h" #include "game/effects/gunshot.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/los.h" #include "game/lot.h" #include "game/objects/common.h" diff --git a/src/game/game/game.c b/src/game/game/game.c index 47590c000..05b116425 100644 --- a/src/game/game/game.c +++ b/src/game/game/game.c @@ -7,7 +7,7 @@ #include "game/input.h" #include "game/interpolation.h" #include "game/inventory.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/level.h" #include "game/music.h" #include "game/output.h" diff --git a/src/game/game/game_draw.c b/src/game/game/game_draw.c index bb7645382..8715c33c1 100644 --- a/src/game/game/game_draw.c +++ b/src/game/game/game_draw.c @@ -3,8 +3,8 @@ #include "config.h" #include "game/camera.h" #include "game/interpolation.h" -#include "game/lara/lara_draw.h" -#include "game/lara/lara_hair.h" +#include "game/lara/draw.h" +#include "game/lara/hair.h" #include "game/output.h" #include "game/overlay.h" #include "game/room_draw.h" diff --git a/src/game/gameflow.c b/src/game/gameflow.c index cce8b0822..a7451698a 100644 --- a/src/game/gameflow.c +++ b/src/game/gameflow.c @@ -6,7 +6,7 @@ #include "game/game_string.h" #include "game/inventory.h" #include "game/inventory/inventory_vars.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/music.h" #include "game/objects/creatures/bacon_lara.h" #include "game/phase/phase.h" diff --git a/src/game/gun/gun.c b/src/game/gun/gun.c index a4c0d7366..90afe8c59 100644 --- a/src/game/gun/gun.c +++ b/src/game/gun/gun.c @@ -4,7 +4,7 @@ #include "game/gun/gun_rifle.h" #include "game/input.h" #include "game/inventory.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/output.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/interpolation.c b/src/game/interpolation.c index 39df418b0..6f9ee323a 100644 --- a/src/game/interpolation.c +++ b/src/game/interpolation.c @@ -3,7 +3,7 @@ #include "config.h" #include "game/effects.h" #include "game/items.h" -#include "game/lara/lara_hair.h" +#include "game/lara/hair.h" #include "game/room.h" #include "global/const.h" #include "global/vars.h" diff --git a/src/game/lara/lara_cheat.c b/src/game/lara/cheat.c similarity index 99% rename from src/game/lara/lara_cheat.c rename to src/game/lara/cheat.c index 5ea76f7d3..4adbc0509 100644 --- a/src/game/lara/lara_cheat.c +++ b/src/game/lara/cheat.c @@ -1,4 +1,4 @@ -#include "game/lara/lara_cheat.h" +#include "game/lara/cheat.h" #include "game/camera.h" #include "game/carrier.h" @@ -8,7 +8,7 @@ #include "game/gameflow.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/objects/common.h" #include "game/room.h" diff --git a/src/game/lara/lara_cheat.h b/src/game/lara/cheat.h similarity index 100% rename from src/game/lara/lara_cheat.h rename to src/game/lara/cheat.h diff --git a/src/game/lara/lara_col.c b/src/game/lara/col.c similarity index 99% rename from src/game/lara/lara_col.c rename to src/game/lara/col.c index 78176ef51..359554b42 100644 --- a/src/game/lara/lara_col.c +++ b/src/game/lara/col.c @@ -1,11 +1,11 @@ -#include "game/lara/lara_col.h" +#include "game/lara/col.h" #include "config.h" #include "game/collide.h" #include "game/input.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_misc.h" +#include "game/lara/common.h" +#include "game/lara/misc.h" #include "game/room.h" #include "game/sound.h" #include "global/const.h" diff --git a/src/game/lara/lara_col.h b/src/game/lara/col.h similarity index 100% rename from src/game/lara/lara_col.h rename to src/game/lara/col.h diff --git a/src/game/lara/lara.c b/src/game/lara/common.c similarity index 99% rename from src/game/lara/lara.c rename to src/game/lara/common.c index 35960448b..552043af9 100644 --- a/src/game/lara/lara.c +++ b/src/game/lara/common.c @@ -1,4 +1,4 @@ -#include "game/lara.h" +#include "game/lara/common.h" #include "config.h" #include "game/camera.h" @@ -8,8 +8,8 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara/lara_cheat.h" -#include "game/lara/lara_control.h" +#include "game/lara/cheat.h" +#include "game/lara/control.h" #include "game/lot.h" #include "game/music.h" #include "game/objects/common.h" diff --git a/src/game/lara.h b/src/game/lara/common.h similarity index 100% rename from src/game/lara.h rename to src/game/lara/common.h diff --git a/src/game/lara/lara_control.c b/src/game/lara/control.c similarity index 98% rename from src/game/lara/lara_control.c rename to src/game/lara/control.c index 33d59fcb3..6fc1a3aa2 100644 --- a/src/game/lara/lara_control.c +++ b/src/game/lara/control.c @@ -1,4 +1,4 @@ -#include "game/lara/lara_control.h" +#include "game/lara/control.h" #include "config.h" #include "game/box.h" @@ -6,11 +6,11 @@ #include "game/gun.h" #include "game/input.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_cheat.h" -#include "game/lara/lara_col.h" -#include "game/lara/lara_look.h" -#include "game/lara/lara_state.h" +#include "game/lara/cheat.h" +#include "game/lara/col.h" +#include "game/lara/common.h" +#include "game/lara/look.h" +#include "game/lara/state.h" #include "game/lot.h" #include "game/room.h" #include "game/sound.h" diff --git a/src/game/lara/lara_control.h b/src/game/lara/control.h similarity index 100% rename from src/game/lara/lara_control.h rename to src/game/lara/control.h diff --git a/src/game/lara/lara_draw.c b/src/game/lara/draw.c similarity index 99% rename from src/game/lara/lara_draw.c rename to src/game/lara/draw.c index 4172581ca..95a94079f 100644 --- a/src/game/lara/lara_draw.c +++ b/src/game/lara/draw.c @@ -1,8 +1,8 @@ -#include "game/lara/lara_draw.h" +#include "game/lara/draw.h" #include "game/gun.h" #include "game/items.h" -#include "game/lara/lara_hair.h" +#include "game/lara/hair.h" #include "game/output.h" #include "game/viewport.h" #include "global/vars.h" diff --git a/src/game/lara/lara_draw.h b/src/game/lara/draw.h similarity index 100% rename from src/game/lara/lara_draw.h rename to src/game/lara/draw.h diff --git a/src/game/lara/lara_hair.c b/src/game/lara/hair.c similarity index 99% rename from src/game/lara/lara_hair.c rename to src/game/lara/hair.c index 1e77aa6e3..6d02f0a29 100644 --- a/src/game/lara/lara_hair.c +++ b/src/game/lara/hair.c @@ -1,4 +1,4 @@ -#include "game/lara/lara_hair.h" +#include "game/lara/hair.h" #include "config.h" #include "game/items.h" diff --git a/src/game/lara/lara_hair.h b/src/game/lara/hair.h similarity index 100% rename from src/game/lara/lara_hair.h rename to src/game/lara/hair.h diff --git a/src/game/lara/lara_misc.c b/src/game/lara/lara_misc.c deleted file mode 100644 index 166c1ebc9..000000000 --- a/src/game/lara/lara_misc.c +++ /dev/null @@ -1,779 +0,0 @@ -#include "game/lara/lara_misc.h" - -#include "config.h" -#include "game/collide.h" -#include "game/effects.h" -#include "game/input.h" -#include "game/items.h" -#include "game/lara.h" -#include "game/random.h" -#include "game/room.h" -#include "global/const.h" -#include "global/vars.h" -#include "math/math.h" - -#include - -#include - -#define LF_FASTFALL 1 -#define LF_STOPHANG 9 -#define LF_STARTHANG 12 -#define LF_HANG 21 - -void Lara_GetCollisionInfo(ITEM_INFO *item, COLL_INFO *coll) -{ - coll->facing = g_Lara.move_angle; - Collide_GetCollisionInfo( - coll, item->pos.x, item->pos.y, item->pos.z, item->room_num, - LARA_HEIGHT); -} - -void Lara_HangTest(ITEM_INFO *item, COLL_INFO *coll) -{ - int flag = 0; - const BOUNDS_16 *bounds; - - coll->bad_pos = NO_BAD_POS; - coll->bad_neg = NO_BAD_NEG; - coll->bad_ceiling = 0; - Lara_GetCollisionInfo(item, coll); - if (coll->front_floor < 200) { - flag = 1; - } - - g_Lara.move_angle = item->rot.y; - item->gravity = 0; - item->fall_speed = 0; - - PHD_ANGLE angle = (uint16_t)(item->rot.y + PHD_45) / PHD_90; - switch (angle) { - case DIR_NORTH: - item->pos.z += 2; - break; - - case DIR_WEST: - item->pos.x -= 2; - break; - - case DIR_SOUTH: - item->pos.z -= 2; - break; - - case DIR_EAST: - item->pos.x += 2; - break; - } - - coll->bad_pos = NO_BAD_POS; - coll->bad_neg = -STEPUP_HEIGHT; - coll->bad_ceiling = 0; - Lara_GetCollisionInfo(item, coll); - - if (!g_Input.action || item->hit_points <= 0) { - item->goal_anim_state = LS_JUMP_UP; - item->current_anim_state = LS_JUMP_UP; - Item_SwitchToAnim(item, LA_STOP_HANG, LF_STOPHANG); - bounds = Item_GetBoundsAccurate(item); - if (g_Config.enable_swing_cancel && item->hit_points > 0) { - item->pos.y += bounds->max.y; - } else { - item->pos.y += coll->front_floor - bounds->min.y + 2; - } - item->pos.x += coll->shift.x; - item->pos.z += coll->shift.z; - item->gravity = 1; - item->fall_speed = 1; - item->speed = 2; - g_Lara.gun_status = LGS_ARMLESS; - return; - } - - bounds = Item_GetBoundsAccurate(item); - const int32_t hdif = coll->front_floor - bounds->min.y; - - if (ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF - || coll->mid_ceiling >= 0 || coll->coll_type != COLL_FRONT - || hdif < -SLOPE_DIF || hdif > SLOPE_DIF || flag) { - item->pos.x = coll->old.x; - item->pos.y = coll->old.y; - item->pos.z = coll->old.z; - if (item->current_anim_state == LS_HANG_LEFT - || item->current_anim_state == LS_HANG_RIGHT) { - item->goal_anim_state = LS_HANG; - item->current_anim_state = LS_HANG; - Item_SwitchToAnim(item, LA_HANG, LF_HANG); - } - return; - } - - switch (angle) { - case DIR_NORTH: - case DIR_SOUTH: - item->pos.z += coll->shift.z; - break; - - case DIR_WEST: - case DIR_EAST: - item->pos.x += coll->shift.x; - break; - } - - if (hdif >= -STEP_L && hdif <= STEP_L) { - item->pos.y += hdif; - } -} - -void Lara_SlideSlope(ITEM_INFO *item, COLL_INFO *coll) -{ - coll->bad_pos = NO_BAD_POS; - coll->bad_neg = -512; - coll->bad_ceiling = 0; - Lara_GetCollisionInfo(item, coll); - - if (Lara_HitCeiling(item, coll)) { - return; - } - - Lara_DeflectEdge(item, coll); - - if (coll->mid_floor > 200) { - if (item->current_anim_state == LS_SLIDE) { - item->current_anim_state = LS_JUMP_FORWARD; - item->goal_anim_state = LS_JUMP_FORWARD; - Item_SwitchToAnim(item, LA_FALL_DOWN, 0); - } else { - item->current_anim_state = LS_FALL_BACK; - item->goal_anim_state = LS_FALL_BACK; - Item_SwitchToAnim(item, LA_FALL_BACK, 0); - } - item->gravity = 1; - item->fall_speed = 0; - return; - } - - Lara_TestSlide(item, coll); - item->pos.y += coll->mid_floor; - - if (ABS(coll->tilt_x) <= 2 && ABS(coll->tilt_z) <= 2) { - item->goal_anim_state = LS_STOP; - } -} - -bool Lara_Fallen(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->mid_floor <= STEPUP_HEIGHT) { - return false; - } - item->current_anim_state = LS_JUMP_FORWARD; - item->goal_anim_state = LS_JUMP_FORWARD; - Item_SwitchToAnim(item, LA_FALL_DOWN, 0); - item->gravity = 1; - item->fall_speed = 0; - return true; -} - -bool Lara_HitCeiling(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->coll_type != COLL_TOP && coll->coll_type != COLL_CLAMP) { - return false; - } - - item->pos.x = coll->old.x; - item->pos.y = coll->old.y; - item->pos.z = coll->old.z; - item->goal_anim_state = LS_STOP; - item->current_anim_state = LS_STOP; - Item_SwitchToAnim(item, LA_STOP, 0); - item->gravity = 0; - item->fall_speed = 0; - item->speed = 0; - return true; -} -bool Lara_DeflectEdge(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->coll_type == COLL_FRONT || coll->coll_type == COLL_TOPFRONT) { - Item_ShiftCol(item, coll); - item->goal_anim_state = LS_STOP; - item->current_anim_state = LS_STOP; - item->gravity = 0; - item->speed = 0; - return true; - } - - if (coll->coll_type == COLL_LEFT) { - Item_ShiftCol(item, coll); - item->rot.y += LARA_DEF_ADD_EDGE; - } else if (coll->coll_type == COLL_RIGHT) { - Item_ShiftCol(item, coll); - item->rot.y -= LARA_DEF_ADD_EDGE; - } - return false; -} - -void Lara_DeflectEdgeJump(ITEM_INFO *item, COLL_INFO *coll) -{ - Item_ShiftCol(item, coll); - switch (coll->coll_type) { - case COLL_LEFT: - item->rot.y += LARA_DEF_ADD_EDGE; - break; - - case COLL_RIGHT: - item->rot.y -= LARA_DEF_ADD_EDGE; - break; - - case COLL_FRONT: - case COLL_TOPFRONT: - item->goal_anim_state = LS_FAST_FALL; - item->current_anim_state = LS_FAST_FALL; - Item_SwitchToAnim(item, LA_FAST_FALL, LF_FASTFALL); - item->speed /= 4; - g_Lara.move_angle -= PHD_180; - if (item->fall_speed <= 0) { - item->fall_speed = 1; - } - break; - - case COLL_TOP: - if (item->fall_speed <= 0) { - item->fall_speed = 1; - } - break; - - case COLL_CLAMP: - item->pos.z -= (Math_Cos(coll->facing) * 100) >> W2V_SHIFT; - item->pos.x -= (Math_Sin(coll->facing) * 100) >> W2V_SHIFT; - item->speed = 0; - coll->mid_floor = 0; - if (item->fall_speed <= 0) { - item->fall_speed = 16; - } - break; - } -} - -void Lara_SlideEdgeJump(ITEM_INFO *item, COLL_INFO *coll) -{ - Item_ShiftCol(item, coll); - switch (coll->coll_type) { - case COLL_LEFT: - item->rot.y += LARA_DEF_ADD_EDGE; - break; - - case COLL_RIGHT: - item->rot.y -= LARA_DEF_ADD_EDGE; - break; - - case COLL_TOP: - case COLL_TOPFRONT: - if (item->fall_speed <= 0) { - item->fall_speed = 1; - } - break; - - case COLL_CLAMP: - item->pos.z -= (Math_Cos(coll->facing) * 100) >> W2V_SHIFT; - item->pos.x -= (Math_Sin(coll->facing) * 100) >> W2V_SHIFT; - item->speed = 0; - coll->mid_floor = 0; - if (item->fall_speed <= 0) { - item->fall_speed = 16; - } - break; - } -} - -bool Lara_TestVault(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->coll_type != COLL_FRONT || !g_Input.action - || g_Lara.gun_status != LGS_ARMLESS - || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { - return false; - } - - PHD_ANGLE angle = item->rot.y; - if (angle >= 0 - VAULT_ANGLE && angle <= 0 + VAULT_ANGLE) { - angle = 0; - } else if (angle >= PHD_90 - VAULT_ANGLE && angle <= PHD_90 + VAULT_ANGLE) { - angle = PHD_90; - } else if ( - angle >= (PHD_180 - 1) - VAULT_ANGLE - || angle <= -(PHD_180 - 1) + VAULT_ANGLE) { - angle = -PHD_180; - } else if ( - angle >= -PHD_90 - VAULT_ANGLE && angle <= -PHD_90 + VAULT_ANGLE) { - angle = -PHD_90; - } - - if (angle & (PHD_90 - 1)) { - return false; - } - - int32_t hdif = coll->front_floor; - if (hdif >= -STEP_L * 2 - STEP_L / 2 && hdif <= -STEP_L * 2 + STEP_L / 2) { - if (hdif - coll->front_ceiling < 0 - || coll->left_floor - coll->left_ceiling < 0 - || coll->right_floor - coll->right_ceiling < 0) { - return false; - } - item->current_anim_state = LS_CLIMB_UP; - item->goal_anim_state = LS_STOP; - Item_SwitchToAnim(item, LA_VAULT_12, 0); - item->pos.y += STEP_L * 2 + hdif; - g_Lara.gun_status = LGS_HANDS_BUSY; - item->rot.y = angle; - Item_ShiftCol(item, coll); - return true; - } else if ( - hdif >= -STEP_L * 3 - STEP_L / 2 && hdif <= -STEP_L * 3 + STEP_L / 2) { - if (hdif - coll->front_ceiling < 0 - || coll->left_floor - coll->left_ceiling < 0 - || coll->right_floor - coll->right_ceiling < 0) { - return false; - } - item->current_anim_state = LS_CLIMB_UP; - item->goal_anim_state = LS_STOP; - Item_SwitchToAnim(item, LA_VAULT_34, 0); - item->pos.y += STEP_L * 3 + hdif; - g_Lara.gun_status = LGS_HANDS_BUSY; - item->rot.y = angle; - Item_ShiftCol(item, coll); - return true; - } else if ( - hdif >= -STEP_L * 7 - STEP_L / 2 && hdif <= -STEP_L * 4 + STEP_L / 2) { - item->goal_anim_state = LS_JUMP_UP; - item->current_anim_state = LS_STOP; - Item_SwitchToAnim(item, LA_STOP, 0); - g_Lara.calc_fall_speed = - -(int16_t)(Math_Sqrt((int)(-2 * GRAVITY * (hdif + 800))) + 3); - Lara_Animate(item); - item->rot.y = angle; - Item_ShiftCol(item, coll); - return true; - } - - return false; -} - -bool Lara_TestHangJump(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->coll_type != COLL_FRONT || !g_Input.action - || g_Lara.gun_status != LGS_ARMLESS - || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { - return false; - } - - if (coll->front_ceiling > 0 || coll->mid_ceiling > -384 - || coll->mid_floor < 200) { - return false; - } - - const BOUNDS_16 *const bounds = Item_GetBoundsAccurate(item); - const int32_t hdif = coll->front_floor - bounds->min.y; - if (hdif < 0 && hdif + item->fall_speed < 0) { - return false; - } - if (hdif > 0 && hdif + item->fall_speed > 0) { - return false; - } - - PHD_ANGLE angle = item->rot.y; - if (angle >= -HANG_ANGLE && angle <= HANG_ANGLE) { - angle = 0; - } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { - angle = PHD_90; - } else if ( - angle >= (PHD_180 - 1) - HANG_ANGLE - || angle <= -(PHD_180 - 1) + HANG_ANGLE) { - angle = -PHD_180; - } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { - angle = -PHD_90; - } - - if (angle & (PHD_90 - 1)) { - return false; - } - - if (Lara_TestHangSwingIn(item, angle)) { - Item_SwitchToAnim(item, LA_GRAB_LEDGE_IN, 0); - } else { - Item_SwitchToAnim(item, LA_GRAB_LEDGE, 0); - } - item->current_anim_state = LS_HANG; - item->goal_anim_state = LS_HANG; - - // bounds = Item_GetBoundsAccurate(item); - item->pos.y += hdif; - item->pos.x += coll->shift.x; - item->pos.z += coll->shift.z; - item->rot.y = angle; - item->gravity = 0; - item->fall_speed = 0; - item->speed = 0; - g_Lara.gun_status = LGS_HANDS_BUSY; - return true; -} - -bool Lara_TestHangSwingIn(ITEM_INFO *item, PHD_ANGLE angle) -{ - int x = item->pos.x; - int y = item->pos.y; - int z = item->pos.z; - int16_t room_num = item->room_num; - switch (angle) { - case 0: - z += 256; - break; - case PHD_90: - x += 256; - break; - case -PHD_90: - x -= 256; - break; - case -PHD_180: - z -= 256; - break; - } - - const SECTOR_INFO *const sector = Room_GetSector(x, y, z, &room_num); - const int32_t h = Room_GetHeight(sector, x, y, z); - const int32_t c = Room_GetCeiling(sector, x, y, z); - - if (h != NO_HEIGHT) { - if ((h - y) > 0 && (c - y) < -400) { - return true; - } - } - return false; -} - -bool Lara_TestHangJumpUp(ITEM_INFO *item, COLL_INFO *coll) -{ - if (coll->coll_type != COLL_FRONT || !g_Input.action - || g_Lara.gun_status != LGS_ARMLESS - || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { - return false; - } - - if (coll->front_ceiling > 0 || coll->mid_ceiling > -384) { - return false; - } - - const BOUNDS_16 *bounds = Item_GetBoundsAccurate(item); - const int32_t hdif = coll->front_floor - bounds->min.y; - if (hdif < 0 && hdif + item->fall_speed < 0) { - return false; - } - if (hdif > 0 && hdif + item->fall_speed > 0) { - return false; - } - - PHD_ANGLE angle = item->rot.y; - if (angle >= 0 - HANG_ANGLE && angle <= 0 + HANG_ANGLE) { - angle = 0; - } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { - angle = PHD_90; - } else if ( - angle >= (PHD_180 - 1) - HANG_ANGLE - || angle <= -(PHD_180 - 1) + HANG_ANGLE) { - angle = -PHD_180; - } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { - angle = -PHD_90; - } - - if (angle & (PHD_90 - 1)) { - return false; - } - - item->goal_anim_state = LS_HANG; - item->current_anim_state = LS_HANG; - Item_SwitchToAnim(item, LA_HANG, LF_STARTHANG); - bounds = Item_GetBoundsAccurate(item); - item->pos.y += coll->front_floor - bounds->min.y; - item->pos.x += coll->shift.x; - item->pos.z += coll->shift.z; - item->rot.y = angle; - item->gravity = 0; - item->fall_speed = 0; - item->speed = 0; - g_Lara.gun_status = LGS_HANDS_BUSY; - return true; -} - -bool Lara_TestSlide(ITEM_INFO *item, COLL_INFO *coll) -{ - static PHD_ANGLE old_angle = 1; - - if (ABS(coll->tilt_x) <= 2 && ABS(coll->tilt_z) <= 2) { - return false; - } - - PHD_ANGLE ang = 0; - if (coll->tilt_x > 2) { - ang = -PHD_90; - } else if (coll->tilt_x < -2) { - ang = PHD_90; - } - if (coll->tilt_z > 2 && coll->tilt_z > ABS(coll->tilt_x)) { - ang = -PHD_180; - } else if (coll->tilt_z < -2 && -coll->tilt_z > ABS(coll->tilt_x)) { - ang = 0; - } - - PHD_ANGLE adif = ang - item->rot.y; - Item_ShiftCol(item, coll); - if (adif >= -PHD_90 && adif <= PHD_90) { - if (item->current_anim_state != LS_SLIDE || old_angle != ang) { - item->goal_anim_state = LS_SLIDE; - item->current_anim_state = LS_SLIDE; - Item_SwitchToAnim(item, LA_SLIDE, 0); - item->rot.y = ang; - g_Lara.move_angle = ang; - old_angle = ang; - } - } else { - if (item->current_anim_state != LS_SLIDE_BACK || old_angle != ang) { - item->goal_anim_state = LS_SLIDE_BACK; - item->current_anim_state = LS_SLIDE_BACK; - Item_SwitchToAnim(item, LA_SLIDE_BACK, 0); - item->rot.y = ang - PHD_180; - g_Lara.move_angle = ang; - old_angle = ang; - } - } - return true; -} - -bool Lara_LandedBad(ITEM_INFO *item, COLL_INFO *coll) -{ - int16_t room_num = item->room_num; - - const SECTOR_INFO *const sector = - Room_GetSector(item->pos.x, item->pos.y, item->pos.z, &room_num); - - const int32_t old_y = item->pos.y; - const int32_t height = Room_GetHeight( - sector, item->pos.x, item->pos.y - LARA_HEIGHT, item->pos.z); - - item->floor = height; - item->pos.y = height; - Room_TestTriggers(item); - item->pos.y = old_y; - - int landspeed = item->fall_speed - DAMAGE_START; - if (landspeed <= 0) { - return false; - } else if (landspeed > DAMAGE_LENGTH) { - item->hit_points = -1; - } else { - Lara_TakeDamage( - (LARA_MAX_HITPOINTS * landspeed * landspeed) - / (DAMAGE_LENGTH * DAMAGE_LENGTH), - false); - } - - // #675: Original bug to keep. Correct operator would be <= - if (item->hit_points < 0) { - return true; - } - return false; -} - -void Lara_SurfaceCollision(ITEM_INFO *item, COLL_INFO *coll) -{ - coll->facing = g_Lara.move_angle; - - Collide_GetCollisionInfo( - coll, item->pos.x, item->pos.y + SURF_HEIGHT, item->pos.z, - item->room_num, SURF_HEIGHT); - - Item_ShiftCol(item, coll); - - if ((coll->coll_type - & (COLL_FRONT | COLL_LEFT | COLL_RIGHT | COLL_TOP | COLL_TOPFRONT - | COLL_CLAMP)) - || coll->mid_floor < 0) { - item->fall_speed = 0; - item->pos.x = coll->old.x; - item->pos.y = coll->old.y; - item->pos.z = coll->old.z; - } else if (coll->coll_type == COLL_LEFT) { - item->rot.y += 5 * PHD_DEGREE; - } else if (coll->coll_type == COLL_RIGHT) { - item->rot.y -= 5 * PHD_DEGREE; - } - - int16_t wh = Room_GetWaterHeight( - item->pos.x, item->pos.y, item->pos.z, item->room_num); - if (wh - item->pos.y <= -100) { - item->goal_anim_state = LS_SWIM; - item->current_anim_state = LS_DIVE; - Item_SwitchToAnim(item, LA_SURF_DIVE, 0); - item->rot.x = -45 * PHD_DEGREE; - item->fall_speed = 80; - g_Lara.water_status = LWS_UNDERWATER; - return; - } - - Lara_TestWaterClimbOut(item, coll); -} - -bool Lara_TestWaterClimbOut(ITEM_INFO *item, COLL_INFO *coll) -{ - if (item->rot.y != g_Lara.move_angle) { - return false; - } - - if (coll->coll_type != COLL_FRONT || !g_Input.action - || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { - return false; - } - - if (coll->front_ceiling > 0 || coll->mid_ceiling > -STEPUP_HEIGHT) { - return false; - } - - const int32_t hdif = coll->front_floor + 700; - if (hdif < -512 || hdif > 100) { - return false; - } - - PHD_ANGLE angle = item->rot.y; - if (angle >= -HANG_ANGLE && angle <= HANG_ANGLE) { - angle = 0; - } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { - angle = PHD_90; - } else if ( - angle >= (PHD_180 - 1) - HANG_ANGLE - || angle <= -(PHD_180 - 1) + HANG_ANGLE) { - angle = -PHD_180; - } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { - angle = -PHD_90; - } - if (angle & (PHD_90 - 1)) { - return false; - } - - item->pos.y += hdif - 5; - Item_UpdateRoom(item, -LARA_HEIGHT / 2); - - switch (angle) { - case 0: - item->pos.z = (item->pos.z & -WALL_L) + WALL_L + LARA_RAD; - break; - case PHD_90: - item->pos.x = (item->pos.x & -WALL_L) + WALL_L + LARA_RAD; - break; - case -PHD_180: - item->pos.z = (item->pos.z & -WALL_L) - LARA_RAD; - break; - case -PHD_90: - item->pos.x = (item->pos.x & -WALL_L) - LARA_RAD; - break; - } - - Item_SwitchToAnim(item, LA_SURF_CLIMB, 0); - item->current_anim_state = LS_WATER_OUT; - item->goal_anim_state = LS_STOP; - item->rot.x = 0; - item->rot.y = angle; - item->rot.z = 0; - item->gravity = 0; - item->fall_speed = 0; - item->speed = 0; - g_Lara.gun_status = LGS_HANDS_BUSY; - g_Lara.water_status = LWS_ABOVE_WATER; - return true; -} - -void Lara_SwimCollision(ITEM_INFO *item, COLL_INFO *coll) -{ - if (item->rot.x >= -PHD_90 && item->rot.x <= PHD_90) { - g_Lara.move_angle = coll->facing = item->rot.y; - } else { - g_Lara.move_angle = coll->facing = item->rot.y - PHD_180; - } - Collide_GetCollisionInfo( - coll, item->pos.x, item->pos.y + UW_HEIGHT / 2, item->pos.z, - item->room_num, UW_HEIGHT); - - Item_ShiftCol(item, coll); - - switch (coll->coll_type) { - case COLL_FRONT: - if (item->rot.x > 35 * PHD_DEGREE) { - item->rot.x = item->rot.x + UW_WALLDEFLECT; - break; - } - if (item->rot.x < -35 * PHD_DEGREE) { - item->rot.x = item->rot.x - UW_WALLDEFLECT; - break; - } - item->fall_speed = 0; - break; - - case COLL_TOP: - if (item->rot.x >= -45 * PHD_DEGREE) { - item->rot.x -= UW_WALLDEFLECT; - } - break; - - case COLL_TOPFRONT: - item->fall_speed = 0; - break; - - case COLL_LEFT: - item->rot.y += 5 * PHD_DEGREE; - break; - - case COLL_RIGHT: - item->rot.y -= 5 * PHD_DEGREE; - break; - - case COLL_CLAMP: - item->fall_speed = 0; - return; - break; - } - - if (coll->mid_floor < 0) { - item->pos.y += coll->mid_floor; - item->rot.x += UW_WALLDEFLECT; - } -} - -void Lara_CatchFire(void) -{ - if (g_Lara.water_status == LWS_CHEAT || g_LaraItem->hit_points < 0) { - return; - } - - int16_t room_num = g_LaraItem->room_num; - const SECTOR_INFO *const sector = Room_GetSector( - g_LaraItem->pos.x, MAX_HEIGHT, g_LaraItem->pos.z, &room_num); - const int16_t height = Room_GetHeight( - sector, g_LaraItem->pos.x, MAX_HEIGHT, g_LaraItem->pos.z); - - if (g_LaraItem->floor != height) { - return; - } - - g_LaraItem->hit_points = -1; - g_LaraItem->hit_status = 1; - - if (g_Lara.water_status != LWS_ABOVE_WATER) { - return; - } - - for (int32_t i = 0; i < 10; i++) { - const int16_t fx_num = Effect_Create(g_LaraItem->room_num); - if (fx_num != NO_ITEM) { - FX_INFO *const fx = &g_Effects[fx_num]; - fx->object_id = O_FLAME; - fx->frame_num = - (g_Objects[O_FLAME].nmeshes * Random_GetControl()) / 0x7FFF; - fx->counter = -1 - Random_GetControl() * 24 / 0x7FFF; - } - } -} diff --git a/src/game/lara/lara_look.c b/src/game/lara/look.c similarity index 98% rename from src/game/lara/lara_look.c rename to src/game/lara/look.c index e0aff8530..2bc3e8dbe 100644 --- a/src/game/lara/lara_look.c +++ b/src/game/lara/look.c @@ -1,4 +1,4 @@ -#include "game/lara/lara_look.h" +#include "game/lara/look.h" #include "config.h" #include "game/input.h" diff --git a/src/game/lara/lara_look.h b/src/game/lara/look.h similarity index 100% rename from src/game/lara/lara_look.h rename to src/game/lara/look.h diff --git a/src/game/lara/misc.c b/src/game/lara/misc.c index cb3a49275..ddda1f71d 100644 --- a/src/game/lara/misc.c +++ b/src/game/lara/misc.c @@ -1,6 +1,782 @@ +#include "game/lara/misc.h" + +#include "config.h" +#include "game/collide.h" #include "game/effects.h" +#include "game/input.h" +#include "game/items.h" +#include "game/lara/common.h" +#include "game/random.h" +#include "game/room.h" +#include "global/const.h" +#include "global/vars.h" +#include "math/math.h" + +#include + +#include + +#define LF_FASTFALL 1 +#define LF_STOPHANG 9 +#define LF_STARTHANG 12 +#define LF_HANG 21 + +void Lara_GetCollisionInfo(ITEM_INFO *item, COLL_INFO *coll) +{ + coll->facing = g_Lara.move_angle; + Collide_GetCollisionInfo( + coll, item->pos.x, item->pos.y, item->pos.z, item->room_num, + LARA_HEIGHT); +} + +void Lara_HangTest(ITEM_INFO *item, COLL_INFO *coll) +{ + int flag = 0; + const BOUNDS_16 *bounds; + + coll->bad_pos = NO_BAD_POS; + coll->bad_neg = NO_BAD_NEG; + coll->bad_ceiling = 0; + Lara_GetCollisionInfo(item, coll); + if (coll->front_floor < 200) { + flag = 1; + } + + g_Lara.move_angle = item->rot.y; + item->gravity = 0; + item->fall_speed = 0; + + PHD_ANGLE angle = (uint16_t)(item->rot.y + PHD_45) / PHD_90; + switch (angle) { + case DIR_NORTH: + item->pos.z += 2; + break; + + case DIR_WEST: + item->pos.x -= 2; + break; + + case DIR_SOUTH: + item->pos.z -= 2; + break; + + case DIR_EAST: + item->pos.x += 2; + break; + } + + coll->bad_pos = NO_BAD_POS; + coll->bad_neg = -STEPUP_HEIGHT; + coll->bad_ceiling = 0; + Lara_GetCollisionInfo(item, coll); + + if (!g_Input.action || item->hit_points <= 0) { + item->goal_anim_state = LS_JUMP_UP; + item->current_anim_state = LS_JUMP_UP; + Item_SwitchToAnim(item, LA_STOP_HANG, LF_STOPHANG); + bounds = Item_GetBoundsAccurate(item); + if (g_Config.enable_swing_cancel && item->hit_points > 0) { + item->pos.y += bounds->max.y; + } else { + item->pos.y += coll->front_floor - bounds->min.y + 2; + } + item->pos.x += coll->shift.x; + item->pos.z += coll->shift.z; + item->gravity = 1; + item->fall_speed = 1; + item->speed = 2; + g_Lara.gun_status = LGS_ARMLESS; + return; + } + + bounds = Item_GetBoundsAccurate(item); + const int32_t hdif = coll->front_floor - bounds->min.y; + + if (ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF + || coll->mid_ceiling >= 0 || coll->coll_type != COLL_FRONT + || hdif < -SLOPE_DIF || hdif > SLOPE_DIF || flag) { + item->pos.x = coll->old.x; + item->pos.y = coll->old.y; + item->pos.z = coll->old.z; + if (item->current_anim_state == LS_HANG_LEFT + || item->current_anim_state == LS_HANG_RIGHT) { + item->goal_anim_state = LS_HANG; + item->current_anim_state = LS_HANG; + Item_SwitchToAnim(item, LA_HANG, LF_HANG); + } + return; + } + + switch (angle) { + case DIR_NORTH: + case DIR_SOUTH: + item->pos.z += coll->shift.z; + break; + + case DIR_WEST: + case DIR_EAST: + item->pos.x += coll->shift.x; + break; + } + + if (hdif >= -STEP_L && hdif <= STEP_L) { + item->pos.y += hdif; + } +} + +void Lara_SlideSlope(ITEM_INFO *item, COLL_INFO *coll) +{ + coll->bad_pos = NO_BAD_POS; + coll->bad_neg = -512; + coll->bad_ceiling = 0; + Lara_GetCollisionInfo(item, coll); + + if (Lara_HitCeiling(item, coll)) { + return; + } + + Lara_DeflectEdge(item, coll); + + if (coll->mid_floor > 200) { + if (item->current_anim_state == LS_SLIDE) { + item->current_anim_state = LS_JUMP_FORWARD; + item->goal_anim_state = LS_JUMP_FORWARD; + Item_SwitchToAnim(item, LA_FALL_DOWN, 0); + } else { + item->current_anim_state = LS_FALL_BACK; + item->goal_anim_state = LS_FALL_BACK; + Item_SwitchToAnim(item, LA_FALL_BACK, 0); + } + item->gravity = 1; + item->fall_speed = 0; + return; + } + + Lara_TestSlide(item, coll); + item->pos.y += coll->mid_floor; + + if (ABS(coll->tilt_x) <= 2 && ABS(coll->tilt_z) <= 2) { + item->goal_anim_state = LS_STOP; + } +} + +bool Lara_Fallen(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->mid_floor <= STEPUP_HEIGHT) { + return false; + } + item->current_anim_state = LS_JUMP_FORWARD; + item->goal_anim_state = LS_JUMP_FORWARD; + Item_SwitchToAnim(item, LA_FALL_DOWN, 0); + item->gravity = 1; + item->fall_speed = 0; + return true; +} + +bool Lara_HitCeiling(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->coll_type != COLL_TOP && coll->coll_type != COLL_CLAMP) { + return false; + } + + item->pos.x = coll->old.x; + item->pos.y = coll->old.y; + item->pos.z = coll->old.z; + item->goal_anim_state = LS_STOP; + item->current_anim_state = LS_STOP; + Item_SwitchToAnim(item, LA_STOP, 0); + item->gravity = 0; + item->fall_speed = 0; + item->speed = 0; + return true; +} +bool Lara_DeflectEdge(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->coll_type == COLL_FRONT || coll->coll_type == COLL_TOPFRONT) { + Item_ShiftCol(item, coll); + item->goal_anim_state = LS_STOP; + item->current_anim_state = LS_STOP; + item->gravity = 0; + item->speed = 0; + return true; + } + + if (coll->coll_type == COLL_LEFT) { + Item_ShiftCol(item, coll); + item->rot.y += LARA_DEF_ADD_EDGE; + } else if (coll->coll_type == COLL_RIGHT) { + Item_ShiftCol(item, coll); + item->rot.y -= LARA_DEF_ADD_EDGE; + } + return false; +} + +void Lara_DeflectEdgeJump(ITEM_INFO *item, COLL_INFO *coll) +{ + Item_ShiftCol(item, coll); + switch (coll->coll_type) { + case COLL_LEFT: + item->rot.y += LARA_DEF_ADD_EDGE; + break; + + case COLL_RIGHT: + item->rot.y -= LARA_DEF_ADD_EDGE; + break; + + case COLL_FRONT: + case COLL_TOPFRONT: + item->goal_anim_state = LS_FAST_FALL; + item->current_anim_state = LS_FAST_FALL; + Item_SwitchToAnim(item, LA_FAST_FALL, LF_FASTFALL); + item->speed /= 4; + g_Lara.move_angle -= PHD_180; + if (item->fall_speed <= 0) { + item->fall_speed = 1; + } + break; + + case COLL_TOP: + if (item->fall_speed <= 0) { + item->fall_speed = 1; + } + break; + + case COLL_CLAMP: + item->pos.z -= (Math_Cos(coll->facing) * 100) >> W2V_SHIFT; + item->pos.x -= (Math_Sin(coll->facing) * 100) >> W2V_SHIFT; + item->speed = 0; + coll->mid_floor = 0; + if (item->fall_speed <= 0) { + item->fall_speed = 16; + } + break; + } +} + +void Lara_SlideEdgeJump(ITEM_INFO *item, COLL_INFO *coll) +{ + Item_ShiftCol(item, coll); + switch (coll->coll_type) { + case COLL_LEFT: + item->rot.y += LARA_DEF_ADD_EDGE; + break; + + case COLL_RIGHT: + item->rot.y -= LARA_DEF_ADD_EDGE; + break; + + case COLL_TOP: + case COLL_TOPFRONT: + if (item->fall_speed <= 0) { + item->fall_speed = 1; + } + break; + + case COLL_CLAMP: + item->pos.z -= (Math_Cos(coll->facing) * 100) >> W2V_SHIFT; + item->pos.x -= (Math_Sin(coll->facing) * 100) >> W2V_SHIFT; + item->speed = 0; + coll->mid_floor = 0; + if (item->fall_speed <= 0) { + item->fall_speed = 16; + } + break; + } +} + +bool Lara_TestVault(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->coll_type != COLL_FRONT || !g_Input.action + || g_Lara.gun_status != LGS_ARMLESS + || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { + return false; + } + + PHD_ANGLE angle = item->rot.y; + if (angle >= 0 - VAULT_ANGLE && angle <= 0 + VAULT_ANGLE) { + angle = 0; + } else if (angle >= PHD_90 - VAULT_ANGLE && angle <= PHD_90 + VAULT_ANGLE) { + angle = PHD_90; + } else if ( + angle >= (PHD_180 - 1) - VAULT_ANGLE + || angle <= -(PHD_180 - 1) + VAULT_ANGLE) { + angle = -PHD_180; + } else if ( + angle >= -PHD_90 - VAULT_ANGLE && angle <= -PHD_90 + VAULT_ANGLE) { + angle = -PHD_90; + } + + if (angle & (PHD_90 - 1)) { + return false; + } + + int32_t hdif = coll->front_floor; + if (hdif >= -STEP_L * 2 - STEP_L / 2 && hdif <= -STEP_L * 2 + STEP_L / 2) { + if (hdif - coll->front_ceiling < 0 + || coll->left_floor - coll->left_ceiling < 0 + || coll->right_floor - coll->right_ceiling < 0) { + return false; + } + item->current_anim_state = LS_CLIMB_UP; + item->goal_anim_state = LS_STOP; + Item_SwitchToAnim(item, LA_VAULT_12, 0); + item->pos.y += STEP_L * 2 + hdif; + g_Lara.gun_status = LGS_HANDS_BUSY; + item->rot.y = angle; + Item_ShiftCol(item, coll); + return true; + } else if ( + hdif >= -STEP_L * 3 - STEP_L / 2 && hdif <= -STEP_L * 3 + STEP_L / 2) { + if (hdif - coll->front_ceiling < 0 + || coll->left_floor - coll->left_ceiling < 0 + || coll->right_floor - coll->right_ceiling < 0) { + return false; + } + item->current_anim_state = LS_CLIMB_UP; + item->goal_anim_state = LS_STOP; + Item_SwitchToAnim(item, LA_VAULT_34, 0); + item->pos.y += STEP_L * 3 + hdif; + g_Lara.gun_status = LGS_HANDS_BUSY; + item->rot.y = angle; + Item_ShiftCol(item, coll); + return true; + } else if ( + hdif >= -STEP_L * 7 - STEP_L / 2 && hdif <= -STEP_L * 4 + STEP_L / 2) { + item->goal_anim_state = LS_JUMP_UP; + item->current_anim_state = LS_STOP; + Item_SwitchToAnim(item, LA_STOP, 0); + g_Lara.calc_fall_speed = + -(int16_t)(Math_Sqrt((int)(-2 * GRAVITY * (hdif + 800))) + 3); + Lara_Animate(item); + item->rot.y = angle; + Item_ShiftCol(item, coll); + return true; + } + + return false; +} + +bool Lara_TestHangJump(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->coll_type != COLL_FRONT || !g_Input.action + || g_Lara.gun_status != LGS_ARMLESS + || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { + return false; + } + + if (coll->front_ceiling > 0 || coll->mid_ceiling > -384 + || coll->mid_floor < 200) { + return false; + } + + const BOUNDS_16 *const bounds = Item_GetBoundsAccurate(item); + const int32_t hdif = coll->front_floor - bounds->min.y; + if (hdif < 0 && hdif + item->fall_speed < 0) { + return false; + } + if (hdif > 0 && hdif + item->fall_speed > 0) { + return false; + } + + PHD_ANGLE angle = item->rot.y; + if (angle >= -HANG_ANGLE && angle <= HANG_ANGLE) { + angle = 0; + } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { + angle = PHD_90; + } else if ( + angle >= (PHD_180 - 1) - HANG_ANGLE + || angle <= -(PHD_180 - 1) + HANG_ANGLE) { + angle = -PHD_180; + } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { + angle = -PHD_90; + } + + if (angle & (PHD_90 - 1)) { + return false; + } + + if (Lara_TestHangSwingIn(item, angle)) { + Item_SwitchToAnim(item, LA_GRAB_LEDGE_IN, 0); + } else { + Item_SwitchToAnim(item, LA_GRAB_LEDGE, 0); + } + item->current_anim_state = LS_HANG; + item->goal_anim_state = LS_HANG; + + // bounds = Item_GetBoundsAccurate(item); + item->pos.y += hdif; + item->pos.x += coll->shift.x; + item->pos.z += coll->shift.z; + item->rot.y = angle; + item->gravity = 0; + item->fall_speed = 0; + item->speed = 0; + g_Lara.gun_status = LGS_HANDS_BUSY; + return true; +} + +bool Lara_TestHangSwingIn(ITEM_INFO *item, PHD_ANGLE angle) +{ + int x = item->pos.x; + int y = item->pos.y; + int z = item->pos.z; + int16_t room_num = item->room_num; + switch (angle) { + case 0: + z += 256; + break; + case PHD_90: + x += 256; + break; + case -PHD_90: + x -= 256; + break; + case -PHD_180: + z -= 256; + break; + } + + const SECTOR_INFO *const sector = Room_GetSector(x, y, z, &room_num); + const int32_t h = Room_GetHeight(sector, x, y, z); + const int32_t c = Room_GetCeiling(sector, x, y, z); + + if (h != NO_HEIGHT) { + if ((h - y) > 0 && (c - y) < -400) { + return true; + } + } + return false; +} + +bool Lara_TestHangJumpUp(ITEM_INFO *item, COLL_INFO *coll) +{ + if (coll->coll_type != COLL_FRONT || !g_Input.action + || g_Lara.gun_status != LGS_ARMLESS + || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { + return false; + } + + if (coll->front_ceiling > 0 || coll->mid_ceiling > -384) { + return false; + } + + const BOUNDS_16 *bounds = Item_GetBoundsAccurate(item); + const int32_t hdif = coll->front_floor - bounds->min.y; + if (hdif < 0 && hdif + item->fall_speed < 0) { + return false; + } + if (hdif > 0 && hdif + item->fall_speed > 0) { + return false; + } + + PHD_ANGLE angle = item->rot.y; + if (angle >= 0 - HANG_ANGLE && angle <= 0 + HANG_ANGLE) { + angle = 0; + } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { + angle = PHD_90; + } else if ( + angle >= (PHD_180 - 1) - HANG_ANGLE + || angle <= -(PHD_180 - 1) + HANG_ANGLE) { + angle = -PHD_180; + } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { + angle = -PHD_90; + } + + if (angle & (PHD_90 - 1)) { + return false; + } + + item->goal_anim_state = LS_HANG; + item->current_anim_state = LS_HANG; + Item_SwitchToAnim(item, LA_HANG, LF_STARTHANG); + bounds = Item_GetBoundsAccurate(item); + item->pos.y += coll->front_floor - bounds->min.y; + item->pos.x += coll->shift.x; + item->pos.z += coll->shift.z; + item->rot.y = angle; + item->gravity = 0; + item->fall_speed = 0; + item->speed = 0; + g_Lara.gun_status = LGS_HANDS_BUSY; + return true; +} + +bool Lara_TestSlide(ITEM_INFO *item, COLL_INFO *coll) +{ + static PHD_ANGLE old_angle = 1; + + if (ABS(coll->tilt_x) <= 2 && ABS(coll->tilt_z) <= 2) { + return false; + } + + PHD_ANGLE ang = 0; + if (coll->tilt_x > 2) { + ang = -PHD_90; + } else if (coll->tilt_x < -2) { + ang = PHD_90; + } + if (coll->tilt_z > 2 && coll->tilt_z > ABS(coll->tilt_x)) { + ang = -PHD_180; + } else if (coll->tilt_z < -2 && -coll->tilt_z > ABS(coll->tilt_x)) { + ang = 0; + } + + PHD_ANGLE adif = ang - item->rot.y; + Item_ShiftCol(item, coll); + if (adif >= -PHD_90 && adif <= PHD_90) { + if (item->current_anim_state != LS_SLIDE || old_angle != ang) { + item->goal_anim_state = LS_SLIDE; + item->current_anim_state = LS_SLIDE; + Item_SwitchToAnim(item, LA_SLIDE, 0); + item->rot.y = ang; + g_Lara.move_angle = ang; + old_angle = ang; + } + } else { + if (item->current_anim_state != LS_SLIDE_BACK || old_angle != ang) { + item->goal_anim_state = LS_SLIDE_BACK; + item->current_anim_state = LS_SLIDE_BACK; + Item_SwitchToAnim(item, LA_SLIDE_BACK, 0); + item->rot.y = ang - PHD_180; + g_Lara.move_angle = ang; + old_angle = ang; + } + } + return true; +} + +bool Lara_LandedBad(ITEM_INFO *item, COLL_INFO *coll) +{ + int16_t room_num = item->room_num; -#include + const SECTOR_INFO *const sector = + Room_GetSector(item->pos.x, item->pos.y, item->pos.z, &room_num); + + const int32_t old_y = item->pos.y; + const int32_t height = Room_GetHeight( + sector, item->pos.x, item->pos.y - LARA_HEIGHT, item->pos.z); + + item->floor = height; + item->pos.y = height; + Room_TestTriggers(item); + item->pos.y = old_y; + + int landspeed = item->fall_speed - DAMAGE_START; + if (landspeed <= 0) { + return false; + } else if (landspeed > DAMAGE_LENGTH) { + item->hit_points = -1; + } else { + Lara_TakeDamage( + (LARA_MAX_HITPOINTS * landspeed * landspeed) + / (DAMAGE_LENGTH * DAMAGE_LENGTH), + false); + } + + // #675: Original bug to keep. Correct operator would be <= + if (item->hit_points < 0) { + return true; + } + return false; +} + +void Lara_SurfaceCollision(ITEM_INFO *item, COLL_INFO *coll) +{ + coll->facing = g_Lara.move_angle; + + Collide_GetCollisionInfo( + coll, item->pos.x, item->pos.y + SURF_HEIGHT, item->pos.z, + item->room_num, SURF_HEIGHT); + + Item_ShiftCol(item, coll); + + if ((coll->coll_type + & (COLL_FRONT | COLL_LEFT | COLL_RIGHT | COLL_TOP | COLL_TOPFRONT + | COLL_CLAMP)) + || coll->mid_floor < 0) { + item->fall_speed = 0; + item->pos.x = coll->old.x; + item->pos.y = coll->old.y; + item->pos.z = coll->old.z; + } else if (coll->coll_type == COLL_LEFT) { + item->rot.y += 5 * PHD_DEGREE; + } else if (coll->coll_type == COLL_RIGHT) { + item->rot.y -= 5 * PHD_DEGREE; + } + + int16_t wh = Room_GetWaterHeight( + item->pos.x, item->pos.y, item->pos.z, item->room_num); + if (wh - item->pos.y <= -100) { + item->goal_anim_state = LS_SWIM; + item->current_anim_state = LS_DIVE; + Item_SwitchToAnim(item, LA_SURF_DIVE, 0); + item->rot.x = -45 * PHD_DEGREE; + item->fall_speed = 80; + g_Lara.water_status = LWS_UNDERWATER; + return; + } + + Lara_TestWaterClimbOut(item, coll); +} + +bool Lara_TestWaterClimbOut(ITEM_INFO *item, COLL_INFO *coll) +{ + if (item->rot.y != g_Lara.move_angle) { + return false; + } + + if (coll->coll_type != COLL_FRONT || !g_Input.action + || ABS(coll->left_floor - coll->right_floor) >= SLOPE_DIF) { + return false; + } + + if (coll->front_ceiling > 0 || coll->mid_ceiling > -STEPUP_HEIGHT) { + return false; + } + + const int32_t hdif = coll->front_floor + 700; + if (hdif < -512 || hdif > 100) { + return false; + } + + PHD_ANGLE angle = item->rot.y; + if (angle >= -HANG_ANGLE && angle <= HANG_ANGLE) { + angle = 0; + } else if (angle >= PHD_90 - HANG_ANGLE && angle <= PHD_90 + HANG_ANGLE) { + angle = PHD_90; + } else if ( + angle >= (PHD_180 - 1) - HANG_ANGLE + || angle <= -(PHD_180 - 1) + HANG_ANGLE) { + angle = -PHD_180; + } else if (angle >= -PHD_90 - HANG_ANGLE && angle <= -PHD_90 + HANG_ANGLE) { + angle = -PHD_90; + } + if (angle & (PHD_90 - 1)) { + return false; + } + + item->pos.y += hdif - 5; + Item_UpdateRoom(item, -LARA_HEIGHT / 2); + + switch (angle) { + case 0: + item->pos.z = (item->pos.z & -WALL_L) + WALL_L + LARA_RAD; + break; + case PHD_90: + item->pos.x = (item->pos.x & -WALL_L) + WALL_L + LARA_RAD; + break; + case -PHD_180: + item->pos.z = (item->pos.z & -WALL_L) - LARA_RAD; + break; + case -PHD_90: + item->pos.x = (item->pos.x & -WALL_L) - LARA_RAD; + break; + } + + Item_SwitchToAnim(item, LA_SURF_CLIMB, 0); + item->current_anim_state = LS_WATER_OUT; + item->goal_anim_state = LS_STOP; + item->rot.x = 0; + item->rot.y = angle; + item->rot.z = 0; + item->gravity = 0; + item->fall_speed = 0; + item->speed = 0; + g_Lara.gun_status = LGS_HANDS_BUSY; + g_Lara.water_status = LWS_ABOVE_WATER; + return true; +} + +void Lara_SwimCollision(ITEM_INFO *item, COLL_INFO *coll) +{ + if (item->rot.x >= -PHD_90 && item->rot.x <= PHD_90) { + g_Lara.move_angle = coll->facing = item->rot.y; + } else { + g_Lara.move_angle = coll->facing = item->rot.y - PHD_180; + } + Collide_GetCollisionInfo( + coll, item->pos.x, item->pos.y + UW_HEIGHT / 2, item->pos.z, + item->room_num, UW_HEIGHT); + + Item_ShiftCol(item, coll); + + switch (coll->coll_type) { + case COLL_FRONT: + if (item->rot.x > 35 * PHD_DEGREE) { + item->rot.x = item->rot.x + UW_WALLDEFLECT; + break; + } + if (item->rot.x < -35 * PHD_DEGREE) { + item->rot.x = item->rot.x - UW_WALLDEFLECT; + break; + } + item->fall_speed = 0; + break; + + case COLL_TOP: + if (item->rot.x >= -45 * PHD_DEGREE) { + item->rot.x -= UW_WALLDEFLECT; + } + break; + + case COLL_TOPFRONT: + item->fall_speed = 0; + break; + + case COLL_LEFT: + item->rot.y += 5 * PHD_DEGREE; + break; + + case COLL_RIGHT: + item->rot.y -= 5 * PHD_DEGREE; + break; + + case COLL_CLAMP: + item->fall_speed = 0; + return; + break; + } + + if (coll->mid_floor < 0) { + item->pos.y += coll->mid_floor; + item->rot.x += UW_WALLDEFLECT; + } +} + +void Lara_CatchFire(void) +{ + if (g_Lara.water_status == LWS_CHEAT || g_LaraItem->hit_points < 0) { + return; + } + + int16_t room_num = g_LaraItem->room_num; + const SECTOR_INFO *const sector = Room_GetSector( + g_LaraItem->pos.x, MAX_HEIGHT, g_LaraItem->pos.z, &room_num); + const int16_t height = Room_GetHeight( + sector, g_LaraItem->pos.x, MAX_HEIGHT, g_LaraItem->pos.z); + + if (g_LaraItem->floor != height) { + return; + } + + g_LaraItem->hit_points = -1; + g_LaraItem->hit_status = 1; + + if (g_Lara.water_status != LWS_ABOVE_WATER) { + return; + } + + for (int32_t i = 0; i < 10; i++) { + const int16_t fx_num = Effect_Create(g_LaraItem->room_num); + if (fx_num != NO_ITEM) { + FX_INFO *const fx = &g_Effects[fx_num]; + fx->object_id = O_FLAME; + fx->frame_num = + (g_Objects[O_FLAME].nmeshes * Random_GetControl()) / 0x7FFF; + fx->counter = -1 - Random_GetControl() * 24 / 0x7FFF; + } + } +} void Lara_Extinguish(void) { diff --git a/src/game/lara/lara_misc.h b/src/game/lara/misc.h similarity index 96% rename from src/game/lara/lara_misc.h rename to src/game/lara/misc.h index a71865964..1d6b1b8c8 100644 --- a/src/game/lara/lara_misc.h +++ b/src/game/lara/misc.h @@ -1,9 +1,9 @@ #pragma once -// Lara collision helpers. - #include "global/types.h" +#include + #include void Lara_GetCollisionInfo(ITEM_INFO *item, COLL_INFO *coll); diff --git a/src/game/lara/lara_state.c b/src/game/lara/state.c similarity index 99% rename from src/game/lara/lara_state.c rename to src/game/lara/state.c index 20e48da48..506e29112 100644 --- a/src/game/lara/lara_state.c +++ b/src/game/lara/state.c @@ -1,10 +1,10 @@ -#include "game/lara/lara_state.h" +#include "game/lara/state.h" #include "config.h" #include "game/input.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_look.h" +#include "game/lara/common.h" +#include "game/lara/look.h" #include "game/objects/common.h" #include "game/objects/effects/twinkle.h" #include "game/room.h" diff --git a/src/game/lara/lara_state.h b/src/game/lara/state.h similarity index 100% rename from src/game/lara/lara_state.h rename to src/game/lara/state.h diff --git a/src/game/level.c b/src/game/level.c index 039ddff43..703168139 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -9,7 +9,7 @@ #include "game/inject.h" #include "game/inventory/inventory_vars.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/music.h" #include "game/objects/creatures/pierre.h" diff --git a/src/game/objects/common.c b/src/game/objects/common.c index 2c75efada..7552aea12 100644 --- a/src/game/objects/common.c +++ b/src/game/objects/common.c @@ -4,7 +4,7 @@ #include "game/collide.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/output.h" #include "game/room.h" #include "game/viewport.h" diff --git a/src/game/objects/creatures/ape.c b/src/game/objects/creatures/ape.c index 8faaf6977..718f85dd1 100644 --- a/src/game/objects/creatures/ape.c +++ b/src/game/objects/creatures/ape.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/objects/creatures/bacon_lara.c b/src/game/objects/creatures/bacon_lara.c index 73eb39710..65062b47a 100644 --- a/src/game/objects/creatures/bacon_lara.c +++ b/src/game/objects/creatures/bacon_lara.c @@ -2,8 +2,8 @@ #include "game/creature.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_draw.h" +#include "game/lara/common.h" +#include "game/lara/draw.h" #include "game/objects/common.h" #include "game/room.h" #include "global/const.h" diff --git a/src/game/objects/creatures/bat.c b/src/game/objects/creatures/bat.c index f0ca49283..4651d8e72 100644 --- a/src/game/objects/creatures/bat.c +++ b/src/game/objects/creatures/bat.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/room.h" #include "global/const.h" diff --git a/src/game/objects/creatures/bear.c b/src/game/objects/creatures/bear.c index 41150d463..67e0fbb66 100644 --- a/src/game/objects/creatures/bear.c +++ b/src/game/objects/creatures/bear.c @@ -4,7 +4,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/objects/creatures/centaur.c b/src/game/objects/creatures/centaur.c index 66dd6eafd..1f063e881 100644 --- a/src/game/objects/creatures/centaur.c +++ b/src/game/objects/creatures/centaur.c @@ -6,7 +6,7 @@ #include "game/effects/exploding_death.h" #include "game/effects/gun.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "game/sound.h" diff --git a/src/game/objects/creatures/crocodile.c b/src/game/objects/creatures/crocodile.c index 18950f5fb..1ae4c12ee 100644 --- a/src/game/objects/creatures/crocodile.c +++ b/src/game/objects/creatures/crocodile.c @@ -5,7 +5,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/room.h" #include "global/const.h" diff --git a/src/game/objects/creatures/lion.c b/src/game/objects/creatures/lion.c index c556b6f46..3208fb998 100644 --- a/src/game/objects/creatures/lion.c +++ b/src/game/objects/creatures/lion.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/objects/creatures/mutant.c b/src/game/objects/creatures/mutant.c index 265a5b8f9..40aab6ffa 100644 --- a/src/game/objects/creatures/mutant.c +++ b/src/game/objects/creatures/mutant.c @@ -6,7 +6,7 @@ #include "game/effects/exploding_death.h" #include "game/effects/gun.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "game/sound.h" diff --git a/src/game/objects/creatures/raptor.c b/src/game/objects/creatures/raptor.c index 3286126c5..e4d81af3b 100644 --- a/src/game/objects/creatures/raptor.c +++ b/src/game/objects/creatures/raptor.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/objects/creatures/rat.c b/src/game/objects/creatures/rat.c index 70868e257..cb642638e 100644 --- a/src/game/objects/creatures/rat.c +++ b/src/game/objects/creatures/rat.c @@ -4,7 +4,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "game/room.h" diff --git a/src/game/objects/creatures/torso.c b/src/game/objects/creatures/torso.c index 23411104a..d95bc2455 100644 --- a/src/game/objects/creatures/torso.c +++ b/src/game/objects/creatures/torso.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/exploding_death.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "game/room.h" diff --git a/src/game/objects/creatures/trex.c b/src/game/objects/creatures/trex.c index 2454a186a..ad1e01d4a 100644 --- a/src/game/objects/creatures/trex.c +++ b/src/game/objects/creatures/trex.c @@ -3,7 +3,7 @@ #include "config.h" #include "game/creature.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/objects/common.h" #include "game/random.h" diff --git a/src/game/objects/creatures/wolf.c b/src/game/objects/creatures/wolf.c index a7e8e1807..38c636607 100644 --- a/src/game/objects/creatures/wolf.c +++ b/src/game/objects/creatures/wolf.c @@ -3,7 +3,7 @@ #include "game/creature.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/random.h" #include "global/const.h" diff --git a/src/game/objects/effects/body_part.c b/src/game/objects/effects/body_part.c index e91e01c4e..98b924786 100644 --- a/src/game/objects/effects/body_part.c +++ b/src/game/objects/effects/body_part.c @@ -1,7 +1,7 @@ #include "game/objects/effects/body_part.h" #include "game/effects.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/room.h" #include "game/sound.h" #include "global/const.h" diff --git a/src/game/objects/effects/ember.c b/src/game/objects/effects/ember.c index 4a7c16dcb..99ce7a466 100644 --- a/src/game/objects/effects/ember.c +++ b/src/game/objects/effects/ember.c @@ -1,7 +1,7 @@ #include "game/objects/effects/ember.h" #include "game/effects.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/room.h" #include "global/vars.h" #include "math/math.h" diff --git a/src/game/objects/effects/flame.c b/src/game/objects/effects/flame.c index f98449b7e..537425607 100644 --- a/src/game/objects/effects/flame.c +++ b/src/game/objects/effects/flame.c @@ -2,8 +2,8 @@ #include "game/collide.h" #include "game/effects.h" -#include "game/lara.h" -#include "game/lara/lara_control.h" +#include "game/lara/common.h" +#include "game/lara/control.h" #include "game/room.h" #include "game/sound.h" #include "global/vars.h" diff --git a/src/game/objects/effects/missile.c b/src/game/objects/effects/missile.c index 24b39c445..f927dfb26 100644 --- a/src/game/objects/effects/missile.c +++ b/src/game/objects/effects/missile.c @@ -2,7 +2,7 @@ #include "game/effects.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/random.h" #include "game/room.h" #include "game/sound.h" diff --git a/src/game/objects/general/door.c b/src/game/objects/general/door.c index 3267f3767..5ad04daae 100644 --- a/src/game/objects/general/door.c +++ b/src/game/objects/general/door.c @@ -3,7 +3,7 @@ #include "game/collide.h" #include "game/gamebuf.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/room.h" #include "global/const.h" diff --git a/src/game/objects/general/keyhole.c b/src/game/objects/general/keyhole.c index e617f7b98..94c4d684f 100644 --- a/src/game/objects/general/keyhole.c +++ b/src/game/objects/general/keyhole.c @@ -3,7 +3,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/sound.h" #include "global/const.h" #include "global/vars.h" diff --git a/src/game/objects/general/pickup.c b/src/game/objects/general/pickup.c index 5164575ff..6024648d4 100644 --- a/src/game/objects/general/pickup.c +++ b/src/game/objects/general/pickup.c @@ -5,7 +5,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/overlay.h" #include "global/const.h" diff --git a/src/game/objects/general/puzzle_hole.c b/src/game/objects/general/puzzle_hole.c index 3aa99155a..1acc270cf 100644 --- a/src/game/objects/general/puzzle_hole.c +++ b/src/game/objects/general/puzzle_hole.c @@ -3,7 +3,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/sound.h" #include "global/const.h" #include "global/vars.h" diff --git a/src/game/objects/general/save_crystal.c b/src/game/objects/general/save_crystal.c index e5b824abc..3639f4ade 100644 --- a/src/game/objects/general/save_crystal.c +++ b/src/game/objects/general/save_crystal.c @@ -4,7 +4,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "global/const.h" #include "global/vars.h" diff --git a/src/game/objects/general/scion1.c b/src/game/objects/general/scion1.c index 02ef77eaf..354cfcc24 100644 --- a/src/game/objects/general/scion1.c +++ b/src/game/objects/general/scion1.c @@ -3,7 +3,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/overlay.h" #include "global/vars.h" diff --git a/src/game/objects/general/scion4.c b/src/game/objects/general/scion4.c index 7b4673e2e..16826f498 100644 --- a/src/game/objects/general/scion4.c +++ b/src/game/objects/general/scion4.c @@ -2,7 +2,7 @@ #include "game/input.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "global/vars.h" #define EXTRA_ANIM_HOLDER_SCION 0 diff --git a/src/game/objects/general/switch.c b/src/game/objects/general/switch.c index 5785abefb..a20d8ed78 100644 --- a/src/game/objects/general/switch.c +++ b/src/game/objects/general/switch.c @@ -3,7 +3,7 @@ #include "config.h" #include "game/input.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "global/const.h" #include "global/vars.h" diff --git a/src/game/objects/setup.c b/src/game/objects/setup.c index e157142a4..a34272964 100644 --- a/src/game/objects/setup.c +++ b/src/game/objects/setup.c @@ -1,8 +1,8 @@ #include "game/objects/setup.h" #include "config.h" -#include "game/lara.h" -#include "game/lara/lara_hair.h" +#include "game/lara/common.h" +#include "game/lara/hair.h" #include "game/objects/common.h" #include "game/objects/creatures/ape.h" #include "game/objects/creatures/bacon_lara.h" diff --git a/src/game/objects/traps/damocles_sword.c b/src/game/objects/traps/damocles_sword.c index 71deb52f7..31712d33b 100644 --- a/src/game/objects/traps/damocles_sword.c +++ b/src/game/objects/traps/damocles_sword.c @@ -2,7 +2,7 @@ #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/random.h" #include "game/sound.h" #include "global/const.h" diff --git a/src/game/objects/traps/dart.c b/src/game/objects/traps/dart.c index 216a8a36a..35ae9c610 100644 --- a/src/game/objects/traps/dart.c +++ b/src/game/objects/traps/dart.c @@ -3,7 +3,7 @@ #include "game/effects.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/random.h" #include "game/room.h" diff --git a/src/game/objects/traps/falling_ceiling.c b/src/game/objects/traps/falling_ceiling.c index 7912061ed..c5446ca84 100644 --- a/src/game/objects/traps/falling_ceiling.c +++ b/src/game/objects/traps/falling_ceiling.c @@ -1,7 +1,7 @@ #include "game/objects/traps/falling_ceiling.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #define FALLING_CEILING_DAMAGE 300 diff --git a/src/game/objects/traps/lava_wedge.c b/src/game/objects/traps/lava_wedge.c index b845746e1..be1054cd6 100644 --- a/src/game/objects/traps/lava_wedge.c +++ b/src/game/objects/traps/lava_wedge.c @@ -1,7 +1,7 @@ #include "game/objects/traps/lava_wedge.h" #include "game/items.h" -#include "game/lara/lara_misc.h" +#include "game/lara/misc.h" #include "game/objects/common.h" #include "game/room.h" #include "global/vars.h" diff --git a/src/game/objects/traps/lightning_emitter.c b/src/game/objects/traps/lightning_emitter.c index 8a4e4c136..69101752e 100644 --- a/src/game/objects/traps/lightning_emitter.c +++ b/src/game/objects/traps/lightning_emitter.c @@ -3,7 +3,7 @@ #include "game/collide.h" #include "game/gamebuf.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/output.h" #include "game/phase/phase.h" #include "game/random.h" diff --git a/src/game/objects/traps/midas_touch.c b/src/game/objects/traps/midas_touch.c index 61427bab2..453fcf490 100644 --- a/src/game/objects/traps/midas_touch.c +++ b/src/game/objects/traps/midas_touch.c @@ -3,7 +3,7 @@ #include "game/input.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/overlay.h" #include "global/const.h" diff --git a/src/game/objects/traps/movable_block.c b/src/game/objects/traps/movable_block.c index dd4808c48..994ebb8da 100644 --- a/src/game/objects/traps/movable_block.c +++ b/src/game/objects/traps/movable_block.c @@ -4,7 +4,7 @@ #include "game/effect_routines/dino_stomp.h" #include "game/input.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/room.h" #include "game/sound.h" diff --git a/src/game/objects/traps/pendulum.c b/src/game/objects/traps/pendulum.c index c0780996a..8e219a2f9 100644 --- a/src/game/objects/traps/pendulum.c +++ b/src/game/objects/traps/pendulum.c @@ -2,7 +2,7 @@ #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/random.h" #include "game/room.h" diff --git a/src/game/objects/traps/rolling_ball.c b/src/game/objects/traps/rolling_ball.c index 8e6147614..114896981 100644 --- a/src/game/objects/traps/rolling_ball.c +++ b/src/game/objects/traps/rolling_ball.c @@ -4,7 +4,7 @@ #include "game/effects/blood.h" #include "game/gamebuf.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/random.h" #include "game/room.h" diff --git a/src/game/objects/traps/spikes.c b/src/game/objects/traps/spikes.c index b5275f46b..68c86b6e4 100644 --- a/src/game/objects/traps/spikes.c +++ b/src/game/objects/traps/spikes.c @@ -3,7 +3,7 @@ #include "game/collide.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/random.h" #define SPIKE_DAMAGE 15 diff --git a/src/game/objects/traps/teeth_trap.c b/src/game/objects/traps/teeth_trap.c index a5aaed043..383cd692c 100644 --- a/src/game/objects/traps/teeth_trap.c +++ b/src/game/objects/traps/teeth_trap.c @@ -3,7 +3,7 @@ #include "game/collide.h" #include "game/effects/blood.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #define TEETH_TRAP_DAMAGE 400 diff --git a/src/game/objects/traps/thors_hammer_handle.c b/src/game/objects/traps/thors_hammer_handle.c index 36f0941cc..6b9bddfd0 100644 --- a/src/game/objects/traps/thors_hammer_handle.c +++ b/src/game/objects/traps/thors_hammer_handle.c @@ -1,7 +1,7 @@ #include "game/objects/traps/thors_hammer_handle.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" #include "game/room.h" #include "global/vars.h" diff --git a/src/game/objects/traps/thors_hammer_head.c b/src/game/objects/traps/thors_hammer_head.c index 345f39bc3..7eb9ccec9 100644 --- a/src/game/objects/traps/thors_hammer_head.c +++ b/src/game/objects/traps/thors_hammer_head.c @@ -1,7 +1,7 @@ #include "game/objects/traps/thors_hammer_head.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/objects/common.h" typedef enum { diff --git a/src/game/phase/phase_cutscene.c b/src/game/phase/phase_cutscene.c index 8f79303c2..f5e39dff6 100644 --- a/src/game/phase/phase_cutscene.c +++ b/src/game/phase/phase_cutscene.c @@ -7,8 +7,8 @@ #include "game/input.h" #include "game/interpolation.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_hair.h" +#include "game/lara/common.h" +#include "game/lara/hair.h" #include "game/level.h" #include "game/music.h" #include "game/output.h" diff --git a/src/game/phase/phase_demo.c b/src/game/phase/phase_demo.c index 5ac9d7eb8..e370d6589 100644 --- a/src/game/phase/phase_demo.c +++ b/src/game/phase/phase_demo.c @@ -9,9 +9,9 @@ #include "game/input.h" #include "game/interpolation.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_cheat.h" -#include "game/lara/lara_hair.h" +#include "game/lara/cheat.h" +#include "game/lara/common.h" +#include "game/lara/hair.h" #include "game/level.h" #include "game/output.h" #include "game/overlay.h" diff --git a/src/game/phase/phase_game.c b/src/game/phase/phase_game.c index fa61b40c3..435be5335 100644 --- a/src/game/phase/phase_game.c +++ b/src/game/phase/phase_game.c @@ -7,9 +7,9 @@ #include "game/interpolation.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" -#include "game/lara/lara_cheat.h" -#include "game/lara/lara_hair.h" +#include "game/lara/cheat.h" +#include "game/lara/common.h" +#include "game/lara/hair.h" #include "game/output.h" #include "game/overlay.h" #include "game/shell.h" diff --git a/src/game/phase/phase_inventory.c b/src/game/phase/phase_inventory.c index 17086b9a0..f6b5476d5 100644 --- a/src/game/phase/phase_inventory.c +++ b/src/game/phase/phase_inventory.c @@ -10,7 +10,7 @@ #include "game/inventory.h" #include "game/inventory/inventory_ring.h" #include "game/inventory/inventory_vars.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/music.h" #include "game/objects/common.h" #include "game/option.h" diff --git a/src/game/room.c b/src/game/room.c index 6a5f21732..efbabc132 100644 --- a/src/game/room.c +++ b/src/game/room.c @@ -3,7 +3,7 @@ #include "game/camera.h" #include "game/gamebuf.h" #include "game/items.h" -#include "game/lara/lara_misc.h" +#include "game/lara/misc.h" #include "game/lot.h" #include "game/music.h" #include "game/objects/common.h" diff --git a/src/game/room_draw.c b/src/game/room_draw.c index 190803d24..4b944e52e 100644 --- a/src/game/room_draw.c +++ b/src/game/room_draw.c @@ -2,7 +2,7 @@ #include "game/effects.h" #include "game/items.h" -#include "game/lara/lara_draw.h" +#include "game/lara/draw.h" #include "game/output.h" #include "game/shell.h" #include "game/viewport.h" diff --git a/src/game/savegame/savegame_bson.c b/src/game/savegame/savegame_bson.c index ff4e05194..4ddbf79f7 100644 --- a/src/game/savegame/savegame_bson.c +++ b/src/game/savegame/savegame_bson.c @@ -6,7 +6,7 @@ #include "game/gameflow.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/lot.h" #include "game/music.h" #include "game/room.h" diff --git a/src/game/savegame/savegame_legacy.c b/src/game/savegame/savegame_legacy.c index 6bbfa3358..0f62c23f5 100644 --- a/src/game/savegame/savegame_legacy.c +++ b/src/game/savegame/savegame_legacy.c @@ -5,7 +5,7 @@ #include "game/gameflow.h" #include "game/inventory.h" #include "game/items.h" -#include "game/lara.h" +#include "game/lara/common.h" #include "game/level.h" #include "game/lot.h" #include "game/room.h" From f7c5121a164c88730d5e67432d87d85842d0678c Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 21 Sep 2024 13:03:53 +0200 Subject: [PATCH 5/7] objects: extract vars module --- meson.build | 1 + src/game/carrier.c | 2 +- src/game/console/cmd/teleport.c | 1 + src/game/creature.c | 1 + src/game/inventory/inventory_func.c | 1 + src/game/lara/cheat.c | 1 + src/game/lara/common.c | 1 + src/game/objects/common.c | 204 ------------------------ src/game/objects/common.h | 12 -- src/game/objects/names.c | 1 + src/game/objects/traps/movable_block.c | 1 + src/game/objects/vars.c | 207 +++++++++++++++++++++++++ src/game/objects/vars.h | 15 ++ src/game/stats.c | 1 + 14 files changed, 232 insertions(+), 217 deletions(-) create mode 100644 src/game/objects/vars.c create mode 100644 src/game/objects/vars.h diff --git a/meson.build b/meson.build index 80070d51f..96bec297a 100644 --- a/meson.build +++ b/meson.build @@ -252,6 +252,7 @@ sources = [ 'src/game/objects/traps/teeth_trap.c', 'src/game/objects/traps/thors_hammer_handle.c', 'src/game/objects/traps/thors_hammer_head.c', + 'src/game/objects/vars.c', 'src/game/option/option.c', 'src/game/option/option_compass.c', 'src/game/option/option_control.c', diff --git a/src/game/carrier.c b/src/game/carrier.c index 723abb66d..1d813fca3 100644 --- a/src/game/carrier.c +++ b/src/game/carrier.c @@ -4,7 +4,7 @@ #include "game/gameflow.h" #include "game/inventory.h" #include "game/items.h" -#include "game/objects/common.h" +#include "game/objects/vars.h" #include "game/room.h" #include "global/const.h" #include "global/types.h" diff --git a/src/game/console/cmd/teleport.c b/src/game/console/cmd/teleport.c index 75d6b8b3d..2aac57fdc 100644 --- a/src/game/console/cmd/teleport.c +++ b/src/game/console/cmd/teleport.c @@ -5,6 +5,7 @@ #include "game/lara/cheat.h" #include "game/objects/common.h" #include "game/objects/names.h" +#include "game/objects/vars.h" #include "game/random.h" #include "game/room.h" #include "global/const.h" diff --git a/src/game/creature.c b/src/game/creature.c index 99ce64235..8e9643fce 100644 --- a/src/game/creature.c +++ b/src/game/creature.c @@ -10,6 +10,7 @@ #include "game/los.h" #include "game/lot.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include "game/random.h" #include "game/room.h" #include "global/vars.h" diff --git a/src/game/inventory/inventory_func.c b/src/game/inventory/inventory_func.c index 80fa0d703..c6bccb07a 100644 --- a/src/game/inventory/inventory_func.c +++ b/src/game/inventory/inventory_func.c @@ -3,6 +3,7 @@ #include "game/inventory/inventory_vars.h" #include "game/items.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include "global/const.h" #include "global/types.h" #include "global/vars.h" diff --git a/src/game/lara/cheat.c b/src/game/lara/cheat.c index 4adbc0509..0c9fece3d 100644 --- a/src/game/lara/cheat.c +++ b/src/game/lara/cheat.c @@ -11,6 +11,7 @@ #include "game/lara/common.h" #include "game/lot.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include "game/room.h" #include "game/sound.h" #include "game/viewport.h" diff --git a/src/game/lara/common.c b/src/game/lara/common.c index 552043af9..ed8a7ef99 100644 --- a/src/game/lara/common.c +++ b/src/game/lara/common.c @@ -14,6 +14,7 @@ #include "game/music.h" #include "game/objects/common.h" #include "game/objects/effects/splash.h" +#include "game/objects/vars.h" #include "game/room.h" #include "game/savegame.h" #include "game/sound.h" diff --git a/src/game/objects/common.c b/src/game/objects/common.c index 7552aea12..5dc7d3fc8 100644 --- a/src/game/objects/common.c +++ b/src/game/objects/common.c @@ -17,181 +17,6 @@ #include #include -const GAME_OBJECT_ID g_EnemyObjects[] = { - // clang-format off - O_WOLF, - O_BEAR, - O_BAT, - O_CROCODILE, - O_ALLIGATOR, - O_LION, - O_LIONESS, - O_PUMA, - O_APE, - O_RAT, - O_VOLE, - O_TREX, - O_RAPTOR, - O_WARRIOR_1, - O_WARRIOR_2, - O_WARRIOR_3, - O_CENTAUR, - O_MUMMY, - O_TORSO, - O_DINO_WARRIOR, - O_FISH, - O_LARSON, - O_PIERRE, - O_SKATEKID, - O_COWBOY, - O_BALDY, - O_NATLA, - O_SCION_ITEM_3, - O_STATUE, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_AllyObjects[] = { - // clang-format off - O_LARA, - NO_OBJECT, - // Lara's social skills: still loading... - // clang-format on -}; - -const GAME_OBJECT_ID g_BossObjects[] = { - // clang-format off - O_TREX, - O_LARSON, - O_PIERRE, - O_SKATEKID, - O_COWBOY, - O_BALDY, - O_NATLA, - O_TORSO, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_PlaceholderObjects[] = { - // clang-format off - O_STATUE, - O_PODS, - O_BIG_POD, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_PickupObjects[] = { - // clang-format off - O_PISTOL_ITEM, - O_SHOTGUN_ITEM, - O_MAGNUM_ITEM, - O_UZI_ITEM, - O_PISTOL_AMMO_ITEM, - O_SG_AMMO_ITEM, - O_MAG_AMMO_ITEM, - O_UZI_AMMO_ITEM, - O_MEDI_ITEM, - O_BIGMEDI_ITEM, - O_EXPLOSIVE_ITEM, - O_PUZZLE_ITEM_1, - O_PUZZLE_ITEM_2, - O_PUZZLE_ITEM_3, - O_PUZZLE_ITEM_4, - O_KEY_ITEM_1, - O_KEY_ITEM_2, - O_KEY_ITEM_3, - O_KEY_ITEM_4, - O_PICKUP_ITEM_1, - O_PICKUP_ITEM_2, - O_LEADBAR_ITEM, - O_SCION_ITEM_1, - O_SCION_ITEM_2, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_GunObjects[] = { - // clang-format off - O_PISTOL_ITEM, - O_SHOTGUN_ITEM, - O_MAGNUM_ITEM, - O_UZI_ITEM, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_DoorObjects[] = { - // clang-format off - O_DOOR_TYPE_1, - O_DOOR_TYPE_2, - O_DOOR_TYPE_3, - O_DOOR_TYPE_4, - O_DOOR_TYPE_5, - O_DOOR_TYPE_6, - O_DOOR_TYPE_7, - O_DOOR_TYPE_8, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_TrapdoorObjects[] = { - // clang-format off - O_TRAPDOOR_1, - O_TRAPDOOR_2, - O_BIGTRAPDOOR, - O_DRAWBRIDGE, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_ID g_InvObjects[] = { - // clang-format off - O_PISTOL_OPTION, - O_SHOTGUN_OPTION, - O_MAGNUM_OPTION, - O_UZI_OPTION, - O_SG_AMMO_OPTION, - O_MAG_AMMO_OPTION, - O_UZI_AMMO_OPTION, - O_EXPLOSIVE_OPTION, - O_MEDI_OPTION, - O_BIGMEDI_OPTION, - O_PUZZLE_OPTION_1, - O_PUZZLE_OPTION_2, - O_PUZZLE_OPTION_3, - O_PUZZLE_OPTION_4, - O_LEADBAR_OPTION, - O_KEY_OPTION_1, - O_KEY_OPTION_2, - O_KEY_OPTION_3, - O_KEY_OPTION_4, - O_PICKUP_OPTION_1, - O_PICKUP_OPTION_2, - O_SCION_OPTION, - O_DETAIL_OPTION, - O_SOUND_OPTION, - O_CONTROL_OPTION, - O_GAMMA_OPTION, - O_PASSPORT_OPTION, - O_MAP_OPTION, - O_PHOTO_OPTION, - NO_OBJECT, - // clang-format on -}; - -const GAME_OBJECT_PAIR g_GunAmmoObjectMap[] = { - // clang-format off - { O_PISTOL_ITEM, O_PISTOL_AMMO_ITEM }, - { O_SHOTGUN_ITEM, O_SG_AMMO_ITEM }, - { O_MAGNUM_ITEM, O_MAG_AMMO_ITEM }, - { O_UZI_ITEM, O_UZI_AMMO_ITEM }, - { NO_OBJECT, NO_OBJECT }, - // clang-format on -}; - static const GAME_OBJECT_PAIR m_KeyItemToReceptacleMap[] = { // clang-format off { O_KEY_OPTION_1, O_KEY_HOLE_1 }, @@ -207,35 +32,6 @@ static const GAME_OBJECT_PAIR m_KeyItemToReceptacleMap[] = { // clang-format on }; -const GAME_OBJECT_PAIR g_ItemToInvObjectMap[] = { - // clang-format off - { O_PISTOL_ITEM, O_PISTOL_OPTION }, - { O_SHOTGUN_ITEM, O_SHOTGUN_OPTION }, - { O_MAGNUM_ITEM, O_MAGNUM_OPTION }, - { O_UZI_ITEM, O_UZI_OPTION }, - { O_SG_AMMO_ITEM, O_SG_AMMO_OPTION }, - { O_MAG_AMMO_ITEM, O_MAG_AMMO_OPTION }, - { O_UZI_AMMO_ITEM, O_UZI_AMMO_OPTION }, - { O_EXPLOSIVE_ITEM, O_EXPLOSIVE_OPTION }, - { O_MEDI_ITEM, O_MEDI_OPTION }, - { O_BIGMEDI_ITEM, O_BIGMEDI_OPTION }, - { O_PUZZLE_ITEM_1, O_PUZZLE_OPTION_1 }, - { O_PUZZLE_ITEM_2, O_PUZZLE_OPTION_2 }, - { O_PUZZLE_ITEM_3, O_PUZZLE_OPTION_3 }, - { O_PUZZLE_ITEM_4, O_PUZZLE_OPTION_4 }, - { O_LEADBAR_ITEM, O_LEADBAR_OPTION }, - { O_KEY_ITEM_1, O_KEY_OPTION_1 }, - { O_KEY_ITEM_2, O_KEY_OPTION_2 }, - { O_KEY_ITEM_3, O_KEY_OPTION_3 }, - { O_KEY_ITEM_4, O_KEY_OPTION_4 }, - { O_PICKUP_ITEM_1, O_PICKUP_OPTION_1 }, - { O_PICKUP_ITEM_2, O_PICKUP_OPTION_2 }, - { O_SCION_ITEM_1, O_SCION_OPTION }, - { O_SCION_ITEM_2, O_SCION_OPTION }, - { NO_OBJECT, NO_OBJECT }, - // clang-format on -}; - OBJECT_INFO *Object_GetObject(GAME_OBJECT_ID object_id) { return &g_Objects[object_id]; diff --git a/src/game/objects/common.h b/src/game/objects/common.h index 5ebd5d8f9..88661641a 100644 --- a/src/game/objects/common.h +++ b/src/game/objects/common.h @@ -9,18 +9,6 @@ typedef struct GAME_OBJECT_PAIR { const GAME_OBJECT_ID value_id; } GAME_OBJECT_PAIR; -extern const GAME_OBJECT_ID g_EnemyObjects[]; -extern const GAME_OBJECT_ID g_AllyObjects[]; -extern const GAME_OBJECT_ID g_BossObjects[]; -extern const GAME_OBJECT_ID g_PlaceholderObjects[]; -extern const GAME_OBJECT_ID g_PickupObjects[]; -extern const GAME_OBJECT_ID g_GunObjects[]; -extern const GAME_OBJECT_ID g_DoorObjects[]; -extern const GAME_OBJECT_ID g_TrapdoorObjects[]; -extern const GAME_OBJECT_ID g_InvObjects[]; -extern const GAME_OBJECT_PAIR g_GunAmmoObjectMap[]; -extern const GAME_OBJECT_PAIR g_ItemToInvObjectMap[]; - GAME_OBJECT_ID Object_GetCognate( GAME_OBJECT_ID key_id, const GAME_OBJECT_PAIR *test_map); GAME_OBJECT_ID Object_GetCognateInverse( diff --git a/src/game/objects/names.c b/src/game/objects/names.c index 5d46ede81..bc00ab312 100644 --- a/src/game/objects/names.c +++ b/src/game/objects/names.c @@ -3,6 +3,7 @@ #include "game/inventory.h" #include "game/inventory/inventory_vars.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include #include diff --git a/src/game/objects/traps/movable_block.c b/src/game/objects/traps/movable_block.c index 994ebb8da..c6faf17a6 100644 --- a/src/game/objects/traps/movable_block.c +++ b/src/game/objects/traps/movable_block.c @@ -6,6 +6,7 @@ #include "game/items.h" #include "game/lara/common.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include "game/room.h" #include "game/sound.h" #include "global/const.h" diff --git a/src/game/objects/vars.c b/src/game/objects/vars.c new file mode 100644 index 000000000..9e28fc26e --- /dev/null +++ b/src/game/objects/vars.c @@ -0,0 +1,207 @@ +#include "game/objects/vars.h" + +#include "global/const.h" + +const GAME_OBJECT_ID g_EnemyObjects[] = { + // clang-format off + O_WOLF, + O_BEAR, + O_BAT, + O_CROCODILE, + O_ALLIGATOR, + O_LION, + O_LIONESS, + O_PUMA, + O_APE, + O_RAT, + O_VOLE, + O_TREX, + O_RAPTOR, + O_WARRIOR_1, + O_WARRIOR_2, + O_WARRIOR_3, + O_CENTAUR, + O_MUMMY, + O_TORSO, + O_DINO_WARRIOR, + O_FISH, + O_LARSON, + O_PIERRE, + O_SKATEKID, + O_COWBOY, + O_BALDY, + O_NATLA, + O_SCION_ITEM_3, + O_STATUE, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_AllyObjects[] = { + // clang-format off + O_LARA, + NO_OBJECT, + // Lara's social skills: still loading... + // clang-format on +}; + +const GAME_OBJECT_ID g_BossObjects[] = { + // clang-format off + O_TREX, + O_LARSON, + O_PIERRE, + O_SKATEKID, + O_COWBOY, + O_BALDY, + O_NATLA, + O_TORSO, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_PlaceholderObjects[] = { + // clang-format off + O_STATUE, + O_PODS, + O_BIG_POD, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_PickupObjects[] = { + // clang-format off + O_PISTOL_ITEM, + O_SHOTGUN_ITEM, + O_MAGNUM_ITEM, + O_UZI_ITEM, + O_PISTOL_AMMO_ITEM, + O_SG_AMMO_ITEM, + O_MAG_AMMO_ITEM, + O_UZI_AMMO_ITEM, + O_MEDI_ITEM, + O_BIGMEDI_ITEM, + O_EXPLOSIVE_ITEM, + O_PUZZLE_ITEM_1, + O_PUZZLE_ITEM_2, + O_PUZZLE_ITEM_3, + O_PUZZLE_ITEM_4, + O_KEY_ITEM_1, + O_KEY_ITEM_2, + O_KEY_ITEM_3, + O_KEY_ITEM_4, + O_PICKUP_ITEM_1, + O_PICKUP_ITEM_2, + O_LEADBAR_ITEM, + O_SCION_ITEM_1, + O_SCION_ITEM_2, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_GunObjects[] = { + // clang-format off + O_PISTOL_ITEM, + O_SHOTGUN_ITEM, + O_MAGNUM_ITEM, + O_UZI_ITEM, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_DoorObjects[] = { + // clang-format off + O_DOOR_TYPE_1, + O_DOOR_TYPE_2, + O_DOOR_TYPE_3, + O_DOOR_TYPE_4, + O_DOOR_TYPE_5, + O_DOOR_TYPE_6, + O_DOOR_TYPE_7, + O_DOOR_TYPE_8, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_TrapdoorObjects[] = { + // clang-format off + O_TRAPDOOR_1, + O_TRAPDOOR_2, + O_BIGTRAPDOOR, + O_DRAWBRIDGE, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_ID g_InvObjects[] = { + // clang-format off + O_PISTOL_OPTION, + O_SHOTGUN_OPTION, + O_MAGNUM_OPTION, + O_UZI_OPTION, + O_SG_AMMO_OPTION, + O_MAG_AMMO_OPTION, + O_UZI_AMMO_OPTION, + O_EXPLOSIVE_OPTION, + O_MEDI_OPTION, + O_BIGMEDI_OPTION, + O_PUZZLE_OPTION_1, + O_PUZZLE_OPTION_2, + O_PUZZLE_OPTION_3, + O_PUZZLE_OPTION_4, + O_LEADBAR_OPTION, + O_KEY_OPTION_1, + O_KEY_OPTION_2, + O_KEY_OPTION_3, + O_KEY_OPTION_4, + O_PICKUP_OPTION_1, + O_PICKUP_OPTION_2, + O_SCION_OPTION, + O_DETAIL_OPTION, + O_SOUND_OPTION, + O_CONTROL_OPTION, + O_GAMMA_OPTION, + O_PASSPORT_OPTION, + O_MAP_OPTION, + O_PHOTO_OPTION, + NO_OBJECT, + // clang-format on +}; + +const GAME_OBJECT_PAIR g_GunAmmoObjectMap[] = { + // clang-format off + { O_PISTOL_ITEM, O_PISTOL_AMMO_ITEM }, + { O_SHOTGUN_ITEM, O_SG_AMMO_ITEM }, + { O_MAGNUM_ITEM, O_MAG_AMMO_ITEM }, + { O_UZI_ITEM, O_UZI_AMMO_ITEM }, + { NO_OBJECT, NO_OBJECT }, + // clang-format on +}; + +const GAME_OBJECT_PAIR g_ItemToInvObjectMap[] = { + // clang-format off + { O_PISTOL_ITEM, O_PISTOL_OPTION }, + { O_SHOTGUN_ITEM, O_SHOTGUN_OPTION }, + { O_MAGNUM_ITEM, O_MAGNUM_OPTION }, + { O_UZI_ITEM, O_UZI_OPTION }, + { O_SG_AMMO_ITEM, O_SG_AMMO_OPTION }, + { O_MAG_AMMO_ITEM, O_MAG_AMMO_OPTION }, + { O_UZI_AMMO_ITEM, O_UZI_AMMO_OPTION }, + { O_EXPLOSIVE_ITEM, O_EXPLOSIVE_OPTION }, + { O_MEDI_ITEM, O_MEDI_OPTION }, + { O_BIGMEDI_ITEM, O_BIGMEDI_OPTION }, + { O_PUZZLE_ITEM_1, O_PUZZLE_OPTION_1 }, + { O_PUZZLE_ITEM_2, O_PUZZLE_OPTION_2 }, + { O_PUZZLE_ITEM_3, O_PUZZLE_OPTION_3 }, + { O_PUZZLE_ITEM_4, O_PUZZLE_OPTION_4 }, + { O_LEADBAR_ITEM, O_LEADBAR_OPTION }, + { O_KEY_ITEM_1, O_KEY_OPTION_1 }, + { O_KEY_ITEM_2, O_KEY_OPTION_2 }, + { O_KEY_ITEM_3, O_KEY_OPTION_3 }, + { O_KEY_ITEM_4, O_KEY_OPTION_4 }, + { O_PICKUP_ITEM_1, O_PICKUP_OPTION_1 }, + { O_PICKUP_ITEM_2, O_PICKUP_OPTION_2 }, + { O_SCION_ITEM_1, O_SCION_OPTION }, + { O_SCION_ITEM_2, O_SCION_OPTION }, + { NO_OBJECT, NO_OBJECT }, + // clang-format on +}; diff --git a/src/game/objects/vars.h b/src/game/objects/vars.h new file mode 100644 index 000000000..2c3d4642b --- /dev/null +++ b/src/game/objects/vars.h @@ -0,0 +1,15 @@ +#pragma once + +#include "game/objects/common.h" + +extern const GAME_OBJECT_ID g_EnemyObjects[]; +extern const GAME_OBJECT_ID g_AllyObjects[]; +extern const GAME_OBJECT_ID g_BossObjects[]; +extern const GAME_OBJECT_ID g_PlaceholderObjects[]; +extern const GAME_OBJECT_ID g_PickupObjects[]; +extern const GAME_OBJECT_ID g_GunObjects[]; +extern const GAME_OBJECT_ID g_DoorObjects[]; +extern const GAME_OBJECT_ID g_TrapdoorObjects[]; +extern const GAME_OBJECT_ID g_InvObjects[]; +extern const GAME_OBJECT_PAIR g_GunAmmoObjectMap[]; +extern const GAME_OBJECT_PAIR g_ItemToInvObjectMap[]; diff --git a/src/game/stats.c b/src/game/stats.c index 4d88f12b9..5fd8fafd9 100644 --- a/src/game/stats.c +++ b/src/game/stats.c @@ -6,6 +6,7 @@ #include "game/gameflow.h" #include "game/items.h" #include "game/objects/common.h" +#include "game/objects/vars.h" #include "global/const.h" #include "global/types.h" #include "global/vars.h" From 14c284fb79ff9a1b193febb8ef7e9dde9e1fa4e5 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sun, 22 Sep 2024 02:30:43 +0200 Subject: [PATCH 6/7] inject: add explosion sprites --- CHANGELOG.md | 1 + data/ship/cfg/TR1X_gameflow.json5 | 2 ++ data/ship/cfg/TR1X_gameflow_demo_pc.json5 | 1 + data/ship/cfg/TR1X_gameflow_ub.json5 | 1 + data/ship/data/injections/explosion.bin | Bin 0 -> 106666 bytes src/game/effects/exploding_death.h | 5 +++++ src/game/level.c | 6 ++++++ src/game/objects/creatures/mutant.c | 10 +++++++++- src/game/objects/creatures/mutant.h | 1 + src/game/objects/effects/body_part.c | 8 ++++---- 10 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 data/ship/data/injections/explosion.bin diff --git a/CHANGELOG.md b/CHANGELOG.md index 267b0e289..139516a24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## [Unreleased](https://github.com/LostArtefacts/TR1X/compare/stable...develop) - ××××-××-×× - fixed double "Fly mode enabled" message when using `/fly` console command (regression from 4.0) +- changed the easter egg console command to pack more punch ## [4.4](https://github.com/LostArtefacts/TR1X/compare/4.3-102-g458cd96...4.4) - 2024-09-20 - added `/exit` command (#1462) diff --git a/data/ship/cfg/TR1X_gameflow.json5 b/data/ship/cfg/TR1X_gameflow.json5 index 30554c14c..f15a86613 100644 --- a/data/ship/cfg/TR1X_gameflow.json5 +++ b/data/ship/cfg/TR1X_gameflow.json5 @@ -20,6 +20,7 @@ "data/injections/lara_jumping.bin", "data/injections/purple_crystal.bin", "data/injections/uzi_sfx.bin", + "data/injections/explosion.bin", ], "convert_dropped_guns": false, @@ -38,6 +39,7 @@ "data/injections/lara_animations.bin", "data/injections/lara_jumping.bin", "data/injections/uzi_sfx.bin", + "data/injections/explosion.bin", ], "sequence": [ {"type": "play_fmv", "fmv_path": "fmv/mansion.avi"}, diff --git a/data/ship/cfg/TR1X_gameflow_demo_pc.json5 b/data/ship/cfg/TR1X_gameflow_demo_pc.json5 index 71f058c81..4efa19b82 100644 --- a/data/ship/cfg/TR1X_gameflow_demo_pc.json5 +++ b/data/ship/cfg/TR1X_gameflow_demo_pc.json5 @@ -21,6 +21,7 @@ "data/injections/lara_animations.bin", "data/injections/lara_jumping.bin", "data/injections/uzi_sfx.bin", + "data/injections/explosion.bin", ], "convert_dropped_guns": false, diff --git a/data/ship/cfg/TR1X_gameflow_ub.json5 b/data/ship/cfg/TR1X_gameflow_ub.json5 index 695edc409..b327f3c3e 100644 --- a/data/ship/cfg/TR1X_gameflow_ub.json5 +++ b/data/ship/cfg/TR1X_gameflow_ub.json5 @@ -19,6 +19,7 @@ "data/injections/lara_animations.bin", "data/injections/lara_jumping.bin", "data/injections/uzi_sfx.bin", + "data/injections/explosion.bin", ], "convert_dropped_guns": false, diff --git a/data/ship/data/injections/explosion.bin b/data/ship/data/injections/explosion.bin new file mode 100644 index 0000000000000000000000000000000000000000..79be67718d1ebd94bd65cce54ec6785674ef6f68 GIT binary patch literal 106666 zcmeEv1z=Ri_I@f9N|8`pf~aeA<*`{_v^p&UU#paIp23=&dj|Vde-dJK8K66r_^^I`qta(kkc<**M4~x zulFoVS3mcZORi_0dNKP`MRGn>D4$EQ0?(8v{6g76FL)HoQ>o;ORZAD}DqpCsN6`i~ zN;Iie(yfeJp`wNI7s&7G>Y6K8uIHc6k>`bM1#)F8=m=+@O&;uy&TWye8$B!$8&}A&NuYAdZRVoyz zS=B8oq8|I2hK1{Uy;!SqUe7WwR4SUiylb{nIb1wS=PQvvXNeNIi2Q8Xp3RvvN8Y@- z3lz*(v{=ECrHYm-U(%y;*=n8@y=qmdTi^2qm$KQiS8>Tx%f+qM3(q~{`h2!Rxw5;t z=BiM@)uV9!D#Z#_D_NvQ+2URmOV+MZrhZM2#&tb?Dtk9^EALaZfNPGY3%u}b;XKb3 z&zGZAft+Ov=c-6Hb#tv&`o$U*3VBy5R;QX<{hDPO)~=8vk4xTyF8PbP6e{83R-S03 z<_$~v6eWtA)PA~gDO_H0k*%<)X#T-oyF&7MEs^9A$g zDpD{{u_F0O6w6=At#G;0#VVFBS;@U@waV@_s#U2~)3a_Z?|iwk7jn&6v_PH`MP4jb zEPt621uB*)Ql&zP>Xl2^^ek7aM#Z{bl^WEk*{ESXQrl?|{d3|U28e+WZfQL{ITs2HzE}6kBRxK?}nNsg93F63jT8xHaHC`2^RiL6ili` z<{uLd+Xn>(NFx@4O8yzzYWPHK(4UK+ycNyFA41ztPHza%2NHgNe}CeD@w-6Y9}(&T z_(4Hn7N3$>V74dMQ{M^63cnHu{7)`81hyyaXtY5LDDi(F86u%@M1cWrP*L)M#_@#T z;#XpS1)JnP8Gh&#;%34Z3Mc^3#AZ*TC8Vm5B3bMJBu=~SlSnl00kcXy4gmn?czApV zVDLm_pt3$WKf3@TfRv^*Aj6{Bd6u>y*1#VSi1=rPmFA|N=GJ4#1$<%DbO9o}=op45_j?^Fnp{m}B z%|gJ4!~k8F6H~=&Uu{;={f4Vx0 z1h8C&F0#e`kSQ`KgMkrktt?1I|7?4ZDe>^q{Sp{FqWnzIi5Q4<~ zkPb_+*sS7*T&0J|=5d8LMXwMLP5am*;g7_R=%hw8a?|lI4uCNb4ZaYFo(Ko){0Om}b20gK{=qz1J zevlahY<`9haCEN)ymgcHmdX(9LJOyIg;T~ac7S9iKoY9L4|X*}qJQSfl0S3DBGdj; z%nv@80C54qkDzg^tZ0fm2oqbE$TMJ@n@9*?z#^Jdam=fVC}^VHkn!VoZh%jssV6j1 zl+l1xr>qhLg73JYC%O~Pj{sA>(6x}qQi&Z$+OkN}jt#-Lu}+EsbDQx)GApccIVM1< z2{sK1tOU?O$dS-e_@O`hlyd?Q`U<^Cta*T`X2GN;cgIHrJU$qBb=Y}DtjJXNGh_u94ks4Nup*4S7Hr9;JeZZ>&G4N zC?FD<1V_3;Q&_{=#4-$9G$iaE9`v8qn28VuDPT z?7UURev6h$0+50PXiSIlip}YOKZOGDv*GA8H+}lo*9yI0YD} zY9o^QRpy641_srbSkh8k%Fv#>!*$%haOwcRjro-@+-f%Q1J;!f=A}p=7hnRw4|Rcr zWqN?*C>X=4C*xOAMWiA?Y6{rj5UFIEB4tYkKgbn0+=U64q?%f@Ebd?7ms?fl7 zh$G1-7!@h74O_(6omQTqIOF7M605wQRV6xw1A|6WQ?*539)#c1gY9qP zXAjW4sv(Nw6N-vhZ5$GTVH8aXRhu}$hlvolH;)3QrnIGtA2#%&hbr`B0<@}18|i>|NU#T)pTl1|(e}3vSr(z_muEnnM3g|KEU9hu zK!?y|--s#G1A?Kmb?{ekjD%-M!UoIH_{B+~hmdBAA9)%~!tc33Umc&C2v&@Q`nkjT z$^L${MFWBgf3d!)taboNJ%k+eb8bNbRGOODmHmVPkO2IMC~4YQw5Mx5c6!dttgH=o zV~6o`Z#n`H0uZYu;+vLbnHPm#MTaY4{ic8NYHZ!%>l<44IJ1 ziuhAKsniuYwx3eAWWbO37iK{%i8a*J(D|F0R--BFh@;#s!qBFy5JrI<0jhMBOEqJ_ zPycr}q4Sm`K$1%m(F8tufsm{4OTu9n5UKi;swvjh7Ps0Hp%(Z?yfS_SEV_hPlE-os zMEY`t;y7X0U!6nOP?qFc96%yUL~*KywS++}oV?Rwc*O%H0BV%~K&eCgNC70vP}NwH zV69ngh1dE;$`Uht7ZYH0DmK570xT3LeW5r055P9)+5GH`%SCs?d0<0!| zu!||_7SoF~!k`&~HEbQg1xw}B;2rYKJF>|PIL42lfOt}sO{_vd@T)WpV#QBMLr65$ zw8L*Q!77WR%AjJwFY&L(K#gAn3kp`7w9Nx+rhJ zM+!u9r!QIsVm1_h1ON=Lni2oX>~fB!ir!LN3Tyyp*VD#lLL?9|q7aKhfD`;BgFuu8 zKB>)Efmn>s8+?o{EAUM|P5U!VtgR9Va#@N+IoYJyKit8A{msBRAkMRiD(-LI9^K=zy*@p%`RHSvjoZRFwi^e>K$>|HtLPFQNs%W&ojVj9F0AsvCg? z8yN`D4qy}gkSmR7AfcvQlBt*>0G2*`I|0bE$|gK)8eVSiIu(p(5&?SuhCs&zxr zL0_yrFNIJ?3co23TP&22x}s~{Bw)DsHSmjzQubr~o;?52@C|QOvRP5aZ!pg~!@Yo= zca$F}9Ys7TpkzA0Pr51x5I41YfE7L^#yohG00qRiSc^>X!_;PDf0r9!f3^?I&qW^- zKu(~if7~&VC{1$=ElC?FVnih4Hz;5o5doM1z*P;Aj9i> zAfE)XP}1E2d?lK?vEu-JXmPgRihY=t9Do#|)AslwmP8^$fi?OM=0Ibpq?45ZKFGy@ zO8=}X=RM#z;j^jGAAEqmMKI$>52nTz0?;A#i;UtNKWl3X(>Z=2fB_izZM9^Lp*l!~ zcY*+h&mW=?=2g_x5gG$!?E|{viKTt;3kwh_mSV6FteXvfbSSbJK6|Q+{#G`PZPwM! z1H`g+q$uvuC(DE%(y5h2dQf^b9}L#GrIzoDbvfUasOfE@v@z&t<^ z-K0-20J51P9{jWryKg+j6q)E)3$goFXQVTQpCo67A0dEJ7&Ng(*xd3VW1O5<5El z$^peV?exShAGd}pZopkO__2>3AsIs-3$+O)8`1Dz3$1p@W!GSa*=9}wAKf}|e-;l? ziB8rGH$WfwfzF)Dm6e{PDx}eW;`}xmT6Y|1%4#UJl?4^$9Qu4lS5j6{Hrp&Wqy6a! z|DTP?l9Wq>R$$9SFna*ObW?LTD{Z)qtqF=Go*~?4nV22g{SS9)(t;iC5 zCw)RF^b`$QsGXFIySSTe#%9xUfg2fKo#VqAx@enGl5vEt2BXlF?lIuwuz`^T2h%Ci zlztSTn;{|N2Cy+lwzi`Caa3I|1h9dW$c%#Qj}UggmH~_64A4l%I14C70z{R#dLWHOh|w!Si=i?yaWVmWM_&$wa8wK{_SibTX2#6F=zWc2*}l-+!B3ki=`;(z`+LzMP>G>xi4Xv}EMc&8JAjt=wctjzoINRXE9pRf;wN&`pjr+h$n z8$yroc*>SF2KYs#fV}402=uB);Gg*0d{N7~_=ok6CnW$_*|uDnGYdTbv|tS;50fPc z%RxDGM|R8XTJOkU0L*l+Tt!wd?1+M)7m({d2HIgBAme!@4FF+ zFcLLh!FpT<^xMk32C48H0l+Z;3P?#bDEcS@V0biH=EN4m!v-DX9XHDT(3@8pi2%Mp zeb|eqoFq>i?7W{x0(k|OpesiuiI3FJt^>9`r4hD<#*ZEiCjfrK!3aa<6lkyvAEBe* zF?`wq3GiqGKXm2>SIj6oC;+;scMmM~=S|80U=kV%101V%2s7Pf^TUBygnqiiJ(>*g zgBj)sA8bPBLV<-rvP&Wc1Re;$9(^F8k-qZ0ja9}aG+;ustz-;Iq?Lo0Fqr`TBCR$S zk63mhYz5lxagMTqFRwPT%W0wXjXWrq>6cS%$do=he`l99%>iY?k%95K6HU@?rvRMuRBz zf)DoGD|*6Tso^AC0gv__6Cm)}@D}TX2MtnQfna$Y0dkp@0qZjb>JrL`+3_PhGX>x+ ze3}g)2g+5rkom|e0Wd#Iz|S4&3-G7`J~i2)J?fo1QRmrYgvZ8CYDYPg)$?tBTmtTh zNB)4;sssW*!jO&vEnF%Rjo$=M?;uli*RLTdooRN&{*c9q0ck7np_YkX2^0L_lpMhF zeh@MjV%w1esMv>70gvEP-p(E*A7*Fd0!D)m*oOe&Cxck5E))PKev(W7XEm`y$LMF8 z`6r4AD+EBYf~5 zHmOH!up|RMZDe2|2$zEZt%qbm`30u-PN;=%MLNpllix4eq|w%#(lDu0Rf6xe%}|r`hw#DKYM@!0!;fG(3JgcWW$$4jNn%^ z!2U#n#!qVm3O^?RS^2;KjknOu1P%XC?8tZ+5Jam)4s2t`2Ev~_kq05oq|y@TB`o|Y z$6}^IO^hHfKH|QN4gkd^>T$C+EmgZ3Jbg2Mh)^%sa2CbhHJI8~sljh8b4$_o4|H0?}eA)Ntb zgM5Pspi)pXY3KUbMWWX5p$0WWO;Cy*g`8ha)ENjP3_1pWXlqytLX806k(J@$T0^km z6uR0#w{So+0xVgT@*i6g_d^Kna5%#L%nWYEH5C5{Q|l;!NFX0@MgV^LXTc8@*xLFjr+kFMG76{L&Byo3L?3clvmK{8Uw%9LjMAT^v&x5 zpWt#xdjavoKT^x26reX$xk>NxX)%<+gKU@)MjbIVZ~%CKnXX7>P5=O*8vB>>dhWs` zfkBBQaUReqfaEFk^n(X>9Calr0{asI7y)UMc2EEVGZjAArT@bd&MB z1=Iu?+9-^f?XJ)pK}VuFCBbTR17PxaB`O0xHD!O{fGL1%axYN8-H=#9#ZiYtiY@sv z2{2avL<_=?K*!Jr3+Nvv5q=y|O`(UL)ci6j1vP%s2ztqv#RHT;^sQ4L1(_%L6&->0 zDgkiSs!Rs-{F*ifay7KEXq66_Gol$nNd^e8hYvoLGzotjJJ8Q>fEBl!#zxVruF_K_ zror9A)%jFN{YXnJ!vye$NdRQBe@Wc|iOTJ$FX&BRl;KR5Wz8`O6#R-+Tt^+DA?I)( z1f82HMF}I1Quul8hfI#i2d-t%8mam@KBmMR4xogZH3BF{ICp=_|4hHO4B;V6CVT{& zk@El^er6QjY&Q)bIY6n5XI;P{_yv)zg#n+N$vM2j;1V}0VY2o|=mfsf&CeC)&#N;5 z(8Df_o|Lvpfle!7M5$;(J!?%^E$)k%B=hTR3;fh{oY6HF>oZl zGUVD3-~_)5I{T7@6?{x~fsex8Onh)x+BNXQ zR!+^2wMKS-AT?A0a;T=d$%tS5@?UPTdaO=b$bSkqGhkw}ZXpSvF>LA(gcz|z7aG9? z{2Yfi1kfnJ>p&_P8MyIb;HUiW=hXZdsj&(#NX6xIhT?T-x*zZXoy>tPYTT14%7722)777t47U&rHD(0`5@dys4sjzI^dSSebwl@Q zI)E|$k&#dV5h}KavX(7g8}JtR7^?H?r0nS1bO6SWML?L-#BX|%6~FrFE8hbbrUuQ8 z@Mr%AW@>_8t?w!~(a^1=NT-?r%V2^ZCz|+~1Uqvp_{P9&8jY610vzGi$Ka?c)FloP zk?fA*|5)v?1+MmZDNq7{@dKE$zbb%9vWZ`QVaEITF!39kItYXS(57`Hc~Sx^==icV zxY{NB>YVm}8WvpxO*sy>Bm=T!*xoQDHYn{$61Kq;9D00bnippzIL=)*tg5f6gQ42T3n9*q=88VY`rL;t5FO3lUz_*&}9&=}UV zQQ5?AP{0Hz!vnko2pmD0StDh{kFiQGsED~t1^^fT<&`AHzuA_vdFi3OEsyqlBo>zD zCii&oFVN`E{b79($JJq)Ntvkt^FIlHtvr1@$4|N&P2Irz0A=7O$_-Z{&g?Y>0}`Oh z2}Cb3TL3Q-AQ8ifRG7e$wnoVylY|;WpaGTE(rLm0wDio28@jTrFUi6S*wzXIR0gIA zg7yMNYZ_e0;FIbM-EYDt$H)jD!b}2;l7R3d3Z;;PJEAcUbkw038xlwdo&zYLY;1Tt zrr5Uli2>6AFdMP@KJaHy83z;r0$4s34c0TbokC8t>A?M2X@dYMPL$601u{uS$Z7$! z^bLubls=jSXd(B4GX#QmD?I7Yr5=$C2ap^f2NC<|L;7~u7kpTuw1NdXOM~jR%^7^? zOxKEeDG0d1_7JE5k&8Uq=o&nKLlvk1zu`on2;eC-m6wWT4gnqp^i)hQ?!&4MtPkN9 zn0gym>%*dl>R&ieC*_QTPYPF#6y@RU<0QaxrFGkK*!d>iO{}5eLA&7rs+>~r`7nY) zKW*ipW77dqW}IuZ{LR<$mZ=c!vJ9vo+?eMwY>BtRSmf^19x=XUxZmLcCV-i5A;XECK7s`Rh>%&gLKeh`6GLfL(unfw=FsP*H zP@BFs^!kJ9X z1N{2QPYAj4^I268Nk9+nS-t1Kavc>wnYbsvU#(JKFzOh3A;!74{8s>EsZ*yePU#)X ziq3>!AlGZ(K`7iP9R&O-zZ7xS<6|7pvLP}VWccL;Cle1+1w{|<3@&`@qRi_6MU7T9iDaxrqxS&_U#JCHx|Tc`j$8I1z{RBvEb)U z&zli0nc~XY$)G$A#85R20vxMu%2n_kMGNI#1r&w#anKR>(n&%~?gVY|7;g|~~044Of`M;_3&gO%(qMouE-nI5}S#x7u~fjHxJA>{qQ zj|mI9zt-MAKuoOpiVfP6zqryEd;0q~O#+sm-v$a5&? zqK(_xxidxyukHalP1>0Nhf3nbX>xeeqJ)TE<8*i}Ny606-*6Rj8N69fi;GV9vIS+k zXVE`njMIWM&nxuI%Jx>hr|Clwa9wVmpk1!c#r}wbj11vwUI({*8HAQJ{W9VS#-x@9 z3e#2eh>@3-Wk6bkM|}%=Hov{+<5me>M&Ky2m2}3>rc&a9xR}LZ0gq3<$g%TFM>LYL z17JxTh{(G=Gn4?7jR-sjJx(S6S@d@{y<&^Q zu0SDi1c|bV$X89BbEXmnn!=BtMQDo}vjU|XKVK&B82B`5^BWHp;jT0vR-HPssfGz{ zSt(Z1^h-I+SCRQekn`$AL@<6zf+6&qKsDI&EeId23SGmO5lw~)<_6_i#!t((MiTV& zupf?%Wj$-AFbFW7bdis!v?X>iyRq9Ml}SC&WdtU}SANRwPZuD0BYD}~O}j!MAPQ|F zP_WZ|IAJ#Q!7Za4_2vK^9|J#Dukm9!`#FHQ>Tk)ECVo6sM|f~k)H{z`sG>C`C0RK} zq;v#&riMl@SxU=DfDz&bHd~37J#>)?0rcjCI5qJ5`MKuJOHl0cpMJsA=J}QZpI`R_ zeu@t;z-vOz->GNx7X6fWGI;*LV=8#BSP`2JJOC*U7ieS_fwUr_lE3f>{LUF5{Nnf+ z%H;unhN3=%4GVzeD4zKBlnEZ5Lk;%|1+;-}XHx@#DA=GE8b*1I-wK5A0V27Qy$1xN zLZExVg6T~fuiVFOWK@8f0lOGLG0$%T2m;5ojK)u|4R}(4X!Dqx2;n9#Um}-)3Xq{! zR&0AjA;y>)ncfl`feMru3WuaHT%xROO5y+lWgx($OdLnSS6|$n`oJBg5Ny#L5HIh_ zJ7QGHI1Jm8%KmuWgWq&8MhZf&eru_IV2Kza^z@(Om4x6RD6LeMZ>!Y^GSwLZT&Dqz z-bQtn!tia;(oOd1k1s%1!lFHX{&y=FKYj;dM-N{tKduHUYW&QT2$MR1W)8Y~^d!W5 z1qfgk0v$|^@J9*BXv$<_Zy=VYHb`UaV^17|?m@GtPJ0Mb73dZYw9^=eND#U)@LQ#b z1K=GdngKg4axPu@M_9XB`5*^})9?*>gliZE79i>cecz(v# zC+upA6~`2h88BH;y9P|#4b=$_2Id9<+~gh$i`dkEHpN^DwYxwUKV)dUQEMpx+4{OB zBK%w($T$N0_EiMrvh%Zf$s{Uv0ahB>Tb#kDBoq)6Jz+5Qqa8t}e4eQlYwHq9^J0}? z3SgDcCz_MVmVW(@jY_FrRe%DXj82XI;ZslGms3VIp}&8dVLg=}A|gt~uu#^-58Jcn z^DxS;EZ$<(-WI<~ChSv8sp1uQxPc%#ru>C&#+EGuneNf6h3Xf%OaNs7N%;Iiy}*a# zWBkxFV~z?G0>DClkjmPW!wY&S$PbZtZiOP68ry>HApkTAjliNj9}<8pilt(UAcJCT z!9{3a-_7`G*Q!&d+Z-P}v@85-yrfZ(Cck;9UZSR{k-C6?`@$x~hwTbHv?0)}n+X?z zPXmVO3OL2rs1JZNA!vnh1ZN1XwlH=i%;Zi6Z{7>jiySTE5#Orzvn9Y_0u*3JaiEt5 zEWbLVfe=P8dJ%=OF3(`C_ST~SBZnKrF-`A1WaLKj0fTt4kh%+B{7KA~$vbdj^mSFm_7QZ@*y%Ma^J}Kv|4N3P2yW z4*^yU)<(l&g8(aj3j`>qQkVt|iDp*gF1Q21&fqN+SS~ezI@!Xzk8F9K*vPg<#zTRW zj)Ye`zpM%p8T=|3(Sx_|OafRrS+oTU90>$je4Rcy|M6miIz~VMPc;*`R+u?pbaF&- zLf3-=z72;g_-Rky{HSjluE;b*fQAn)G=5q*lhT=UfUz4WNSCmxwr*h2o`mZT%&t_AbeYrpEFvtMz%L~q{*opdMS;XW5us~;<@)pm>*E45 z8PYGz=}rSbKZwx=G4axtWn3T>tpmIX^o$e z%NS?D$t1|no{0c+i3r7z6+c7O+Q8rn79FB3(*dmEK-)McG3;DtyFYVj0ySMiI(9C? z{tP<+c{0uTk^Hy;zcjnxr^}cYc!-f0K#BQC9Uxf;@uAR!a{PIb3CfzC}%>`pq{r3wIlTaYMFf7}XTfRae%K06m6Ya5MciYNw+ zmuf@#v?&;c6ZL8EAZ~-y=1kK^9ydCBzmTqhVzj|2Up@P*$HK!05qH3L7SL>$XIM_7daHtZtOh7wWF`ewMyT5q?BO1bBM5 zaxF|DAP%5vTwW8`_%Q~+IgG}Ceb&;Iofc}B7Qr(%9Uqbto{)f?#@_(v4lJ5vX_N5N zQ*xle!oNHIg?sV?3a?f zh(-EAn_ZOIT=<7}NDEn^BZG2E7hk}R-cl7WqsK6T1`a4!8nv$z9qbv9eOj3pb8`xC zhM(SGr{S1pODN3q&21SZ~(=W87pj>&FVywRNS__`WVYK;6{D73fRE>Ki4wwKBRqhEV>QkQJ zkj7*cY9%xAe#MLht;QzbiU27K6Y1i%>qe5wbKhQ(8TyQC;6{Fp=+BmT+KgN1#thTazJ{p3rJ*h z-`d}KerB4SW0u^O{Mkn7KXHd&SSR+a*5?4gUu5OUIxNA-!Ls=FhZKMvKmacZ0X`bs zod+qllh|AhR5+5M!{A)Gp%|rY3XY7YGhFZNfc(u@d;BOqNxX7IcE_w`AZOj!9ET@T zSc6q?AmaJyszwUPV8iA%>rQY0ybcbfqza{e}pnhR58_*>WzI+&|;$6DUv_fPIrbWJGc<=dsTq26UiP zf_Y5c11VfRX%t8Vz67GPknma2(QT*Abeu7Je=NY-~ zK{Mc)H%ngiNX)o^XIjCO`X~e*H~rCXXP_mS2$~@gvKi@}O08+dO#T+9MLl^V*XrUV zj;nDjND#fY?`XPb_7^TKVzaVoOaYLz@MJ41_ELg_Z2om7tSDzNqPzXuw~lnuFKroK zL+JHfl)uddDR~N=6`_tga&QbI4>t^8#K7YW0%U(PZSy}CU>aU|KvqnJU+$styNhxk zY)^iL%*R{Cf*kOBx;uIo%>lNo9HJjUVGWF@zCu9OJwS?fwz;RQr)R+LnFUwHdK3Z0 zr*Xe*=s&%w)2TY`L5q;~Z(?NyYldqm^IKdPbYlX5X?uoC9UK6B542qa_-A~6 zS~0_q4;;vm;>Xj2-o2t>#PYA5u>HBb6ppcCN$YjU4Ag7hJh`*{6K@B-%3@SW^IwtR z#LWco>V%_PY>yFs(nmi>0e(H|8R^e6v%f~Fr3LwO6!D8T2t~sQFaQuxYQ(e3hj>PT z?0|B}{mI8cUHJ!Ea}Ez>JO#{37N9u`%z=N8Oq7)TZE6n|=nv9qm`=X~^U6Ikm7uuC zjaZ201fcO_ZPqfd;F^jRpR5+WOn7+0M~1U?St@5R zjA1CmqyP+1UEm}e=%3C~G$L*h4Ytx)%SVp@0kEs_q>;@}&W$n>3(^<@Xb?m>Z4QGP zf5i%!z;t>_OfR!Gi@8V%k}Hf;8pMK=nix3Dhh%?Mv~j^Bb)c01F&D{u#3YDj5rPxJ zZ;Yt&+y%qGDg_9A2LG@4B=*P8QDv@1K5HNwNC_Ujlwy8#Lv#SL%`bcK9jbm{QrHg%O0Gz!!uL9(&OV2ICc2727P?DwW+?1(`y|hX@twVmoew@KYmgeqIUV zi-E(&tH4F3jv5k}SKX;SfKol~LNdZ3h@?g_fup*4X8E5yvnVc4e^qEJp_HM?PCD}` z{N#<)BdGz^NQaCBkp1NpuB1HAgEmCceOgE3JF`SZ_80sDpYiH~7hQ`?d|G^!lI|1X zmp>fK1ekKcts42X?NEP+Z*Vq57PMO*k?9}n45olzNmM>%83!x6TWpYFQw4yTbFG?T zIgOh114EHtP-?`nCzuEG8_@87lULy$U2r#Q{y_=An2E5PV-( zP^v&f!(To8jJq6d=p_JpfFL-vEFxBU03WA*$X9i-;P5wTj>MbC)So`!0Z{cp#fNN3 z5A?}%LL9WHPyUZl5H+zW&00uUG&Tq|1kgOtyvxzn^HgV$Q6x2y3Z^vL!md`%asn@+ zI+B&yG5%{u)Q{EvM)hHI0xtsyBity@b1?`4Y>MGv{VoYKhK^SK$XF`=X>B+&t<*X7 zM4DZIoc>9OsjFB_4Zt{I83_S_&cHZ4DX@JCOoX!O zv{F{7;z0DKZKmaqMRy_qE@c?U6iVGoqeIxBPg(-9+?u6Ln)r%`iTxqoW1H<&>UEQ z9hXssEF7_s_NUpNI_97M$$KsmTVTN2$OG)qV?E5S5oweIZ1mEP&_Tf;iBBQN@Bpm7 zWr44(Uc#^Zae4xJqtr49a0K55KXL#i0pPcVDJ#XiV4PKLGQAG#u76(G>#ivM^MJ<~ zI0>5hA1s*lp3eL-1r-Ot1qwg@9J-AI=pO#JzY+cbLCZWG`RoIx`So(H37*5>K(Fw# z1JGaL_}|9rP&>;106|3=hB6+_&GgUA*kH#FCcnghVo7m9#64E=`RBW`LwJuq2m&a| zsk#^ZHbG#S?^$R-NnnFs_8zaoL4J6&c7Od9903RbwZ4rR4Oc9Lka)4cHaBJYgD+t7 ztI&BYJRwxQ{`Ke{-2)~-0E(YK5^fYicoK#*XqoMr*m;ZAf@!?a1mH$$j|b;}13lip zMhX-&QW*o}Z~-oZjl~K(_>=+^euM#+e{{#=rN7*{OFY^*fBh9Eep>Ex&BInjHOKhr z-~X~lF8lIm3*f;6*&cQ2rdS1|$nDgX#8KVqk!7_j~Q^U@D5vVxxpaQM$Z zWui6Jh5r)-;H3}x8<_|ITH~TdEV$;$G3Z;$ps0tylSNa|0X-Os_EL@$*kafd#3a z>{({PD3#ded<$*SuN*R{N$|O4I6()nqQNKsH$s3^;bk=b$KNCh3<~hzTbl8%1zvAb z@MTfP;fjQyr_YQ8kn>}?fPVV)hZhDi3V*UAn6A@u6+deMT$Klq_ZU4z2Yut!4a^iU z;&bB_E@v}8!EVK`$-r_3o8BQkPln)+-$iCY6!7#13=mRz4n)q*XeB^6QSiG^ghHAX zqp1fxAY%r=QQXB`$R*}2|J5yy0`h2`3CZEv_i61C>zmxfLx>RC;|#_hj?@M;YW4&m z*>V%kT_=UO(N1!M|1;k@MI%ffUnv4k z@Qm6PMCeS(!f-$_tW)UYckct+nx$)A9>15zR_i}< z1K}uNoYkuKolJS4@8w1{eonQ&zUdfDU=O zge_k(cOF^>RhjZ{h@U~S*Ap3F#0+#!e-a~>qkkU`-~d!Uh#xQy{6PTeuY!=pEkW?N z#81e{=CaHs@D1zJE@A^L{GA(6n!la~XoZ*IGbev%_?+P|;3<&W+#o_3pE=Oy|6W`u z^I{aV0_4N+d_58f1=dUc9z0NNGbj{+7DNhe2K;|N0vNP%b&~*l{HhN4+h#(>Yr@Bt zL4mnpd%@pm&!JnJxMk~ag!l2FC?X#3rhl&fhk<_>_`k+LaEbqG8vhCUh8QpXt5v~2 zLFWG@5qc@;|B}xC==u)>|1j_m1OG7a{|5v2CcBh!DRt`MsfSHnniAwL8(chH+?zfe z`tX#?YT8d(;o{@sdEmj%5B#3W@sx|pMjw|pE}nfJ9D7jq>6Wzb;^)%ErS5YN;vO`9 zItcsQvH#%r@CUV@o`!uNmp(3afB8M`!E!n8Li;}7{J!LY>(fi`I#_~5{Ur=Rwt z{T-x&i_ee;mmh>b)gI@4Xy0?z1J{R}pZbQxb@4<0#~ye*Z28n1w4XBBcE8J2==<)2 zjt}2;x$2TiSA6%-#bvC^!*CauXI385JEF5gipC78xBH92pZ56crZ| z6dfB991|NH91|TJ784a3850#j*M^5jMFxjQg$0I31qVk)g@i>%hlR()ghs_ihDJq) zhs8wF)saEru~EU1v5~M6C#46XGMg>#D#`NM}>q(M}~$+ zMuta3L3lI?j|z*3jG+J1(TFfQ%4cXhk~ECKvCxR{(2$6T&@j4&PsT=vMZ|=MMnuvf z`j798ij0VgiHeGj2DGTC*!Y;(S&4B`agj48j~zXF_>f`arcIlfv}o4cW$V_YCNEn$ ze|AE&-;_y{XUv@L8x#^2Gb=u7?y}^B#JO>E7R`x?o;^FvZ`!m#ze$sP{r!TYV`eQ# zUX++He{R^csguTx8$ELT)TzEPadcUHRFI#a@1%*oGyMF+W8(-;pg;Y&)PN9wzo>+m z@R0D>SW+o0D9~^E%<$M_@4o-ZhaY|T?z?Zkv$al{0{LIem;c2A1uG7!Ud*kCZ=aH7 ziM-ei+f9PPH1=~<(um$!GV+I8yG ztyjN(g9Z&7Hfr3su}{;cO`A7w(XwT$)@|ChYuB!QhmIXPb?V%uOV@7Qy7%bOvuCf~ zz5Dd-+pmAW{sRUM95iU~;2}eYjTkn1Lf{qoDtKmF^+AHM&N zyZZ8r&+dQv=_enfkN4ht_Z{lu&D(cwz7|z;-8!$Lx$@+!ws~fm!uj*hT$HkRe9(e{ z>tDU``s){C2bArYe*W@=;)QbM%l%^Rc8AZswykc7e0lSb68T*V=k7AMs(aB6m(sSq z^Tz#+b=vHCWAoPWo9^Cu?``VfoqPAFkGpr?xc&NTuibq0)f?BZzw*kTJvEaXyb zT4f61G90@uE;9pPpe=4sQ7lv5pvIrre(LF*m9ll6P&vBhi+P^U#e{*c7xNb^Sg0@& zR$LKQmI$L?w|Z2nQn|Y4nEtgU-}&a(U;j-8`t6sWiMJoVC*HpO8aDd;^ZR6-k3V|< zy?gf#k84q)2>IiS*J3<6o+`{?YHldKfLkAYd3FQ zzcICH=JCcd|) zdyA;y4I0+2SEoVU#(aKF&zO&{jqTd+$^+8p#upENnBS>Q(=Jyxb#E8>?N3&H zA3PvceDqUopPx*wA3zVp^wue}-FcXX*jx$}^tDo-VmG?;V{ytyaa>Q>#^CgOvBE(5zYI>Q$;&^Yp4wZ}75NjT?K{tJBQ4 z^{7`qPifPvL6e4!eb#*QX+WpubMF7NziZn@O(?7zHf-FuiH}dyX3Y@Uty;B0WVi3o zp;KoL?5^D@uzPj)jTtd?4HWLqz9FQ4FZvs?HKT9exEq?%-XdP=SI43R4o~pe~6lSgst62kwmR=V zfwJIt-+uMg7hk@A;?BqKf4VOC>fQIL5#G1nO-p>`=G`|ax^CZo?e!C9Uw!4q^=nsB zx4v}o%9%y`FI>2I0gz9fI(&Ro4y9zt9M4uxI&|XnnUm+{xT|FJluNA{ZmtCq4_{80 zGOtwr=b!f*`=V?1e8f0uoSRd2!6Jp-O2^;4^U*7p@7)QkT&dXTDI;h1tWv5>i5k-f z3~W2^#ycM#-+S*^*UDw+-I3CzDwa#Qec|JeKKtbUg|77~l`375(o7j1@!YFc>ezkB zt+WeYe)rRl>}iDV+i%F%KKuNmj~1`F+^2G>VkJxTtK0s-t<>6e%Xc_-=iT?V3~kV8 z+S!>0&ijWquTU26<&+}Ih_mt)J*rl1dFbP>zyI$2``>;R)#bp4Uwr-5H#|Ol{uwzh z*Ei^+xqvJ$>rC6)I4)Xu~;6`cBs!xf0l=G1F@>0;6;|&cDrOZTJnG$ie>Yg=f@X$cDNxk}9nlx$Jq(zg#zHQpI zY~8wbn>JLMbm-8rOXu$0#-wlm;OhA|;ztdfeCy$7^8->&9y$Eh2ghRv^y=1)tCl{A z!2|opzIyx4og3d+Qkb#%2E*^X z`^HTq0Sw-^Zrz}<`_QPcL&xG)UbuMmvV<><;OEbsJ#(4{@DnFw1V4Q6z`^~8md)R> zZTHqS>0#Z6j_fw1b^UR3w`|?9W9Lqc=-an#-MVGV=JfPU8#iuPzkdC?wQJU_UbSlF z%9SftEMK0MwrttbrAwDkOHEBlS)9CZ!QA;13m3_*lZumXl=K-I9ekRSDVI$YfkxGY zd_ga3P%xD(OM{~tvZ-d2im`TWDHt0zYDA+74=PkGwrSg;SGPV3kFH;R^A}B|`u^AP z-D?*5w()65tx=;UbWhV}%~4=>7#Ta&_vp?!D=vTe(~+?LT{;b&5w>Xg#2)>|j0)O$ z6GN@DhH->Tf}ei;5rv3~MXEz!pbyCR^+19&{n~4kTW?5lb>-6K-7zT#&uov5njb&d z^I7ns#sF+R{S4O(oRjiUyiplhurMly;#|d)DOaIVr3Qm`y#2wQ?QeYj-495bU%r1b zeoX(tvks@Hoxl6Rk-+h3ODDIf)T~pT20aFjni20C9WbD-d&Tlp{8VtSx%Q~BMicb`67fScv_@ZqDzE!%qF z`oA7N{NeQeb0@YhONMXN!YYvQ2Wu5anpM>Z#p8tcVt_iX8pT2>oROq$~zAq{_Fnd zB7;B4dcTqN5L{A3e)+{0Dvy3d1wQI~D(7y#eDl`%P4kBN6faoH!>4t}cFld-cj-AX zDK#;2@%)u%Z&29rP)>HehNAhU3v0udZrZ+j_Pn$;$&r29c4|_iVDWZ?+jgHgE_j+x zv1j4`7$~VCMiF5%+RJ>+GBh~ z%EH9(*y%ofW=!hbv0c;dO&hlxG_rHcrkz?fX*XcXh^{?bw`kE~K>xPwy85n&3q1Ih z1vPJe@a~VVED0FZs%|ZBFRxlneCpS0&@^oA#x3h^{qp1Oi`TyT_~p~_ott$IpV4LL z?4u{&T-kA4M8C#OM-Lh?q*2eljobEL`0l6QAuxXb?Wdc;&70P$L4_dYN-CszCRc~D zB~RsOBIna?VB7v_moFdMa^Q=H-<{oj-devw#J{N&!wiT5=u zr5Y{Tc9|L*J!{vS-~9CR&*+Ogqi97oeecHY+m|nGTC#f0nv_)wq9;y>o3nn`^|#)* za{Dcs7SUjM`?Xs)&g@AJ@*Uc#L$|@bTh?ptRl2lii@K#NmCO4A4T&<@qq?3{pb8o# zbcqrwPAPF!sM&M$wCMp6YtG#M?7JUO;qcUfT#eHBhxfM57#}?+alyj0T}L)AKlAdT zmPgM)i=NR z;;SzR&ZloIiw*Y+pF5>Xm!2y&jqQ|l>du)!|K!DKThkH~V@Gyw)1gPb7Bi*|?b5hI z?@2>?wy5AywZrgnGyF#P9TmS}ZBp30r4iG*Rf9lE_~ z&5iqCe?$MnOo=B-WKyHdpi#@HTsd~AZoT}{OFZGEYLh0MG+G@$di2QQ!-ozYJg`sA zH+Sx&v1!}t(0OYjdzD5kxja>@REeeu(dFweo*lGu^QsZu5;knzwq+YWVaiU3*N5TeWlh z&XZTKUby!52Q=*P7)~R@FTZ^8+4tXnetGwi(_2$hW2eW4jv6pz?5GjFeQH&!<5|95 z&xVyfFk7ia*|Iux>vV}F|mvGoWF4F;GQineRB8M!MirW z{QK|Uy!qD4#}Dj1a4bD(LW^cy+SI68nTnSxs(hiTE!I|idbVrShzgiiEt@oH(ynjk z7R`AQMnz1UHf?zt*0q1HuDz#*PMa}3C}DPB)Y^^nmuxw{GiLZmznLMCWBUyboF6x1 z;nwS)+`4w{?yoi~INC7>MmRj?pOji@GW5ZFymUf|^_9~Hc5Y0WziI#4g)7q6EsBnh zo<7OfFJ|qwH7oaCIJiD_;qomD`!%lPp6BVOB~?E6e6jK#wJVhKX^!(Y;aS6%$E}q?gV8_k_ z+ZRWq?OHK6X7Z@sE$i1J%4G$LsyrG1F->jOtmF7e(-#~$fBmi{V?B6lM_kN~(?@sg zPEU@Q(yvR0p8Y2+Sv7xdOz46QE8;_A7HvOy?#9)9sWH;_(aDFQ32j{m;K( zHvAJ6nY6Hhy!hVLi^mTx3W;B|X#Uy_Y0(pVv>Y&M;J|UiTXmZ@bzt*`^~#k*nNCxk zQkd$1@e1@W48f7B(oj&nZbNUM;UoKm@7Z(wV9JVP?|S+PCpc$CazDMlTXrJP#y2u(RY7bb`K#N{|IxVcxMmCcG(YE<>8 zQloauehJ%8y#LviyWjozGmS5l=dnZtzvt16)`%$ey>a;9#lxF7AH4p`xvN)BpS*DH z^!f7_Pi@_B?B#3JuD*Qb;_e-%&TQ}>HLS&pPd$?>N4A{LW=CoG^fND1ZrO9hz#gN= z44*QzOP2wCJ2dY)Ibht-31M+Dvsdofw(IIGN~U^I;iV&MX3y+Xw{Z3s3KlF_qFC|z z!$$NT7#Px}d^xwGUQIm?W>w(Epo|54)ugJ-25-m_`rvc#|n0|w5Fi<_OiD0#`!6-$>d-*)lLp6#bz zIX=fPo+j!CcI`W|du#f#l++c=Qx>FbJpRh%>(?&6{=t{OJ^bAKAaF5f=AX4BbwAKl%ZvU1PaOZ> zzVhm&o#}^Ped}#n!?}0w?wfC7a)hPL8<$^3@qO*m*-I~xFI}Ydf-`5%9^HT9V_Fp>+t;sLqt&2EBgcdX-qYyHA_iw~2R6uf{Ff)Gc4JQKNDtD6nB6tej9_(@J`+ zdQH3b@7~1A)3au~o<6lvzN;}qmGA9(4j3|M)TGJL3lb&_o)8;9dCuOOm-p=0e`?#Z zxf_n3-x3{=5FHj1J7;dvq6NWIrwr}fu5HKRe&LbPLE$TRq=bYmUcGD2{IFS(Ge!*^ zGHzs#&b0L2xiigTyZ0PEIc#3k$gs7^adX#f+qwJ1)%R&}gND3se|-4xo3HL$Dor(U z`t`#r@BRCy4_-gLcmLsavtuLYZaI5?-=Ujd{_7`7I9Q*g;o++*C^W6>2xERlSO5%}O41>Unw9t5>s1 zRqsxnTDNXej|Mv)KIvHkJxowDnbsXU_Zv3BKW_P+gU3#vf8TJfhrfKGT@DNWG!dW# z_#@4wXcot%6y@QMWu4(&UL)sK2CR(GA_JwQ^Ebd2~MJ1iobg1Zx z6s=IL`NW99wcJ~c7}>wGSH+t3E0-@MkB_#~7ro!aHf~g> zMveN-YF4OJwMI3!B4&}z>s)Fzok|W`bmjGu2F=^FZQP)7W5#yvSZJtxQP>{j~zK9ap{Vc$@F9|D&^>n z+qZ6ibpLB=G**0a|NeWIF1&R8#^rtU!|?C5#6?dHNl6?#bjJM6=Z~*lwro*kpx@X5 zJ;#OkN6eW!J2YtS`rTVsq|Tq0ydW-o#>9y;RF}xQg_+s%o7MqkTt@pBWGsyJ&9g zj1hghbQ{pUalIY`S~YFkx>Nt2?b^2Q*rQjE)@=t*8r8K$Q(EfA3PbmiQ+&q{=-Opu zNK)#GRcTAt>^^s5Q}VpUE4R>qwD;Vd>u1hfz4O_>?!R^So0F2fc-5W@Z`_wU>|dXM`XOf76o4Om`Rnh$ z|NFapuUx-;C_Qyfa@w*5u_1xcbLK?P7&m&J!lP8m0B(BwI5Hg4Z{`ugo#w{BiJ zb?n0RYo~T?+O~Vkmi>p196Pvu2aT3zFB~~|`ttRgw{Km0`Q>Xjs8+vA?M-CTTet9x z=-Q=Irw;AhzIJxZf<+1bBMEM+W(^yAdz7nI%e!V3kLtCWbRN{J+nC7Y%{#Yj-E;c# z`2%ZG=Ff_b2pBhV@PJ;uIyGs~tX%{5A_dD*tPeNQIkRK{G-kLj5O=9X-5PqndT=R4Grt0N|Bq zDPCxrh{r+RjhnXVK0YcbAz<93;OMZKGp0`(JH>zcG=F;7oUmZ)kv-{~ckMp%%3JT; zIdoUrw4pqpnUbxl~>PhU%zC@!tlvcX3U&2s&CtN ztsB?v)XJ-NgVwFv^%yvK%+#qfCQXfwr&0T?c37l z%^Wv%THi(uyAAH&vs=GuQNbg6bnH86WZPz)29BLRp^pJ(#ECuYmaj}tUzs?2Zt{witJkHaB&TfLx$DsBE7xAWbn4LIoG+jZ;Ix_#?fHEMa3_pVv4c!@GK zTePfRrfTilHL6tgtm0P0!>4WinsuAD?bf|z%g&wqjhz7r zWZ~@KnSmkx0jWDu!{b-&-m`Ptmd(2l?by42`^FWii&kvek-lio%H2l~?m70-sna*_ zUO%yG-^DY#w(s4yYtx2p$IowHvVQ-zrSp=a6Vlcsg#`Ienh+J#x8smW6UX%K+`C)T zy7e1Snb(k(xob7-+`DVfiNXGprv$_)tbx<}O;jY0It?hj;JVvS$6-l^fTuSe%-= zdS%-7<0ns_-m`w`f~aYeCk!3Xw`VJFFYnq7ygkZSu2Q~O(b5%47Oz~ZMy0AgExam} zEnBv-w?{>fx=k9j@@ZVVT6J1BYtwtkh_TZG0)oS%=ccXOxOKe6+)ckem0bJx*Rdp7Jkc4Xt)Jx31j+qL_^;giSrY~H#vebtI(i_>k>h=*O&m3H+_*tqy7%utsB6p6~nlNhQSiey6faG;sRxeq*>+q2c^A@h!w27W9Y)Rj+<-o3u zTXt^Wx}6MgbkFLQYtrV;ii-)G?l*1Bs0m|-4<0yVP#>Clv}o6+iFYMDx-W;cNUPyI zK$r2T>R!du%e!H_uI-w2=+$SiZ+P6C#i?^+V-puGPKpQ(4T}!(^{4lBg8j#j964s( z_;KULjGsPp(u8rNMvR|4ZrsfH#Q4yF$e8e`S&NcqCoWpKY;Nkt9lH)*c>SICzWDzB zy$`*hxVP8llT(snBWH}B z;5%vju--ifj2_-RjxA~P<}F^GM&7ez@xsK|q?Cp6(NTfq)02au z!={XxJY`7l{^J6I{ANs?6qTHkyms&QMNtt^iOGpU)22`C-)}rsYoQ@CX9Pz_ht8mT z=C9w795*Xz{_K!(gGP)Q)U`#!I<=d2?$x9F;HfiwCy$@v7Z%|+Eol1qsp0dI=Orf2 znIAXJ7gh}Lo#GeZJ7MCup+m>{PM_`<78?~xW#GKTIVto=DrMo^+0pUylEP_xoSl>~ zdlo%6SddBqcIfc_UE6l;KXm-a?)1%@H>_Q|VdM4_r%#?efBN{*!za#PJb&)=;k`T3 zmoH3+2n>r$NQepzjZ2(8D?TB9PRgS2NfRbd8BOD8w{|`an{?<&&p$eL?B0#6JY-<6 z9=*GF?KWsARf0Ww4jegZ650+3=WC#YF{88BJNV_kf}F*3^)} zg9Z;BK632%3DfCs&Q6=`A00Jg?1(XA$BiF5etJk~Xzc9hkkEwrbK)YyLZfHJ$IVYk zS+Z>DinZwnPM$k+_R{57E}b|^b-}?cE0(WFos%$oc0$aoq}hqH66P+PJ1ZeEW%WAp zAR2sjZr!nK+vZK{R<2mGU_r{f_<2hf&s&(bZWBFU+`RAj(Y>^0yJge*LUdeW((I&JfrC4B>ei)2 z!`gLfRW4JSo*@@4QL=nxPp^h;I`tehcG9?^0|xZ%)xBH0W=)&a^RC;pU7N=Bn)mG6 zsa4y~y?S@;*rm_#DbsxYA`|D#il$cr6Xzv_1^CUFLDrk>7aZg_EigQI+T_WTCXXF4 zV#E*%rlG@!4W<7E^zYku@X&tkTDI%jr(d6*eTPp8jgFf$XI|>c4eM5|S-EWW+NBHU zFGyZEcV1F_eEh7q*jcla;zC2>lM-TMXU~~EJ9+tv#YwZ1*RNf=a^vQ$RIsgIzjn>4 zWs8@t-mrE5@gw^WoxE`AWqOo-?bh8l@7{a;)myK>a_;1*GbfH7*s=A{g|kPf5Ib}6 z%1fsXA3eHj{gR~kxELy|2MvH`-MVz?)TQr`(Nq2D-|GvBNlc25jSHJRX6(?O9lP}I z*{LJFY}37G??GdxP7j&2Xi3`2WebV|x1fwD}3q;r>&`jv6z5{K$bl`%+RI zHgaIMj$M0pY2C7I`_?V#5n`*3{e})E=El%iF?!65sKf<}Qdh27zhV7~MT^(&*tLD* zl6i9%E}lO-DS1`;rq#=quUN4nZNaQWDnK`ESeCqS{{L(1JbN_F(u2$|;0quuAtMn4 z-w*=H*xuRQ2|Lphc4vB0Pv=}+-Cf<4bL#5KIp?a5)nPhJ+MSsl@8YmFURlNlAxnHf zvIGVhko+UKuKPaETQzG=)%(PA?wrnfp0{dYd10ipx&EU!-#T&??dt4 z&d#HseDUo0S4?vrJ$(A?!QFe?b0ht2ZM+lN*E6!PIyW}CK*_PSwSDKwCr=+ee)jnG z+T8T`Q0Mi!iw%v}8YniqIyyR9n%n)Wgq?kTeFH<|v&$P>r1Q~yV=T9HsyR&!y*7nBA%F6uI{KoDbtm_M+ z-&dbM*xJ}4BX+hBkLxdAI(PcaslzY7_|hwf-hStGo&~)6=3B4vnC$SIFTeEKp;upe znHloy$Lr29=Q?`2p|!Ppl%=96MAX;UQGfiyx4-+Z|HVK5XaDf;{{3J7C;#GK{kvCq z=6?Rdu@8=&Jp7|~U;n`y?;L*T@JDBeE2odWea5hcx$ljp8pzkL40(Q{X?5Nobp zYad@&URhe0B-{@64GiCGJN^Fg3zsg?)$n!r-J>T?o_PO*3*Eg9XU|?dfAYhRPM$i> zd%|ygaO%i=#NcCRSeoi)kzlB&y@SBj-P_UBPg%t6%)1Ytefi@j zdk^+*@7~#6-`ab0pIOkOM-TSy-M&psT3%Y++`0ew$)mfwTbsMLcn@M_ysxuwYH5CM zX=!Uu>}Ip!za(4fA-~1oMk)>>q#RW$j7x-}uDT)YSaK z!u%9rb!L{C-Nxcbe^*Om!=-blPM$b<>OB71+tu9K$4lcwV-u6(qr;PQHyqr(N5s8* z@9x&h;^OSc;DGkXb4zEuoqgj*f6pLd8XlRNnI4;%8k;~T%5Pz14G&#k zU**l0WqoaYY#0#4gf9L(WoLU!OIt_twQCJmt~R$fUv2E_?d=`t?`&;j+J@A+cuBjZ zxsl1hHA;i-USIp>HS6K&nK541-rAD7y~m$C-`m~3b?4UF{8)ci^OgFB*3O>Z!J!-Y z|G>~dZ)fx6GiNS0H8s?ejZU0Aefn(OmHG?kFE>N}^~?2_{k`1SL(hQ`lJd;#+%)fY zceGPL)}KFf=G-ORu>K3}EMyBTw=f?Wl`r69c_PzTLK7RV?=U;sG?Ad2u|ISxmd`=9#yS28l zx`c{Gr+IfC)lJPUE-f#wZtmXWt)kmo%ag-5CrFgjGt-mPGc!ncd}w%TdU~3VrQh7t z_|1{=k$(ONZ0`+Tn;)J;ucLM;m+m?FCdY?`v*p6XLxOXpr_LUs_Dwb z^DtNso2M~_#%tFaTlu@G{eyf}V4$a?`^Loh(7+8=kw!;GMt#A4ZfSX8er{@VYHD(v z7xiyY8WUMMI+!>P-Wn>ko zzIEjqs=3Fs9ysSdrIJbHpR+s|LPbot8lYnQJ!clY;U3B#k46j@VagM6W3klA2M z8}{4Q+}Kc0yLj#_Kj+S0sBdWL!oEhvr>5bG%>*Azczl9FjW0utj7`kWj19AvHZ{9M z(pg{MzW4O=FTeWY`SWK_K7Rawng09?DU`yWTf283fAabBhj;Hi*xOlKURqhVtu9j# z?(S^ge)#m!?#cq%SzKNwj;*XMO^*(b&CE{m^2Ng9%=qY3R9XB}lHR`Vww89Sd3b^f zVu0^ZU~NN#w42D5uXptK_4eN!!Kny%1B98Gc_P*P5?)7PxUDRmoMQyFE?c@Nx5HGvdaP{(~ix=uHH{g%go0}E;MO=jpc$Uw_i)T-sID5JA z`t>H9*8jKBJ8)xYu)lv$ZzjDD-r(KkT&iW-_g2Y!iSXpn(7$42?i2*!k6jFRoAshAh$ zHGF`L@r@C_DALo>LY(hI=fH*Ek%@`X5i~Y7J}w=6J!FKCjYW)3jE^Z2q^N%mlPUTz zb}YG{{|Jgeacb`JZ4wM%3Mz(g^pOw9z*EyR#>T;}*7lx(-nORZc0!i_f=bhcs>$)O z$@!(l1%6hj>cNY_ObFn{5V4V&($ws%<~76QeFU4Dgp`ari)(8uiwi{Yg{37_s4dND z5ikJpARm+dvC*M^R6RmyU6=#N*!b8@<=)wH?eZn&?e&)~o;h>o!j)?TsP2KGQG9iA zky7iz~gY5#3seLHge#Ob<*X6&qYU}$U>V&|5(?obZw+`WJ2772waetBVe|S2qT3=Zr!7X@`YGQkn3C`Z$y}Nh!o;-d0@ZsM5 zJGbuw4zVG=#T6C~C_$Ket;5`gPpt>J`%K=~E|95t)u4#t#nv=rC^te(=Hjhu?YY zwU>YJ`WvtC{=_Smm#=*9g%`f};tvkJ@#fp_zIWuy6D#P0a4w+PnMtGSp3CA~v(IvbjYbS;hUgw|9285XRQ#Hj{;0N`3F{ zuIU(Y(#RNwaBPr}f*betv^6)kk(b-rx^a#4R*cMaLqmS{C*#m2C#NIJ%`Gm2YL^#Y z?>>0^Xb&;*vcbpkD(v2a2X}AZ+Sz1{WMg}GcWZTSZgFjMduK~+Z$#m~yt0O(pm3e3 z1l=}N`uZvr4$hC&Yrf0NMzpzE;t9^87n>ujy$okmObsOH`l}6%h@!c%xt+iL+%qsL zUo*?wyoc)>xLfOMPO^#SdNd0j#6$jHPB+Edbqd6WD_81BeWy;HK%K{EM~@xjds8P) zF;P5s{vtW$%vo|j3u6t}o7#zX{RHAsGQ$)vFYc}}9lf);y7TlWKmNsk`Q1O^J;%TJ zi~sybKiL^;J@(yy`!9d(*Zu+T;QYPXJ8%E!*Z=W9{WmYacIfSoC;{Jo^^I3we)Z5B zKYZuici%f-ck1}5OU)fES1w=Y>t>g)UTq*@wzW34^$kPy+^TM{M3`9HSXo+HghAT) z@bIXal0@Ftj<@ynlc>jyveR?RYxG;1N0cL^(w4^SmzlAiJagvc@l$6nTx#qZxG^|1 zHaWYrvAerXy4YMJ84-P!)^zjsY}NF<{x3a%gjP@kdbjrZ@t(`l2kDu{^+ozvCfA;jz z!^aP9ZEW4%ySKZuySur4Z*yjDp3vQoG2^6X$zPOi=<(d?6GxAqxp48)wWjM0O>Lb$ zSP*r4_l=PufBvE*Hc-*3ZSU%$NQ*Cn*%6 zx3)6T#W$%!uGC#TbL@i;Kl`I2A{YhEN+ z^XrB47bz?$Z%!OLdi2Qq?;bvU_^sF9dgt)lKjdxscRwIhyvNV`AH2^D@%;HS$9cL3 zFDygVUAlCs?$YJUmsnCD*tf7AcCERigK$eO9v)@7M5dvdMf`-$S^Sl?55D$EYMz>! zbuKWCJC9RS4Bh1Gpe#i#GP&5jjXrMevU>D@RH(*Moe+uO&y-NRmLxSrmDVI{BM6RG$%C>Gzx|1F8xh@Gizm>sB@L8=8}8QCGvjE8AZzS<8Q3~JgE5#8b{-xpY#VG;I+<1x5C!I2hsk zvcr@a<3uEuWWmaRF}9HD>Ocr>?f3!po#~>Zo6A&ad^32E;+()v#WIRf+;mol9Ijls z+Hm=DiE;v>Afl|K;)+6uE%ra8GDh(Tat>$-#h_|yX<{~c@xr;Yr!eIc#Fr}#jjdh% zBa`%{2%4nd$T;{Yfy^H(yTq6WtPnhU`sB&8&%dH9`RO10;a8vi?3X`(c=yS(r}xPO zTcoWO;utfW#g+N#@!09`AK#Aq2ex=8Z9Qg`O~k&lj_Jo>@A?|=B=`|rH{ z?os9#eCzcnwF{s3e#AHEUT2-{W!}|)>BSc*R$lndZ^c`TyfyIKyode$Lx*v<4?kj# zc%D_ddLDx`G$}uF1WAQjwU@PdzQR005^{N|n}1kOi9UeBNARRbEQF7F>W@vH0Z{@j zu|hFzMK^EAT-&^}_weIqpMCM=H^2LfU;d~6%1Z+O?Jxi8um8{g{$Ky|um9$6{_kJ& zO8x)%?|dENul|y6t;L%(yhxDWSRtYO1@F@EGR>d;*?;`gKmC(G{=J`m`T6rlJn-AX zMD(@U$>DzJ>2fs!Sy+{vU|oomcJgHAv{O9!I(hu$sgp-Pe4j>GdHbzHd~5gz-+$qS z@BHR>zW4p#{tdp`@LS(`;rp+?!8+l4M-jxybM(nV*>+4&)cl_GSy}f(496=U&{OsAYPd<6ZBh!x`Kjb0dJ&MQml~oEu z8k4E{8K=DwcE$}jlT$1=tge`%oFh+7%^1d)XND){<|l5j_BS}FnKqMA@rG+mbDZI@ zTy2Y`eW&<%{YBWjbneW#i>%TdV}b3+3BENQ^ZwKJJas0cZ++eQvs^uQ?#!u^$B!O4 z%7eXg=VKYC?jlcMR#n|HrFY&LPRYXyF*pT7an&s>gXJZo!X`rm=)bJ*HWe&_@Yk=3;% zgxthZA9FIYai4QLv&Q7e0HO^X#y8)D8NMCaHM1Dj(9p=@m9+%9dzg$O ztdJWM$}#d|4rGRo>2GAi9a4;gA4K)^$&WO7#o9gGZD^06=Wu(WClxQI1?n)S!hsA08AqJcPdz`iwhvY zHd%>?zf3_%;SvP}i{^-hcDZZU-N{sx7aU@uR5Cz<>ApT}evoRC*(xfIoIZW-;^hY9&5{E(K2;2hRjdafl*m1k6ulI63x*5) z+G2T`nv9^}#3|%SDq_8fVw}kq0hC}8lLLYS;y@U&E|K%RQ5o+eK6S9XhGtL=b;HdO zEC^lb4d^I}JzqbhHpW6+4ANHgSPHx5Cg!cQtFE6~Qc+iMXl=zp1rNlVs16JkPNUR< z%uvsu8P_{hv{a!Z>R4+YX9D=3k(~(*8pG`{T8sw$5QFeV96hbvP{*XvMOcku#8`?) za~Y^u2n%Wh^hTSO%eV*A!H$S0YKqumS=!l-GC3xAx3E%{g(+z8S&SNks2WuO!0=>@ zMdy})baX0kVr-h9q5YW#6! z8coVQH5(#AI^3n~U@8u?Dn!ZHoxk9MeNf`wV&DCy90MqfvJ$AG zSzOoBbz+tljHN_W9_wC1mDjE}(<>rw7hG9a64FCZAvq$Vp*Zgm4kFDdO`1@7TFi1S zC|x7xluW?7qj7|JkxR~CL(qsC4{||`euz-T+8Z)mB7`hggq<1_1d**8H}#O`=9g9} z%<&_f3gc&r%;O`?AK8Q?S^lAg?IJl014Zb^xGw=@67wQ-I|b&kAbv!$)uS*XBZh%e zVN+M=RKTStH<=U?Gw=$^a14?L)DXM65f9awsoCx^^}({yAuv%FdrTg>w0yK=^wZu= z*`f^crpVAHZrNZ3bnUwJ zTll5xR-84Wk9J227%4#4GMrr?3yZK zjbMY3TWF9P`BftZUSfw16Dh$JsBmJiS`*+?z4|6`)||*JeQ=QHLw#L6T_hc{ujRk< zc*(Jg zsNj!8DGlf6DAAA}|1go5)hVlxObjH!Q~sFRF$zaGnijce#ssTfTaXiED9=IfOfSL= z*uoK6rx?a!DHhF*Jar;7VuXB*zJ9O~-~!!nVFcol9STaTPj9uDQXd9YCJWpHj2{LM zl5B7qCCo?=Ab+bbf@*|OX8dL?0wnsd(!yrs96JtC7^g-!GJ)U`OvodjV{Zx_%J|?g z)}ZJSn>LwY4+IvBhDUA)&ZP}gpCvV2bySF=!Jky(mhO->t&q>D;RLVD1jdsP^STRC zhUtii5ToA+(5HY|U?@)Vco;mHkoduvEC=vd8w$`2a04BQ#@eVLDA*GQONvo{8Pa?l zY1*Tia*!J7r-h8>+XA|EyNR3R5{$*8AXsqnz4#U;N= z#?diys|lQ-PGomxWJY(xC9YjH1=v{RQU)+gwWGb6q2ZjUp&?MKM1nJU%CiNUsmcPx z1gDLocV#@xH%D9LDIh;sXG{Oi|VvRR5K6Rf5SWRw`p>jo%3^80l zGd>g{BV&dx7=EPbTDRg?Va(h%1jIbbTSl4iaL9^jl5&me0LMlIL<*;P8LS0jh>JP5 zQ&)lju1M}NsyRJy;W{q(Og~^!uI7}sZ$4&5Si7DwCkc9zFjZ~(qlQ~bs$TVf_ zPFp4yV4s+()h5+Q)+JtX&TC(vR!6iEAn`+$DpU{?znm1hu4v7VQ(2V}7{aU!Yc`@x zRL9B!HhEAeleWdBh$66!Rhn}Z13arMg9z5FxoWqjlQdH_>&)1yL;kck@*|}67NqKjp?qx1`p~*3So0_xSU-*e!~o2KW%#4KIt$DpQG$kYiG5-=A;6^? z)V{;B=Q2}>c-~?TA=)Bm~(*P5mMTLe-M?%scsEQD_P7$7AnsNoY zcud^UiHts&ppIk0%7|$(XVnuaTv{umLpg_$kL=9+OVqds9m zhf)CO!DKX%v(xG{ir|# z8DzUPhO1N+$tQJ~qg7`%R9DPS474E6y|fs^S)9YJ17Mi37DDw-o~IxcO`e4|B-Z9= z6^SAYc@aiD4F9t7QZdfv44M8~vM?p0pfwB`*{RlbQGWEV(v(41f@BBX!Cd%|q113< zG$qny?DHrCp_ikeE^$#`=6%Y+_Lr*jj+ryl|jtB2Tt>mXrh@TYt< zS83(YU&Lps^P07y)Jwi26e_*FYuLdBi#Uoy>Xt|>W|4wUwqaRuhD{r1vDhL=${g$# zEf@t2j{HRRZf&Cpm}5fgs2aNY(3vS?+Ctn77vdhaqzPdQD%+A;Py!M*c0A?0UVk<= zJ546AGD=xsGH?jFrfxxn0fhY&KIPQRXX*|fP2ln&$AwWxg#5Z_K(Zp z+Y!4IT^I^dt@*ChsyaghDNgr^9YzY<;m-1_2WQxjZi^x@h7-9&67C#v+xaO`%GE)= zGYCZ$DkgO7>NI0@PQ|BmLnhHx?Wg5uj>PI?ChFQi2uoXGtP+n&rl#vJ(pK_nN;Tqb zp~|2&Q5)@JQ6rgGL?Vw7!Km@aa!j$wnIhsYLXlEsYW#@i4od(6RS{gG&aiHeirFfp zkh``k&xGbEdLdm9KBisNi_rYO#n>H-THquYH zfO=3ZdbBNsD~l9@u8dd=dgg&=CRppg6rg1-+LT=h1{;kF>B(LwZl=l0p;nV@!fhy= zt0)SJ6eL7KMkzH?FaS~Q#pOKW5NN>{8^8d7K9S2}#tmSDnS#n-PB_;*!^yZFfh_VP zE(CCKt9STN2{~23cx@6J8f6FhCE;l8p-4?#W6zi&Ek0rinlnkH+sLHA!X<(qOb;W% z{;C!_!)p~-IATn6P_CL&JeekpuJHn~SM|bRT ztNCFw5hE3HMDUupgA6@|%ieJX-BqsWE(Cgd&jG9uh5o{4H7A4=(*Z-A9NW^LiVqbl zLXMPTStUEmvA}Qy`bcBc#uS+94%^UgHIO1B!THf_QnhjBvo!IcOeM`-ytLSz(FXJ} zB}`fKs2wgMu30==e{h0EY#}Z7W*4t0GOtCcN3tPddf9^1po2LkS}4|FI3eQ|wPF=& zIMfuqwG3&5prBVZNwU@W?L3fr=v82{qL7lZs5HEp97$P;jJkGEnx>$2<(v{ZLTH$k1_Zmo z7JUJ(98wG#m^PGViBx0yLcFX(rppRtCXThM9;d5}0x?pl26G1uh5E!yAM6BN;?s1( zM&v1CdNHTqkqgGU;4ZX)D6nAbJd>*@nqVYjH%g_rmbZ{?ns!Kw%8}b@QLqqTBv9oB zV~L3dMY?nZO6ws6l!Bt4-D6X_#*Y30UNccCDv421Xj!qrxFU=&5WWz?#e5VGpAf&s zn06M~jWgL+83mzA*IQEk9Ammr?NVCd$;e+4aLl1xi69xfkR76^rc2rhlC#A;&iW(- zqq&6sWivT+tF@_&GD=`3exc?zAVs<$ipeRHBZ?U31msimYeaZ$1I@b$NxBOWz+s>X z6$GDY%E};c8$j&I>^=j5{;myD;e<_U&f0P4RGQO-6>nlA+J|+zwP*52e>%p%T$>21 z1Y1G~s>0b6H|o%&ojD;BNs?|?9eMKxLsXi!@KHKwWu5@5q$gcGy4VX13j$IE#12~1 zH!9*BD0ZJ_M<8*QKuwjiym;Of_;iklQ_9Mipr+J~xzM3%jJNB($TLQCjr!HRok*CW zL}O7@8Co9j%ty*bmk#L~;7ZVq2&@94;nrGl$Wmi=m;+N?G1?1U;+eg{IRbLgn1-NG z*;YFQ=EbzT;LH%gFB|&=U5-#{CRF$_bz6A4#--82chLs`3^0mPh0xN^(2T|vN;2~5 zf6-Cg;>sBbw0NTZ1?JFHAZ8LL4#B7i#^gnTEwWm_<7> zj7d;9xq~x6C?(Ab;gZ#2c{iu6%&iic=_+uA&{Je#)J~KWt!mZ0LL2Vnx7-Y}xD<*) zZE8;0(_}mNt>Sd05eCR~^I$Sl68bk-IME|o=w#Z6 zC+1#J23GY1+gTXFeNf9D1!dm!IMq><9K(VoSS^tQuIv}WN84#dv3za-BHH9_{L@za zJ5{A@gkN@n1j;pBy}qb1g~&F?tHhvRYm1R(!zmZ&7OD)ks$ihWWy5m9R6--D)LI~7 zFuPdHC`O#XeE{Q>X1d1#uf)2Q-JUe6-1{EfSVTAy4 zqxUC7OHZYn@|I#Lgys|q&_Wn?59P>T4AnF=b>yYVREqOn*j}J!lL#?W?>Ht4x3GMr zma0%v90wtO-&C~%H5C#=#VQCsiL0VH(Fq3-VJJG0r=hQiGVz2)d*eRFlJQ95i&cxh zs261hZBP?1Qygp$$OICSxUg*pOMD12DAxbOgd{cz4he<%ruf7WIKwbeeT4PnR*I~VrR!%i+N8_4sVDm)J*SauptbZ0ONowa%a2}r1A^# z1%uUTWpBYW7ipTAb%-@6+O{yU#kDZjG$}y~-Ih=w%CQ+$icKr|Fbb%HLL^YAOn;SD z^_Lu}=P(W^1!`~GDQ$4!54Q!aAK>Fh$b2c z!%_k;v>g;argd;Y+nj4g@kl<5vE95_j#L=n_2I4^s`}i7};X0RyG7K&v?M zFxc{9=tsmfK?}i8*sc52UWmqMRppI<9z-MgMBuZLfGB*A*eXbG$6+mM6-me4=$foc zi|iI5Ku0m109L7?Ml6gY_Vl$PY$cI`#hFs$X_09Q$~ffgE-=BNE#=0oI7{Bd=Pg<& zF4b9NomciRg+Zr7r$Uun04p0X_zO$i33PE9M`Gb>m|2J|)RW_(N!lTya`OtHgw?Dn zPRfQ_qS&(!3sl*~m|^x+RL=UIYT%xF&H5t=*-NC5>1c6ku2C36}Y zSHr0ggc9(hHAG8rsUGB*Eh473i#$>mDWA$ZKpHle79vrSOsimUA@!b`Pjn!M=%7+| zWgx{_WKtP6T&yD&@Qk#X)S+e#12337oZR*?w5A`_Q8Sy$08glc(H$W~kWPdTQdgA9R| z7EcPpcw@xV&$D5*MTg>p^5F!+|tq zSKL4%Xn-pqOBb+sr8;xeueS6ru2yPHl|;9=q*2=nDA4F@v|unugtXkFmBJq=85UHf zc(QltUP-#hLg?`u2f>LLlcYFu6EZ6h(Y1(ZVoZS-f)aLaBQRvYn$&~-)LF5gghOB9 z0IeEON=W)v$O0egOoZhi1|;8VwvZWJff#++U`Q;5XRZboq2w6pin(Mg zNyhWP{c$nF_n5Q$Hjp-4PRMA18z7NSl`hBQL|!Dh%QUAi@j(BL4&J( z9~5(itLCvuc<2CNj$xEZ$$^R^h2zz*K{3!V_=>S1(x5U~4Vprz!YGa5vXlr?)Roxn z5oF6NzfoLemWvgVl8NC~jY$U|TOl@Bs`v_-izkFFvmqqKYoQHRp=^u=o%dls@vgW%65RkG^4_Bn!!HgP^lV8?tE6`3(z$v)luxdS+(ex z)W+3s$um3InRJvV6+vm^NRiUluB4VO?YG(l;Acf^5~dJ|hAu`t1Tv`~5m<0vYPM7AUq z%B#>5DoIC8R-zlZG`q{QpsN7~^eOvs`9KVd3v5D_((lMn@V2w@1mp`UpLSiVE877KFHw z7AQGL0n!apYCRnp8c;DFhJwN(@=n#$y`5>bU}kX`c{NmNI*E30NDQk6=G_CPByClX zTBoF&z8n`4$jpN@5-HtF4CoTQ-<7 zsErC#p4CP>%##?tZ=P`!x42t|2cc58-{j2UZtNYOLV49I2e2(*VwaNMrz1Lr7(C+D z^Bl!t0TZ-{DG^pT5@z(;2j-AklFsqP0F&3eA2%E?zS0XU$x^kKqspxVx3^=w*As-a z_!A5!VFAw``z-~;2reZyw~VW`xEccria?&n0Z>}wH*nd#Kq{7%$ zy7dGYNo5*Nx#Z3ccCCKB6hplE|7kTyg`R!p_jyi=gMo@fT+S8%1(A@;P8y}+AZiJ! zjfmcP$~NwJDfO5X1dGux?gWM!cn0|uy1<`^VsNq$gKES(CVD2KyeYvT+hXLT2R3z5xR|5qPIlQVxZ7+cv2q6 z6&?HJ$R{nj{tB!-4R{r#-0yQ(9dSLeCdS}gwrP3AgMB(U@;5K#El!e#%G8s`LPG^4 zsNENzb5mOd&Tc}@-yFm?sf%sMr^c8EwO&bIjCH(V`OTv^jZ0PcfD!rT_jcet^o$|{~Y|ANkyjt}O1df!Y1QgKXidRKhP}FWGso5_;1)^$P+1n|Q zmGc(Ksk+F>6C+HHDDZo85g`5 zEu@jX0zpDdczMBZ&MO^SZB&kx%KR54lwSO>TW +// Mesh_bits: which meshes to affect. +// Damage: +// * Positive values - deal damage, enable body part explosions. +// * Negative values - deal damage, disable body part explosions. +// * Zero - don't deal any damage, disable body part explosions. int32_t Effect_ExplodingDeath( int16_t item_num, int32_t mesh_bits, int16_t damage); diff --git a/src/game/level.c b/src/game/level.c index 703168139..39e1de4cb 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -12,6 +12,7 @@ #include "game/lara/common.h" #include "game/lot.h" #include "game/music.h" +#include "game/objects/creatures/mutant.h" #include "game/objects/creatures/pierre.h" #include "game/objects/setup.h" #include "game/output.h" @@ -919,6 +920,11 @@ static void M_CompleteSetup(int32_t level_num) } } + // We inject explosions sprites and sounds, although in the original game, + // some levels lack them, resulting in no audio or visual effects when + // killing mutants. This is to maintain that feature. + Mutant_ToggleExplosions(g_Objects[O_EXPLOSION_1].loaded); + Inject_AllInjections(&m_LevelInfo); M_MarkWaterEdgeVertices(); diff --git a/src/game/objects/creatures/mutant.c b/src/game/objects/creatures/mutant.c index 40aab6ffa..95cc152e9 100644 --- a/src/game/objects/creatures/mutant.c +++ b/src/game/objects/creatures/mutant.c @@ -56,10 +56,16 @@ enum FLYER_ANIM { FLYER_FLY = 13, }; +static bool m_EnableExplosions = true; static BITE_INFO m_WarriorBite = { -27, 98, 0, 10 }; static BITE_INFO m_WarriorRocket = { 51, 213, 0, 14 }; static BITE_INFO m_WarriorShard = { -35, 269, 0, 9 }; +void Mutant_ToggleExplosions(bool enable) +{ + m_EnableExplosions = enable; +} + void Mutant_Setup(OBJECT_INFO *obj) { if (!obj->loaded) { @@ -117,7 +123,9 @@ void Mutant_FlyerControl(int16_t item_num) int16_t angle = 0; if (item->hit_points <= 0) { - if (Effect_ExplodingDeath(item_num, -1, FLYER_PART_DAMAGE)) { + if (Effect_ExplodingDeath( + item_num, -1, + m_EnableExplosions ? FLYER_SMARTNESS : -FLYER_PART_DAMAGE)) { Sound_Effect(SFX_ATLANTEAN_DEATH, &item->pos, SPM_NORMAL); LOT_DisableBaddieAI(item_num); Item_Kill(item_num); diff --git a/src/game/objects/creatures/mutant.h b/src/game/objects/creatures/mutant.h index 9ec69a557..19f14e03c 100644 --- a/src/game/objects/creatures/mutant.h +++ b/src/game/objects/creatures/mutant.h @@ -6,6 +6,7 @@ void Mutant_Setup(OBJECT_INFO *obj); void Mutant_Setup2(OBJECT_INFO *obj); void Mutant_Setup3(OBJECT_INFO *obj); +void Mutant_ToggleExplosions(bool enable); void Mutant_FlyerControl(int16_t item_num); void Mutant_Initialise2(int16_t item_num); diff --git a/src/game/objects/effects/body_part.c b/src/game/objects/effects/body_part.c index 98b924786..fc4596510 100644 --- a/src/game/objects/effects/body_part.c +++ b/src/game/objects/effects/body_part.c @@ -39,7 +39,7 @@ void BodyPart_Control(int16_t fx_num) const int32_t height = Room_GetHeight(sector, fx->pos.x, fx->pos.y, fx->pos.z); if (fx->pos.y >= height) { - if (fx->counter) { + if (fx->counter > 0) { fx->speed = 0; fx->frame_num = 0; fx->counter = 0; @@ -51,10 +51,10 @@ void BodyPart_Control(int16_t fx_num) return; } - if (Lara_IsNearItem(&fx->pos, fx->counter * 2)) { - Lara_TakeDamage(fx->counter, true); + if (Lara_IsNearItem(&fx->pos, ABS(fx->counter) * 2)) { + Lara_TakeDamage(ABS(fx->counter), true); - if (fx->counter) { + if (fx->counter > 0) { fx->speed = 0; fx->frame_num = 0; fx->counter = 0; From 452ebadbc11bcbbc83929d1e5cad5205ea4a96c7 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sun, 22 Sep 2024 19:40:28 +0200 Subject: [PATCH 7/7] inject: tidy explosion sounds --- data/ship/data/injections/lara_animations.bin | Bin 260072 -> 220046 bytes src/global/types.h | 203 +----------------- subprojects/libtrx | 2 +- 3 files changed, 2 insertions(+), 203 deletions(-) diff --git a/data/ship/data/injections/lara_animations.bin b/data/ship/data/injections/lara_animations.bin index ac5f19d3310af74ebf54f8bf9efb2809eae14245..ac69d7b19e1663ec85a0c44ac128892d6f19f348 100644 GIT binary patch delta 60 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 c13KeV-pQ^;C(#R9*e@32b->@Xf^={F1)>6IeE #include #include +#include #include #include @@ -87,208 +88,6 @@ typedef enum GAME_STATIC_ID { STATIC_NUMBER_OF = 50, } GAME_STATIC_ID; -typedef enum SOUND_EFFECT_ID { - SFX_LARA_FEET = 0, - SFX_LARA_CLIMB2 = 1, - SFX_LARA_NO = 2, - SFX_LARA_SLIPPING = 3, - SFX_LARA_LAND = 4, - SFX_LARA_CLIMB1 = 5, - SFX_LARA_DRAW = 6, - SFX_LARA_HOLSTER = 7, - SFX_LARA_FIRE = 8, - SFX_LARA_RELOAD = 9, - SFX_LARA_RICOCHET = 10, - SFX_BEAR_GROWL = 11, - SFX_BEAR_FEET = 12, - SFX_BEAR_ATTACK = 13, - SFX_BEAR_SNARL = 14, - SFX_LARA_WET_FEET = 15, - SFX_BEAR_HURT = 16, - SFX_BEAR_DEATH = 18, - SFX_WOLF_JUMP = 19, - SFX_WOLF_HURT = 20, - SFX_WOLF_DEATH = 22, - SFX_WOLF_HOWL = 24, - SFX_WOLF_ATTACK = 25, - SFX_LARA_CLIMB3 = 26, - SFX_LARA_BODYSL = 27, - SFX_LARA_SHIMMY2 = 28, - SFX_LARA_JUMP = 29, - SFX_LARA_FALL = 30, - SFX_LARA_INJURY = 31, - SFX_LARA_ROLL = 32, - SFX_LARA_SPLASH = 33, - SFX_LARA_GETOUT = 34, - SFX_LARA_SWIM = 35, - SFX_LARA_BREATH = 36, - SFX_LARA_BUBBLES = 37, - SFX_LARA_SWITCH = 38, - SFX_LARA_KEY = 39, - SFX_LARA_OBJECT = 40, - SFX_LARA_GENERAL_DEATH = 41, - SFX_LARA_KNEES_DEATH = 42, - SFX_LARA_UZI_FIRE = 43, - SFX_LARA_MAGNUMS = 44, - SFX_LARA_SHOTGUN = 45, - SFX_LARA_BLOCK_PUSH1 = 46, - SFX_LARA_BLOCK_PUSH2 = 47, - SFX_LARA_EMPTY = 48, - SFX_LARA_BULLETHIT = 50, - SFX_LARA_BLKPULL = 51, - SFX_LARA_FLOATING = 52, - SFX_LARA_FALLDETH = 53, - SFX_LARA_GRABHAND = 54, - SFX_LARA_GRABBODY = 55, - SFX_LARA_GRABFEET = 56, - SFX_LARA_SWITCHUP = 57, - SFX_BAT_SQK = 58, - SFX_BAT_FLAP = 59, - SFX_UNDERWATER = 60, - SFX_UNDERWATER_SWITCH = 61, - SFX_BLOCK_SOUND = 63, - SFX_DOOR = 64, - SFX_PENDULUM_BLADES = 65, - SFX_ROCK_FALL_CRUMBLE = 66, - SFX_ROCK_FALL_FALL = 67, - SFX_ROCK_FALL_LAND = 68, - SFX_T_REX_DEATH = 69, - SFX_T_REX_FOOTSTOMP = 70, - SFX_T_REX_ROAR = 71, - SFX_T_REX_ATTACK = 72, - SFX_RAPTOR_ROAR = 73, - SFX_RAPTOR_ATTACK = 74, - SFX_RAPTOR_FEET = 75, - SFX_MUMMY_GROWL = 76, - SFX_LARSON_FIRE = 77, - SFX_LARSON_RICOCHET = 78, - SFX_WATERFALL_LOOP = 79, - SFX_WATER_LOOP = 80, - SFX_WATERFALL_BIG = 81, - SFX_CHAINDOOR_UP = 82, - SFX_CHAINDOOR_DOWN = 83, - SFX_COGS = 84, - SFX_LION_HURT = 85, - SFX_LION_ATTACK = 86, - SFX_LION_ROAR = 87, - SFX_LION_DEATH = 88, - SFX_GORILLA_FEET = 89, - SFX_GORILLA_PANT = 90, - SFX_GORILLA_DEATH = 91, - SFX_CROC_FEET = 92, - SFX_CROC_ATTACK = 93, - SFX_RAT_FEET = 94, - SFX_RAT_CHIRP = 95, - SFX_RAT_ATTACK = 96, - SFX_RAT_DEATH = 97, - SFX_THUNDER = 98, - SFX_EXPLOSION = 99, - SFX_GORILLA_GRUNT = 100, - SFX_GORILLA_GRUNTS = 101, - SFX_CROC_DEATH = 102, - SFX_DAMOCLES_SWORD = 103, - SFX_ATLANTEAN_EXPLODE = 104, - SFX_MENU_ROTATE = 108, - SFX_MENU_CHOOSE = 109, - SFX_MENU_GAMEBOY = 110, - SFX_MENU_SPININ = 111, - SFX_MENU_SPINOUT = 112, - SFX_MENU_COMPASS = 113, - SFX_MENU_GUNS = 114, - SFX_MENU_PASSPORT = 115, - SFX_MENU_MEDI = 116, - SFX_RAISINGBLOCK_FX = 117, - SFX_SAND_FX = 118, - SFX_STAIRS2SLOPE_FX = 119, - SFX_ATLANTEAN_WALK = 120, - SFX_ATLANTEAN_ATTACK = 121, - SFX_ATLANTEAN_JUMP_ATTACK = 122, - SFX_ATLANTEAN_NEEDLE = 123, - SFX_ATLANTEAN_BALL = 124, - SFX_ATLANTEAN_WINGS = 125, - SFX_ATLANTEAN_RUN = 126, - SFX_SLAMDOOR_CLOSE = 127, - SFX_SLAMDOOR_OPEN = 128, - SFX_SKATEBOARD_MOVE = 129, - SFX_SKATEBOARD_STOP = 130, - SFX_SKATEBOARD_SHOOT = 131, - SFX_SKATEBOARD_HIT = 132, - SFX_SKATEBOARD_START = 133, - SFX_SKATEBOARD_DEATH = 134, - SFX_SKATEBOARD_HIT_GROUND = 135, - SFX_TORSO_HIT_GROUND = 136, - SFX_TORSO_ATTACK1 = 137, - SFX_TORSO_ATTACK2 = 138, - SFX_TORSO_DEATH = 139, - SFX_TORSO_ARM_SWING = 140, - SFX_TORSO_MOVE = 141, - SFX_TORSO_HIT = 142, - SFX_CENTAUR_FEET = 143, - SFX_CENTAUR_ROAR = 144, - SFX_LARA_SPIKE_DEATH = 145, - SFX_LARA_DEATH3 = 146, - SFX_ROLLING_BALL = 147, - SFX_LAVA_LOOP = 148, - SFX_LAVA_FOUNTAIN = 149, - SFX_FIRE = 150, - SFX_DARTS = 151, - SFX_METAL_DOOR_CLOSE = 152, - SFX_METAL_DOOR_OPEN = 153, - SFX_ALTAR_LOOP = 154, - SFX_POWERUP_FX = 155, - SFX_COWBOY_DEATH = 156, - SFX_BLACK_GOON_DEATH = 157, - SFX_LARSON_DEATH = 158, - SFX_PIERRE_DEATH = 159, - SFX_NATLA_DEATH = 160, - SFX_TRAPDOOR_OPEN = 161, - SFX_TRAPDOOR_CLOSE = 162, - SFX_ATLANTEAN_EGG_LOOP = 163, - SFX_ATLANTEAN_EGG_HATCH = 164, - SFX_DRILL_ENGINE_START = 165, - SFX_DRILL_ENGINE_LOOP = 166, - SFX_CONVEYOR_BELT = 167, - SFX_HUT_LOWERED = 168, - SFX_HUT_HIT_GROUND = 169, - SFX_EXPLOSION_FX = 170, - SFX_ATLANTEAN_DEATH = 171, - SFX_CHAINBLOCK_FX = 172, - SFX_SECRET = 173, - SFX_GYM_HINT_01 = 174, - SFX_GYM_HINT_02 = 175, - SFX_GYM_HINT_03 = 176, - SFX_GYM_HINT_04 = 177, - SFX_GYM_HINT_05 = 178, - SFX_GYM_HINT_06 = 179, - SFX_GYM_HINT_07 = 180, - SFX_GYM_HINT_08 = 181, - SFX_GYM_HINT_09 = 182, - SFX_GYM_HINT_10 = 183, - SFX_GYM_HINT_11 = 184, - SFX_GYM_HINT_12 = 185, - SFX_GYM_HINT_13 = 186, - SFX_GYM_HINT_14 = 187, - SFX_GYM_HINT_15 = 188, - SFX_GYM_HINT_16 = 189, - SFX_GYM_HINT_17 = 190, - SFX_GYM_HINT_18 = 191, - SFX_GYM_HINT_19 = 192, - SFX_GYM_HINT_20 = 193, - SFX_GYM_HINT_21 = 194, - SFX_GYM_HINT_22 = 195, - SFX_GYM_HINT_23 = 196, - SFX_GYM_HINT_24 = 197, - SFX_GYM_HINT_25 = 198, - SFX_BALDY_SPEECH = 199, - SFX_COWBOY_SPEECH = 200, - SFX_LARSON_SPEECH = 201, - SFX_NATLA_SPEECH = 202, - SFX_PIERRE_SPEECH = 203, - SFX_SKATEKID_SPEECH = 204, - SFX_LARA_SETUP = 205, - SFX_EXPLOSION_CHEAT = 206, -} SOUND_EFFECT_ID; - typedef enum MUSIC_TRACK_ID { MX_INACTIVE = -1, MX_UNUSED_0 = 0, diff --git a/subprojects/libtrx b/subprojects/libtrx index c984f369d..17e2ce904 160000 --- a/subprojects/libtrx +++ b/subprojects/libtrx @@ -1 +1 @@ -Subproject commit c984f369d2e7903ec0cd4c5fa5724aeaa8d571b2 +Subproject commit 17e2ce9042401bbc04baf6fd2e02b4c752c0ea1f