diff --git a/include/libtrx/config/file.h b/include/libtrx/config/file.h index 2ee98ed..e900273 100644 --- a/include/libtrx/config/file.h +++ b/include/libtrx/config/file.h @@ -1,6 +1,6 @@ #pragma once -#include "../enum_str.h" +#include "../enum_map.h" #include "../json.h" #include "./option.h" @@ -17,7 +17,6 @@ void ConfigFile_DumpOptions( int ConfigFile_ReadEnum( JSON_OBJECT *obj, const char *name, int default_value, - const ENUM_STRING_MAP *enum_map); + const char *enum_name); void ConfigFile_WriteEnum( - JSON_OBJECT *obj, const char *name, int value, - const ENUM_STRING_MAP *enum_map); + JSON_OBJECT *obj, const char *name, int value, const char *enum_name); diff --git a/include/libtrx/config/map.h b/include/libtrx/config/map.h index d48b55d..4444c52 100644 --- a/include/libtrx/config/map.h +++ b/include/libtrx/config/map.h @@ -1,4 +1,4 @@ -#include "../enum_str.h" +#include "../enum_map.h" #include "../utils.h" #include "./option.h" @@ -39,4 +39,4 @@ .type = COT_ENUM, \ .target = &parent.target_, \ .default_value = &(int32_t) { default_value_ }, \ - .param = ENUM_STRING_MAP(enum_map) }, + .param = ENUM_MAP_NAME(enum_map) }, diff --git a/include/libtrx/enum_map.h b/include/libtrx/enum_map.h new file mode 100644 index 0000000..d0fecff --- /dev/null +++ b/include/libtrx/enum_map.h @@ -0,0 +1,25 @@ +#include + +#define ENUM_MAP_DEFINE(enum_name, enum_value, str_value) \ + EnumMap_Define(ENUM_MAP_NAME(enum_name), enum_value, str_value); +#define ENUM_MAP_DEFINE_SELF(enum_name, enum_value) \ + EnumMap_Define(ENUM_MAP_NAME(enum_name), enum_value, #enum_value); + +#define ENUM_MAP_GET(enum_name, str_value, default_value) \ + EnumMap_Get(ENUM_MAP_NAME(enum_name), str_value, default_value) + +#define ENUM_MAP_TO_STRING(enum_name, enum_value) \ + EnumMap_ToString(ENUM_MAP_NAME(enum_name), enum_value) + +#define ENUM_MAP_NAME(enum_name) #enum_name + +// The function to put the EnumMap_Define calls in +extern void EnumMap_Init(void); + +void EnumMap_Shutdown(void); + +void EnumMap_Define( + const char *enum_name, int32_t enum_value, const char *str_value); +int32_t EnumMap_Get( + const char *enum_name, const char *str_value, int32_t default_value); +const char *EnumMap_ToString(const char *enum_name, int32_t enum_value); diff --git a/include/libtrx/enum_str.h b/include/libtrx/enum_str.h deleted file mode 100644 index 221c854..0000000 --- a/include/libtrx/enum_str.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -typedef struct { - const char *text; - int value; -} ENUM_STRING_MAP; - -#define ENUM_SELF(type) { #type, type } -#define ENUM_STRING_MAP(type) g_EnumStr_##type - -#ifdef ENUM_STR_IMPL - #define DECLARE_ENUM_STRING_MAP(type, ...) \ - const ENUM_STRING_MAP g_EnumStr_##type[] = { __VA_ARGS__ { NULL, -1 } }; -#else - #define DECLARE_ENUM_STRING_MAP(type, ...) \ - extern const ENUM_STRING_MAP g_EnumStr_##type[]; -#endif - -#define ENUM_STRING_GET(type, key, default_value) \ - EnumStr_GetImpl(ENUM_STRING_MAP(type), (key), (default_value)) - -int EnumStr_GetImpl( - const ENUM_STRING_MAP *enum_map, const char *key, int default_value); diff --git a/include/libtrx/game/objects/ids.def b/include/libtrx/game/objects/ids.def new file mode 100644 index 0000000..0d9a7fb --- /dev/null +++ b/include/libtrx/game/objects/ids.def @@ -0,0 +1,5 @@ +#if TR_VERSION == 1 + #include "./ids_tr1.def" +#elif TR_VERSION == 2 + #include "./ids_tr2.def" +#endif diff --git a/include/libtrx/game/objects/ids.h b/include/libtrx/game/objects/ids.h index 4f0c238..1e73690 100644 --- a/include/libtrx/game/objects/ids.h +++ b/include/libtrx/game/objects/ids.h @@ -1,467 +1,8 @@ #pragma once typedef enum { -#if TR_VERSION == 1 NO_OBJECT = -1, - O_LARA = 0, - O_PISTOL_ANIM = 1, - O_SHOTGUN_ANIM = 2, - O_MAGNUM_ANIM = 3, - O_UZI_ANIM = 4, - O_LARA_EXTRA = 5, - O_BACON_LARA = 6, - O_WOLF = 7, - O_BEAR = 8, - O_BAT = 9, - O_CROCODILE = 10, - O_ALLIGATOR = 11, - O_LION = 12, - O_LIONESS = 13, - O_PUMA = 14, - O_APE = 15, - O_RAT = 16, - O_VOLE = 17, - O_TREX = 18, - O_RAPTOR = 19, - O_WARRIOR_1 = 20, // flying mutant - O_WARRIOR_2 = 21, - O_WARRIOR_3 = 22, - O_CENTAUR = 23, - O_MUMMY = 24, - O_DINO_WARRIOR = 25, - O_FISH = 26, - O_LARSON = 27, - O_PIERRE = 28, - O_SKATEBOARD = 29, - O_SKATEKID = 30, - O_COWBOY = 31, - O_BALDY = 32, - O_NATLA = 33, - O_TORSO = 34, // a.k.a. Abortion, Adam or Evil Natla - O_FALLING_BLOCK = 35, - O_PENDULUM = 36, - O_SPIKES = 37, - O_ROLLING_BALL = 38, - O_DARTS = 39, - O_DART_EMITTER = 40, - O_DRAWBRIDGE = 41, - O_TEETH_TRAP = 42, - O_DAMOCLES_SWORD = 43, - O_THORS_HANDLE = 44, - O_THORS_HEAD = 45, - O_LIGHTNING_EMITTER = 46, - O_MOVING_BAR = 47, - O_MOVABLE_BLOCK_1 = 48, - O_MOVABLE_BLOCK_2 = 49, - O_MOVABLE_BLOCK_3 = 50, - O_MOVABLE_BLOCK_4 = 51, - O_SLIDING_PILLAR = 52, - O_FALLING_CEILING_1 = 53, - O_FALLING_CEILING_2 = 54, - O_SWITCH_TYPE_1 = 55, - O_SWITCH_TYPE_2 = 56, - O_DOOR_TYPE_1 = 57, - O_DOOR_TYPE_2 = 58, - O_DOOR_TYPE_3 = 59, - O_DOOR_TYPE_4 = 60, - O_DOOR_TYPE_5 = 61, - O_DOOR_TYPE_6 = 62, - O_DOOR_TYPE_7 = 63, - O_DOOR_TYPE_8 = 64, - O_TRAPDOOR_1 = 65, - O_TRAPDOOR_2 = 66, - O_BIGTRAPDOOR = 67, - O_BRIDGE_FLAT = 68, - O_BRIDGE_TILT_1 = 69, - O_BRIDGE_TILT_2 = 70, - O_PASSPORT_OPTION = 71, - O_MAP_OPTION = 72, - O_PHOTO_OPTION = 73, - O_COG_1 = 74, - O_COG_2 = 75, - O_COG_3 = 76, - O_PLAYER_1 = 77, - O_PLAYER_2 = 78, - O_PLAYER_3 = 79, - O_PLAYER_4 = 80, - O_PASSPORT_CLOSED = 81, - O_MAP_CLOSED = 82, - O_SAVEGAME_ITEM = 83, - O_PISTOL_ITEM = 84, - O_SHOTGUN_ITEM = 85, - O_MAGNUM_ITEM = 86, - O_UZI_ITEM = 87, - O_PISTOL_AMMO_ITEM = 88, - O_SG_AMMO_ITEM = 89, - O_MAG_AMMO_ITEM = 90, - O_UZI_AMMO_ITEM = 91, - O_EXPLOSIVE_ITEM = 92, - O_MEDI_ITEM = 93, - O_BIGMEDI_ITEM = 94, - O_DETAIL_OPTION = 95, - O_SOUND_OPTION = 96, - O_CONTROL_OPTION = 97, - O_GAMMA_OPTION = 98, - O_PISTOL_OPTION = 99, - O_SHOTGUN_OPTION = 100, - O_MAGNUM_OPTION = 101, - O_UZI_OPTION = 102, - O_PISTOL_AMMO_OPTION = 103, - O_SG_AMMO_OPTION = 104, - O_MAG_AMMO_OPTION = 105, - O_UZI_AMMO_OPTION = 106, - O_EXPLOSIVE_OPTION = 107, - O_MEDI_OPTION = 108, - O_BIGMEDI_OPTION = 109, - O_PUZZLE_ITEM_1 = 110, - O_PUZZLE_ITEM_2 = 111, - O_PUZZLE_ITEM_3 = 112, - O_PUZZLE_ITEM_4 = 113, - O_PUZZLE_OPTION_1 = 114, - O_PUZZLE_OPTION_2 = 115, - O_PUZZLE_OPTION_3 = 116, - O_PUZZLE_OPTION_4 = 117, - O_PUZZLE_HOLE_1 = 118, - O_PUZZLE_HOLE_2 = 119, - O_PUZZLE_HOLE_3 = 120, - O_PUZZLE_HOLE_4 = 121, - O_PUZZLE_DONE_1 = 122, - O_PUZZLE_DONE_2 = 123, - O_PUZZLE_DONE_3 = 124, - O_PUZZLE_DONE_4 = 125, - O_LEADBAR_ITEM = 126, - O_LEADBAR_OPTION = 127, - O_MIDAS_TOUCH = 128, - O_KEY_ITEM_1 = 129, - O_KEY_ITEM_2 = 130, - O_KEY_ITEM_3 = 131, - O_KEY_ITEM_4 = 132, - O_KEY_OPTION_1 = 133, - O_KEY_OPTION_2 = 134, - O_KEY_OPTION_3 = 135, - O_KEY_OPTION_4 = 136, - O_KEY_HOLE_1 = 137, - O_KEY_HOLE_2 = 138, - O_KEY_HOLE_3 = 139, - O_KEY_HOLE_4 = 140, - O_PICKUP_ITEM_1 = 141, - O_PICKUP_ITEM_2 = 142, - O_SCION_ITEM_1 = 143, - O_SCION_ITEM_2 = 144, - O_SCION_ITEM_3 = 145, - O_SCION_ITEM_4 = 146, - O_SCION_HOLDER = 147, - O_PICKUP_OPTION_1 = 148, - O_PICKUP_OPTION_2 = 149, - O_SCION_OPTION = 150, - O_EXPLOSION_1 = 151, - O_EXPLOSION_2 = 152, - O_SPLASH_1 = 153, - O_SPLASH_2 = 154, - O_BUBBLES_1 = 155, - O_BUBBLES_2 = 156, - O_BUBBLE_EMITTER = 157, - O_BLOOD_1 = 158, - O_BLOOD_2 = 159, - O_DART_EFFECT = 160, - O_STATUE = 161, - O_PORTACABIN = 162, - O_PODS = 163, - O_RICOCHET_1 = 164, - O_TWINKLE = 165, - O_GUN_FLASH = 166, - O_DUST = 167, - O_BODY_PART = 168, - O_CAMERA_TARGET = 169, - O_WATERFALL = 170, - O_MISSILE_1 = 171, - O_MISSILE_2 = 172, - O_MISSILE_3 = 173, - O_MISSILE_4 = 174, - O_MISSILE_5 = 175, - O_EMBER = 176, - O_EMBER_EMITTER = 177, - O_FLAME = 178, - O_FLAME_EMITTER = 179, - O_LAVA_WEDGE = 180, - O_BIG_POD = 181, - O_BOAT = 182, - O_EARTHQUAKE = 183, - O_SKYBOX = 184, - O_TEMP_6 = 185, - O_TEMP_7 = 186, - O_TEMP_8 = 187, - O_TEMP_9 = 188, - O_TEMP_10 = 189, - O_HAIR = O_TEMP_10, - O_ALPHABET = 190, -#elif TR_VERSION == 2 - O_NONE = -1, - O_LARA = 0, - O_LARA_PISTOLS = 1, - O_LARA_HAIR = 2, - O_LARA_SHOTGUN = 3, - O_LARA_MAGNUMS = 4, - O_LARA_UZIS = 5, - O_LARA_M16 = 6, - O_LARA_GRENADE = 7, - O_LARA_HARPOON = 8, - O_LARA_FLARE = 9, - O_LARA_SKIDOO = 10, - O_LARA_BOAT = 11, - O_LARA_EXTRA = 12, - O_SKIDOO_FAST = 13, - O_BOAT = 14, - O_DOG = 15, - O_CULT_1 = 16, - O_CULT_1A = 17, - O_CULT_1B = 18, - O_CULT_2 = 19, - O_CULT_3 = 20, - O_MOUSE = 21, - O_DRAGON_FRONT = 22, - O_DRAGON_BACK = 23, - O_GONDOLA = 24, - O_SHARK = 25, - O_EEL = 26, - O_BIG_EEL = 27, - O_BARRACUDA = 28, - O_DIVER = 29, - O_WORKER_1 = 30, - O_WORKER_2 = 31, - O_WORKER_3 = 32, - O_WORKER_4 = 33, - O_WORKER_5 = 34, - O_JELLY = 35, - O_SPIDER = 36, - O_BIG_SPIDER = 37, - O_CROW = 38, - O_TIGER = 39, - O_BARTOLI = 40, - O_XIAN_SPEARMAN = 41, - O_XIAN_SPEARMAN_STATUE = 42, - O_XIAN_KNIGHT = 43, - O_XIAN_KNIGHT_STATUE = 44, - O_YETI = 45, - O_GIANT_YETI = 46, - O_EAGLE = 47, - O_BANDIT_1 = 48, - O_BANDIT_2 = 49, - O_BANDIT_2B = 50, - O_SKIDOO_ARMED = 51, - O_SKIDMAN = 52, - O_MONK_1 = 53, - O_MONK_2 = 54, - O_FALLING_BLOCK_1 = 55, - O_FALLING_BLOCK_2 = 56, - O_FALLING_BLOCK_3 = 57, - O_PENDULUM_1 = 58, - O_SPIKES = 59, - O_ROLLING_BALL_1 = 60, - O_DARTS = 61, - O_DART_EMITTER = 62, - O_DRAWBRIDGE = 63, - O_TEETH_TRAP = 64, - O_LIFT = 65, - O_GENERAL = 66, - O_MOVABLE_BLOCK_1 = 67, - O_MOVABLE_BLOCK_2 = 68, - O_MOVABLE_BLOCK_3 = 69, - O_MOVABLE_BLOCK_4 = 70, - O_BIG_BOWL = 71, - O_WINDOW_1 = 72, - O_WINDOW_2 = 73, - O_WINDOW_3 = 74, - O_WINDOW_4 = 75, - O_PROPELLER_1 = 76, - O_POWER_SAW = 77, - O_HOOK = 78, - O_FALLING_CEILING = 79, - O_SPINNING_BLADE = 80, - O_BLADE = 81, - O_KILLER_STATUE = 82, - O_ROLLING_BALL_2 = 83, - O_ICICLE = 84, - O_SPIKE_WALL = 85, - O_SPRING_BOARD = 86, - O_CEILING_SPIKES = 87, - O_BELL = 88, - O_WATER_SPRITE = 89, - O_SNOW_SPRITE = 90, - O_SKIDOO_LARA = 91, - O_SWITCH_TYPE_1 = 92, - O_SWITCH_TYPE_2 = 93, - O_PROPELLER_2 = 94, - O_PROPELLER_3 = 95, - O_PENDULUM_2 = 96, - O_MESH_SWAP_1 = 97, - O_MESH_SWAP_2 = 98, - O_LARA_SWAP = 99, - O_TEXT_BOX = 100, - O_ROLLING_BALL_3 = 101, - O_DEATH_SLIDE = 102, - O_SWITCH_TYPE_3 = 103, - O_SWITCH_TYPE_4 = 104, - O_SWITCH_TYPE_5 = 105, - O_DOOR_TYPE_1 = 106, - O_DOOR_TYPE_2 = 107, - O_DOOR_TYPE_3 = 108, - O_DOOR_TYPE_4 = 109, - O_DOOR_TYPE_5 = 110, - O_DOOR_TYPE_6 = 111, - O_DOOR_TYPE_7 = 112, - O_DOOR_TYPE_8 = 113, - O_TRAPDOOR_TYPE_1 = 114, - O_TRAPDOOR_TYPE_2 = 115, - O_TRAPDOOR_TYPE_3 = 116, - O_BRIDGE_FLAT = 117, - O_BRIDGE_TILT_1 = 118, - O_BRIDGE_TILT_2 = 119, - O_PASSPORT_OPTION = 120, - O_COMPASS_OPTION = 121, - O_PHOTO_OPTION = 122, - O_PLAYER_1 = 123, - O_PLAYER_2 = 124, - O_PLAYER_3 = 125, - O_PLAYER_4 = 126, - O_PLAYER_5 = 127, - O_PLAYER_6 = 128, - O_PLAYER_7 = 129, - O_PLAYER_8 = 130, - O_PLAYER_9 = 131, - O_PLAYER_10 = 132, - O_PASSPORT_CLOSED = 133, - O_COMPASS_ITEM = 134, - O_PISTOL_ITEM = 135, - O_SHOTGUN_ITEM = 136, - O_MAGNUM_ITEM = 137, - O_UZI_ITEM = 138, - O_HARPOON_ITEM = 139, - O_M16_ITEM = 140, - O_GRENADE_ITEM = 141, - O_PISTOL_AMMO_ITEM = 142, - O_SHOTGUN_AMMO_ITEM = 143, - O_MAGNUM_AMMO_ITEM = 144, - O_UZI_AMMO_ITEM = 145, - O_HARPOON_AMMO_ITEM = 146, - O_M16_AMMO_ITEM = 147, - O_GRENADE_AMMO_ITEM = 148, - O_SMALL_MEDIPACK_ITEM = 149, - O_LARGE_MEDIPACK_ITEM = 150, - O_FLARES_ITEM = 151, - O_FLARE_ITEM = 152, - O_DETAIL_OPTION = 153, - O_SOUND_OPTION = 154, - O_CONTROL_OPTION = 155, - O_GAMMA_OPTION = 156, - O_PISTOL_OPTION = 157, - O_SHOTGUN_OPTION = 158, - O_MAGNUM_OPTION = 159, - O_UZI_OPTION = 160, - O_HARPOON_OPTION = 161, - O_M16_OPTION = 162, - O_GRENADE_OPTION = 163, - O_PISTOL_AMMO_OPTION = 164, - O_SHOTGUN_AMMO_OPTION = 165, - O_MAGNUM_AMMO_OPTION = 166, - O_UZI_AMMO_OPTION = 167, - O_HARPOON_AMMO_OPTION = 168, - O_M16_AMMO_OPTION = 169, - O_GRENADE_AMMO_OPTION = 170, - O_SMALL_MEDIPACK_OPTION = 171, - O_LARGE_MEDIPACK_OPTION = 172, - O_FLARES_OPTION = 173, - O_PUZZLE_ITEM_1 = 174, - O_PUZZLE_ITEM_2 = 175, - O_PUZZLE_ITEM_3 = 176, - O_PUZZLE_ITEM_4 = 177, - O_PUZZLE_OPTION_1 = 178, - O_PUZZLE_OPTION_2 = 179, - O_PUZZLE_OPTION_3 = 180, - O_PUZZLE_OPTION_4 = 181, - O_PUZZLE_HOLE_1 = 182, - O_PUZZLE_HOLE_2 = 183, - O_PUZZLE_HOLE_3 = 184, - O_PUZZLE_HOLE_4 = 185, - O_PUZZLE_DONE_1 = 186, - O_PUZZLE_DONE_2 = 187, - O_PUZZLE_DONE_3 = 188, - O_PUZZLE_DONE_4 = 189, - O_SECRET_1 = 190, - O_SECRET_2 = 191, - O_SECRET_3 = 192, - O_KEY_ITEM_1 = 193, - O_KEY_ITEM_2 = 194, - O_KEY_ITEM_3 = 195, - O_KEY_ITEM_4 = 196, - O_KEY_OPTION_1 = 197, - O_KEY_OPTION_2 = 198, - O_KEY_OPTION_3 = 199, - O_KEY_OPTION_4 = 200, - O_KEY_HOLE_1 = 201, - O_KEY_HOLE_2 = 202, - O_KEY_HOLE_3 = 203, - O_KEY_HOLE_4 = 204, - O_PICKUP_ITEM_1 = 205, - O_PICKUP_ITEM_2 = 206, - O_PICKUP_OPTION_1 = 207, - O_PICKUP_OPTION_2 = 208, - O_SPHERE_OF_DOOM_1 = 209, - O_SPHERE_OF_DOOM_2 = 210, - O_SPHERE_OF_DOOM_3 = 211, - O_ALARM_SOUND = 212, - O_BIRD_TWEETER_1 = 213, - O_DINO = 214, - O_BIRD_TWEETER_2 = 215, - O_CLOCK_CHIMES = 216, - O_DRAGON_BONES_1 = 217, - O_DRAGON_BONES_2 = 218, - O_DRAGON_BONES_3 = 219, - O_HOT_LIQUID = 220, - O_BOAT_BITS = 221, - O_MINE = 222, - O_INV_BACKGROUND = 223, - O_FX_RESERVED = 224, - O_GONG_BONGER = 225, - O_DETONATOR_1 = 226, - O_DETONATOR_2 = 227, - O_COPTER = 228, - O_EXPLOSION = 229, - O_SPLASH = 230, - O_BUBBLES = 231, - O_BUBBLE_EMITTER = 232, - O_BLOOD = 233, - O_DART_EFFECT = 234, - O_FLARE_FIRE = 235, - O_GLOW = 236, - O_GLOW_RESERVED = 237, - O_RICOCHET = 238, - O_TWINKLE = 239, - O_GUN_FLASH = 240, - O_M16_FLASH = 241, - O_BODY_PART = 242, - O_CAMERA_TARGET = 243, - O_WATERFALL = 244, - O_MISSILE_HARPOON = 245, - O_MISSILE_FLAME = 246, - O_MISSILE_KNIFE = 247, - O_GRENADE = 248, - O_HARPOON_BOLT = 249, - O_EMBER = 250, - O_EMBER_EMITTER = 251, - O_FLAME = 252, - O_FLAME_EMITTER = 253, - O_SKYBOX = 254, - O_ALPHABET = 255, - O_DYING_MONK = 256, - O_DING_DONG = 257, - O_LARA_ALARM = 258, - O_MINI_COPTER = 259, - O_WINSTON = 260, - O_ASSAULT_DIGITS = 261, - O_FINAL_LEVEL_COUNTER = 262, - O_CUT_SHOTGUN = 263, - O_EARTHQUAKE = 264, -#endif +#define OBJ_ID_DEFINE(object_id, enum_value) object_id = enum_value, +#include "./ids.def" O_NUMBER_OF, } GAME_OBJECT_ID; diff --git a/include/libtrx/game/objects/ids_tr1.def b/include/libtrx/game/objects/ids_tr1.def new file mode 100644 index 0000000..7147963 --- /dev/null +++ b/include/libtrx/game/objects/ids_tr1.def @@ -0,0 +1,192 @@ +OBJ_ID_DEFINE(O_LARA, 0) +OBJ_ID_DEFINE(O_PISTOL_ANIM, 1) +OBJ_ID_DEFINE(O_SHOTGUN_ANIM, 2) +OBJ_ID_DEFINE(O_MAGNUM_ANIM, 3) +OBJ_ID_DEFINE(O_UZI_ANIM, 4) +OBJ_ID_DEFINE(O_LARA_EXTRA, 5) +OBJ_ID_DEFINE(O_BACON_LARA, 6) +OBJ_ID_DEFINE(O_WOLF, 7) +OBJ_ID_DEFINE(O_BEAR, 8) +OBJ_ID_DEFINE(O_BAT, 9) +OBJ_ID_DEFINE(O_CROCODILE, 10) +OBJ_ID_DEFINE(O_ALLIGATOR, 11) +OBJ_ID_DEFINE(O_LION, 12) +OBJ_ID_DEFINE(O_LIONESS, 13) +OBJ_ID_DEFINE(O_PUMA, 14) +OBJ_ID_DEFINE(O_APE, 15) +OBJ_ID_DEFINE(O_RAT, 16) +OBJ_ID_DEFINE(O_VOLE, 17) +OBJ_ID_DEFINE(O_TREX, 18) +OBJ_ID_DEFINE(O_RAPTOR, 19) +OBJ_ID_DEFINE(O_WARRIOR_1, 20) // flying mutant +OBJ_ID_DEFINE(O_WARRIOR_2, 21) +OBJ_ID_DEFINE(O_WARRIOR_3, 22) +OBJ_ID_DEFINE(O_CENTAUR, 23) +OBJ_ID_DEFINE(O_MUMMY, 24) +OBJ_ID_DEFINE(O_DINO_WARRIOR, 25) +OBJ_ID_DEFINE(O_FISH, 26) +OBJ_ID_DEFINE(O_LARSON, 27) +OBJ_ID_DEFINE(O_PIERRE, 28) +OBJ_ID_DEFINE(O_SKATEBOARD, 29) +OBJ_ID_DEFINE(O_SKATEKID, 30) +OBJ_ID_DEFINE(O_COWBOY, 31) +OBJ_ID_DEFINE(O_BALDY, 32) +OBJ_ID_DEFINE(O_NATLA, 33) +OBJ_ID_DEFINE(O_TORSO, 34) // a.k.a. Abortion, Adam or Evil Natla) +OBJ_ID_DEFINE(O_FALLING_BLOCK, 35) +OBJ_ID_DEFINE(O_PENDULUM, 36) +OBJ_ID_DEFINE(O_SPIKES, 37) +OBJ_ID_DEFINE(O_ROLLING_BALL, 38) +OBJ_ID_DEFINE(O_DARTS, 39) +OBJ_ID_DEFINE(O_DART_EMITTER, 40) +OBJ_ID_DEFINE(O_DRAWBRIDGE, 41) +OBJ_ID_DEFINE(O_TEETH_TRAP, 42) +OBJ_ID_DEFINE(O_DAMOCLES_SWORD, 43) +OBJ_ID_DEFINE(O_THORS_HANDLE, 44) +OBJ_ID_DEFINE(O_THORS_HEAD, 45) +OBJ_ID_DEFINE(O_LIGHTNING_EMITTER, 46) +OBJ_ID_DEFINE(O_MOVING_BAR, 47) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_1, 48) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_2, 49) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_3, 50) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_4, 51) +OBJ_ID_DEFINE(O_SLIDING_PILLAR, 52) +OBJ_ID_DEFINE(O_FALLING_CEILING_1, 53) +OBJ_ID_DEFINE(O_FALLING_CEILING_2, 54) +OBJ_ID_DEFINE(O_SWITCH_TYPE_1, 55) +OBJ_ID_DEFINE(O_SWITCH_TYPE_2, 56) +OBJ_ID_DEFINE(O_DOOR_TYPE_1, 57) +OBJ_ID_DEFINE(O_DOOR_TYPE_2, 58) +OBJ_ID_DEFINE(O_DOOR_TYPE_3, 59) +OBJ_ID_DEFINE(O_DOOR_TYPE_4, 60) +OBJ_ID_DEFINE(O_DOOR_TYPE_5, 61) +OBJ_ID_DEFINE(O_DOOR_TYPE_6, 62) +OBJ_ID_DEFINE(O_DOOR_TYPE_7, 63) +OBJ_ID_DEFINE(O_DOOR_TYPE_8, 64) +OBJ_ID_DEFINE(O_TRAPDOOR_1, 65) +OBJ_ID_DEFINE(O_TRAPDOOR_2, 66) +OBJ_ID_DEFINE(O_BIGTRAPDOOR, 67) +OBJ_ID_DEFINE(O_BRIDGE_FLAT, 68) +OBJ_ID_DEFINE(O_BRIDGE_TILT_1, 69) +OBJ_ID_DEFINE(O_BRIDGE_TILT_2, 70) +OBJ_ID_DEFINE(O_PASSPORT_OPTION, 71) +OBJ_ID_DEFINE(O_MAP_OPTION, 72) +OBJ_ID_DEFINE(O_PHOTO_OPTION, 73) +OBJ_ID_DEFINE(O_COG_1, 74) +OBJ_ID_DEFINE(O_COG_2, 75) +OBJ_ID_DEFINE(O_COG_3, 76) +OBJ_ID_DEFINE(O_PLAYER_1, 77) +OBJ_ID_DEFINE(O_PLAYER_2, 78) +OBJ_ID_DEFINE(O_PLAYER_3, 79) +OBJ_ID_DEFINE(O_PLAYER_4, 80) +OBJ_ID_DEFINE(O_PASSPORT_CLOSED, 81) +OBJ_ID_DEFINE(O_MAP_CLOSED, 82) +OBJ_ID_DEFINE(O_SAVEGAME_ITEM, 83) +OBJ_ID_DEFINE(O_PISTOL_ITEM, 84) +OBJ_ID_DEFINE(O_SHOTGUN_ITEM, 85) +OBJ_ID_DEFINE(O_MAGNUM_ITEM, 86) +OBJ_ID_DEFINE(O_UZI_ITEM, 87) +OBJ_ID_DEFINE(O_PISTOL_AMMO_ITEM, 88) +OBJ_ID_DEFINE(O_SG_AMMO_ITEM, 89) +OBJ_ID_DEFINE(O_MAG_AMMO_ITEM, 90) +OBJ_ID_DEFINE(O_UZI_AMMO_ITEM, 91) +OBJ_ID_DEFINE(O_EXPLOSIVE_ITEM, 92) +OBJ_ID_DEFINE(O_MEDI_ITEM, 93) +OBJ_ID_DEFINE(O_BIGMEDI_ITEM, 94) +OBJ_ID_DEFINE(O_DETAIL_OPTION, 95) +OBJ_ID_DEFINE(O_SOUND_OPTION, 96) +OBJ_ID_DEFINE(O_CONTROL_OPTION, 97) +OBJ_ID_DEFINE(O_GAMMA_OPTION, 98) +OBJ_ID_DEFINE(O_PISTOL_OPTION, 99) +OBJ_ID_DEFINE(O_SHOTGUN_OPTION, 100) +OBJ_ID_DEFINE(O_MAGNUM_OPTION, 101) +OBJ_ID_DEFINE(O_UZI_OPTION, 102) +OBJ_ID_DEFINE(O_PISTOL_AMMO_OPTION, 103) +OBJ_ID_DEFINE(O_SG_AMMO_OPTION, 104) +OBJ_ID_DEFINE(O_MAG_AMMO_OPTION, 105) +OBJ_ID_DEFINE(O_UZI_AMMO_OPTION, 106) +OBJ_ID_DEFINE(O_EXPLOSIVE_OPTION, 107) +OBJ_ID_DEFINE(O_MEDI_OPTION, 108) +OBJ_ID_DEFINE(O_BIGMEDI_OPTION, 109) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_1, 110) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_2, 111) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_3, 112) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_4, 113) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_1, 114) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_2, 115) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_3, 116) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_4, 117) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_1, 118) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_2, 119) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_3, 120) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_4, 121) +OBJ_ID_DEFINE(O_PUZZLE_DONE_1, 122) +OBJ_ID_DEFINE(O_PUZZLE_DONE_2, 123) +OBJ_ID_DEFINE(O_PUZZLE_DONE_3, 124) +OBJ_ID_DEFINE(O_PUZZLE_DONE_4, 125) +OBJ_ID_DEFINE(O_LEADBAR_ITEM, 126) +OBJ_ID_DEFINE(O_LEADBAR_OPTION, 127) +OBJ_ID_DEFINE(O_MIDAS_TOUCH, 128) +OBJ_ID_DEFINE(O_KEY_ITEM_1, 129) +OBJ_ID_DEFINE(O_KEY_ITEM_2, 130) +OBJ_ID_DEFINE(O_KEY_ITEM_3, 131) +OBJ_ID_DEFINE(O_KEY_ITEM_4, 132) +OBJ_ID_DEFINE(O_KEY_OPTION_1, 133) +OBJ_ID_DEFINE(O_KEY_OPTION_2, 134) +OBJ_ID_DEFINE(O_KEY_OPTION_3, 135) +OBJ_ID_DEFINE(O_KEY_OPTION_4, 136) +OBJ_ID_DEFINE(O_KEY_HOLE_1, 137) +OBJ_ID_DEFINE(O_KEY_HOLE_2, 138) +OBJ_ID_DEFINE(O_KEY_HOLE_3, 139) +OBJ_ID_DEFINE(O_KEY_HOLE_4, 140) +OBJ_ID_DEFINE(O_PICKUP_ITEM_1, 141) +OBJ_ID_DEFINE(O_PICKUP_ITEM_2, 142) +OBJ_ID_DEFINE(O_SCION_ITEM_1, 143) +OBJ_ID_DEFINE(O_SCION_ITEM_2, 144) +OBJ_ID_DEFINE(O_SCION_ITEM_3, 145) +OBJ_ID_DEFINE(O_SCION_ITEM_4, 146) +OBJ_ID_DEFINE(O_SCION_HOLDER, 147) +OBJ_ID_DEFINE(O_PICKUP_OPTION_1, 148) +OBJ_ID_DEFINE(O_PICKUP_OPTION_2, 149) +OBJ_ID_DEFINE(O_SCION_OPTION, 150) +OBJ_ID_DEFINE(O_EXPLOSION_1, 151) +OBJ_ID_DEFINE(O_EXPLOSION_2, 152) +OBJ_ID_DEFINE(O_SPLASH_1, 153) +OBJ_ID_DEFINE(O_SPLASH_2, 154) +OBJ_ID_DEFINE(O_BUBBLES_1, 155) +OBJ_ID_DEFINE(O_BUBBLES_2, 156) +OBJ_ID_DEFINE(O_BUBBLE_EMITTER, 157) +OBJ_ID_DEFINE(O_BLOOD_1, 158) +OBJ_ID_DEFINE(O_BLOOD_2, 159) +OBJ_ID_DEFINE(O_DART_EFFECT, 160) +OBJ_ID_DEFINE(O_STATUE, 161) +OBJ_ID_DEFINE(O_PORTACABIN, 162) +OBJ_ID_DEFINE(O_PODS, 163) +OBJ_ID_DEFINE(O_RICOCHET_1, 164) +OBJ_ID_DEFINE(O_TWINKLE, 165) +OBJ_ID_DEFINE(O_GUN_FLASH, 166) +OBJ_ID_DEFINE(O_DUST, 167) +OBJ_ID_DEFINE(O_BODY_PART, 168) +OBJ_ID_DEFINE(O_CAMERA_TARGET, 169) +OBJ_ID_DEFINE(O_WATERFALL, 170) +OBJ_ID_DEFINE(O_MISSILE_1, 171) +OBJ_ID_DEFINE(O_MISSILE_2, 172) +OBJ_ID_DEFINE(O_MISSILE_3, 173) +OBJ_ID_DEFINE(O_MISSILE_4, 174) +OBJ_ID_DEFINE(O_MISSILE_5, 175) +OBJ_ID_DEFINE(O_EMBER, 176) +OBJ_ID_DEFINE(O_EMBER_EMITTER, 177) +OBJ_ID_DEFINE(O_FLAME, 178) +OBJ_ID_DEFINE(O_FLAME_EMITTER, 179) +OBJ_ID_DEFINE(O_LAVA_WEDGE, 180) +OBJ_ID_DEFINE(O_BIG_POD, 181) +OBJ_ID_DEFINE(O_BOAT, 182) +OBJ_ID_DEFINE(O_EARTHQUAKE, 183) +OBJ_ID_DEFINE(O_SKYBOX, 184) +OBJ_ID_DEFINE(O_TEMP_6, 185) +OBJ_ID_DEFINE(O_TEMP_7, 186) +OBJ_ID_DEFINE(O_TEMP_8, 187) +OBJ_ID_DEFINE(O_TEMP_9, 188) +OBJ_ID_DEFINE(O_TEMP_10, 189) +OBJ_ID_DEFINE(O_HAIR, O_TEMP_10) +OBJ_ID_DEFINE(O_ALPHABET, 190) diff --git a/include/libtrx/game/objects/ids_tr2.def b/include/libtrx/game/objects/ids_tr2.def new file mode 100644 index 0000000..af394d0 --- /dev/null +++ b/include/libtrx/game/objects/ids_tr2.def @@ -0,0 +1,265 @@ +OBJ_ID_DEFINE(O_LARA, 0) +OBJ_ID_DEFINE(O_LARA_PISTOLS, 1) +OBJ_ID_DEFINE(O_LARA_HAIR, 2) +OBJ_ID_DEFINE(O_LARA_SHOTGUN, 3) +OBJ_ID_DEFINE(O_LARA_MAGNUMS, 4) +OBJ_ID_DEFINE(O_LARA_UZIS, 5) +OBJ_ID_DEFINE(O_LARA_M16, 6) +OBJ_ID_DEFINE(O_LARA_GRENADE, 7) +OBJ_ID_DEFINE(O_LARA_HARPOON, 8) +OBJ_ID_DEFINE(O_LARA_FLARE, 9) +OBJ_ID_DEFINE(O_LARA_SKIDOO, 10) +OBJ_ID_DEFINE(O_LARA_BOAT, 11) +OBJ_ID_DEFINE(O_LARA_EXTRA, 12) +OBJ_ID_DEFINE(O_SKIDOO_FAST, 13) +OBJ_ID_DEFINE(O_BOAT, 14) +OBJ_ID_DEFINE(O_DOG, 15) +OBJ_ID_DEFINE(O_CULT_1, 16) +OBJ_ID_DEFINE(O_CULT_1A, 17) +OBJ_ID_DEFINE(O_CULT_1B, 18) +OBJ_ID_DEFINE(O_CULT_2, 19) +OBJ_ID_DEFINE(O_CULT_3, 20) +OBJ_ID_DEFINE(O_MOUSE, 21) +OBJ_ID_DEFINE(O_DRAGON_FRONT, 22) +OBJ_ID_DEFINE(O_DRAGON_BACK, 23) +OBJ_ID_DEFINE(O_GONDOLA, 24) +OBJ_ID_DEFINE(O_SHARK, 25) +OBJ_ID_DEFINE(O_EEL, 26) +OBJ_ID_DEFINE(O_BIG_EEL, 27) +OBJ_ID_DEFINE(O_BARRACUDA, 28) +OBJ_ID_DEFINE(O_DIVER, 29) +OBJ_ID_DEFINE(O_WORKER_1, 30) +OBJ_ID_DEFINE(O_WORKER_2, 31) +OBJ_ID_DEFINE(O_WORKER_3, 32) +OBJ_ID_DEFINE(O_WORKER_4, 33) +OBJ_ID_DEFINE(O_WORKER_5, 34) +OBJ_ID_DEFINE(O_JELLY, 35) +OBJ_ID_DEFINE(O_SPIDER, 36) +OBJ_ID_DEFINE(O_BIG_SPIDER, 37) +OBJ_ID_DEFINE(O_CROW, 38) +OBJ_ID_DEFINE(O_TIGER, 39) +OBJ_ID_DEFINE(O_BARTOLI, 40) +OBJ_ID_DEFINE(O_XIAN_SPEARMAN, 41) +OBJ_ID_DEFINE(O_XIAN_SPEARMAN_STATUE, 42) +OBJ_ID_DEFINE(O_XIAN_KNIGHT, 43) +OBJ_ID_DEFINE(O_XIAN_KNIGHT_STATUE, 44) +OBJ_ID_DEFINE(O_YETI, 45) +OBJ_ID_DEFINE(O_GIANT_YETI, 46) +OBJ_ID_DEFINE(O_EAGLE, 47) +OBJ_ID_DEFINE(O_BANDIT_1, 48) +OBJ_ID_DEFINE(O_BANDIT_2, 49) +OBJ_ID_DEFINE(O_BANDIT_2B, 50) +OBJ_ID_DEFINE(O_SKIDOO_ARMED, 51) +OBJ_ID_DEFINE(O_SKIDMAN, 52) +OBJ_ID_DEFINE(O_MONK_1, 53) +OBJ_ID_DEFINE(O_MONK_2, 54) +OBJ_ID_DEFINE(O_FALLING_BLOCK_1, 55) +OBJ_ID_DEFINE(O_FALLING_BLOCK_2, 56) +OBJ_ID_DEFINE(O_FALLING_BLOCK_3, 57) +OBJ_ID_DEFINE(O_PENDULUM_1, 58) +OBJ_ID_DEFINE(O_SPIKES, 59) +OBJ_ID_DEFINE(O_ROLLING_BALL_1, 60) +OBJ_ID_DEFINE(O_DARTS, 61) +OBJ_ID_DEFINE(O_DART_EMITTER, 62) +OBJ_ID_DEFINE(O_DRAWBRIDGE, 63) +OBJ_ID_DEFINE(O_TEETH_TRAP, 64) +OBJ_ID_DEFINE(O_LIFT, 65) +OBJ_ID_DEFINE(O_GENERAL, 66) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_1, 67) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_2, 68) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_3, 69) +OBJ_ID_DEFINE(O_MOVABLE_BLOCK_4, 70) +OBJ_ID_DEFINE(O_BIG_BOWL, 71) +OBJ_ID_DEFINE(O_WINDOW_1, 72) +OBJ_ID_DEFINE(O_WINDOW_2, 73) +OBJ_ID_DEFINE(O_WINDOW_3, 74) +OBJ_ID_DEFINE(O_WINDOW_4, 75) +OBJ_ID_DEFINE(O_PROPELLER_1, 76) +OBJ_ID_DEFINE(O_POWER_SAW, 77) +OBJ_ID_DEFINE(O_HOOK, 78) +OBJ_ID_DEFINE(O_FALLING_CEILING, 79) +OBJ_ID_DEFINE(O_SPINNING_BLADE, 80) +OBJ_ID_DEFINE(O_BLADE, 81) +OBJ_ID_DEFINE(O_KILLER_STATUE, 82) +OBJ_ID_DEFINE(O_ROLLING_BALL_2, 83) +OBJ_ID_DEFINE(O_ICICLE, 84) +OBJ_ID_DEFINE(O_SPIKE_WALL, 85) +OBJ_ID_DEFINE(O_SPRING_BOARD, 86) +OBJ_ID_DEFINE(O_CEILING_SPIKES, 87) +OBJ_ID_DEFINE(O_BELL, 88) +OBJ_ID_DEFINE(O_WATER_SPRITE, 89) +OBJ_ID_DEFINE(O_SNOW_SPRITE, 90) +OBJ_ID_DEFINE(O_SKIDOO_LARA, 91) +OBJ_ID_DEFINE(O_SWITCH_TYPE_1, 92) +OBJ_ID_DEFINE(O_SWITCH_TYPE_2, 93) +OBJ_ID_DEFINE(O_PROPELLER_2, 94) +OBJ_ID_DEFINE(O_PROPELLER_3, 95) +OBJ_ID_DEFINE(O_PENDULUM_2, 96) +OBJ_ID_DEFINE(O_MESH_SWAP_1, 97) +OBJ_ID_DEFINE(O_MESH_SWAP_2, 98) +OBJ_ID_DEFINE(O_LARA_SWAP, 99) +OBJ_ID_DEFINE(O_TEXT_BOX, 100) +OBJ_ID_DEFINE(O_ROLLING_BALL_3, 101) +OBJ_ID_DEFINE(O_DEATH_SLIDE, 102) +OBJ_ID_DEFINE(O_SWITCH_TYPE_3, 103) +OBJ_ID_DEFINE(O_SWITCH_TYPE_4, 104) +OBJ_ID_DEFINE(O_SWITCH_TYPE_5, 105) +OBJ_ID_DEFINE(O_DOOR_TYPE_1, 106) +OBJ_ID_DEFINE(O_DOOR_TYPE_2, 107) +OBJ_ID_DEFINE(O_DOOR_TYPE_3, 108) +OBJ_ID_DEFINE(O_DOOR_TYPE_4, 109) +OBJ_ID_DEFINE(O_DOOR_TYPE_5, 110) +OBJ_ID_DEFINE(O_DOOR_TYPE_6, 111) +OBJ_ID_DEFINE(O_DOOR_TYPE_7, 112) +OBJ_ID_DEFINE(O_DOOR_TYPE_8, 113) +OBJ_ID_DEFINE(O_TRAPDOOR_TYPE_1, 114) +OBJ_ID_DEFINE(O_TRAPDOOR_TYPE_2, 115) +OBJ_ID_DEFINE(O_TRAPDOOR_TYPE_3, 116) +OBJ_ID_DEFINE(O_BRIDGE_FLAT, 117) +OBJ_ID_DEFINE(O_BRIDGE_TILT_1, 118) +OBJ_ID_DEFINE(O_BRIDGE_TILT_2, 119) +OBJ_ID_DEFINE(O_PASSPORT_OPTION, 120) +OBJ_ID_DEFINE(O_COMPASS_OPTION, 121) +OBJ_ID_DEFINE(O_PHOTO_OPTION, 122) +OBJ_ID_DEFINE(O_PLAYER_1, 123) +OBJ_ID_DEFINE(O_PLAYER_2, 124) +OBJ_ID_DEFINE(O_PLAYER_3, 125) +OBJ_ID_DEFINE(O_PLAYER_4, 126) +OBJ_ID_DEFINE(O_PLAYER_5, 127) +OBJ_ID_DEFINE(O_PLAYER_6, 128) +OBJ_ID_DEFINE(O_PLAYER_7, 129) +OBJ_ID_DEFINE(O_PLAYER_8, 130) +OBJ_ID_DEFINE(O_PLAYER_9, 131) +OBJ_ID_DEFINE(O_PLAYER_10, 132) +OBJ_ID_DEFINE(O_PASSPORT_CLOSED, 133) +OBJ_ID_DEFINE(O_COMPASS_ITEM, 134) +OBJ_ID_DEFINE(O_PISTOL_ITEM, 135) +OBJ_ID_DEFINE(O_SHOTGUN_ITEM, 136) +OBJ_ID_DEFINE(O_MAGNUM_ITEM, 137) +OBJ_ID_DEFINE(O_UZI_ITEM, 138) +OBJ_ID_DEFINE(O_HARPOON_ITEM, 139) +OBJ_ID_DEFINE(O_M16_ITEM, 140) +OBJ_ID_DEFINE(O_GRENADE_ITEM, 141) +OBJ_ID_DEFINE(O_PISTOL_AMMO_ITEM, 142) +OBJ_ID_DEFINE(O_SHOTGUN_AMMO_ITEM, 143) +OBJ_ID_DEFINE(O_MAGNUM_AMMO_ITEM, 144) +OBJ_ID_DEFINE(O_UZI_AMMO_ITEM, 145) +OBJ_ID_DEFINE(O_HARPOON_AMMO_ITEM, 146) +OBJ_ID_DEFINE(O_M16_AMMO_ITEM, 147) +OBJ_ID_DEFINE(O_GRENADE_AMMO_ITEM, 148) +OBJ_ID_DEFINE(O_SMALL_MEDIPACK_ITEM, 149) +OBJ_ID_DEFINE(O_LARGE_MEDIPACK_ITEM, 150) +OBJ_ID_DEFINE(O_FLARES_ITEM, 151) +OBJ_ID_DEFINE(O_FLARE_ITEM, 152) +OBJ_ID_DEFINE(O_DETAIL_OPTION, 153) +OBJ_ID_DEFINE(O_SOUND_OPTION, 154) +OBJ_ID_DEFINE(O_CONTROL_OPTION, 155) +OBJ_ID_DEFINE(O_GAMMA_OPTION, 156) +OBJ_ID_DEFINE(O_PISTOL_OPTION, 157) +OBJ_ID_DEFINE(O_SHOTGUN_OPTION, 158) +OBJ_ID_DEFINE(O_MAGNUM_OPTION, 159) +OBJ_ID_DEFINE(O_UZI_OPTION, 160) +OBJ_ID_DEFINE(O_HARPOON_OPTION, 161) +OBJ_ID_DEFINE(O_M16_OPTION, 162) +OBJ_ID_DEFINE(O_GRENADE_OPTION, 163) +OBJ_ID_DEFINE(O_PISTOL_AMMO_OPTION, 164) +OBJ_ID_DEFINE(O_SHOTGUN_AMMO_OPTION, 165) +OBJ_ID_DEFINE(O_MAGNUM_AMMO_OPTION, 166) +OBJ_ID_DEFINE(O_UZI_AMMO_OPTION, 167) +OBJ_ID_DEFINE(O_HARPOON_AMMO_OPTION, 168) +OBJ_ID_DEFINE(O_M16_AMMO_OPTION, 169) +OBJ_ID_DEFINE(O_GRENADE_AMMO_OPTION, 170) +OBJ_ID_DEFINE(O_SMALL_MEDIPACK_OPTION, 171) +OBJ_ID_DEFINE(O_LARGE_MEDIPACK_OPTION, 172) +OBJ_ID_DEFINE(O_FLARES_OPTION, 173) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_1, 174) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_2, 175) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_3, 176) +OBJ_ID_DEFINE(O_PUZZLE_ITEM_4, 177) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_1, 178) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_2, 179) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_3, 180) +OBJ_ID_DEFINE(O_PUZZLE_OPTION_4, 181) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_1, 182) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_2, 183) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_3, 184) +OBJ_ID_DEFINE(O_PUZZLE_HOLE_4, 185) +OBJ_ID_DEFINE(O_PUZZLE_DONE_1, 186) +OBJ_ID_DEFINE(O_PUZZLE_DONE_2, 187) +OBJ_ID_DEFINE(O_PUZZLE_DONE_3, 188) +OBJ_ID_DEFINE(O_PUZZLE_DONE_4, 189) +OBJ_ID_DEFINE(O_SECRET_1, 190) +OBJ_ID_DEFINE(O_SECRET_2, 191) +OBJ_ID_DEFINE(O_SECRET_3, 192) +OBJ_ID_DEFINE(O_KEY_ITEM_1, 193) +OBJ_ID_DEFINE(O_KEY_ITEM_2, 194) +OBJ_ID_DEFINE(O_KEY_ITEM_3, 195) +OBJ_ID_DEFINE(O_KEY_ITEM_4, 196) +OBJ_ID_DEFINE(O_KEY_OPTION_1, 197) +OBJ_ID_DEFINE(O_KEY_OPTION_2, 198) +OBJ_ID_DEFINE(O_KEY_OPTION_3, 199) +OBJ_ID_DEFINE(O_KEY_OPTION_4, 200) +OBJ_ID_DEFINE(O_KEY_HOLE_1, 201) +OBJ_ID_DEFINE(O_KEY_HOLE_2, 202) +OBJ_ID_DEFINE(O_KEY_HOLE_3, 203) +OBJ_ID_DEFINE(O_KEY_HOLE_4, 204) +OBJ_ID_DEFINE(O_PICKUP_ITEM_1, 205) +OBJ_ID_DEFINE(O_PICKUP_ITEM_2, 206) +OBJ_ID_DEFINE(O_PICKUP_OPTION_1, 207) +OBJ_ID_DEFINE(O_PICKUP_OPTION_2, 208) +OBJ_ID_DEFINE(O_SPHERE_OF_DOOM_1, 209) +OBJ_ID_DEFINE(O_SPHERE_OF_DOOM_2, 210) +OBJ_ID_DEFINE(O_SPHERE_OF_DOOM_3, 211) +OBJ_ID_DEFINE(O_ALARM_SOUND, 212) +OBJ_ID_DEFINE(O_BIRD_TWEETER_1, 213) +OBJ_ID_DEFINE(O_DINO, 214) +OBJ_ID_DEFINE(O_BIRD_TWEETER_2, 215) +OBJ_ID_DEFINE(O_CLOCK_CHIMES, 216) +OBJ_ID_DEFINE(O_DRAGON_BONES_1, 217) +OBJ_ID_DEFINE(O_DRAGON_BONES_2, 218) +OBJ_ID_DEFINE(O_DRAGON_BONES_3, 219) +OBJ_ID_DEFINE(O_HOT_LIQUID, 220) +OBJ_ID_DEFINE(O_BOAT_BITS, 221) +OBJ_ID_DEFINE(O_MINE, 222) +OBJ_ID_DEFINE(O_INV_BACKGROUND, 223) +OBJ_ID_DEFINE(O_FX_RESERVED, 224) +OBJ_ID_DEFINE(O_GONG_BONGER, 225) +OBJ_ID_DEFINE(O_DETONATOR_1, 226) +OBJ_ID_DEFINE(O_DETONATOR_2, 227) +OBJ_ID_DEFINE(O_COPTER, 228) +OBJ_ID_DEFINE(O_EXPLOSION, 229) +OBJ_ID_DEFINE(O_SPLASH, 230) +OBJ_ID_DEFINE(O_BUBBLES, 231) +OBJ_ID_DEFINE(O_BUBBLE_EMITTER, 232) +OBJ_ID_DEFINE(O_BLOOD, 233) +OBJ_ID_DEFINE(O_DART_EFFECT, 234) +OBJ_ID_DEFINE(O_FLARE_FIRE, 235) +OBJ_ID_DEFINE(O_GLOW, 236) +OBJ_ID_DEFINE(O_GLOW_RESERVED, 237) +OBJ_ID_DEFINE(O_RICOCHET, 238) +OBJ_ID_DEFINE(O_TWINKLE, 239) +OBJ_ID_DEFINE(O_GUN_FLASH, 240) +OBJ_ID_DEFINE(O_M16_FLASH, 241) +OBJ_ID_DEFINE(O_BODY_PART, 242) +OBJ_ID_DEFINE(O_CAMERA_TARGET, 243) +OBJ_ID_DEFINE(O_WATERFALL, 244) +OBJ_ID_DEFINE(O_MISSILE_HARPOON, 245) +OBJ_ID_DEFINE(O_MISSILE_FLAME, 246) +OBJ_ID_DEFINE(O_MISSILE_KNIFE, 247) +OBJ_ID_DEFINE(O_GRENADE, 248) +OBJ_ID_DEFINE(O_HARPOON_BOLT, 249) +OBJ_ID_DEFINE(O_EMBER, 250) +OBJ_ID_DEFINE(O_EMBER_EMITTER, 251) +OBJ_ID_DEFINE(O_FLAME, 252) +OBJ_ID_DEFINE(O_FLAME_EMITTER, 253) +OBJ_ID_DEFINE(O_SKYBOX, 254) +OBJ_ID_DEFINE(O_ALPHABET, 255) +OBJ_ID_DEFINE(O_DYING_MONK, 256) +OBJ_ID_DEFINE(O_DING_DONG, 257) +OBJ_ID_DEFINE(O_LARA_ALARM, 258) +OBJ_ID_DEFINE(O_MINI_COPTER, 259) +OBJ_ID_DEFINE(O_WINSTON, 260) +OBJ_ID_DEFINE(O_ASSAULT_DIGITS, 261) +OBJ_ID_DEFINE(O_FINAL_LEVEL_COUNTER, 262) +OBJ_ID_DEFINE(O_CUT_SHOTGUN, 263) +OBJ_ID_DEFINE(O_EARTHQUAKE, 264) diff --git a/include/libtrx/game/objects/names.def b/include/libtrx/game/objects/names.def new file mode 100644 index 0000000..a2c4979 --- /dev/null +++ b/include/libtrx/game/objects/names.def @@ -0,0 +1,5 @@ +#if TR_VERSION == 1 +#include "names_tr1.def" +#elif TR_VERSION == 2 +#include "names_tr2.def" +#endif diff --git a/include/libtrx/game/objects/names.h b/include/libtrx/game/objects/names.h index 21fb10f..1f3d70f 100644 --- a/include/libtrx/game/objects/names.h +++ b/include/libtrx/game/objects/names.h @@ -2,8 +2,15 @@ #include "ids.h" +#include +#include + const char *Object_GetName(GAME_OBJECT_ID object_id); +void Object_ResetNames(void); + +void Object_SetName(GAME_OBJECT_ID object_id, const char *name); + // Return a list of object ids that match given string. // out_match_count may be NULL. // The result must be freed by the caller. diff --git a/include/libtrx/game/objects/names_tr1.def b/include/libtrx/game/objects/names_tr1.def new file mode 100644 index 0000000..356b580 --- /dev/null +++ b/include/libtrx/game/objects/names_tr1.def @@ -0,0 +1,192 @@ +OBJ_NAME_DEFINE(O_LARA, "Lara") +OBJ_NAME_DEFINE(O_PISTOL_ANIM, "Pistols Animation") +OBJ_NAME_DEFINE(O_SHOTGUN_ANIM, "Shotgun Animation") +OBJ_NAME_DEFINE(O_MAGNUM_ANIM, "Magnums Animation") +OBJ_NAME_DEFINE(O_UZI_ANIM, "Uzis Animation") +OBJ_NAME_DEFINE(O_LARA_EXTRA, "Lara's Extra Animation") +OBJ_NAME_DEFINE(O_BACON_LARA, "Bacon Lara") +OBJ_NAME_DEFINE(O_WOLF, "Wolf") +OBJ_NAME_DEFINE(O_BEAR, "Bear") +OBJ_NAME_DEFINE(O_BAT, "Bat") +OBJ_NAME_DEFINE(O_CROCODILE, "Crocodile") +OBJ_NAME_DEFINE(O_ALLIGATOR, "Alligator") +OBJ_NAME_DEFINE(O_LION, "Lion") +OBJ_NAME_DEFINE(O_LIONESS, "Lioness") +OBJ_NAME_DEFINE(O_PUMA, "Puma") +OBJ_NAME_DEFINE(O_APE, "Ape") +OBJ_NAME_DEFINE(O_RAT, "Rat") +OBJ_NAME_DEFINE(O_VOLE, "Vole") +OBJ_NAME_DEFINE(O_TREX, "T-Rex") +OBJ_NAME_DEFINE(O_RAPTOR, "Raptor") +OBJ_NAME_DEFINE(O_WARRIOR_1, "Mutant 1") +OBJ_NAME_DEFINE(O_WARRIOR_2, "Mutant 2") +OBJ_NAME_DEFINE(O_WARRIOR_3, "Mutant 3") +OBJ_NAME_DEFINE(O_CENTAUR, "Centaur") +OBJ_NAME_DEFINE(O_MUMMY, "Mummy") +OBJ_NAME_DEFINE(O_DINO_WARRIOR, "Dino Mutant") +OBJ_NAME_DEFINE(O_FISH, "Mutant Fish") +OBJ_NAME_DEFINE(O_LARSON, "Larson") +OBJ_NAME_DEFINE(O_PIERRE, "Pierre") +OBJ_NAME_DEFINE(O_SKATEBOARD, "Skateboard") +OBJ_NAME_DEFINE(O_SKATEKID, "Skate Kid") +OBJ_NAME_DEFINE(O_COWBOY, "Cowboy") +OBJ_NAME_DEFINE(O_BALDY, "Baldy") +OBJ_NAME_DEFINE(O_NATLA, "Natla") +OBJ_NAME_DEFINE(O_TORSO, "Torso") +OBJ_NAME_DEFINE(O_FALLING_BLOCK, "Falling Block") +OBJ_NAME_DEFINE(O_PENDULUM, "Pendulum") +OBJ_NAME_DEFINE(O_SPIKES, "Spikes") +OBJ_NAME_DEFINE(O_ROLLING_BALL, "Boulder") +OBJ_NAME_DEFINE(O_DARTS, "Darts") +OBJ_NAME_DEFINE(O_DART_EMITTER, "Dart Emitter") +OBJ_NAME_DEFINE(O_DRAWBRIDGE, "Drawbridge") +OBJ_NAME_DEFINE(O_TEETH_TRAP, "Teeth Trap") +OBJ_NAME_DEFINE(O_DAMOCLES_SWORD, "Damocles Sword") +OBJ_NAME_DEFINE(O_THORS_HANDLE, "Thor's Hammer Handle") +OBJ_NAME_DEFINE(O_THORS_HEAD, "Thor's Hammer") +OBJ_NAME_DEFINE(O_LIGHTNING_EMITTER, "Lightning Emitter") +OBJ_NAME_DEFINE(O_MOVING_BAR, "Moving Bar") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "Push Block 1") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "Push Block 2") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "Push Block 3") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "Push Block 4") +OBJ_NAME_DEFINE(O_SLIDING_PILLAR, "Sliding Pillar") +OBJ_NAME_DEFINE(O_FALLING_CEILING_1, "Falling Ceiling 1") +OBJ_NAME_DEFINE(O_FALLING_CEILING_2, "Falling Ceiling 2") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_1, "Switch 1") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_2, "Switch 2") +OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "Door 1") +OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "Door 2") +OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "Door 3") +OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "Door 4") +OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "Door 5") +OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "Door 6") +OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "Door 7") +OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "Door 8") +OBJ_NAME_DEFINE(O_TRAPDOOR_1, "Trapdoor 1") +OBJ_NAME_DEFINE(O_TRAPDOOR_2, "Trapdoor 2") +OBJ_NAME_DEFINE(O_BIGTRAPDOOR, "Big Trapdoor") +OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "Bridge Flat") +OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "Bridge Tilt 1") +OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "Bridge Tilt 2") +OBJ_NAME_DEFINE(O_PASSPORT_OPTION, "Game") +OBJ_NAME_DEFINE(O_MAP_OPTION, "Compass") +OBJ_NAME_DEFINE(O_PHOTO_OPTION, "Lara's Home") +OBJ_NAME_DEFINE(O_COG_1, "Cog 1") +OBJ_NAME_DEFINE(O_COG_2, "Cog 2") +OBJ_NAME_DEFINE(O_COG_3, "Cog 3") +OBJ_NAME_DEFINE(O_PLAYER_1, "Cutscene Actor 1") +OBJ_NAME_DEFINE(O_PLAYER_2, "Cutscene Actor 2") +OBJ_NAME_DEFINE(O_PLAYER_3, "Cutscene Actor 3") +OBJ_NAME_DEFINE(O_PLAYER_4, "Cutscene Actor 4") +OBJ_NAME_DEFINE(O_PASSPORT_CLOSED, "Game") +OBJ_NAME_DEFINE(O_MAP_CLOSED, "Map Closed") +OBJ_NAME_DEFINE(O_SAVEGAME_ITEM, "Savegame Crystal") +OBJ_NAME_DEFINE(O_PISTOL_ITEM, "Pistol") +OBJ_NAME_DEFINE(O_SHOTGUN_ITEM, "Shotgun") +OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "Magnums") +OBJ_NAME_DEFINE(O_UZI_ITEM, "Uzis") +OBJ_NAME_DEFINE(O_PISTOL_AMMO_ITEM, "Pistol Clips") +OBJ_NAME_DEFINE(O_SG_AMMO_ITEM, "Shotgun Ammo") +OBJ_NAME_DEFINE(O_MAG_AMMO_ITEM, "Magnum Clips") +OBJ_NAME_DEFINE(O_UZI_AMMO_ITEM, "Uzi Clips") +OBJ_NAME_DEFINE(O_EXPLOSIVE_ITEM, "Grenade") +OBJ_NAME_DEFINE(O_MEDI_ITEM, "Small Medi Pack") +OBJ_NAME_DEFINE(O_BIGMEDI_ITEM, "Large Medi Pack") +OBJ_NAME_DEFINE(O_DETAIL_OPTION, "Detail Levels") +OBJ_NAME_DEFINE(O_SOUND_OPTION, "Sound") +OBJ_NAME_DEFINE(O_CONTROL_OPTION, "Controls") +OBJ_NAME_DEFINE(O_GAMMA_OPTION, "Gamma") +OBJ_NAME_DEFINE(O_PISTOL_OPTION, "Pistols") +OBJ_NAME_DEFINE(O_SHOTGUN_OPTION, "Shotgun") +OBJ_NAME_DEFINE(O_MAGNUM_OPTION, "Magnums") +OBJ_NAME_DEFINE(O_UZI_OPTION, "Uzis") +OBJ_NAME_DEFINE(O_PISTOL_AMMO_OPTION, "Pistol Clips") +OBJ_NAME_DEFINE(O_SG_AMMO_OPTION, "Shotgun Shells") +OBJ_NAME_DEFINE(O_MAG_AMMO_OPTION, "Magnum Clips") +OBJ_NAME_DEFINE(O_UZI_AMMO_OPTION, "Uzi Clips") +OBJ_NAME_DEFINE(O_EXPLOSIVE_OPTION, "Grenade") +OBJ_NAME_DEFINE(O_MEDI_OPTION, "Small Medi Pack") +OBJ_NAME_DEFINE(O_BIGMEDI_OPTION, "Large Medi Pack") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_1, "Puzzle Item 1") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_2, "Puzzle Item 2") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_3, "Puzzle Item 3") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_4, "Puzzle Item 4") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_1, "Puzzle Option 1") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_2, "Puzzle Option 2") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_3, "Puzzle Option 3") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_4, "Puzzle Option 4") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "Puzzle Hole 1 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "Puzzle Hole 2 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "Puzzle Hole 3 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "Puzzle Hole 4 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "Puzzle Hole 1 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "Puzzle Hole 2 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "Puzzle Hole 3 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "Puzzle Hole 4 (Done)") +OBJ_NAME_DEFINE(O_LEADBAR_ITEM, "Lead Bar") +OBJ_NAME_DEFINE(O_LEADBAR_OPTION, "Lead Bar") +OBJ_NAME_DEFINE(O_MIDAS_TOUCH, "Midas Hand") +OBJ_NAME_DEFINE(O_KEY_ITEM_1, "Key 1") +OBJ_NAME_DEFINE(O_KEY_ITEM_2, "Key 2") +OBJ_NAME_DEFINE(O_KEY_ITEM_3, "Key 3") +OBJ_NAME_DEFINE(O_KEY_ITEM_4, "Key 4") +OBJ_NAME_DEFINE(O_KEY_OPTION_1, "Key Option 1") +OBJ_NAME_DEFINE(O_KEY_OPTION_2, "Key Option 2") +OBJ_NAME_DEFINE(O_KEY_OPTION_3, "Key Option 3") +OBJ_NAME_DEFINE(O_KEY_OPTION_4, "Key Option 4") +OBJ_NAME_DEFINE(O_KEY_HOLE_1, "Key Hole 1") +OBJ_NAME_DEFINE(O_KEY_HOLE_2, "Key Hole 1") +OBJ_NAME_DEFINE(O_KEY_HOLE_3, "Key Hole 1") +OBJ_NAME_DEFINE(O_KEY_HOLE_4, "Key Hole 1") +OBJ_NAME_DEFINE(O_PICKUP_ITEM_1, "Pickup Item 1") +OBJ_NAME_DEFINE(O_PICKUP_ITEM_2, "Pickup Item 2") +OBJ_NAME_DEFINE(O_SCION_ITEM_1, "Scion 1") +OBJ_NAME_DEFINE(O_SCION_ITEM_2, "Scion 2") +OBJ_NAME_DEFINE(O_SCION_ITEM_3, "Scion 3") +OBJ_NAME_DEFINE(O_SCION_ITEM_4, "Scion 4") +OBJ_NAME_DEFINE(O_SCION_HOLDER, "Scion Holder") +OBJ_NAME_DEFINE(O_PICKUP_OPTION_1, "Pickup Option 1") +OBJ_NAME_DEFINE(O_PICKUP_OPTION_2, "Pickup Option 2") +OBJ_NAME_DEFINE(O_SCION_OPTION, "Scion Option") +OBJ_NAME_DEFINE(O_EXPLOSION_1, "Explosion 1") +OBJ_NAME_DEFINE(O_EXPLOSION_2, "Explosion 2") +OBJ_NAME_DEFINE(O_SPLASH_1, "Splash 1") +OBJ_NAME_DEFINE(O_SPLASH_2, "Splash 2") +OBJ_NAME_DEFINE(O_BUBBLES_1, "Bubbles 1") +OBJ_NAME_DEFINE(O_BUBBLES_2, "Bubbles 2") +OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "Bubbles Emitter") +OBJ_NAME_DEFINE(O_BLOOD_1, "Blood 1") +OBJ_NAME_DEFINE(O_BLOOD_2, "Blood 2") +OBJ_NAME_DEFINE(O_DART_EFFECT, "Dart Effect") +OBJ_NAME_DEFINE(O_STATUE, "Statue") +OBJ_NAME_DEFINE(O_PORTACABIN, "Portable Cabin") +OBJ_NAME_DEFINE(O_PODS, "Pod") +OBJ_NAME_DEFINE(O_RICOCHET_1, "Ricochet") +OBJ_NAME_DEFINE(O_TWINKLE, "Sparkles") +OBJ_NAME_DEFINE(O_GUN_FLASH, "Gun Flash") +OBJ_NAME_DEFINE(O_DUST, "Dust") +OBJ_NAME_DEFINE(O_BODY_PART, "Body Part") +OBJ_NAME_DEFINE(O_CAMERA_TARGET, "Camera Target") +OBJ_NAME_DEFINE(O_WATERFALL, "Waterfall Mist") +OBJ_NAME_DEFINE(O_MISSILE_1, "Missile 1") +OBJ_NAME_DEFINE(O_MISSILE_2, "Missile 2") +OBJ_NAME_DEFINE(O_MISSILE_3, "Missile 3") +OBJ_NAME_DEFINE(O_MISSILE_4, "Missile 4") +OBJ_NAME_DEFINE(O_MISSILE_5, "Missile 5") +OBJ_NAME_DEFINE(O_EMBER, "Ember") +OBJ_NAME_DEFINE(O_EMBER_EMITTER, "Ember Emitter") +OBJ_NAME_DEFINE(O_FLAME, "Flame") +OBJ_NAME_DEFINE(O_FLAME_EMITTER, "Flame Emitter") +OBJ_NAME_DEFINE(O_LAVA_WEDGE, "Lava Wedge") +OBJ_NAME_DEFINE(O_BIG_POD, "Big Pod") +OBJ_NAME_DEFINE(O_BOAT, "Boat") +OBJ_NAME_DEFINE(O_EARTHQUAKE, "Earthquake") +OBJ_NAME_DEFINE(O_SKYBOX, "Skybox") +OBJ_NAME_DEFINE(O_TEMP_6, "Temp 6") +OBJ_NAME_DEFINE(O_TEMP_7, "Temp 7") +OBJ_NAME_DEFINE(O_TEMP_8, "Temp 8") +OBJ_NAME_DEFINE(O_TEMP_9, "Temp 9") +OBJ_NAME_DEFINE(O_TEMP_10, "Temp 10") +OBJ_NAME_DEFINE(O_HAIR, "Lara's Braid") +OBJ_NAME_DEFINE(O_ALPHABET, "Alphabet") diff --git a/include/libtrx/game/objects/names_tr2.def b/include/libtrx/game/objects/names_tr2.def new file mode 100644 index 0000000..5772f2f --- /dev/null +++ b/include/libtrx/game/objects/names_tr2.def @@ -0,0 +1,265 @@ +OBJ_NAME_DEFINE(O_LARA, "Lara") +OBJ_NAME_DEFINE(O_LARA_PISTOLS, "Pistols Animation") +OBJ_NAME_DEFINE(O_LARA_HAIR, "Braid") +OBJ_NAME_DEFINE(O_LARA_SHOTGUN, "Shotgun Animation") +OBJ_NAME_DEFINE(O_LARA_MAGNUMS, "Magnums Animation") +OBJ_NAME_DEFINE(O_LARA_UZIS, "Uzis Animation") +OBJ_NAME_DEFINE(O_LARA_M16, "M16 Animation") +OBJ_NAME_DEFINE(O_LARA_GRENADE, "Grenade Launcher Animation") +OBJ_NAME_DEFINE(O_LARA_HARPOON, "Harpoon Animation") +OBJ_NAME_DEFINE(O_LARA_FLARE, "Flare Animation") +OBJ_NAME_DEFINE(O_LARA_SKIDOO, "Snowmobile Animation") +OBJ_NAME_DEFINE(O_LARA_BOAT, "Boat Animation") +OBJ_NAME_DEFINE(O_LARA_EXTRA, "Lara's Extra Animation") +OBJ_NAME_DEFINE(O_SKIDOO_FAST, "Red Snowmobile") +OBJ_NAME_DEFINE(O_BOAT, "Boat") +OBJ_NAME_DEFINE(O_DOG, "Dog") +OBJ_NAME_DEFINE(O_CULT_1, "Masked Goon 1") +OBJ_NAME_DEFINE(O_CULT_1A, "Masked Goon 2") +OBJ_NAME_DEFINE(O_CULT_1B, "Masked Goon 3") +OBJ_NAME_DEFINE(O_CULT_2, "Knife Thrower") +OBJ_NAME_DEFINE(O_CULT_3, "Shotgun Goon") +OBJ_NAME_DEFINE(O_MOUSE, "Rat") +OBJ_NAME_DEFINE(O_DRAGON_FRONT, "Dragon Front") +OBJ_NAME_DEFINE(O_DRAGON_BACK, "Dragon Back") +OBJ_NAME_DEFINE(O_GONDOLA, "Gondola") +OBJ_NAME_DEFINE(O_SHARK, "Shark") +OBJ_NAME_DEFINE(O_EEL, "Eel") +OBJ_NAME_DEFINE(O_BIG_EEL, "Big Eel") +OBJ_NAME_DEFINE(O_BARRACUDA, "Barracuda") +OBJ_NAME_DEFINE(O_DIVER, "Scuba Diver") +OBJ_NAME_DEFINE(O_WORKER_1, "Gunman Goon 1") +OBJ_NAME_DEFINE(O_WORKER_2, "Gunman Goon 2") +OBJ_NAME_DEFINE(O_WORKER_3, "Stick Wielding Goon 1") +OBJ_NAME_DEFINE(O_WORKER_4, "Stick Wielding Goon 2") +OBJ_NAME_DEFINE(O_WORKER_5, "Flamethrower Goon") +OBJ_NAME_DEFINE(O_JELLY, "Jellyfish") +OBJ_NAME_DEFINE(O_SPIDER, "Spider") +OBJ_NAME_DEFINE(O_BIG_SPIDER, "Giant Spider") +OBJ_NAME_DEFINE(O_CROW, "Crow") +OBJ_NAME_DEFINE(O_TIGER, "Tiger") +OBJ_NAME_DEFINE(O_BARTOLI, "Marco Bartoli") +OBJ_NAME_DEFINE(O_XIAN_SPEARMAN, "Xian Spearman") +OBJ_NAME_DEFINE(O_XIAN_SPEARMAN_STATUE, "Xian Spearman Statue") +OBJ_NAME_DEFINE(O_XIAN_KNIGHT, "Xian Knight") +OBJ_NAME_DEFINE(O_XIAN_KNIGHT_STATUE, "Xian Knight") +OBJ_NAME_DEFINE(O_YETI, "Yeti") +OBJ_NAME_DEFINE(O_GIANT_YETI, "Bird Monster") +OBJ_NAME_DEFINE(O_EAGLE, "Eagle") +OBJ_NAME_DEFINE(O_BANDIT_1, "Mercenary 1") +OBJ_NAME_DEFINE(O_BANDIT_2, "Mercenary 2") +OBJ_NAME_DEFINE(O_BANDIT_2B, "Mercenary 3") +OBJ_NAME_DEFINE(O_SKIDOO_ARMED, "Black Snowmobile") +OBJ_NAME_DEFINE(O_SKIDMAN, "Black Snowmobile Driver") +OBJ_NAME_DEFINE(O_MONK_1, "Monk 1") +OBJ_NAME_DEFINE(O_MONK_2, "Monk 2") +OBJ_NAME_DEFINE(O_FALLING_BLOCK_1, "Falling Block 1") +OBJ_NAME_DEFINE(O_FALLING_BLOCK_2, "Falling Block 2") +OBJ_NAME_DEFINE(O_FALLING_BLOCK_3, "Loose Boards") +OBJ_NAME_DEFINE(O_PENDULUM_1, "Sandbag") +OBJ_NAME_DEFINE(O_SPIKES, "Spikes") +OBJ_NAME_DEFINE(O_ROLLING_BALL_1, "Boulder 1") +OBJ_NAME_DEFINE(O_DARTS, "Disc") +OBJ_NAME_DEFINE(O_DART_EMITTER, "Disc Emitter") +OBJ_NAME_DEFINE(O_DRAWBRIDGE, "Drawbridge") +OBJ_NAME_DEFINE(O_TEETH_TRAP, "Teeth Trap") +OBJ_NAME_DEFINE(O_LIFT, "Lift") +OBJ_NAME_DEFINE(O_GENERAL, "Minisub") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "Push Block 1") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "Push Block 2") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "Push Block 3") +OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "Push Block 4") +OBJ_NAME_DEFINE(O_BIG_BOWL, "Lava Bowl") +OBJ_NAME_DEFINE(O_WINDOW_1, "Breakable Window 1") +OBJ_NAME_DEFINE(O_WINDOW_2, "Breakable Window 2") +OBJ_NAME_DEFINE(O_WINDOW_3, "Breakable Window 3") +OBJ_NAME_DEFINE(O_WINDOW_4, "Breakable Window 4") +OBJ_NAME_DEFINE(O_PROPELLER_1, "Airplane Propeller") +OBJ_NAME_DEFINE(O_POWER_SAW, "Power Saw") +OBJ_NAME_DEFINE(O_HOOK, "Hook") +OBJ_NAME_DEFINE(O_FALLING_CEILING, "Falling Ceiling") +OBJ_NAME_DEFINE(O_SPINNING_BLADE, "Spinning Blade") +OBJ_NAME_DEFINE(O_BLADE, "Wall-mounted Blade") +OBJ_NAME_DEFINE(O_KILLER_STATUE, "Statue with Sword") +OBJ_NAME_DEFINE(O_ROLLING_BALL_2, "Boulder 2") +OBJ_NAME_DEFINE(O_ICICLE, "Icicles") +OBJ_NAME_DEFINE(O_SPIKE_WALL, "Spike Wall") +OBJ_NAME_DEFINE(O_SPRING_BOARD, "Springboard") +OBJ_NAME_DEFINE(O_CEILING_SPIKES, "Spiky Ceiling") +OBJ_NAME_DEFINE(O_BELL, "Bell") +OBJ_NAME_DEFINE(O_WATER_SPRITE, "Boat Wake") +OBJ_NAME_DEFINE(O_SNOW_SPRITE, "Snowmobile Wale") +OBJ_NAME_DEFINE(O_SKIDOO_LARA, "Snowmobile Animation") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_1, "Switch 1") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_2, "Switch 2") +OBJ_NAME_DEFINE(O_PROPELLER_2, "Underwater Propeller") +OBJ_NAME_DEFINE(O_PROPELLER_3, "Air Fan") +OBJ_NAME_DEFINE(O_PENDULUM_2, "Swinging Box") +OBJ_NAME_DEFINE(O_MESH_SWAP_1, "Mesh Swap 1") +OBJ_NAME_DEFINE(O_MESH_SWAP_2, "Mesh Swap 2") +OBJ_NAME_DEFINE(O_LARA_SWAP, "Lara Mesh Swap") +OBJ_NAME_DEFINE(O_TEXT_BOX, "UI Frame") +OBJ_NAME_DEFINE(O_ROLLING_BALL_3, "Boulder 3") +OBJ_NAME_DEFINE(O_DEATH_SLIDE, "Zipline Handle") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_3, "Switch 3") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_4, "Switch 4") +OBJ_NAME_DEFINE(O_SWITCH_TYPE_5, "Switch 5") +OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "Door 1") +OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "Door 2") +OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "Door 3") +OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "Door 4") +OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "Door 5") +OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "Door 6") +OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "Door 7") +OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "Door 8") +OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_1, "Trapdoor 1") +OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_2, "Trapdoor 2") +OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_3, "Trapdoor 3") +OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "Bridge Flat") +OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "Bridge Tilt 1") +OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "Bridge Tilt 2") +OBJ_NAME_DEFINE(O_PASSPORT_OPTION, "Passport Option") +OBJ_NAME_DEFINE(O_COMPASS_OPTION, "Compass Option") +OBJ_NAME_DEFINE(O_PHOTO_OPTION, "Photo Option") +OBJ_NAME_DEFINE(O_PLAYER_1, "Cutscene Actor 1") +OBJ_NAME_DEFINE(O_PLAYER_2, "Cutscene Actor 2") +OBJ_NAME_DEFINE(O_PLAYER_3, "Cutscene Actor 3") +OBJ_NAME_DEFINE(O_PLAYER_4, "Cutscene Actor 4") +OBJ_NAME_DEFINE(O_PLAYER_5, "Cutscene Actor 5") +OBJ_NAME_DEFINE(O_PLAYER_6, "Cutscene Actor 6") +OBJ_NAME_DEFINE(O_PLAYER_7, "Cutscene Actor 7") +OBJ_NAME_DEFINE(O_PLAYER_8, "Cutscene Actor 8") +OBJ_NAME_DEFINE(O_PLAYER_9, "Cutscene Actor 9") +OBJ_NAME_DEFINE(O_PLAYER_10, "Cutscene Actor 10") +OBJ_NAME_DEFINE(O_PASSPORT_CLOSED, "Passport Closed") +OBJ_NAME_DEFINE(O_COMPASS_ITEM, "Compass") +OBJ_NAME_DEFINE(O_PISTOL_ITEM, "Pistols") +OBJ_NAME_DEFINE(O_SHOTGUN_ITEM, "Shotgun") +OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "Automatic Pistols") +OBJ_NAME_DEFINE(O_UZI_ITEM, "Uzis") +OBJ_NAME_DEFINE(O_HARPOON_ITEM, "Harpoon") +OBJ_NAME_DEFINE(O_M16_ITEM, "M16") +OBJ_NAME_DEFINE(O_GRENADE_ITEM, "Grenade Launcher") +OBJ_NAME_DEFINE(O_PISTOL_AMMO_ITEM, "Pistol Ammo") +OBJ_NAME_DEFINE(O_SHOTGUN_AMMO_ITEM, "Shotgun Ammo") +OBJ_NAME_DEFINE(O_MAGNUM_AMMO_ITEM, "Magnum Ammo") +OBJ_NAME_DEFINE(O_UZI_AMMO_ITEM, "Uzi Ammo") +OBJ_NAME_DEFINE(O_HARPOON_AMMO_ITEM, "Harpoon Ammo") +OBJ_NAME_DEFINE(O_M16_AMMO_ITEM, "M16 Ammo") +OBJ_NAME_DEFINE(O_GRENADE_AMMO_ITEM, "Grenade Launcher Ammo") +OBJ_NAME_DEFINE(O_SMALL_MEDIPACK_ITEM, "Small Medipack") +OBJ_NAME_DEFINE(O_LARGE_MEDIPACK_ITEM, "Large Medipack") +OBJ_NAME_DEFINE(O_FLARES_ITEM, "Flares Box") +OBJ_NAME_DEFINE(O_FLARE_ITEM, "Flare") +OBJ_NAME_DEFINE(O_DETAIL_OPTION, "Detail Option") +OBJ_NAME_DEFINE(O_SOUND_OPTION, "Sound Option") +OBJ_NAME_DEFINE(O_CONTROL_OPTION, "Controls Option") +OBJ_NAME_DEFINE(O_GAMMA_OPTION, "Gamma Option") +OBJ_NAME_DEFINE(O_PISTOL_OPTION, "Pistol Option") +OBJ_NAME_DEFINE(O_SHOTGUN_OPTION, "Shotgun Option") +OBJ_NAME_DEFINE(O_MAGNUM_OPTION, "Magnums Option") +OBJ_NAME_DEFINE(O_UZI_OPTION, "Uzis Option") +OBJ_NAME_DEFINE(O_HARPOON_OPTION, "Harpoon Option") +OBJ_NAME_DEFINE(O_M16_OPTION, "M16 Option") +OBJ_NAME_DEFINE(O_GRENADE_OPTION, "Grenade Launcher Option") +OBJ_NAME_DEFINE(O_PISTOL_AMMO_OPTION, "Pistol Ammo Option") +OBJ_NAME_DEFINE(O_SHOTGUN_AMMO_OPTION, "Shotgun Ammo Option") +OBJ_NAME_DEFINE(O_MAGNUM_AMMO_OPTION, "Magnum Ammo Option") +OBJ_NAME_DEFINE(O_UZI_AMMO_OPTION, "Uzi Ammo Option") +OBJ_NAME_DEFINE(O_HARPOON_AMMO_OPTION, "Harpoon Ammo Option") +OBJ_NAME_DEFINE(O_M16_AMMO_OPTION, "M16 Ammo Option") +OBJ_NAME_DEFINE(O_GRENADE_AMMO_OPTION, "Grenade Launcher Ammo Option") +OBJ_NAME_DEFINE(O_SMALL_MEDIPACK_OPTION, "Small Medipack Option") +OBJ_NAME_DEFINE(O_LARGE_MEDIPACK_OPTION, "Large Medipack Option") +OBJ_NAME_DEFINE(O_FLARES_OPTION, "Flare Option") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_1, "Puzzle Item 1") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_2, "Puzzle Item 2") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_3, "Puzzle Item 3") +OBJ_NAME_DEFINE(O_PUZZLE_ITEM_4, "Puzzle Item 4") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_1, "Puzzle Option 1") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_2, "Puzzle Option 2") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_3, "Puzzle Option 3") +OBJ_NAME_DEFINE(O_PUZZLE_OPTION_4, "Puzzle Option 4") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "Puzzle Hole 1 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "Puzzle Hole 2 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "Puzzle Hole 3 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "Puzzle Hole 4 (Empty)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "Puzzle Hole 1 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "Puzzle Hole 2 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "Puzzle Hole 3 (Done)") +OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "Puzzle Hole 4 (Done)") +OBJ_NAME_DEFINE(O_SECRET_1, "Secret 1") +OBJ_NAME_DEFINE(O_SECRET_2, "Secret 2") +OBJ_NAME_DEFINE(O_SECRET_3, "Secret 3") +OBJ_NAME_DEFINE(O_KEY_ITEM_1, "Key 1") +OBJ_NAME_DEFINE(O_KEY_ITEM_2, "Key 2") +OBJ_NAME_DEFINE(O_KEY_ITEM_3, "Key 3") +OBJ_NAME_DEFINE(O_KEY_ITEM_4, "Key 4") +OBJ_NAME_DEFINE(O_KEY_OPTION_1, "Key Option 1") +OBJ_NAME_DEFINE(O_KEY_OPTION_2, "Key Option 2") +OBJ_NAME_DEFINE(O_KEY_OPTION_3, "Key Option 3") +OBJ_NAME_DEFINE(O_KEY_OPTION_4, "Key Option 4") +OBJ_NAME_DEFINE(O_KEY_HOLE_1, "Key Hole 1") +OBJ_NAME_DEFINE(O_KEY_HOLE_2, "Key Hole 2") +OBJ_NAME_DEFINE(O_KEY_HOLE_3, "Key Hole 3") +OBJ_NAME_DEFINE(O_KEY_HOLE_4, "Key Hole 4") +OBJ_NAME_DEFINE(O_PICKUP_ITEM_1, "Pickup Item 1") +OBJ_NAME_DEFINE(O_PICKUP_ITEM_2, "Pickup Item 2") +OBJ_NAME_DEFINE(O_PICKUP_OPTION_1, "Pickup Option 1") +OBJ_NAME_DEFINE(O_PICKUP_OPTION_2, "Pickup Option 2") +OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_1, "Dragon Explosion 1") +OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_2, "Dragon Explosion 2") +OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_3, "Dragon Explosion 3") +OBJ_NAME_DEFINE(O_ALARM_SOUND, "Alarm") +OBJ_NAME_DEFINE(O_BIRD_TWEETER_1, "Dripping Water") +OBJ_NAME_DEFINE(O_DINO, "T-Rex") +OBJ_NAME_DEFINE(O_BIRD_TWEETER_2, "Singing Birds") +OBJ_NAME_DEFINE(O_CLOCK_CHIMES, "Bartoli Hideout clock") +OBJ_NAME_DEFINE(O_DRAGON_BONES_1, "Placeholder") +OBJ_NAME_DEFINE(O_DRAGON_BONES_2, "Dragon Bones Front") +OBJ_NAME_DEFINE(O_DRAGON_BONES_3, "Dragon Bones Back") +OBJ_NAME_DEFINE(O_HOT_LIQUID, "Extra Fire") +OBJ_NAME_DEFINE(O_BOAT_BITS, "Boat Bits") +OBJ_NAME_DEFINE(O_MINE, "Aquatic Mine") +OBJ_NAME_DEFINE(O_INV_BACKGROUND, "Menu Background") +OBJ_NAME_DEFINE(O_FX_RESERVED, "Gray disk") +OBJ_NAME_DEFINE(O_GONG_BONGER, "Gong Stick") +OBJ_NAME_DEFINE(O_DETONATOR_1, "Gong") +OBJ_NAME_DEFINE(O_DETONATOR_2, "Detonator Box") +OBJ_NAME_DEFINE(O_COPTER, "Helicopter") +OBJ_NAME_DEFINE(O_EXPLOSION, "Explosion") +OBJ_NAME_DEFINE(O_SPLASH, "Water Ripples") +OBJ_NAME_DEFINE(O_BUBBLES, "Bubbles") +OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "Bubbles Emitter") +OBJ_NAME_DEFINE(O_BLOOD, "Blood") +OBJ_NAME_DEFINE(O_DART_EFFECT, "Dart Effect") +OBJ_NAME_DEFINE(O_FLARE_FIRE, "Flare sparks") +OBJ_NAME_DEFINE(O_GLOW, "Glow") +OBJ_NAME_DEFINE(O_GLOW_RESERVED, "Map Glow") +OBJ_NAME_DEFINE(O_RICOCHET, "Ricochet") +OBJ_NAME_DEFINE(O_TWINKLE, "Sparkles") +OBJ_NAME_DEFINE(O_GUN_FLASH, "Gun Flash") +OBJ_NAME_DEFINE(O_M16_FLASH, "M16 Flash") +OBJ_NAME_DEFINE(O_BODY_PART, "Body Part") +OBJ_NAME_DEFINE(O_CAMERA_TARGET, "Camera Target") +OBJ_NAME_DEFINE(O_WATERFALL, "Waterfall Mist") +OBJ_NAME_DEFINE(O_MISSILE_HARPOON, "Missile Harpoon") +OBJ_NAME_DEFINE(O_MISSILE_FLAME, "Missile Flame") +OBJ_NAME_DEFINE(O_MISSILE_KNIFE, "Missile Knife") +OBJ_NAME_DEFINE(O_GRENADE, "Grenade") +OBJ_NAME_DEFINE(O_HARPOON_BOLT, "Harpoon Bolt") +OBJ_NAME_DEFINE(O_EMBER, "Ember") +OBJ_NAME_DEFINE(O_EMBER_EMITTER, "Ember Emitter") +OBJ_NAME_DEFINE(O_FLAME, "Flame") +OBJ_NAME_DEFINE(O_FLAME_EMITTER, "Flame Emitter") +OBJ_NAME_DEFINE(O_SKYBOX, "Skybox") +OBJ_NAME_DEFINE(O_ALPHABET, "Alphabet") +OBJ_NAME_DEFINE(O_DYING_MONK, "Dying monk") +OBJ_NAME_DEFINE(O_DING_DONG, "Doorbell") +OBJ_NAME_DEFINE(O_LARA_ALARM, "Alarm Bell") +OBJ_NAME_DEFINE(O_MINI_COPTER, "Helicopter 2") +OBJ_NAME_DEFINE(O_WINSTON, "Winston") +OBJ_NAME_DEFINE(O_ASSAULT_DIGITS, "Assault Digits") +OBJ_NAME_DEFINE(O_FINAL_LEVEL_COUNTER, "Final Level Counter") +OBJ_NAME_DEFINE(O_CUT_SHOTGUN, "Shotgun Shower Animation") +OBJ_NAME_DEFINE(O_EARTHQUAKE, "Earthquake") diff --git a/include/libtrx/strings.h b/include/libtrx/strings.h index 3089d31..f7ad174 100644 --- a/include/libtrx/strings.h +++ b/include/libtrx/strings.h @@ -1,18 +1,4 @@ #pragma once -#include -#include -#include - -bool String_EndsWith(const char *str, const char *suffix); -bool String_Equivalent(const char *a, const char *b); - -const char *String_CaseSubstring(const char *subject, const char *pattern); -bool String_Match(const char *subject, const char *pattern); - -bool String_IsEmpty(const char *value); -bool String_ParseBool(const char *value, bool *target); -bool String_ParseInteger(const char *value, int32_t *target); -bool String_ParseDecimal(const char *value, float *target); - -char *String_WordWrap(const char *text, size_t line_length); +#include "./strings/common.h" +#include "./strings/fuzzy_match.h" diff --git a/include/libtrx/strings/common.h b/include/libtrx/strings/common.h new file mode 100644 index 0000000..3089d31 --- /dev/null +++ b/include/libtrx/strings/common.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include + +bool String_EndsWith(const char *str, const char *suffix); +bool String_Equivalent(const char *a, const char *b); + +const char *String_CaseSubstring(const char *subject, const char *pattern); +bool String_Match(const char *subject, const char *pattern); + +bool String_IsEmpty(const char *value); +bool String_ParseBool(const char *value, bool *target); +bool String_ParseInteger(const char *value, int32_t *target); +bool String_ParseDecimal(const char *value, float *target); + +char *String_WordWrap(const char *text, size_t line_length); diff --git a/include/libtrx/strings/fuzzy_match.h b/include/libtrx/strings/fuzzy_match.h new file mode 100644 index 0000000..4cf4f5a --- /dev/null +++ b/include/libtrx/strings/fuzzy_match.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../vector.h" + +#include +#include + +typedef struct { + const char *key; + void *value; + int32_t weight; +} STRING_FUZZY_SOURCE; + +typedef struct { + bool is_full; + int32_t score; +} STRING_FUZZY_SCORE; + +typedef struct { + const char *key; + void *value; + STRING_FUZZY_SCORE score; +} STRING_FUZZY_MATCH; + +// Takes a vector of STRING_FUZZY_SOURCE. +// Returns a vector of STRING_FUZZY_MATCH. +VECTOR *String_FuzzyMatch(const char *user_input, const VECTOR *source); diff --git a/meson.build b/meson.build index b740a2d..96b8981 100644 --- a/meson.build +++ b/meson.build @@ -65,7 +65,7 @@ sources = [ 'src/engine/audio_sample.c', 'src/engine/audio_stream.c', 'src/engine/image.c', - 'src/enum_str.c', + 'src/enum_map.c', 'src/event_manager.c', 'src/filesystem.c', 'src/game/backpack.c', @@ -86,6 +86,7 @@ sources = [ 'src/game/console/common.c', 'src/game/game_string.c', 'src/game/items.c', + 'src/game/objects/names.c', 'src/game/ui/common.c', 'src/game/ui/events.c', 'src/game/ui/widgets/console.c', @@ -114,7 +115,8 @@ sources = [ 'src/json/json_write.c', 'src/log.c', 'src/memory.c', - 'src/strings.c', + 'src/strings/common.c', + 'src/strings/fuzzy_match.c', 'src/vector.c', 'src/virtual_file.c', ] diff --git a/src/config/file.c b/src/config/file.c index 84acb54..096b3be 100644 --- a/src/config/file.c +++ b/src/config/file.c @@ -135,8 +135,7 @@ void ConfigFile_LoadOptions(JSON_OBJECT *root_obj, const CONFIG_OPTION *options) case COT_ENUM: *(int *)opt->target = ConfigFile_ReadEnum( root_obj, M_ResolveOptionName(opt->name), - *(int *)opt->default_value, - (const ENUM_STRING_MAP *)opt->param); + *(int *)opt->default_value, opt->param); } opt++; } @@ -173,7 +172,7 @@ void ConfigFile_DumpOptions(JSON_OBJECT *root_obj, const CONFIG_OPTION *options) case COT_ENUM: ConfigFile_WriteEnum( root_obj, M_ResolveOptionName(opt->name), *(int *)opt->target, - (const ENUM_STRING_MAP *)opt->param); + (const char *)opt->param); break; } opt++; @@ -181,30 +180,18 @@ void ConfigFile_DumpOptions(JSON_OBJECT *root_obj, const CONFIG_OPTION *options) } int ConfigFile_ReadEnum( - JSON_OBJECT *obj, const char *name, int default_value, - const ENUM_STRING_MAP *enum_map) + JSON_OBJECT *const obj, const char *const name, const int default_value, + const char *const enum_name) { const char *value_str = JSON_ObjectGetString(obj, name, NULL); - if (value_str) { - while (enum_map->text) { - if (!strcmp(value_str, enum_map->text)) { - return enum_map->value; - } - enum_map++; - } + if (value_str != NULL) { + return EnumMap_Get(enum_name, value_str, default_value); } return default_value; } void ConfigFile_WriteEnum( - JSON_OBJECT *obj, const char *name, int value, - const ENUM_STRING_MAP *enum_map) + JSON_OBJECT *obj, const char *name, int value, const char *enum_name) { - while (enum_map->text) { - if (enum_map->value == value) { - JSON_ObjectAppendString(obj, name, enum_map->text); - break; - } - enum_map++; - } + JSON_ObjectAppendString(obj, name, EnumMap_ToString(enum_name, value)); } diff --git a/src/enum_map.c b/src/enum_map.c new file mode 100644 index 0000000..ce61027 --- /dev/null +++ b/src/enum_map.c @@ -0,0 +1,99 @@ +#include "enum_map.h" + +#include "memory.h" + +#include +#include + +typedef struct { + char *key; + int32_t value; + UT_hash_handle hh; +} M_ENTRY; + +typedef struct { + char *key; + char *str_value; + UT_hash_handle hh; +} M_INVERSE_ENTRY; + +static M_ENTRY *m_Map = NULL; +static M_INVERSE_ENTRY *m_InverseMap = NULL; + +void EnumMap_Define( + const char *const enum_name, const int32_t enum_value, + const char *const str_value) +{ + { + const size_t key_len = strlen(enum_name) + strlen(str_value) + 2; + char *const key = Memory_Alloc(key_len); + snprintf(key, key_len, "%s|%s", enum_name, str_value); + + M_ENTRY *const entry = Memory_Alloc(sizeof(M_ENTRY)); + entry->key = key; + entry->value = enum_value; + HASH_ADD_KEYPTR(hh, m_Map, entry->key, strlen(entry->key), entry); + } + + { + const size_t key_len = + snprintf(NULL, 0, "%s|%d", enum_name, enum_value) + 1; + char *const key = Memory_Alloc(key_len); + snprintf(key, key_len, "%s|%d", enum_name, enum_value); + + M_INVERSE_ENTRY *const entry = Memory_Alloc(sizeof(M_INVERSE_ENTRY)); + entry->key = key; + entry->str_value = Memory_DupStr(str_value); + HASH_ADD_KEYPTR( + hh, m_InverseMap, entry->key, strlen(entry->key), entry); + } +} + +int32_t EnumMap_Get( + const char *const enum_name, const char *const str_value, + int32_t default_value) +{ + size_t key_len = strlen(enum_name) + strlen(str_value) + 2; + char key[key_len]; + snprintf(key, key_len, "%s|%s", enum_name, str_value); + + M_ENTRY *entry; + HASH_FIND_STR(m_Map, key, entry); + return entry != NULL ? entry->value : default_value; +} + +const char *EnumMap_ToString( + const char *const enum_name, const int32_t enum_value) +{ + size_t key_len = snprintf(NULL, 0, "%s|%d", enum_name, enum_value) + 1; + char key[key_len]; + snprintf(key, key_len, "%s|%d", enum_name, enum_value); + + M_INVERSE_ENTRY *entry; + HASH_FIND_STR(m_InverseMap, key, entry); + return entry != NULL ? entry->str_value : NULL; +} + +void EnumMap_Shutdown(void) +{ + { + M_ENTRY *current, *tmp; + HASH_ITER(hh, m_Map, current, tmp) + { + HASH_DEL(m_Map, current); + Memory_Free(current->key); + Memory_Free(current); + } + } + + { + M_INVERSE_ENTRY *current, *tmp; + HASH_ITER(hh, m_InverseMap, current, tmp) + { + HASH_DEL(m_InverseMap, current); + Memory_Free(current->str_value); + Memory_Free(current->key); + Memory_Free(current); + } + } +} diff --git a/src/enum_str.c b/src/enum_str.c deleted file mode 100644 index e8aa667..0000000 --- a/src/enum_str.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "enum_str.h" - -#include - -int EnumStr_GetImpl( - const ENUM_STRING_MAP *enum_map, const char *const key, - const int default_value) -{ - while (enum_map->text) { - if (!strcmp(key, enum_map->text)) { - return enum_map->value; - } - enum_map++; - } - return default_value; -} diff --git a/src/game/console/cmd/config.c b/src/game/console/cmd/config.c index ef184fc..e752bf7 100644 --- a/src/game/console/cmd/config.c +++ b/src/game/console/cmd/config.c @@ -92,12 +92,9 @@ static bool M_GetCurrentValue( snprintf(target, target_size, "%.2f", *(double *)option->target); break; case COT_ENUM: - for (const ENUM_STRING_MAP *enum_map = option->param; - enum_map->text != NULL; enum_map++) { - if (enum_map->value == *(int32_t *)option->target) { - strncpy(target, enum_map->text, target_size); - } - } + snprintf( + target, target_size, "%s", + EnumMap_ToString(option->param, *(int32_t *)option->target)); break; } return true; @@ -149,16 +146,16 @@ static bool M_SetCurrentValue( break; } - case COT_ENUM: - for (const ENUM_STRING_MAP *enum_map = option->param; - enum_map->text != NULL; enum_map++) { - if (String_Equivalent(enum_map->text, new_value)) { - *(int32_t *)option->target = enum_map->value; - return true; - } + case COT_ENUM: { + const int32_t new_value_typed = + EnumMap_Get(option->param, new_value, -1); + if (new_value_typed != -1) { + *(int32_t *)option->target = new_value_typed; + return true; } break; } + } return false; } diff --git a/src/game/console/cmd/give_item.c b/src/game/console/cmd/give_item.c index a0647cb..ef757b8 100644 --- a/src/game/console/cmd/give_item.c +++ b/src/game/console/cmd/give_item.c @@ -18,7 +18,8 @@ static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx); static bool M_CanTargetObjectPickup(const GAME_OBJECT_ID object_id) { - return Object_IsObjectType(object_id, g_PickupObjects); + return Object_IsObjectType(object_id, g_PickupObjects) + && Object_GetObject(object_id)->loaded; } static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx) diff --git a/src/game/game_string.c b/src/game/game_string.c index ce18f1a..3bf81c3 100644 --- a/src/game/game_string.c +++ b/src/game/game_string.c @@ -8,17 +8,17 @@ typedef struct { char *key; char *value; UT_hash_handle hh; -} STRING_TABLE_ENTRY; +} M_STRING_ENTRY; -static STRING_TABLE_ENTRY *m_StringTable = NULL; +static M_STRING_ENTRY *m_StringTable = NULL; void GameString_Define(const char *key, const char *value) { - STRING_TABLE_ENTRY *entry; + M_STRING_ENTRY *entry; HASH_FIND_STR(m_StringTable, key, entry); if (entry == NULL) { - entry = (STRING_TABLE_ENTRY *)Memory_Alloc(sizeof(STRING_TABLE_ENTRY)); + entry = (M_STRING_ENTRY *)Memory_Alloc(sizeof(M_STRING_ENTRY)); entry->key = Memory_DupStr(key); entry->value = Memory_DupStr(value); HASH_ADD_KEYPTR( @@ -31,21 +31,21 @@ void GameString_Define(const char *key, const char *value) bool GameString_IsKnown(const char *key) { - STRING_TABLE_ENTRY *entry; + M_STRING_ENTRY *entry; HASH_FIND_STR(m_StringTable, key, entry); return entry != NULL; } const char *GameString_Get(const char *key) { - STRING_TABLE_ENTRY *entry; + M_STRING_ENTRY *entry; HASH_FIND_STR(m_StringTable, key, entry); return entry ? entry->value : NULL; } void GameString_Clear(void) { - STRING_TABLE_ENTRY *entry, *tmp; + M_STRING_ENTRY *entry, *tmp; HASH_ITER(hh, m_StringTable, entry, tmp) { diff --git a/src/game/objects/names.c b/src/game/objects/names.c new file mode 100644 index 0000000..bbe22e0 --- /dev/null +++ b/src/game/objects/names.c @@ -0,0 +1,81 @@ +#include "game/objects/names.h" + +#include "game/game_string.h" +#include "memory.h" +#include "strings/fuzzy_match.h" + +#include + +typedef struct { + char *name; +} M_NAME_ENTRY; + +static M_NAME_ENTRY m_NamesTable[O_NUMBER_OF] = { 0 }; + +static void M_ClearNames(void); + +static void M_ClearNames(void) +{ + for (GAME_OBJECT_ID object_id = 0; object_id < O_NUMBER_OF; object_id++) { + M_NAME_ENTRY *const entry = &m_NamesTable[object_id]; + Memory_FreePointer(&entry->name); + } +} + +void Object_SetName(const GAME_OBJECT_ID object_id, const char *const name) +{ + M_NAME_ENTRY *const entry = &m_NamesTable[object_id]; + Memory_FreePointer(&entry->name); + assert(name != NULL); + entry->name = Memory_DupStr(name); +} + +const char *Object_GetName(const GAME_OBJECT_ID object_id) +{ + M_NAME_ENTRY *const entry = &m_NamesTable[object_id]; + return entry != NULL ? entry->name : NULL; +} + +void Object_ResetNames(void) +{ + M_ClearNames(); + +#define OBJ_NAME_DEFINE(object_id, name) Object_SetName(object_id, name); +#include "game/objects/names.def" +} + +GAME_OBJECT_ID *Object_IdsFromName( + const char *user_input, int32_t *out_match_count, + bool (*filter)(GAME_OBJECT_ID)) +{ + VECTOR *source = Vector_Create(sizeof(STRING_FUZZY_SOURCE)); + + for (GAME_OBJECT_ID object_id = 0; object_id < O_NUMBER_OF; object_id++) { + if (filter != NULL && !filter(object_id)) { + continue; + } + STRING_FUZZY_SOURCE source_item = { + .key = Object_GetName(object_id), + .value = (void *)(intptr_t)object_id, + .weight = 1, + }; + Vector_Add(source, &source_item); + } + + VECTOR *matches = String_FuzzyMatch(user_input, source); + GAME_OBJECT_ID *results = + Memory_Alloc(sizeof(GAME_OBJECT_ID) * (matches->count + 1)); + for (int32_t i = 0; i < matches->count; i++) { + const STRING_FUZZY_MATCH *const match = Vector_Get(matches, i); + results[i] = (GAME_OBJECT_ID)(intptr_t)match->value; + } + results[matches->count] = NO_OBJECT; + if (out_match_count != NULL) { + *out_match_count = matches->count; + } + + Vector_Free(matches); + matches = NULL; + + return results; +} diff --git a/src/strings.c b/src/strings/common.c similarity index 99% rename from src/strings.c rename to src/strings/common.c index fc544bf..fcde3a4 100644 --- a/src/strings.c +++ b/src/strings/common.c @@ -1,7 +1,6 @@ -#include "strings.h" - #include "log.h" #include "memory.h" +#include "strings.h" #include "utils.h" #include diff --git a/src/strings/fuzzy_match.c b/src/strings/fuzzy_match.c new file mode 100644 index 0000000..4578bd3 --- /dev/null +++ b/src/strings/fuzzy_match.c @@ -0,0 +1,136 @@ +#include "strings/fuzzy_match.h" + +#include "memory.h" +#include "strings/common.h" + +#include +#include + +#define FULL_MATCH_SCORE_BONUS 100 +#define WORD_MATCH_SCORE_BONUS 50 +#define PERCENT_MATCH_SCORE 50 +#define LETTER_MATCH_SCORE_BONUS 1 + +static STRING_FUZZY_SCORE M_GetScore( + const char *user_input, const char *reference, int32_t weight); +static void M_DiscardNonFullMatches(VECTOR *matches); +static void M_SortMatches(VECTOR *matches); +static void M_DiscardDuplicateMatches(VECTOR *matches); + +static STRING_FUZZY_SCORE M_GetScore( + const char *const user_input, const char *const reference, + const int32_t weight) +{ + const int32_t percent_score = + PERCENT_MATCH_SCORE * strlen(user_input) / strlen(reference); + const int32_t letter_score = LETTER_MATCH_SCORE_BONUS * strlen(user_input); + + char *word_regex = Memory_Alloc(strlen(user_input) + 20); + char *full_regex = Memory_Alloc(strlen(user_input) + 20); + sprintf(word_regex, "\\b%s\\b", user_input); + sprintf(full_regex, "^\\s*%s\\s*$", user_input); + + // Assume a partial match + bool is_full = false; + int32_t score = letter_score + percent_score; + if (String_Match(reference, full_regex)) { + // Got a full match + is_full = true; + score += FULL_MATCH_SCORE_BONUS; + } else if (String_Match(reference, word_regex)) { + // Got a word match + score += WORD_MATCH_SCORE_BONUS; + } else if (String_CaseSubstring(reference, user_input) == NULL) { + // No match. + score = 0; + } + + Memory_FreePointer(&word_regex); + Memory_FreePointer(&full_regex); + + return (STRING_FUZZY_SCORE) { + .is_full = is_full, + .score = score * weight, + }; +} + +static void M_DiscardNonFullMatches(VECTOR *const matches) +{ + bool has_full_match = false; + for (int32_t i = 0; i < matches->count; i++) { + const STRING_FUZZY_MATCH *const match = Vector_Get(matches, i); + if (match->score.is_full) { + has_full_match = true; + } + } + if (has_full_match) { + for (int32_t i = matches->count - 1; i >= 0; i--) { + const STRING_FUZZY_MATCH *const match = Vector_Get(matches, i); + if (!match->score.is_full) { + Vector_RemoveAt(matches, i); + } + } + } +} + +static void M_SortMatches(VECTOR *const matches) +{ + // sort by match length so that best-matching results appear first + for (int32_t i = 0; i < matches->count; i++) { + const STRING_FUZZY_MATCH *const match_1 = Vector_Get(matches, i); + for (int32_t j = i + 1; j < matches->count; j++) { + const STRING_FUZZY_MATCH *const match_2 = Vector_Get(matches, j); + if (match_1->score.score < match_2->score.score) { + Vector_Swap(matches, i, j); + } + } + } +} + +static void M_DiscardDuplicateMatches(VECTOR *const matches) +{ + for (int32_t i = matches->count - 1; i >= 0; i--) { + const STRING_FUZZY_MATCH *const match = Vector_Get(matches, i); + bool is_unique = true; + for (int32_t j = 0; j < matches->count; j++) { + const STRING_FUZZY_MATCH *const other_match = + Vector_Get(matches, j); + if (j != i && match->value == other_match->value) { + is_unique = false; + break; + } + } + if (!is_unique) { + Vector_RemoveAt(matches, i); + } + } +} + +VECTOR *String_FuzzyMatch(const char *user_input, const VECTOR *const source) +{ + VECTOR *matches = Vector_Create(sizeof(STRING_FUZZY_MATCH)); + + for (int32_t i = 0; i < source->count; i++) { + const STRING_FUZZY_SOURCE *const source_item = + Vector_Get((VECTOR *)source, i); + const STRING_FUZZY_SCORE score = + M_GetScore(user_input, source_item->key, source_item->weight); + + if (score.score <= 0) { + continue; + } + + STRING_FUZZY_MATCH match = { + .key = source_item->key, + .value = source_item->value, + .score = score, + }; + Vector_Add(matches, &match); + } + + M_DiscardNonFullMatches(matches); + M_DiscardDuplicateMatches(matches); + M_SortMatches(matches); + + return matches; +}