#include "framework.h" #include "gui.h" #include "animation.h" #include "control/control.h" #include "lara_fire.h" #include "gameflow.h" #include "Sound\sound.h" #include "savegame.h" #include "Lara.h" #include "camera.h" #include "spotcam.h" #include "input.h" #include "configuration.h" #include "lara_one_gun.h" #include "lara_two_guns.h" #include "level.h" #include "input.h" #include "pickup.h" #include "Renderer11.h" #include "items.h" using namespace TEN::Renderer; GuiController g_Gui; const char* optmessages[] = { STRING_USE, STRING_CHOOSE_AMMO, STRING_COMBINE, STRING_SEPARE, STRING_EQUIP, STRING_COMBINE_WITH, STRING_LOAD_GAME, STRING_SAVE_GAME, STRING_EXAMINE, STRING_STATISTICS, STRING_CHOOSE_WEAPON, "" // STRING_READ_DIARY }; const char* controlmsgs[] = { STRING_CONTROLS_MOVE_FORWARD, STRING_CONTROLS_MOVE_BACKWARD, STRING_CONTROLS_MOVE_LEFT, STRING_CONTROLS_MOVE_RIGHT, STRING_CONTROLS_DUCK, STRING_CONTROLS_DASH, STRING_CONTROLS_WALK, STRING_CONTROLS_JUMP, STRING_CONTROLS_ACTION, STRING_CONTROLS_DRAW_WEAPON, STRING_CONTROLS_USE_FLARE, STRING_CONTROLS_LOOK, STRING_CONTROLS_ROLL, STRING_CONTROLS_INVENTORY, STRING_CONTROLS_STEP_LEFT, STRING_CONTROLS_STEP_RIGHT }; #define font_height 25 #define max_combines 60 #define phd_winxmax g_Configuration.Width #define phd_winymax g_Configuration.Height #define phd_centerx 400 #define phd_centery phd_winymax / 2 /* if you wanna add an object to the inventory, edit the InventoryObjectTypes array then edit THIS inventry_objects_list array with the object IN THE RIGHT PLACE the #s MUST MATCH. i.e if uzi item is #2 in InventoryObjectTypes (starting count from 0), IT HAS TO BE THE THIRD ELEMENT IN inventry_objects_list. thank you. note: don't forget to add your object to the proper list construction function and if it's a weapon, add its ammo handling shit. (look at vars at the beginning of the file) if it's combineable, add its things to the combine_table and don't forget to increment max_combines!! */ CombineList combine_table[max_combines] = { {combine_revolver_lasersight, INV_OBJECT_REVOLVER, INV_OBJECT_LASERSIGHT, INV_OBJECT_REVOLVER_LASER}, {combine_crossbow_lasersight, INV_OBJECT_CROSSBOW, INV_OBJECT_LASERSIGHT, INV_OBJECT_CROSSBOW_LASER}, {combine_HK_SILENCER, INV_OBJECT_HK, INV_OBJECT_SILENCER, INV_OBJECT_HK_SILENCER}, {combine_PuzzleItem1, INV_OBJECT_PUZZLE1_COMBO1, INV_OBJECT_PUZZLE1_COMBO2, INV_OBJECT_PUZZLE1}, {combine_PuzzleItem2, INV_OBJECT_PUZZLE2_COMBO1, INV_OBJECT_PUZZLE2_COMBO2, INV_OBJECT_PUZZLE2}, {combine_PuzzleItem3, INV_OBJECT_PUZZLE3_COMBO1, INV_OBJECT_PUZZLE3_COMBO2, INV_OBJECT_PUZZLE3}, {combine_PuzzleItem4, INV_OBJECT_PUZZLE4_COMBO1, INV_OBJECT_PUZZLE4_COMBO2, INV_OBJECT_PUZZLE4}, {combine_PuzzleItem5, INV_OBJECT_PUZZLE5_COMBO1, INV_OBJECT_PUZZLE5_COMBO2, INV_OBJECT_PUZZLE5}, {combine_PuzzleItem6, INV_OBJECT_PUZZLE6_COMBO1, INV_OBJECT_PUZZLE6_COMBO2, INV_OBJECT_PUZZLE6}, {combine_PuzzleItem7, INV_OBJECT_PUZZLE7_COMBO1, INV_OBJECT_PUZZLE7_COMBO2, INV_OBJECT_PUZZLE7}, {combine_PuzzleItem8, INV_OBJECT_PUZZLE8_COMBO1, INV_OBJECT_PUZZLE8_COMBO2, INV_OBJECT_PUZZLE8}, {combine_PuzzleItem9, INV_OBJECT_PUZZLE9_COMBO1, INV_OBJECT_PUZZLE9_COMBO2, INV_OBJECT_PUZZLE9}, {combine_PuzzleItem10, INV_OBJECT_PUZZLE10_COMBO1, INV_OBJECT_PUZZLE10_COMBO2, INV_OBJECT_PUZZLE10}, {combine_PuzzleItem11, INV_OBJECT_PUZZLE11_COMBO1, INV_OBJECT_PUZZLE11_COMBO2, INV_OBJECT_PUZZLE11}, {combine_PuzzleItem12, INV_OBJECT_PUZZLE12_COMBO1, INV_OBJECT_PUZZLE12_COMBO2, INV_OBJECT_PUZZLE12}, {combine_PuzzleItem13, INV_OBJECT_PUZZLE13_COMBO1, INV_OBJECT_PUZZLE13_COMBO2, INV_OBJECT_PUZZLE13}, {combine_PuzzleItem14, INV_OBJECT_PUZZLE14_COMBO1, INV_OBJECT_PUZZLE14_COMBO2, INV_OBJECT_PUZZLE14}, {combine_PuzzleItem15, INV_OBJECT_PUZZLE15_COMBO1, INV_OBJECT_PUZZLE15_COMBO2, INV_OBJECT_PUZZLE15}, {combine_PuzzleItem16, INV_OBJECT_PUZZLE16_COMBO1, INV_OBJECT_PUZZLE16_COMBO2, INV_OBJECT_PUZZLE16}, {combine_KeyItem1, INV_OBJECT_KEY1_COMBO1, INV_OBJECT_KEY1_COMBO2, INV_OBJECT_KEY1}, {combine_KeyItem2, INV_OBJECT_KEY2_COMBO1, INV_OBJECT_KEY2_COMBO2, INV_OBJECT_KEY2}, {combine_KeyItem3, INV_OBJECT_KEY3_COMBO1, INV_OBJECT_KEY3_COMBO2, INV_OBJECT_KEY3}, {combine_KeyItem4, INV_OBJECT_KEY4_COMBO1, INV_OBJECT_KEY4_COMBO2, INV_OBJECT_KEY4}, {combine_KeyItem5, INV_OBJECT_KEY5_COMBO1, INV_OBJECT_KEY5_COMBO2, INV_OBJECT_KEY5}, {combine_KeyItem6, INV_OBJECT_KEY6_COMBO1, INV_OBJECT_KEY6_COMBO2, INV_OBJECT_KEY6}, {combine_KeyItem7, INV_OBJECT_KEY7_COMBO1, INV_OBJECT_KEY7_COMBO2, INV_OBJECT_KEY7}, {combine_KeyItem8, INV_OBJECT_KEY8_COMBO1, INV_OBJECT_KEY8_COMBO2, INV_OBJECT_KEY8}, {combine_KeyItem9, INV_OBJECT_KEY9_COMBO1, INV_OBJECT_KEY9_COMBO2, INV_OBJECT_KEY9}, {combine_KeyItem10, INV_OBJECT_KEY10_COMBO1, INV_OBJECT_KEY10_COMBO2, INV_OBJECT_KEY10}, {combine_KeyItem11, INV_OBJECT_KEY11_COMBO1, INV_OBJECT_KEY11_COMBO2, INV_OBJECT_KEY11}, {combine_KeyItem12, INV_OBJECT_KEY12_COMBO1, INV_OBJECT_KEY12_COMBO2, INV_OBJECT_KEY12}, {combine_KeyItem13, INV_OBJECT_KEY13_COMBO1, INV_OBJECT_KEY13_COMBO2, INV_OBJECT_KEY13}, {combine_KeyItem14, INV_OBJECT_KEY14_COMBO1, INV_OBJECT_KEY14_COMBO2, INV_OBJECT_KEY14}, {combine_KeyItem15, INV_OBJECT_KEY15_COMBO1, INV_OBJECT_KEY15_COMBO2, INV_OBJECT_KEY15}, {combine_KeyItem16, INV_OBJECT_KEY16_COMBO1, INV_OBJECT_KEY16_COMBO2, INV_OBJECT_KEY16}, {combine_PickupItem1, INV_OBJECT_PICKUP1_COMBO1, INV_OBJECT_PICKUP1_COMBO2, INV_OBJECT_PICKUP1}, {combine_PickupItem2, INV_OBJECT_PICKUP2_COMBO1, INV_OBJECT_PICKUP2_COMBO2, INV_OBJECT_PICKUP2}, {combine_PickupItem3, INV_OBJECT_PICKUP3_COMBO1, INV_OBJECT_PICKUP3_COMBO2, INV_OBJECT_PICKUP3}, {combine_PickupItem4, INV_OBJECT_PICKUP4_COMBO1, INV_OBJECT_PICKUP4_COMBO2, INV_OBJECT_PICKUP4}, {combine_PickupItem5, INV_OBJECT_PICKUP5_COMBO1, INV_OBJECT_PICKUP5_COMBO2, INV_OBJECT_PICKUP5}, {combine_PickupItem6, INV_OBJECT_PICKUP6_COMBO1, INV_OBJECT_PICKUP6_COMBO2, INV_OBJECT_PICKUP6}, {combine_PickupItem7, INV_OBJECT_PICKUP7_COMBO1, INV_OBJECT_PICKUP7_COMBO2, INV_OBJECT_PICKUP7}, {combine_PickupItem8, INV_OBJECT_PICKUP8_COMBO1, INV_OBJECT_PICKUP8_COMBO2, INV_OBJECT_PICKUP8}, {combine_PickupItem9, INV_OBJECT_PICKUP9_COMBO1, INV_OBJECT_PICKUP9_COMBO2, INV_OBJECT_PICKUP9}, {combine_PickupItem10, INV_OBJECT_PICKUP10_COMBO1, INV_OBJECT_PICKUP10_COMBO2, INV_OBJECT_PICKUP10}, {combine_PickupItem11, INV_OBJECT_PICKUP11_COMBO1, INV_OBJECT_PICKUP11_COMBO2, INV_OBJECT_PICKUP11}, {combine_PickupItem12, INV_OBJECT_PICKUP12_COMBO1, INV_OBJECT_PICKUP12_COMBO2, INV_OBJECT_PICKUP12}, {combine_PickupItem13, INV_OBJECT_PICKUP13_COMBO1, INV_OBJECT_PICKUP13_COMBO2, INV_OBJECT_PICKUP13}, {combine_PickupItem14, INV_OBJECT_PICKUP14_COMBO1, INV_OBJECT_PICKUP14_COMBO2, INV_OBJECT_PICKUP14}, {combine_PickupItem15, INV_OBJECT_PICKUP15_COMBO1, INV_OBJECT_PICKUP15_COMBO2, INV_OBJECT_PICKUP15}, {combine_PickupItem16, INV_OBJECT_PICKUP16_COMBO1, INV_OBJECT_PICKUP16_COMBO2, INV_OBJECT_PICKUP16}, {combine_Examine1, INV_OBJECT_EXAMINE1_COMBO1, INV_OBJECT_EXAMINE1_COMBO2, INV_OBJECT_EXAMINE1}, {combine_Examine2, INV_OBJECT_EXAMINE2_COMBO1, INV_OBJECT_EXAMINE2_COMBO2, INV_OBJECT_EXAMINE2}, {combine_Examine3, INV_OBJECT_EXAMINE3_COMBO1, INV_OBJECT_EXAMINE3_COMBO2, INV_OBJECT_EXAMINE3}, {combine_Examine4, INV_OBJECT_EXAMINE4_COMBO1, INV_OBJECT_EXAMINE4_COMBO2, INV_OBJECT_EXAMINE4}, {combine_Examine5, INV_OBJECT_EXAMINE5_COMBO1, INV_OBJECT_EXAMINE5_COMBO2, INV_OBJECT_EXAMINE5}, {combine_Examine6, INV_OBJECT_EXAMINE6_COMBO1, INV_OBJECT_EXAMINE6_COMBO2, INV_OBJECT_EXAMINE6}, {combine_Examine7, INV_OBJECT_EXAMINE7_COMBO1, INV_OBJECT_EXAMINE7_COMBO2, INV_OBJECT_EXAMINE7}, {combine_Examine8, INV_OBJECT_EXAMINE8_COMBO1, INV_OBJECT_EXAMINE8_COMBO2, INV_OBJECT_EXAMINE8}, {combine_ClockWorkBeetle, INV_OBJECT_BEETLE_PART1, INV_OBJECT_BEETLE_PART2, INV_OBJECT_BEETLE} }; InventoryObject inventry_objects_list[INVENTORY_TABLE_SIZE] = { // Weapons {ID_PISTOLS_ITEM, 6, 0.5f, ANGLE(90), ANGLE(243.69873046875f), ANGLE(276.1328125), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_PISTOLS, STRING_PISTOLS, NO_MESH_BITS, INV_ROT_Y}, {ID_PISTOLS_AMMO_ITEM, 4, 0.5f, 0, ANGLE(90), 0, OPT_USE, STRING_PISTOLS_AMMO, NO_MESH_BITS, INV_ROT_Y}, {ID_UZI_ITEM, -4, 0.5f, ANGLE(-90) , ANGLE(135), ANGLE(90), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_UZI, STRING_UZI , NO_MESH_BITS, INV_ROT_Y}, {ID_UZI_AMMO_ITEM, 5, 0.5f, 0, 5384, 0, OPT_USE, STRING_UZI_AMMO, NO_MESH_BITS, INV_ROT_Y}, {ID_SHOTGUN_ITEM, -6, 0.8f, ANGLE(-20), ANGLE(270), ANGLE(45), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_SHOTGUN, STRING_SHOTGUN, 1, INV_ROT_Y}, {ID_SHOTGUN_AMMO1_ITEM, 0, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_SHOTGUN_AMMO1, NO_MESH_BITS, INV_ROT_Y}, {ID_SHOTGUN_AMMO2_ITEM, 0, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_SHOTGUN_AMMO2, NO_MESH_BITS, INV_ROT_Y}, {ID_REVOLVER_ITEM, 0, 0.5f, ANGLE(-90), ANGLE(60), ANGLE(85), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_REVOLVER, STRING_REVOLVER , 1, INV_ROT_Y}, {ID_REVOLVER_AMMO_ITEM, 0, 0.5f, ANGLE(90), ANGLE(-16), 0, OPT_USE, STRING_REVOLVER_AMMO, NO_MESH_BITS, INV_ROT_Y}, {ID_REVOLVER_ITEM, 0, 0.5f, ANGLE(90), ANGLE(60), ANGLE(85), OPT_EQUIP | OPT_SEPERATABLE | OPT_CHOOSEAMMO_REVOLVER, STRING_REVOLVER_LASER, 3, INV_ROT_Y}, {ID_CROSSBOW_ITEM, 0, 0.5f, ANGLE(-90), ANGLE(33), 0, OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_CROSSBOW, STRING_CROSSBOW, 1, INV_ROT_Y}, {ID_CROSSBOW_ITEM, 0, 0.5f, ANGLE(-90), ANGLE(33), 0, OPT_EQUIP | OPT_SEPERATABLE | OPT_CHOOSEAMMO_CROSSBOW, STRING_CROSSBOW_LASER, 3, INV_ROT_Y}, {ID_CROSSBOW_AMMO1_ITEM, 0, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_CROSSBOW_AMMO1, NO_MESH_BITS, INV_ROT_Y}, {ID_CROSSBOW_AMMO2_ITEM, 0, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_CROSSBOW_AMMO1, NO_MESH_BITS, INV_ROT_Y}, {ID_CROSSBOW_AMMO3_ITEM, 0, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_CROSSBOW_AMMO1, NO_MESH_BITS, INV_ROT_Y}, {ID_HK_ITEM, 0, 0.5f, ANGLE(0), ANGLE(280), 0, OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_HK, STRING_HK, 1, INV_ROT_Y}, {ID_HK_ITEM, 0, 0.5f, ANGLE(-45), ANGLE(280), 0, OPT_EQUIP | OPT_SEPERATABLE | OPT_CHOOSEAMMO_HK, STRING_HK_SILENCED, NO_MESH_BITS, INV_ROT_Y}, {ID_HK_AMMO_ITEM, 3, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_HK_AMMO, 2}, {ID_GRENADE_GUN_ITEM, 0, 0.5f, ANGLE(90), 0, ANGLE(65), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_GRENADEGUN, STRING_GRENADE_LAUNCHER, NO_MESH_BITS, INV_ROT_Y}, {ID_GRENADE_AMMO1_ITEM, 3, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_GRENADE_AMMO1, NO_MESH_BITS, INV_ROT_Y}, {ID_GRENADE_AMMO2_ITEM, 3, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_GRENADE_AMMO2, NO_MESH_BITS, INV_ROT_Y}, {ID_GRENADE_AMMO3_ITEM, 3, 0.5f, ANGLE(90), 0, 0, OPT_USE, STRING_GRENADE_AMMO3, NO_MESH_BITS, INV_ROT_Y}, {ID_HARPOON_ITEM, 0, 0.5f, 0, ANGLE(-65), ANGLE(-20), OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_HARPOON, STRING_HARPOON_GUN, NO_MESH_BITS, INV_ROT_Y}, {ID_HARPOON_AMMO_ITEM, 3, 0.5f, 0, ANGLE(15), 0, OPT_USE, STRING_HARPOON_AMMO, NO_MESH_BITS, INV_ROT_Y}, {ID_ROCKET_LAUNCHER_ITEM, 0, 0.5f, ANGLE(180), ANGLE(80), 0, OPT_EQUIP | OPT_COMBINABLE | OPT_CHOOSEAMMO_ROCKET, STRING_ROCKET_LAUNCHER, NO_MESH_BITS, INV_ROT_Y}, {ID_ROCKET_LAUNCHER_AMMO_ITEM, 3, 0.5f, ANGLE(90), 0, ANGLE(15), OPT_USE, STRING_ROCKET_AMMO, NO_MESH_BITS, INV_ROT_Y}, // Misc {ID_LASERSIGHT_ITEM, 2, 0.5f, ANGLE(90), ANGLE(10), 0, OPT_USE | OPT_COMBINABLE, STRING_LASERSIGHT, NO_MESH_BITS, INV_ROT_Y}, {ID_SILENCER_ITEM, 1, 0.5f, 0, ANGLE(10), 0, OPT_USE | OPT_COMBINABLE, STRING_SILENCER, NO_MESH_BITS, INV_ROT_Y}, {ID_BIGMEDI_ITEM, 2, 0.7f, ANGLE(180), 0, 0, OPT_USE, STRING_LARGE_MEDIPACK, NO_MESH_BITS, INV_ROT_Y}, {ID_SMALLMEDI_ITEM, 0, 0.7f, ANGLE(180), ANGLE(112), 0, OPT_USE, STRING_SMALL_MEDIPACK, NO_MESH_BITS, INV_ROT_Y}, {ID_BINOCULARS_ITEM, -1, 0.5f, ANGLE(180), ANGLE(10), 0, OPT_USE, STRING_BINOCULARS, NO_MESH_BITS, INV_ROT_Y}, {ID_FLARE_INV_ITEM, 52, 0.8f, ANGLE(0), 0, 0, OPT_USE, STRING_FLARES, NO_MESH_BITS, INV_ROT_Y}, {ID_TIMEX_ITEM, 2, 0.4f, 0, 0, 0, OPT_STATS, STRING_TIMEX, NO_MESH_BITS, INV_ROT_Y}, {ID_PC_LOAD_INV_ITEM, 52, 0.3f, ANGLE(180), 0, 0, OPT_LOAD, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PC_LOAD_SAVE_ITEM, 52, 0.3f, ANGLE(180), 0, 0, OPT_SAVE, STRING_SAVE_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_BURNING_TORCH_ITEM, 14, 0.5f, 0, ANGLE(90), 0, OPT_USE, STRING_TORCH, NO_MESH_BITS, INV_ROT_Y}, {ID_CROWBAR_ITEM, 4, 0.5f, 0, ANGLE(90), 0, OPT_USE, STRING_CROWBAR, NO_MESH_BITS, INV_ROT_Y}, {ID_DIARY_ITEM, 0, 0.3f, ANGLE(180), 0, 0, OPT_DIARY, STRING_DIARY, NO_MESH_BITS, INV_ROT_Y}, {ID_COMPASS_ITEM, -14, 0.5f, 0, 0, 0, 0, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_CLOCKWORK_BEETLE, 14, 0.5f, 0, 0, 0, OPT_USE, STRING_CLOCKWORK_BEETLE, NO_MESH_BITS, INV_ROT_Y}, {ID_CLOCKWORK_BEETLE_COMBO1, 18, 0.5f, 0, 0, 0, OPT_COMBINABLE, STRING_CLOCKWORK_BEETLE_COMBO1, NO_MESH_BITS, INV_ROT_Y}, {ID_CLOCKWORK_BEETLE_COMBO2, 14, 0.5f, 0, 0, 0, OPT_COMBINABLE, STRING_CLOCKWORK_BEETLE_COMBO2, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN1_EMPTY, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_SMALL_EMPTY, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN1_1, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_SMALL_1, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN1_2, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_SMALL_2, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN1_3, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_SMALL_3, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_EMPTY, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_EMPTY, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_1, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_1, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_2, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_2, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_3, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_3, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_4, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_4, NO_MESH_BITS, INV_ROT_Y}, {ID_WATERSKIN2_5, 2, 0.5f, 0, ANGLE(285), 0, OPT_USE | OPT_COMBINABLE, STRING_WATERSKIN_LARGE_5, NO_MESH_BITS, INV_ROT_Y}, {ID_OPEN_DIARY_ITEM, 0, 0.9f, ANGLE(90), 0, 0, 0, 0, 0, 0}, // Puzzles {ID_PUZZLE_ITEM1, 14, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM2, 14, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM3, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM4, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM5, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM6, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM7, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM8, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM9, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM10, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM11, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM12, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM13, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM14, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM15, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM16, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Puzzle combos {ID_PUZZLE_ITEM1_COMBO1, 18, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM1_COMBO2, 18, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM2_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM2_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM3_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM3_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM4_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM4_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM5_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM5_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM6_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM6_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM7_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM7_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM8_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM8_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM9_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM9_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM10_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM10_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM11_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM11_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM12_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM12_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM13_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM13_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM14_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM14_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM15_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM15_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM16_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PUZZLE_ITEM16_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Keys {ID_KEY_ITEM1, 14, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM2, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM3, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM4, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM5, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM6, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM7, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM8, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM9, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM10, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM11, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM12, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM13, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM14, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM15, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM16, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Key combos {ID_KEY_ITEM1_COMBO1, 18, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM1_COMBO2, 18, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM2_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM2_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM3_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM3_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM4_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM4_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM5_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM5_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM6_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM6_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM7_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM7_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM8_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM8_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM9_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM9_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM10_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM10_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM11_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM11_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM12_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM12_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM13_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM13_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM14_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM14_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM15_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM15_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM16_COMBO1, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_KEY_ITEM16_COMBO2, 8, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Pickups {ID_PICKUP_ITEM1, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM2, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM3, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM4, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM5, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM6, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM7, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM8, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM9, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM10, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM11, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM12, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM13, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM14, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM15, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM16, 8, 0.5f, 0, 0, 0, OPT_USE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Pickup combos {ID_PICKUP_ITEM1_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM1_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM2_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM2_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM3_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM3_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM4_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM4_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM5_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM5_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM6_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM6_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM7_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM7_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM8_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM8_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM9_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM9_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM10_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM10_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM11_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM11_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM12_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM12_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM13_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM13_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM14_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM14_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM15_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM15_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM16_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_PICKUP_ITEM16_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Examines {ID_EXAMINE1, 4, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE2, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE3, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE4, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE5, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE6, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE7, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE8, 14, 0.5f, 0, 0, 0, OPT_EXAMINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, // Examines combos {ID_EXAMINE1_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE1_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE2_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE2_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE3_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE3_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE4_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE4_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE5_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE5_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE6_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE6_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE7_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE7_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE8_COMBO1, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, {ID_EXAMINE8_COMBO2, 14, 0.5f, 0, 0, 0, OPT_USE | OPT_COMBINABLE, STRING_LOAD_GAME, NO_MESH_BITS, INV_ROT_Y}, }; TitleSettings GuiController::GetCurrentSettings() { return CurrentSettings; } InventoryRing* GuiController::GetRings(char num) { return rings[num]; } short GuiController::GetSelectedOption() { return selected_option; } Menu GuiController::GetMenuToDisplay() { return menu_to_display; } void GuiController::SetSelectedOption(short menu) { selected_option = menu; } void GuiController::SetMenuToDisplay(Menu menu) { menu_to_display = menu; } InventoryMode GuiController::GetInventoryMode() { return invMode; } void GuiController::SetInventoryMode(InventoryMode mode) { invMode = mode; } void GuiController::SetInventoryItemChosen(int num) { inventoryItemChosen = num; } int GuiController::GetInventoryItemChosen() { return inventoryItemChosen; } void GuiController::SetEnterInventory(int num) { enterInventory = num; } int GuiController::GetEnterInventory() { return enterInventory; } int GuiController::GetLastInventoryItem() { return lastInvItem; } void GuiController::DrawInventory() { g_Renderer.renderInventory(); } void GuiController::ClearInputVariables(bool flag) { goUp = goDown = goRight = goLeft = goSelect = goDeselect = 0; if (flag) return; else //don't wanna make another function for the rest { dbUp = dbDown = dbRight = dbLeft = dbSelect = dbDeselect = 0; rptRight = rptLeft = 0; } } void GuiController::DoDebouncedInput() { ClearInputVariables(1); if (TrInput & IN_LEFT) { if (rptLeft >= 8) goLeft = 1; else rptLeft++; if (!dbLeft) goLeft = 1; dbLeft = 1; } else { dbLeft = 0; rptLeft = 0; } if (TrInput & IN_RIGHT) { if (rptRight >= 8) goRight = 1; else rptRight++; if (!dbRight) goRight = 1; dbRight = 1; } else { dbRight = 0; rptRight = 0; } if (TrInput & IN_FORWARD) { if (!dbUp) goUp = 1; dbUp = 1; } else dbUp = 0; if (TrInput & IN_BACK) { if (!dbDown) goDown = 1; dbDown = 1; } else dbDown = 0; if (TrInput & IN_ACTION || TrInput & IN_SELECT) { dbSelect = 1; if (invMode == InventoryMode::Save) { if (!stop_killing_me_you_dumb_input_system) { goSelect = TrInput & IN_SAVE ? 0 : 1; dbSelect = !goSelect; stop_killing_me_you_dumb_input_system = dbSelect; } } else if (invMode == InventoryMode::Load) { if (!stop_killing_me_you_dumb_input_system) { goSelect = TrInput & IN_LOAD ? 0 : 1; dbSelect = !goSelect; stop_killing_me_you_dumb_input_system = dbSelect; } } } else { if (dbSelect == 1 && !stop_killing_me_you_dumb_input_system) goSelect = 1; dbSelect = 0; stop_killing_me_you_dumb_input_system = 0; } if ((TrInput & IN_DESELECT)) dbDeselect = 1; else { if (dbDeselect == 1 && !stop_killing_me_you_dumb_input_system2) goDeselect = 1; dbDeselect = 0; stop_killing_me_you_dumb_input_system2 = 0; } } InventoryResult GuiController::TitleOptions() { auto ret = InventoryResult::None; static short selected_option_bak; /*stuff for credits go here!*/ switch (menu_to_display) { case Menu::Title: option_count = 3; break; case Menu::SelectLevel: ret = InventoryResult::None; option_count = g_GameFlow->GetNumLevels() - 2; break; case Menu::LoadGame: option_count = SAVEGAME_MAX - 1; break; case Menu::Options: option_count = 2; break; case Menu::Display: option_count = 6; HandleDisplaySettingsInput(0); break; case Menu::Controls: option_count = 17; HandleControlSettingsInput(0); break; case Menu::Sound: option_count = 4; HandleSoundSettingsInput(0); break; } DoDebouncedInput(); if (menu_to_display == Menu::Title || menu_to_display == Menu::SelectLevel || menu_to_display == Menu::LoadGame || menu_to_display == Menu::Options) { if (goUp) { if (selected_option <= 0) selected_option += option_count; else selected_option--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDown) { if (selected_option < option_count) selected_option++; else selected_option -= option_count; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDeselect && menu_to_display != Menu::Title) { menu_to_display = Menu::Title; selected_option = selected_option_bak; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } } if (goSelect) { if (menu_to_display == Menu::Title) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); switch (selected_option) { case 0: if (g_GameFlow->PlayAnyLevel) { selected_option_bak = selected_option; selected_option = 0; menu_to_display = Menu::SelectLevel; } else ret = InventoryResult::NewGame; break; case 1: selected_option_bak = selected_option; selected_option = 0; menu_to_display = Menu::LoadGame; break; case 2: selected_option_bak = selected_option; selected_option = 0; menu_to_display = Menu::Options; break; case 3: ret = InventoryResult::ExitGame; break; } } else if (menu_to_display == Menu::SelectLevel) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); g_GameFlow->SelectedLevelForNewGame = selected_option; menu_to_display = Menu::Title; selected_option = 0; ret = InventoryResult::NewGameSelectedLevel; } else if (menu_to_display == Menu::LoadGame) { if (!SavegameInfos[selected_option].Present) SayNo(); else { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); g_GameFlow->SelectedSaveGame = selected_option; selected_option = 0; ret = InventoryResult::LoadGame; } } else if (menu_to_display == Menu::Options) { switch (selected_option) { case 0: FillDisplayOptions(); menu_to_display = Menu::Display; break; case 1: menu_to_display = Menu::Controls; selected_option = 0; break; case 2: FillSound(); menu_to_display = Menu::Sound; selected_option = 0; break; } } } return ret; } void GuiController::FillDisplayOptions() { // Copy configuration to a temporary object memcpy(&CurrentSettings.conf, &g_Configuration, sizeof(GameConfiguration)); // Get current display mode vector* adapters = g_Renderer.getAdapters(); RendererVideoAdapter* adapter = &(*adapters)[CurrentSettings.conf.Adapter]; CurrentSettings.videoMode = 0; for (int i = 0; i < adapter->DisplayModes.size(); i++) { RendererDisplayMode* mode = &adapter->DisplayModes[i]; if (mode->Width == CurrentSettings.conf.Width && mode->Height == CurrentSettings.conf.Height && mode->RefreshRate == CurrentSettings.conf.RefreshRate) { CurrentSettings.videoMode = i; break; } } } void GuiController::HandleDisplaySettingsInput(bool pause) { vector* adapters = g_Renderer.getAdapters(); RendererVideoAdapter* adapter = &(*adapters)[CurrentSettings.conf.Adapter]; SetDebounce = true; S_UpdateInput(); SetDebounce = false; DoDebouncedInput(); if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, NULL, 0); menu_to_display = Menu::Options; selected_option = 0; return; } if (goLeft) { switch (selected_option) { case 0: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); if (CurrentSettings.videoMode > 0) CurrentSettings.videoMode--; break; case 1: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.Windowed = !CurrentSettings.conf.Windowed; break; case 2: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableShadows = !CurrentSettings.conf.EnableShadows; break; case 3: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableCaustics = !CurrentSettings.conf.EnableCaustics; break; case 4: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableVolumetricFog = !CurrentSettings.conf.EnableVolumetricFog; break; } } if (goRight) { switch (selected_option) { case 0: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); if (CurrentSettings.videoMode < adapter->DisplayModes.size() - 1) CurrentSettings.videoMode++; break; case 1: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.Windowed = !CurrentSettings.conf.Windowed; break; case 2: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableShadows = !CurrentSettings.conf.EnableShadows; break; case 3: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableCaustics = !CurrentSettings.conf.EnableCaustics; break; case 4: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableVolumetricFog = !CurrentSettings.conf.EnableVolumetricFog; break; } } if (goUp) { if (selected_option <= 0) selected_option += option_count; else selected_option--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDown) { if (selected_option < option_count) selected_option++; else selected_option -= option_count; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goSelect) { SoundEffect(SFX_TR4_MENU_SELECT, NULL, 0); if (selected_option == 5) { // Save the configuration RendererDisplayMode* mode = &adapter->DisplayModes[CurrentSettings.videoMode]; CurrentSettings.conf.Width = mode->Width; CurrentSettings.conf.Height = mode->Height; CurrentSettings.conf.RefreshRate = mode->RefreshRate; memcpy(&g_Configuration, &CurrentSettings.conf, sizeof(GameConfiguration)); SaveConfiguration(); // Reset screen and go back g_Renderer.changeScreenResolution(CurrentSettings.conf.Width, CurrentSettings.conf.Height, CurrentSettings.conf.RefreshRate, CurrentSettings.conf.Windowed); menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = pause ? 1 : 0; } else if (selected_option == 6) { menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = pause ? 1 : 0; } } } void GuiController::HandleControlSettingsInput(bool pause) { CurrentSettings.waitingForkey = 0; memcpy(&CurrentSettings.conf.KeyboardLayout, &KeyboardLayout[1], NUM_CONTROLS); SetDebounce = true; S_UpdateInput(); SetDebounce = false; DoDebouncedInput(); if (goDeselect) { if (!CurrentSettings.waitingForkey) { menu_to_display = Menu::Options; selected_option = 1; } else CurrentSettings.waitingForkey = 0; return; } if (!CurrentSettings.waitingForkey) { if (goUp) { if (selected_option <= 0) selected_option += option_count; else selected_option--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDown) { if (selected_option < option_count) selected_option++; else selected_option -= option_count; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goSelect) { if (selected_option == 16) // Apply { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); memcpy(KeyboardLayout[1], CurrentSettings.conf.KeyboardLayout, NUM_CONTROLS); SaveConfiguration(); menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = 1; return; } if (selected_option == 17) // Cancel { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = 1; return; } } } if (KeyMap[DIK_RETURN] && selected_option != 16 && selected_option != 17) { SoundEffect(SFX_TR4_MENU_SELECT, NULL, 0); CurrentSettings.waitingForkey = 1; } if (CurrentSettings.waitingForkey) { TrInput = 0; DbInput = 0; ZeroMemory(KeyMap, 256); while (true) { if (DbInput & IN_DESELECT) { CurrentSettings.waitingForkey = false; break; } int selectedKey = 0; for (selectedKey = 0; selectedKey < 256; selectedKey++) { if (KeyMap[selectedKey] & 0x80) break; } if (selectedKey == 256) selectedKey = 0; if (selectedKey && g_KeyNames[selectedKey]) { if (!(selectedKey == DIK_RETURN || selectedKey == DIK_LEFT || selectedKey == DIK_RIGHT || selectedKey == DIK_UP || selectedKey == DIK_DOWN)) { if (selectedKey != DIK_ESCAPE) { KeyboardLayout[1][selected_option] = selectedKey; DefaultConflict(); DbInput = 0; CurrentSettings.waitingForkey = false; return; } } } if (pause) { g_Renderer.renderInventory(); Camera.numberFrames = g_Renderer.SyncRenderer(); } else { g_Renderer.renderTitle(); Camera.numberFrames = g_Renderer.SyncRenderer(); int nframes = Camera.numberFrames; ControlPhase(nframes, 0); } SetDebounce = true; S_UpdateInput(); SetDebounce = false; } } } void GuiController::FillSound() { memcpy(&CurrentSettings.conf, &g_Configuration, sizeof(GameConfiguration)); } void GuiController::HandleSoundSettingsInput(bool pause) { SetDebounce = true; S_UpdateInput(); SetDebounce = false; DoDebouncedInput(); if (goDeselect) { menu_to_display = Menu::Options; selected_option = 2; SetVolumeMusic(g_Configuration.MusicVolume); SetVolumeFX(g_Configuration.SfxVolume); return; } if (goLeft) { switch (selected_option) { case 0: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableAudioSpecialEffects = !CurrentSettings.conf.EnableAudioSpecialEffects; break; case 1: if (CurrentSettings.conf.MusicVolume > 0) { static int db = 0; CurrentSettings.conf.MusicVolume--; SetVolumeMusic(CurrentSettings.conf.MusicVolume); if (!db) { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); db = 10; } else db -= 2; } break; case 2: if (CurrentSettings.conf.SfxVolume > 0) { static int db = 0; CurrentSettings.conf.SfxVolume--; SetVolumeFX(CurrentSettings.conf.SfxVolume); if (!db) { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); db = 10; } else db -= 2; } break; } } if (goRight) { switch (selected_option) { case 0: SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); CurrentSettings.conf.EnableAudioSpecialEffects = !CurrentSettings.conf.EnableAudioSpecialEffects; break; case 1: if (CurrentSettings.conf.MusicVolume < 100) { static int db = 0; CurrentSettings.conf.MusicVolume++; SetVolumeMusic(CurrentSettings.conf.MusicVolume); if (!db) { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); db = 10; } else db -= 2; } break; case 2: if (CurrentSettings.conf.SfxVolume < 100) { static int db = 0; CurrentSettings.conf.SfxVolume++; SetVolumeFX(CurrentSettings.conf.SfxVolume); if (!db) { SoundEffect(SFX_TR4_MENU_CHOOSE, NULL, 0); db = 10; } else db -= 2; } break; } } if (goUp) { if (selected_option <= 0) selected_option += option_count; else selected_option--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDown) { if (selected_option < option_count) selected_option++; else selected_option -= option_count; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goSelect) { SoundEffect(SFX_TR4_MENU_SELECT, NULL, 0); if (selected_option == 3) { // Save the configuration memcpy(&g_Configuration, &CurrentSettings.conf, sizeof(GameConfiguration)); SaveConfiguration(); menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = pause ? 1 : 2; } else if (selected_option == 4) { SoundEffect(SFX_TR4_MENU_SELECT, NULL, 0); SetVolumeMusic(g_Configuration.MusicVolume); SetVolumeFX(g_Configuration.SfxVolume); menu_to_display = pause ? Menu::Pause : Menu::Options; selected_option = pause ? 1 : 2; } } } InventoryResult GuiController::DoPauseMenu() { //basically mini title switch (menu_to_display) { case Menu::Pause: option_count = 2; break; case Menu::Statistics: option_count = 0; break; case Menu::Options: option_count = 2; break; case Menu::Display: option_count = 6; HandleDisplaySettingsInput(1); break; case Menu::Controls: option_count = 17; HandleControlSettingsInput(1); break; case Menu::Sound: option_count = 4; HandleSoundSettingsInput(1); break; } ClearInputVariables(1); SetDebounce = true; S_UpdateInput(); SetDebounce = false; DoDebouncedInput(); if (menu_to_display == Menu::Pause || menu_to_display == Menu::Options) { if (goUp) { if (selected_option <= 0) selected_option += option_count; else selected_option--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDown) { if (selected_option < option_count) selected_option++; else selected_option -= option_count; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } } if (goDeselect) { if (menu_to_display == Menu::Pause) { invMode = InventoryMode::None; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); return InventoryResult::None; } if (menu_to_display == Menu::Statistics || menu_to_display == Menu::Options) { selected_option = menu_to_display == Menu::Statistics ? 0 : 1; menu_to_display = Menu::Pause; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } } if (goSelect) { if (menu_to_display == Menu::Pause) { switch (selected_option) { case 0: selected_option = 0; menu_to_display = Menu::Statistics; break; case 1: selected_option = 0; menu_to_display = Menu::Options; break; case 2: invMode = InventoryMode::None; return InventoryResult::ExitToTitle; } } else if (menu_to_display == Menu::Options) { switch (selected_option) { case 0: FillDisplayOptions(); menu_to_display = Menu::Display; break; case 1: selected_option = 0; menu_to_display = Menu::Controls; break; case 2: FillSound(); selected_option = 0; menu_to_display = Menu::Sound; break; } } } return InventoryResult::None; } /*inventory*/ bool GuiController::DoObjectsCombine(int obj1, int obj2) { for (int n = 0; n < max_combines; n++) { if (combine_table[n].item1 == obj1 && combine_table[n].item2 == obj2) return 1; if (combine_table[n].item1 == obj2 && combine_table[n].item2 == obj1) return 1; } return 0; } bool GuiController::IsItemCurrentlyCombinable(short obj) { if (obj < INV_OBJECT_SMOL_WATERSKIN || obj > INV_OBJECT_BIG_WATERSKIN5L)//trash { for (int n = 0; n < max_combines; n++) { if (combine_table[n].item1 == obj) if (IsItemInInventory(combine_table[n].item2)) return 1; if (combine_table[n].item2 == obj) if (IsItemInInventory(combine_table[n].item1)) return 1; } } else if (obj > INV_OBJECT_SMOL_WATERSKIN3L) { for (int n = 0; n < 4; n++) { if (IsItemInInventory(n + INV_OBJECT_SMOL_WATERSKIN)) return 1; } } else { for (int n = 0; n < 6; n++) { if (IsItemInInventory(n + INV_OBJECT_BIG_WATERSKIN)) return 1; } } return 0; } bool GuiController::IsItemInInventory(short obj) { for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) if (rings[(int)RingTypes::Inventory]->current_object_list[i].invitem == obj) return 1; return 0; } void GuiController::CombineObjects(short obj1, short obj2) { int n; for (n = 0; n < max_combines; n++) { if (combine_table[n].item1 == obj1 && combine_table[n].item2 == obj2) break; if (combine_table[n].item1 == obj2 && combine_table[n].item2 == obj1) break; } combine_table[n].combine_routine(0); ConstructObjectList(); SetupObjectListStartPosition(combine_table[n].combined_item); HandleObjectChangeover((int)RingTypes::Inventory); } void GuiController::SeparateObject(short obj) { int n; for (n = 0; n < max_combines; n++) if (combine_table[n].combined_item == obj) break; combine_table[n].combine_routine(1); ConstructObjectList(); SetupObjectListStartPosition(combine_table[n].item1); } void GuiController::SetupObjectListStartPosition(short newobj) { for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) if (rings[(int)RingTypes::Inventory]->current_object_list[i].invitem == newobj) rings[(int)RingTypes::Inventory]->curobjinlist = i; } void GuiController::HandleObjectChangeover(int ringnum) { current_selected_option = 0; menu_active = 1; SetupAmmoSelector(); } void GuiController::SetupAmmoSelector() { int num; unsigned __int64 opts; num = 0; opts = inventry_objects_list[rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem].opts; ammo_selector_flag = 0; num_ammo_slots = 0; if (rings[(int)RingTypes::Ammo]->ringactive) return; ammo_object_list[0].xrot = 0; ammo_object_list[0].yrot = 0; ammo_object_list[0].zrot = 0; ammo_object_list[1].xrot = 0; ammo_object_list[1].yrot = 0; ammo_object_list[1].zrot = 0; ammo_object_list[2].xrot = 0; ammo_object_list[2].yrot = 0; ammo_object_list[2].zrot = 0; if (opts & (OPT_CHOOSEAMMO_UZI | OPT_CHOOSEAMMO_PISTOLS | OPT_CHOOSEAMMO_REVOLVER | OPT_CHOOSEAMMO_CROSSBOW | OPT_CHOOSEAMMO_HK | OPT_CHOOSEAMMO_SHOTGUN | OPT_CHOOSEAMMO_GRENADEGUN | OPT_CHOOSEAMMO_HARPOON | OPT_CHOOSEAMMO_ROCKET)) { ammo_selector_flag = 1; ammo_selector_fade_dir = 1; if (opts & OPT_CHOOSEAMMO_UZI) { ammo_object_list[0].invitem = INV_OBJECT_UZI_AMMO; ammo_object_list[0].amount = AmountUziAmmo; num++; num_ammo_slots = num; current_ammo_type = &CurrentUziAmmoType; } if (opts & OPT_CHOOSEAMMO_PISTOLS) { num++; ammo_object_list[0].invitem = INV_OBJECT_PISTOLS_AMMO; ammo_object_list[0].amount = -1; num_ammo_slots = num; current_ammo_type = &CurrentPistolsAmmoType; } if (opts & OPT_CHOOSEAMMO_REVOLVER) { num++; ammo_object_list[0].invitem = INV_OBJECT_REVOLVER_AMMO; ammo_object_list[0].amount = AmountRevolverAmmo; num_ammo_slots = num; current_ammo_type = &CurrentRevolverAmmoType; } if (opts & OPT_CHOOSEAMMO_CROSSBOW) { ammo_object_list[num].invitem = INV_OBJECT_CROSSBOW_AMMO1; ammo_object_list[num].amount = AmountCrossBowAmmo1; num++; ammo_object_list[num].invitem = INV_OBJECT_CROSSBOW_AMMO2; ammo_object_list[num].amount = AmountCrossBowAmmo2; num++; ammo_object_list[num].invitem = INV_OBJECT_CROSSBOW_AMMO3; ammo_object_list[num].amount = AmountCrossBowAmmo3; num++; num_ammo_slots = num; current_ammo_type = &CurrentCrossBowAmmoType; } if (opts & OPT_CHOOSEAMMO_HK) { ammo_object_list[num].invitem = INV_OBJECT_HK_AMMO; ammo_object_list[num].amount = AmountHKAmmo1; num++; num_ammo_slots = num; current_ammo_type = &CurrentHKAmmoType; } if (opts & OPT_CHOOSEAMMO_SHOTGUN) { ammo_object_list[num].invitem = INV_OBJECT_SHOTGUN_AMMO1; ammo_object_list[num].amount = AmountShotGunAmmo1; num++; ammo_object_list[num].invitem = INV_OBJECT_SHOTGUN_AMMO2; ammo_object_list[num].amount = AmountShotGunAmmo2; num++; num_ammo_slots = num; current_ammo_type = &CurrentShotGunAmmoType; } if (opts & OPT_CHOOSEAMMO_GRENADEGUN) { ammo_object_list[num].invitem = INV_OBJECT_GRENADE_AMMO1; ammo_object_list[num].amount = AmountGrenadeAmmo1; num++; ammo_object_list[num].invitem = INV_OBJECT_GRENADE_AMMO2; ammo_object_list[num].amount = AmountGrenadeAmmo2; num++; ammo_object_list[num].invitem = INV_OBJECT_GRENADE_AMMO3; ammo_object_list[num].amount = AmountGrenadeAmmo3; num++; num_ammo_slots = num; current_ammo_type = &CurrentGrenadeGunAmmoType; } if (opts & OPT_CHOOSEAMMO_HARPOON) { ammo_object_list[num].invitem = INV_OBJECT_HARPOON_AMMO; ammo_object_list[num].amount = AmountHarpoonAmmo; num++; num_ammo_slots = num; current_ammo_type = &CurrentHarpoonAmmoType; } if (opts & OPT_CHOOSEAMMO_ROCKET) { ammo_object_list[num].invitem = INV_OBJECT_ROCKET_AMMO; ammo_object_list[num].amount = AmountRocketsAmmo; num++; num_ammo_slots = num; current_ammo_type = &CurrentRocketAmmoType; } } } void GuiController::InsertObjectIntoList(int num) { rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->numobjectsinlist].invitem = num; rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->numobjectsinlist].xrot = 0; rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->numobjectsinlist].yrot = 0; rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->numobjectsinlist].zrot = 0; rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->numobjectsinlist].bright = 32; rings[(int)RingTypes::Inventory]->numobjectsinlist++; } void GuiController::InsertObjectIntoList_v2(int num) { unsigned __int64 opts = inventry_objects_list[num].opts; if (opts & (OPT_COMBINABLE | OPT_ALWAYSCOMBINE)) { if (rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem != num) { rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->numobjectsinlist].invitem = num; rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->numobjectsinlist].xrot = 0; rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->numobjectsinlist].yrot = 0; rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->numobjectsinlist].zrot = 0; rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->numobjectsinlist++].bright = 32; } } } void GuiController::ConstructObjectList() { rings[(int)RingTypes::Inventory]->numobjectsinlist = 0; for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) rings[(int)RingTypes::Inventory]->current_object_list[i].invitem = NO_ITEM; CurrentPistolsAmmoType = 0; CurrentUziAmmoType = 0; CurrentRevolverAmmoType = 0; CurrentShotGunAmmoType = 0; CurrentGrenadeGunAmmoType = 0; CurrentCrossBowAmmoType = 0; if (!(g_GameFlow->GetLevel(CurrentLevel)->LaraType == LaraType::Young)) { if (Lara.Weapons[WEAPON_PISTOLS].Present) InsertObjectIntoList(INV_OBJECT_PISTOLS); else if (AmountPistolsAmmo) InsertObjectIntoList(INV_OBJECT_PISTOLS_AMMO); if (Lara.Weapons[WEAPON_UZI].Present) InsertObjectIntoList(INV_OBJECT_UZIS); else if (AmountUziAmmo) InsertObjectIntoList(INV_OBJECT_UZI_AMMO); if (Lara.Weapons[WEAPON_REVOLVER].Present) { if (Lara.Weapons[WEAPON_REVOLVER].HasLasersight) InsertObjectIntoList(INV_OBJECT_REVOLVER_LASER); else InsertObjectIntoList(INV_OBJECT_REVOLVER); } else if (AmountRevolverAmmo) InsertObjectIntoList(INV_OBJECT_REVOLVER_AMMO); if (Lara.Weapons[WEAPON_SHOTGUN].Present) { InsertObjectIntoList(INV_OBJECT_SHOTGUN); if (Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo == WEAPON_AMMO2) CurrentShotGunAmmoType = 1; } else { if (AmountShotGunAmmo1) InsertObjectIntoList(INV_OBJECT_SHOTGUN_AMMO1); if (AmountShotGunAmmo2) InsertObjectIntoList(INV_OBJECT_SHOTGUN_AMMO2); } if (Lara.Weapons[WEAPON_HK].Present) { if (Lara.Weapons[WEAPON_HK].HasSilencer) InsertObjectIntoList(INV_OBJECT_HK_SILENCER); else InsertObjectIntoList(INV_OBJECT_HK); } else if (AmountHKAmmo1) InsertObjectIntoList(INV_OBJECT_HK_AMMO); if (Lara.Weapons[WEAPON_CROSSBOW].Present) { if (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight) InsertObjectIntoList(INV_OBJECT_CROSSBOW_LASER); else InsertObjectIntoList(INV_OBJECT_CROSSBOW); if (Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo == WEAPON_AMMO2) CurrentCrossBowAmmoType = 1; if (Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo == WEAPON_AMMO3) CurrentCrossBowAmmoType = 2; } else { if (AmountCrossBowAmmo1) InsertObjectIntoList(INV_OBJECT_CROSSBOW_AMMO1); if (AmountCrossBowAmmo2) InsertObjectIntoList(INV_OBJECT_CROSSBOW_AMMO2); if (AmountCrossBowAmmo3) InsertObjectIntoList(INV_OBJECT_CROSSBOW_AMMO3); } if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) { InsertObjectIntoList(INV_OBJECT_GRENADE_LAUNCHER); if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo == WEAPON_AMMO2) CurrentGrenadeGunAmmoType = 1; if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo == WEAPON_AMMO3) CurrentGrenadeGunAmmoType = 2; } else { if (AmountGrenadeAmmo1) InsertObjectIntoList(INV_OBJECT_GRENADE_AMMO1); if (AmountGrenadeAmmo2) InsertObjectIntoList(INV_OBJECT_GRENADE_AMMO2); if (AmountGrenadeAmmo3) InsertObjectIntoList(INV_OBJECT_GRENADE_AMMO3); } if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present) InsertObjectIntoList(INV_OBJECT_ROCKET_LAUNCHER); else if (AmountRocketsAmmo) InsertObjectIntoList(INV_OBJECT_ROCKET_AMMO); if (Lara.Weapons[WEAPON_HARPOON_GUN].Present) InsertObjectIntoList(INV_OBJECT_HARPOON_GUN); else if (AmountHarpoonAmmo) InsertObjectIntoList(INV_OBJECT_HARPOON_AMMO); if (Lara.Lasersight) InsertObjectIntoList(INV_OBJECT_LASERSIGHT); if (Lara.Silencer) InsertObjectIntoList(INV_OBJECT_SILENCER); if (Lara.Binoculars) InsertObjectIntoList(INV_OBJECT_BINOCULARS); if (Lara.NumFlares) InsertObjectIntoList(INV_OBJECT_FLARES); } InsertObjectIntoList(INV_OBJECT_TIMEX);//every level has the timex? what's a good way to check?! if (Lara.NumSmallMedipacks) InsertObjectIntoList(INV_OBJECT_SMALL_MEDIPACK); if (Lara.NumLargeMedipacks) InsertObjectIntoList(INV_OBJECT_LARGE_MEDIPACK); if (Lara.Crowbar) InsertObjectIntoList(INV_OBJECT_CROWBAR); if (Lara.hasBeetleThings) { if (Lara.hasBeetleThings & 1) InsertObjectIntoList(INV_OBJECT_BEETLE); if (Lara.hasBeetleThings & 2) InsertObjectIntoList(INV_OBJECT_BEETLE_PART1); if (Lara.hasBeetleThings & 4) InsertObjectIntoList(INV_OBJECT_BEETLE_PART2); } if (Lara.small_waterskin) InsertObjectIntoList((Lara.small_waterskin - 1) + INV_OBJECT_SMOL_WATERSKIN); if (Lara.big_waterskin) InsertObjectIntoList((Lara.big_waterskin - 1) + INV_OBJECT_BIG_WATERSKIN); for (int i = 0; i < NUM_PUZZLES; i++) if (Lara.Puzzles[i]) InsertObjectIntoList(INV_OBJECT_PUZZLE1 + i); for (int i = 0; i < NUM_PUZZLE_PIECES; i++) if (Lara.PuzzlesCombo[i]) InsertObjectIntoList(INV_OBJECT_PUZZLE1_COMBO1 + i); for (int i = 0; i < NUM_KEYS; i++) if (Lara.Keys[i]) InsertObjectIntoList(INV_OBJECT_KEY1 + i); for (int i = 0; i < NUM_KEY_PIECES; i++) if (Lara.KeysCombo[i]) InsertObjectIntoList(INV_OBJECT_KEY1_COMBO1 + i); for (int i = 0; i < NUM_PICKUPS; i++) if (Lara.Pickups[i]) InsertObjectIntoList(INV_OBJECT_PICKUP1 + i); for (int i = 0; i < NUM_PICKUPS_PIECES; i++) if (Lara.PickupsCombo[i]) InsertObjectIntoList(INV_OBJECT_PICKUP1_COMBO1 + i); for (int i = 0; i < NUM_EXAMINES; i++) if (Lara.Examines[i]) InsertObjectIntoList(INV_OBJECT_EXAMINE1 + i); for (int i = 0; i < NUM_EXAMINES_PIECES; i++) if (Lara.ExaminesCombo[i]) InsertObjectIntoList(INV_OBJECT_EXAMINE1_COMBO1 + i); if (Lara.Diary.Present) InsertObjectIntoList(INV_OBJECT_DIARY); if (g_GameFlow->EnableLoadSave) { InsertObjectIntoList(INV_OBJECT_LOAD_FLOPPY); InsertObjectIntoList(INV_OBJECT_SAVE_FLOPPY); } rings[(int)RingTypes::Inventory]->objlistmovement = 0; rings[(int)RingTypes::Inventory]->curobjinlist = 0; rings[(int)RingTypes::Inventory]->ringactive = 1; rings[(int)RingTypes::Ammo]->objlistmovement = 0; rings[(int)RingTypes::Ammo]->curobjinlist = 0; rings[(int)RingTypes::Ammo]->ringactive = 0; HandleObjectChangeover((int)RingTypes::Inventory); ammo_active = 0; } void GuiController::ConstructCombineObjectList() { rings[(int)RingTypes::Ammo]->numobjectsinlist = 0; for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) rings[(int)RingTypes::Ammo]->current_object_list[i].invitem = NO_ITEM; if (!(g_GameFlow->GetLevel(CurrentLevel)->LaraType == LaraType::Young)) { if (Lara.Weapons[WEAPON_REVOLVER].Present) { if (Lara.Weapons[WEAPON_REVOLVER].HasLasersight) InsertObjectIntoList_v2(INV_OBJECT_REVOLVER_LASER); else InsertObjectIntoList_v2(INV_OBJECT_REVOLVER); } if (Lara.Weapons[WEAPON_HK].Present) InsertObjectIntoList_v2(INV_OBJECT_HK); if (Lara.Weapons[WEAPON_CROSSBOW].Present) { if (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight) InsertObjectIntoList_v2(INV_OBJECT_CROSSBOW_LASER); else InsertObjectIntoList_v2(INV_OBJECT_CROSSBOW); } if (Lara.Lasersight) InsertObjectIntoList_v2(INV_OBJECT_LASERSIGHT); if (Lara.Silencer) InsertObjectIntoList_v2(INV_OBJECT_SILENCER); } if (Lara.hasBeetleThings) { if (Lara.hasBeetleThings & 2) InsertObjectIntoList_v2(INV_OBJECT_BEETLE_PART1); if (Lara.hasBeetleThings & 4) InsertObjectIntoList_v2(INV_OBJECT_BEETLE_PART2); } if (Lara.small_waterskin) InsertObjectIntoList_v2(Lara.small_waterskin - 1 + INV_OBJECT_SMOL_WATERSKIN); if (Lara.big_waterskin) InsertObjectIntoList_v2(Lara.big_waterskin - 1 + INV_OBJECT_BIG_WATERSKIN); for (int i = 0; i < NUM_PUZZLE_PIECES; i++) if (Lara.PuzzlesCombo[i]) InsertObjectIntoList_v2(INV_OBJECT_PUZZLE1_COMBO1 + i); for (int i = 0; i < NUM_KEY_PIECES; i++) if (Lara.KeysCombo[i]) InsertObjectIntoList_v2(INV_OBJECT_KEY1_COMBO1 + i); for (int i = 0; i < NUM_PICKUPS_PIECES; i++) if (Lara.PickupsCombo[i]) InsertObjectIntoList_v2(INV_OBJECT_PICKUP1_COMBO1 + i); for (int i = 0; i < NUM_EXAMINES_PIECES; i++) if (Lara.ExaminesCombo[i]) InsertObjectIntoList_v2(INV_OBJECT_EXAMINE1_COMBO1 + i); rings[(int)RingTypes::Ammo]->objlistmovement = 0; rings[(int)RingTypes::Ammo]->curobjinlist = 0; rings[(int)RingTypes::Ammo]->ringactive = 0; } void GuiController::InitializeInventory() { compassNeedleAngle = 4096; AlterFOV(14560); Lara.busy = 0; inventoryItemChosen = NO_ITEM; ClearInputVariables(0); useItem = 0; if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0].hasInfinite()) AmountShotGunAmmo1 = -1; else AmountShotGunAmmo1 = Lara.Weapons[WEAPON_SHOTGUN].Ammo[0].getCount() / 6; if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[1].hasInfinite()) AmountShotGunAmmo2 = -1; else AmountShotGunAmmo2 = Lara.Weapons[WEAPON_SHOTGUN].Ammo[1].getCount() / 6; AmountHKAmmo1 = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1].getCount(); AmountCrossBowAmmo1 = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1].getCount(); AmountCrossBowAmmo2 = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2].hasInfinite() ? -1 : Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2].getCount(); AmountCrossBowAmmo3 = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3].hasInfinite() ? -1 : Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3].getCount(); AmountUziAmmo = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1].getCount(); AmountRevolverAmmo = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1].getCount(); AmountPistolsAmmo = Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1].getCount(); AmountRocketsAmmo = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1].hasInfinite() ? -1 : Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1].getCount(); AmountHarpoonAmmo = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1].hasInfinite()? -1 : Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1].getCount(); AmountGrenadeAmmo1 = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1].hasInfinite()? -1 : Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1].getCount(); AmountGrenadeAmmo2 = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2].hasInfinite() ? -1 : Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2].getCount(); AmountGrenadeAmmo3 = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3].hasInfinite() ? -1 : Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3].getCount(); ConstructObjectList(); if (enterInventory == NO_ITEM) { if (lastInvItem != NO_ITEM) { if (IsItemInInventory(lastInvItem)) SetupObjectListStartPosition(lastInvItem); else//son of a bitch { if (lastInvItem >= INV_OBJECT_SMOL_WATERSKIN && lastInvItem <= INV_OBJECT_SMOL_WATERSKIN3L) { for (int i = INV_OBJECT_SMOL_WATERSKIN; i <= INV_OBJECT_SMOL_WATERSKIN3L; i++) { if (IsItemInInventory(i)) { SetupObjectListStartPosition(i); break; } } } else if (lastInvItem >= INV_OBJECT_BIG_WATERSKIN && lastInvItem <= INV_OBJECT_BIG_WATERSKIN5L) { for (int i = INV_OBJECT_BIG_WATERSKIN; i <= INV_OBJECT_BIG_WATERSKIN5L; i++) { if (IsItemInInventory(i)) { SetupObjectListStartPosition(i); break; } } } } lastInvItem = NO_ITEM; } } else { if (IsObjectInInventory(enterInventory)) SetupObjectListStartPosition2(enterInventory); enterInventory = NO_ITEM; } ammo_selector_fade_val = 0; ammo_selector_fade_dir = 0; combine_ring_fade_val = 0; combine_ring_fade_dir = 0; combine_type_flag = 0; seperate_type_flag = 0; combine_obj1 = 0; combine_obj2 = 0; normal_ring_fade_val = 128; normal_ring_fade_dir = 0; HandleObjectChangeover((int)RingTypes::Inventory); } int GuiController::IsObjectInInventory(short object_number) { return GetInventoryCount(from_underlying(object_number)); } void GuiController::SetupObjectListStartPosition2(short newobj) { for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) if (inventry_objects_list[rings[(int)RingTypes::Inventory]->current_object_list[i].invitem].object_number == newobj) rings[(int)RingTypes::Inventory]->curobjinlist = i; } int GuiController::ConvertObjectToInventoryItem(short obj) { for (int i = 0; i < INVENTORY_TABLE_SIZE; i++) { if (inventry_objects_list[i].object_number == obj) return i; } return -1; } int GuiController::ConvertInventoryItemToObject(int obj) { return inventry_objects_list[obj].object_number; } void GuiController::FadeAmmoSelector() { if (rings[(int)RingTypes::Inventory]->ringactive && (rptLeft >= 8 || rptRight >= 8)) ammo_selector_fade_val = 0; else if (ammo_selector_fade_dir == 1) { if (ammo_selector_fade_val < 128) ammo_selector_fade_val += 32; if (ammo_selector_fade_val > 128) { ammo_selector_fade_val = 128; ammo_selector_fade_dir = 0; } } else if (ammo_selector_fade_dir == 2) { if (ammo_selector_fade_val > 0) ammo_selector_fade_val -= 32; if (ammo_selector_fade_val < 0) { ammo_selector_fade_val = 0; ammo_selector_fade_dir = 0; } } } void GuiController::UseCurrentItem() { short invobject, gmeobject; long OldBinocular; OldBinocular = BinocularRange; Lara.oldBusy = false; BinocularRange = 0; LaraItem->meshBits = -1; invobject = rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem; gmeobject = inventry_objects_list[invobject].object_number; if (Lara.waterStatus == LW_ABOVE_WATER || Lara.waterStatus == LW_WADE) { if (gmeobject == ID_PISTOLS_ITEM) { Lara.requestGunType = WEAPON_PISTOLS; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_PISTOLS) Lara.gunStatus = LG_DRAW_GUNS; return; } if (gmeobject == ID_UZI_ITEM) { Lara.requestGunType = WEAPON_UZI; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_UZI) Lara.gunStatus = LG_DRAW_GUNS; return; } } if (gmeobject != ID_SHOTGUN_ITEM && gmeobject != ID_REVOLVER_ITEM && gmeobject != ID_HK_ITEM && gmeobject != ID_CROSSBOW_ITEM && gmeobject != ID_GRENADE_GUN_ITEM && gmeobject != ID_ROCKET_LAUNCHER_ITEM && gmeobject != ID_HARPOON_ITEM) { if (gmeobject == ID_FLARE_INV_ITEM) { if (Lara.gunStatus == LG_NO_ARMS) { if (LaraItem->currentAnimState != LS_CRAWL_IDLE && LaraItem->currentAnimState != LS_CRAWL_FORWARD && LaraItem->currentAnimState != LS_CRAWL_TURN_LEFT && LaraItem->currentAnimState != LS_CRAWL_TURN_RIGHT && LaraItem->currentAnimState != LS_CRAWL_BACK && LaraItem->currentAnimState != LS_CRAWL_TO_HANG) { if (Lara.gunType != WEAPON_FLARE) { TrInput = IN_FLARE; LaraGun(); TrInput = 0; } return; } } SayNo(); return; } switch (invobject) { case INV_OBJECT_BINOCULARS: if (((LaraItem->currentAnimState == LS_STOP && LaraItem->animNumber == LA_STAND_IDLE) || (Lara.isDucked && !(TrInput & IN_DUCK))) && !UseSpotCam && !TrackCameraInit) { Lara.oldBusy = true; BinocularRange = 128; if (Lara.gunStatus != LG_NO_ARMS) Lara.gunStatus = LG_UNDRAW_GUNS; } if (OldBinocular) BinocularRange = OldBinocular; else BinocularOldCamera = Camera.oldType; return; case INV_OBJECT_SMALL_MEDIPACK: if ((LaraItem->hitPoints <= 0 || LaraItem->hitPoints >= 1000) && !Lara.poisoned) { SayNo(); return; } if (Lara.NumSmallMedipacks != 0) { if (Lara.NumSmallMedipacks != -1) Lara.NumSmallMedipacks--; Lara.poisoned = 0; LaraItem->hitPoints += 500; if (LaraItem->hitPoints > 1000) LaraItem->hitPoints = 1000; SoundEffect(SFX_TR4_MENU_MEDI, 0, SFX_ALWAYS); Statistics.Game.HealthUsed++; } else SayNo(); return; case INV_OBJECT_LARGE_MEDIPACK: if ((LaraItem->hitPoints <= 0 || LaraItem->hitPoints >= 1000) && !Lara.poisoned) { SayNo(); return; } if (Lara.NumLargeMedipacks != 0) { if (Lara.NumLargeMedipacks != -1) Lara.NumLargeMedipacks--; Lara.poisoned = 0; LaraItem->hitPoints = 1000; SoundEffect(SFX_TR4_MENU_MEDI, 0, SFX_ALWAYS); Statistics.Game.HealthUsed++; } else SayNo(); return; default: inventoryItemChosen = gmeobject; return; } return; } if (Lara.gunStatus == LG_HANDS_BUSY) { SayNo(); return; } if (LaraItem->currentAnimState == LS_CRAWL_IDLE || LaraItem->currentAnimState == LS_CRAWL_FORWARD || LaraItem->currentAnimState == LS_CRAWL_TURN_LEFT || LaraItem->currentAnimState == LS_CRAWL_TURN_RIGHT || LaraItem->currentAnimState == LS_CRAWL_BACK || LaraItem->currentAnimState == LS_CRAWL_TO_HANG || LaraItem->currentAnimState == LS_CROUCH_IDLE || LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT || LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT) { SayNo(); return; } if (gmeobject == ID_SHOTGUN_ITEM) { Lara.requestGunType = WEAPON_SHOTGUN; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_SHOTGUN) Lara.gunStatus = LG_DRAW_GUNS; return; } if (gmeobject == ID_REVOLVER_ITEM) { Lara.requestGunType = WEAPON_REVOLVER; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_REVOLVER) Lara.gunStatus = LG_DRAW_GUNS; return; } else if (gmeobject == ID_HK_ITEM) { Lara.requestGunType = WEAPON_HK; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_HK) Lara.gunStatus = LG_DRAW_GUNS; return; } else if (gmeobject == ID_CROSSBOW_ITEM) { Lara.requestGunType = WEAPON_CROSSBOW; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_CROSSBOW) Lara.gunStatus = LG_DRAW_GUNS; return; } else if (gmeobject == ID_GRENADE_GUN_ITEM) { Lara.requestGunType = WEAPON_GRENADE_LAUNCHER; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_GRENADE_LAUNCHER) Lara.gunStatus = LG_DRAW_GUNS; return; } else if (gmeobject == ID_HARPOON_ITEM) { Lara.requestGunType = WEAPON_HARPOON_GUN; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_HARPOON_GUN) Lara.gunStatus = LG_DRAW_GUNS; return; } else if (gmeobject == ID_ROCKET_LAUNCHER_ITEM) { Lara.requestGunType = WEAPON_ROCKET_LAUNCHER; if (Lara.gunStatus != LG_NO_ARMS) return; if (Lara.gunType == WEAPON_ROCKET_LAUNCHER) Lara.gunStatus = LG_DRAW_GUNS; return; } } void GuiController::HandleInventoryMenu() { int n; unsigned __int64 opts; int i; int ypos; int num; if (rings[(int)RingTypes::Ammo]->ringactive) { g_Renderer.drawString(phd_centerx, phd_centery, g_GameFlow->GetString(optmessages[5]), PRINTSTRING_COLOR_WHITE, PRINTSTRING_BLINK | PRINTSTRING_CENTER); if (rings[(int)RingTypes::Inventory]->objlistmovement) return; if (rings[(int)RingTypes::Ammo]->objlistmovement) return; if (goSelect) { short invItem = rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem; short ammoItem = rings[(int)RingTypes::Ammo]->current_object_list[rings[(int)RingTypes::Ammo]->curobjinlist].invitem; if (DoObjectsCombine(invItem, ammoItem)) { combine_ring_fade_dir = 2; combine_type_flag = 1; combine_obj1 = invItem; combine_obj2 = ammoItem; SoundEffect(SFX_TR4_MENU_COMBINE, 0, SFX_ALWAYS); } else if (ammoItem >= INV_OBJECT_SMOL_WATERSKIN && ammoItem <= INV_OBJECT_SMOL_WATERSKIN3L && invItem >= INV_OBJECT_BIG_WATERSKIN && invItem <= INV_OBJECT_BIG_WATERSKIN5L) { if (PerformWaterskinCombine(1)) { combine_type_flag = 2; combine_ring_fade_dir = 2; SoundEffect(SFX_TR4_MENU_COMBINE, 0, SFX_ALWAYS); return; } SayNo(); combine_ring_fade_dir = 2; } else if (invItem >= INV_OBJECT_SMOL_WATERSKIN && invItem <= INV_OBJECT_SMOL_WATERSKIN3L && ammoItem >= INV_OBJECT_BIG_WATERSKIN && ammoItem <= INV_OBJECT_BIG_WATERSKIN5L) { if (PerformWaterskinCombine(0)) { combine_type_flag = 2; combine_ring_fade_dir = 2; SoundEffect(SFX_TR4_MENU_COMBINE, 0, SFX_ALWAYS); return; } SayNo(); combine_ring_fade_dir = 2; } else { SayNo(); combine_ring_fade_dir = 2; } } if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); combine_ring_fade_dir = 2; goDeselect = 0; } return; } else { num = rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem; for (n = 0; n < 3; n++) { current_options[n].type = MenuType::None; current_options[n].text = 0; } n = 0; if (!ammo_active) { opts = inventry_objects_list[rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem].opts; if ((opts & OPT_LOAD)) { current_options[0].type = MenuType::Load; current_options[0].text = g_GameFlow->GetString(optmessages[6]); n = 1; } if ((opts & OPT_SAVE)) { current_options[n].type = MenuType::Save; current_options[n].text = g_GameFlow->GetString(optmessages[7]); n++; } if ((opts & OPT_EXAMINABLE)) { current_options[n].type = MenuType::Examine; current_options[n].text = g_GameFlow->GetString(optmessages[8]); n++; } if ((opts & OPT_STATS)) { current_options[n].type = MenuType::Statistics; current_options[n].text = g_GameFlow->GetString(optmessages[9]); n++; } if ((opts & OPT_USE)) { current_options[n].type = MenuType::Use; current_options[n].text = g_GameFlow->GetString(optmessages[0]); n++; } if ((opts & OPT_EQUIP)) { current_options[n].type = MenuType::Equip; current_options[n].text = g_GameFlow->GetString(optmessages[4]); n++; } if ((opts & (OPT_CHOOSEAMMO_SHOTGUN | OPT_CHOOSEAMMO_CROSSBOW | OPT_CHOOSEAMMO_GRENADEGUN))) { current_options[n].type = MenuType::ChooseAmmo; current_options[n].text = g_GameFlow->GetString(optmessages[1]); n++; } if ((opts & OPT_COMBINABLE)) { if (IsItemCurrentlyCombinable(num)) { current_options[n].type = MenuType::Combine; current_options[n].text = g_GameFlow->GetString(optmessages[2]); n++; } } if ((opts & OPT_ALWAYSCOMBINE)) { current_options[n].type = MenuType::Combine; current_options[n].text = g_GameFlow->GetString(optmessages[2]); n++; } if ((opts & OPT_SEPERATABLE)) { current_options[n].type = MenuType::Seperate; current_options[n].text = g_GameFlow->GetString(optmessages[3]); n++; } if (opts & OPT_DIARY) { current_options[n].type = MenuType::Diary; current_options[n].text = g_GameFlow->GetString(optmessages[11]); n++; } } else { current_options[0].type = MenuType::Ammo1; current_options[0].text = g_GameFlow->GetString(inventry_objects_list[ammo_object_list[0].invitem].objname); current_options[1].type = MenuType::Ammo2; current_options[1].text = g_GameFlow->GetString(inventry_objects_list[ammo_object_list[1].invitem].objname); n = 2; opts = inventry_objects_list[rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem].opts; if (opts & (OPT_CHOOSEAMMO_CROSSBOW | OPT_CHOOSEAMMO_GRENADEGUN)) { n = 3; current_options[2].type = MenuType::Ammo3; current_options[2].text = g_GameFlow->GetString(inventry_objects_list[ammo_object_list[2].invitem].objname); } current_selected_option = *current_ammo_type; } ypos = 310 - font_height; if (n == 1) ypos += font_height; else if (n == 2) ypos += font_height >> 1; if (n > 0) { for (i = 0; i < n; i++) { if (i == current_selected_option) { g_Renderer.drawString(phd_centerx, ypos, current_options[i].text, PRINTSTRING_COLOR_WHITE, PRINTSTRING_BLINK | PRINTSTRING_CENTER); ypos += font_height; } else { g_Renderer.drawString(phd_centerx, ypos, current_options[i].text, PRINTSTRING_COLOR_WHITE, PRINTSTRING_CENTER); ypos += font_height; } } } if (menu_active && !rings[(int)RingTypes::Inventory]->objlistmovement && !rings[(int)RingTypes::Ammo]->objlistmovement) { if (goUp && current_selected_option > 0) { current_selected_option--; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } else if (goDown && current_selected_option < n - 1) { current_selected_option++; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } if (ammo_active) { if (goLeft && current_selected_option > 0) { current_selected_option--; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } if (goRight && current_selected_option < n - 1) { current_selected_option++; SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); } *current_ammo_type = current_selected_option; } if (goSelect) { if (current_options[current_selected_option].type != MenuType::Equip && current_options[current_selected_option].type != MenuType::Use) SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); switch (current_options[current_selected_option].type) { case MenuType::ChooseAmmo: rings[(int)RingTypes::Inventory]->ringactive = 0; ammo_active = 1; Stashedcurrent_selected_option = current_selected_option; StashedCurrentPistolsAmmoType = CurrentPistolsAmmoType; StashedCurrentUziAmmoType = CurrentUziAmmoType; StashedCurrentRevolverAmmoType = CurrentRevolverAmmoType; StashedCurrentShotGunAmmoType = CurrentShotGunAmmoType; StashedCurrentGrenadeGunAmmoType = CurrentGrenadeGunAmmoType; StashedCurrentCrossBowAmmoType = CurrentCrossBowAmmoType; StashedCurrentHKAmmoType = CurrentHKAmmoType; StashedCurrentHarpoonAmmoType = CurrentHarpoonAmmoType; StashedCurrentRocketAmmoType = CurrentRocketAmmoType; break; case MenuType::Load: //fill_up_savegames_array//or maybe not? invMode = InventoryMode::Load; break; case MenuType::Save: //fill_up_savegames_array invMode = InventoryMode::Save; break; case MenuType::Examine: invMode = InventoryMode::Examine; break; case MenuType::Statistics: invMode = InventoryMode::Statistics; break; case MenuType::Ammo1: case MenuType::Ammo2: case MenuType::Ammo3: ammo_active = 0; rings[(int)RingTypes::Inventory]->ringactive = 1; current_selected_option = 0; break; case MenuType::Combine: ConstructCombineObjectList(); rings[(int)RingTypes::Inventory]->ringactive = 0; rings[(int)RingTypes::Ammo]->ringactive = 1; ammo_selector_flag = 0; menu_active = 0; combine_ring_fade_dir = 1; break; case MenuType::Seperate: seperate_type_flag = 1; normal_ring_fade_dir = 2; break; case MenuType::Equip: case MenuType::Use: menu_active = 0; useItem = 1; break; case MenuType::Diary: invMode = InventoryMode::Diary; Lara.Diary.currentPage = 1; break; } } if (goDeselect && ammo_active) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; ammo_active = 0; rings[(int)RingTypes::Inventory]->ringactive = 1; CurrentPistolsAmmoType = StashedCurrentPistolsAmmoType; CurrentUziAmmoType = StashedCurrentUziAmmoType; CurrentRevolverAmmoType = StashedCurrentRevolverAmmoType; CurrentShotGunAmmoType = StashedCurrentShotGunAmmoType; CurrentGrenadeGunAmmoType = StashedCurrentGrenadeGunAmmoType; CurrentCrossBowAmmoType = StashedCurrentCrossBowAmmoType; CurrentHKAmmoType = StashedCurrentHKAmmoType; CurrentHarpoonAmmoType = StashedCurrentHarpoonAmmoType; CurrentRocketAmmoType = StashedCurrentRocketAmmoType; current_selected_option = Stashedcurrent_selected_option; } } } } //this function is to UPDATE THE SELECTED AMMO OF WEPS THAT REQUIRE DOING SO, and only these.. void GuiController::UpdateWeaponStatus() { if (Lara.Weapons[WEAPON_SHOTGUN].Present) { if (CurrentShotGunAmmoType) Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO2; else Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1; } if (Lara.Weapons[WEAPON_CROSSBOW].Present) { Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO1; if (CurrentCrossBowAmmoType == 1) Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO2; else if (CurrentCrossBowAmmoType == 2) Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO3; } if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) { Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1; if (CurrentGrenadeGunAmmoType == 1) Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO2; else if (CurrentGrenadeGunAmmoType == 2) Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO3; } } void GuiController::SpinBack(unsigned short* angle) { unsigned short val; unsigned short val2; val = *angle; if (val) { if (val <= 32768) { val2 = val; if (val2 < ANGLE(5)) val = ANGLE(5); else if (val2 > ANGLE(90)) val2 = ANGLE(90); val -= (val2 >> 3); if (val > 32768) val = 0; } else { val2 = -val; if (val2 < ANGLE(5)) val = ANGLE(5); else if (val2 > ANGLE(90)) val2 = ANGLE(90); val += (val2 >> 3); if (val < ANGLE(180)) val = 0; } *angle = val; } } void GuiController::DrawAmmoSelector() { int n; int xpos; unsigned short xrot, yrot, zrot; InventoryObject* objme; char invTextBuffer[256]; int x, y; if (!ammo_selector_flag) return; xpos = (2 * phd_centerx - OBJLIST_SPACING) >> 1; if (num_ammo_slots == 2) xpos -= OBJLIST_SPACING / 2; else if (num_ammo_slots == 3) xpos -= OBJLIST_SPACING; if (num_ammo_slots > 0) { for (n = 0; n < num_ammo_slots; n++) { objme = &inventry_objects_list[ammo_object_list[n].invitem]; if (n == *current_ammo_type) { if (objme->rot_flags & INV_ROT_X) ammo_object_list[n].xrot += ANGLE(5); if (objme->rot_flags & INV_ROT_Y) ammo_object_list[n].yrot += ANGLE(5); if (objme->rot_flags & INV_ROT_Z) ammo_object_list[n].zrot += ANGLE(5); } else { SpinBack(&ammo_object_list[n].xrot); SpinBack(&ammo_object_list[n].yrot); SpinBack(&ammo_object_list[n].zrot); } xrot = ammo_object_list[n].xrot; yrot = ammo_object_list[n].yrot; zrot = ammo_object_list[n].zrot; x = phd_centerx - 300 + xpos; y = 430; short obj = ConvertInventoryItemToObject(ammo_object_list[n].invitem); float scaler = inventry_objects_list[ammo_object_list[n].invitem].scale1; if (n == *current_ammo_type) { if (ammo_object_list[n].amount == -1) sprintf(&invTextBuffer[0], "Unlimited %s", g_GameFlow->GetString(inventry_objects_list[ammo_object_list[n].invitem].objname)); else sprintf(&invTextBuffer[0], "%d x %s", ammo_object_list[n].amount, g_GameFlow->GetString(inventry_objects_list[ammo_object_list[n].invitem].objname)); if (ammo_selector_fade_val) g_Renderer.drawString(phd_centerx, 380, &invTextBuffer[0], PRINTSTRING_COLOR_YELLOW, PRINTSTRING_CENTER); if (n == *current_ammo_type) g_Renderer.drawObjectOn2DPosition(x, y, obj, xrot, yrot, zrot, scaler); else g_Renderer.drawObjectOn2DPosition(x, y, obj, xrot, yrot, zrot, scaler); } else g_Renderer.drawObjectOn2DPosition(x, y, obj, xrot, yrot, zrot, scaler); xpos += OBJLIST_SPACING; } } } void GuiController::DrawCurrentObjectList(int ringnum) { int n; int maxobj; int xoff; int i; int shade; int minobj; char textbufme[128]; int objmeup; int nummeup; short ymeup; unsigned short xrot, yrot, zrot; int activenum; int count; if (rings[ringnum]->current_object_list <= 0) return; if (ringnum == (int)RingTypes::Ammo) { ammo_selector_fade_val = 0; ammo_selector_fade_dir = 0; if (combine_ring_fade_dir == 1) { if (combine_ring_fade_val < 128) combine_ring_fade_val += 32; if (combine_ring_fade_val > 128) { combine_ring_fade_val = 128; combine_ring_fade_dir = 0; } } else if (combine_ring_fade_dir == 2) { combine_ring_fade_val -= 32; if (combine_ring_fade_val <= 0) { combine_ring_fade_val = 0; combine_ring_fade_dir = 0; if (combine_type_flag) normal_ring_fade_dir = 2; else { rings[(int)RingTypes::Inventory]->ringactive = 1; menu_active = 1; rings[(int)RingTypes::Ammo]->ringactive = 0; HandleObjectChangeover((int)RingTypes::Inventory); } rings[(int)RingTypes::Ammo]->ringactive = 0; } } } else if (normal_ring_fade_dir == 1) { if (normal_ring_fade_val < 128) normal_ring_fade_val += 32; if (normal_ring_fade_val > 128) { normal_ring_fade_val = 128; normal_ring_fade_dir = 0; rings[(int)RingTypes::Inventory]->ringactive = 1; menu_active = 1; } } else if (normal_ring_fade_dir == 2) { normal_ring_fade_val -= 32; if (normal_ring_fade_val <= 0) { normal_ring_fade_val = 0; normal_ring_fade_dir = 1; if (combine_type_flag == 1) { combine_type_flag = 0; CombineObjects(combine_obj1, combine_obj2); } else if (combine_type_flag == 2) { combine_type_flag = 0; ConstructObjectList(); SetupObjectListStartPosition(combine_obj1); } else if (seperate_type_flag) SeparateObject(rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem); HandleObjectChangeover((int)RingTypes::Inventory); } } minobj = 0; maxobj = 0; xoff = 0; n = 0; if (rings[ringnum]->numobjectsinlist != 1) xoff = (OBJLIST_SPACING * rings[ringnum]->objlistmovement) >> 16; if (rings[ringnum]->numobjectsinlist == 2) { minobj = -1; maxobj = 0; n = rings[ringnum]->curobjinlist - 1; } if (rings[ringnum]->numobjectsinlist == 3 || rings[ringnum]->numobjectsinlist == 4) { minobj = -2; maxobj = 1; n = rings[ringnum]->curobjinlist - 2; } if (rings[ringnum]->numobjectsinlist >= 5) { minobj = -3; maxobj = 2; n = rings[ringnum]->curobjinlist - 3; } if (n < 0) n += rings[ringnum]->numobjectsinlist; if (rings[ringnum]->objlistmovement < 0) maxobj++; if (minobj <= maxobj) { for (i = minobj; i <= maxobj; i++) { if (minobj == i) { if (rings[ringnum]->objlistmovement < 0) shade = 0; else shade = rings[ringnum]->objlistmovement >> 9; } else if (i != minobj + 1 || maxobj == minobj + 1) { if (i != maxobj) shade = 128; else { if (rings[ringnum]->objlistmovement < 0) shade = (-128 * rings[ringnum]->objlistmovement) >> 16; else shade = 128 - (short)(rings[ringnum]->objlistmovement >> 9); } } else { if (rings[ringnum]->objlistmovement < 0) shade = 128 - ((-128 * rings[ringnum]->objlistmovement) >> 16); else shade = 128; } if (!minobj && !maxobj) shade = 128; if (ringnum == (int)RingTypes::Ammo && combine_ring_fade_val < 128 && shade) shade = combine_ring_fade_val; else if (ringnum == (int)RingTypes::Inventory && normal_ring_fade_val < 128 && shade) shade = normal_ring_fade_val; if (!i) { nummeup = 0; switch (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number) { case ID_BIGMEDI_ITEM: nummeup = Lara.NumLargeMedipacks; break; case ID_SMALLMEDI_ITEM: nummeup = Lara.NumSmallMedipacks; break; case ID_FLARE_INV_ITEM: nummeup = Lara.NumFlares; break; default: if (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number < ID_PUZZLE_ITEM1 || inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number > ID_PUZZLE_ITEM16) { switch (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number) { case ID_SHOTGUN_AMMO1_ITEM: count = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1].getCount(); nummeup = count == -1 ? count : count / 6; break; case ID_SHOTGUN_AMMO2_ITEM: count = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2].getCount(); nummeup = count == -1 ? count : count / 6; break; case ID_HK_AMMO_ITEM: nummeup = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1].getCount(); break; case ID_CROSSBOW_AMMO1_ITEM: count = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1].getCount(); nummeup = count; break; case ID_CROSSBOW_AMMO2_ITEM: count = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2].getCount(); nummeup = count; break; case ID_CROSSBOW_AMMO3_ITEM: count = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3].getCount(); nummeup = count; break; case ID_GRENADE_AMMO1_ITEM: count = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1].getCount(); nummeup = count; break; case ID_GRENADE_AMMO2_ITEM: count = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2].getCount(); nummeup = count; break; case ID_GRENADE_AMMO3_ITEM: count = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3].getCount(); nummeup = count; break; case ID_ROCKET_LAUNCHER_ITEM: nummeup = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1].getCount(); break; case ID_HARPOON_ITEM: nummeup = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1].getCount(); break; case ID_REVOLVER_AMMO_ITEM: nummeup = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1].getCount(); break; case ID_UZI_AMMO_ITEM: nummeup = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1].getCount(); break; } } else { nummeup = Lara.Puzzles[inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number - ID_PUZZLE_ITEM1]; if (nummeup <= 1) sprintf(textbufme, g_GameFlow->GetString(inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].objname)); else sprintf(textbufme, "%d x %s", nummeup, g_GameFlow->GetString(inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].objname)); } break; } if (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number < ID_PUZZLE_ITEM1 || inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].object_number > ID_PUZZLE_ITEM16) { if (nummeup) { if (nummeup == -1) sprintf(textbufme, "Unlimited %s", g_GameFlow->GetString(inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].objname)); else sprintf(textbufme, "%d x %s", nummeup, g_GameFlow->GetString(inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].objname)); } else sprintf(textbufme, g_GameFlow->GetString(inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].objname)); } if (ringnum == (int)RingTypes::Inventory) objmeup = (int)(phd_centery - (phd_winymax + 1) * 0.0625 * 3.0); else objmeup = (int)((phd_winymax + 1) * 0.0625 * 3.0 + phd_centery); g_Renderer.drawString(phd_centerx, ringnum == (int)RingTypes::Inventory ? 230 : 300, textbufme, PRINTSTRING_COLOR_YELLOW, PRINTSTRING_CENTER); } if (!i && !rings[ringnum]->objlistmovement) { if (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].rot_flags & INV_ROT_X) rings[ringnum]->current_object_list[n].xrot += ANGLE(5); if (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].rot_flags & INV_ROT_Y) rings[ringnum]->current_object_list[n].yrot += ANGLE(5); if (inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].rot_flags & INV_ROT_Z) rings[ringnum]->current_object_list[n].zrot += ANGLE(5); } else { SpinBack(&rings[ringnum]->current_object_list[n].xrot); SpinBack(&rings[ringnum]->current_object_list[n].yrot); SpinBack(&rings[ringnum]->current_object_list[n].zrot); } xrot = rings[ringnum]->current_object_list[n].xrot; yrot = rings[ringnum]->current_object_list[n].yrot; zrot = rings[ringnum]->current_object_list[n].zrot; if (rings[ringnum]->objlistmovement) { if (rings[ringnum]->objlistmovement > 0) activenum = -1; else activenum = 1; } else activenum = 0; if (i == activenum) { if (rings[ringnum]->current_object_list[n].bright < 160) rings[ringnum]->current_object_list[n].bright += 16; if (rings[ringnum]->current_object_list[n].bright > 160) rings[ringnum]->current_object_list[n].bright = 160; } else { if (rings[ringnum]->current_object_list[n].bright > 32) rings[ringnum]->current_object_list[n].bright -= 16; if (rings[ringnum]->current_object_list[n].bright < 32) rings[ringnum]->current_object_list[n].bright = 32; } int x, y, y2; x = 400 + xoff + i * OBJLIST_SPACING; y = 150; y2 = 430;//combine short obj = ConvertInventoryItemToObject(rings[ringnum]->current_object_list[n].invitem); float scaler = inventry_objects_list[rings[ringnum]->current_object_list[n].invitem].scale1; g_Renderer.drawObjectOn2DPosition(x, ringnum == (int)RingTypes::Inventory ? y : y2, obj, xrot, yrot, zrot, scaler); if (++n >= rings[ringnum]->numobjectsinlist) n = 0; } if (rings[ringnum]->ringactive) { if (rings[ringnum]->numobjectsinlist != 1 && (ringnum != 1 || combine_ring_fade_val == 128)) { if (rings[ringnum]->objlistmovement > 0) rings[ringnum]->objlistmovement += 8192; if (rings[ringnum]->objlistmovement < 0) rings[ringnum]->objlistmovement -= 8192; if (goLeft) { if (!rings[ringnum]->objlistmovement) { SoundEffect(SFX_TR4_MENU_ROTATE, 0, SFX_ALWAYS); rings[ringnum]->objlistmovement += 8192; if (ammo_selector_flag) ammo_selector_fade_dir = 2; } } if (goRight) { if (!rings[ringnum]->objlistmovement) { SoundEffect(SFX_TR4_MENU_ROTATE, 0, SFX_ALWAYS); rings[ringnum]->objlistmovement -= 8192; if (ammo_selector_flag) ammo_selector_fade_dir = 2; } } if (rings[ringnum]->objlistmovement < 65536) { if (rings[ringnum]->objlistmovement < -65535) { rings[ringnum]->curobjinlist++; if (rings[ringnum]->curobjinlist >= rings[ringnum]->numobjectsinlist) rings[ringnum]->curobjinlist = 0; rings[ringnum]->objlistmovement = 0; if (ringnum == (int)RingTypes::Inventory) HandleObjectChangeover(0); } } else { rings[ringnum]->curobjinlist--; if (rings[ringnum]->curobjinlist < 0) rings[ringnum]->curobjinlist = rings[ringnum]->numobjectsinlist - 1; rings[ringnum]->objlistmovement = 0; if (ringnum == (int)RingTypes::Inventory) HandleObjectChangeover(0); } } } } } int GuiController::CallInventory(bool reset_mode) { int return_value; Lara.oldBusy = Lara.busy; if (TrInput & IN_SELECT) stop_killing_me_you_dumb_input_system = 1; rings[(int)RingTypes::Inventory] = &pcring1; rings[(int)RingTypes::Ammo] = &pcring2; g_Renderer.DumpGameScene(); if (reset_mode) invMode = InventoryMode::InGame; InitializeInventory(); Camera.numberFrames = 2; while (true) { int val = 0; OBJLIST_SPACING = phd_centerx >> 1; if (compassNeedleAngle != 1024) compassNeedleAngle -= 32; SetDebounce = true; S_UpdateInput(); TrInput = InputBusy; GameTimer++; if (DbInput & IN_OPTION) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); val = 1; } return_value = ThreadEnded; if (return_value) return return_value; DoDebouncedInput(); if (invMode == InventoryMode::Statistics) DoStatisticsMode(); if (invMode == InventoryMode::Examine) DoExamineMode(); if (invMode == InventoryMode::Diary) DoDiary(); if (invMode == InventoryMode::Load) return_value = DoLoad(); if (invMode == InventoryMode::Save) DoSave(); DrawInventory(); DrawCompass(); if (useItem && !TrInput) val = 1; if (ExitInvLoop) { ExitInvLoop = 0; val = 1; } Camera.numberFrames = g_Renderer.SyncRenderer(); if (val) break; } lastInvItem = rings[(int)RingTypes::Inventory]->current_object_list[rings[(int)RingTypes::Inventory]->curobjinlist].invitem; UpdateWeaponStatus(); if (useItem) UseCurrentItem(); Lara.busy = Lara.oldBusy; invMode = InventoryMode::None; ClearInputVariables(0); return return_value; } void GuiController::DoStatisticsMode() { invMode = InventoryMode::Statistics; if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; invMode = InventoryMode::None; } } void GuiController::DoExamineMode() { invMode = InventoryMode::Examine; if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; invMode = InventoryMode::None; } } void GuiController::DrawCompass() { return; g_Renderer.drawObjectOn2DPosition(130, 480, ID_COMPASS_ITEM, ANGLE(90), 0, ANGLE(180), inventry_objects_list[INV_OBJECT_COMPASS].scale1); short compass_speed = phd_sin(compassNeedleAngle - LaraItem->pos.yRot); short compass_angle = (LaraItem->pos.yRot + compass_speed) - ANGLE(180); Matrix::CreateRotationY(compass_angle); } void GuiController::DoDiary() { invMode = InventoryMode::Diary; if (goRight && Lara.Diary.currentPage < Lara.Diary.numPages) { Lara.Diary.currentPage++; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goLeft && Lara.Diary.currentPage > 1) { Lara.Diary.currentPage--; SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); } if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; invMode = InventoryMode::None; } } short GuiController::GetLoadSaveSelection() { return selected_slot; } int GuiController::DoLoad() { invMode = InventoryMode::Load; if (goDown) { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); if (selected_slot == SAVEGAME_MAX - 1) selected_slot -= SAVEGAME_MAX - 1; //go back up else selected_slot++; } if (goUp) { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); if (selected_slot== 0) selected_slot += SAVEGAME_MAX - 1; //go back down else selected_slot--; } if (goSelect) { if (!SavegameInfos[selected_slot].Present) SayNo(); else { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); g_GameFlow->SelectedSaveGame = selected_slot; ExitInvLoop = 1; return 1; } } if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; invMode = InventoryMode::InGame; } return 0; } void GuiController::DoSave() { invMode = InventoryMode::Save; if (goDown) { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); if (selected_slot == SAVEGAME_MAX - 1) selected_slot -= SAVEGAME_MAX - 1; //go back up else selected_slot++; } if (goUp) { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); if (selected_slot == 0) selected_slot += SAVEGAME_MAX - 1; //go back down else selected_slot--; } if (goSelect) { SoundEffect(SFX_TR4_MENU_CHOOSE, 0, SFX_ALWAYS); SaveGame::Save(selected_slot); ExitInvLoop = 1; //exit inv if the user has saved } if (goDeselect) { SoundEffect(SFX_TR4_MENU_SELECT, 0, SFX_ALWAYS); goDeselect = 0; invMode = InventoryMode::InGame; } } void combine_revolver_lasersight(int flag) { if (flag) { Lara.Lasersight = 1; Lara.Weapons[WEAPON_REVOLVER].HasLasersight = 0; } else { Lara.Lasersight = 0; Lara.Weapons[WEAPON_REVOLVER].HasLasersight = 1; } if (Lara.gunStatus && Lara.gunType == WEAPON_REVOLVER) { undraw_pistol_mesh_right(WEAPON_REVOLVER); draw_pistol_meshes(WEAPON_REVOLVER); } } void combine_crossbow_lasersight(int flag) { if (flag) { Lara.Lasersight = 1; Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = 0; } else { Lara.Lasersight = 0; Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = 1; } if (Lara.gunStatus && Lara.gunType == WEAPON_CROSSBOW) { undraw_shotgun_meshes(WEAPON_CROSSBOW); draw_shotgun_meshes(WEAPON_CROSSBOW); } } void combine_HK_SILENCER(int flag) { if (flag) { Lara.Silencer = 1; Lara.Weapons[WEAPON_HK].HasSilencer = 0; } else { Lara.Silencer = 0; Lara.Weapons[WEAPON_HK].HasSilencer = 1; } } void combine_PuzzleItem1(int flag) { Lara.PuzzlesCombo[0] = 0; Lara.PuzzlesCombo[1] = 0; Lara.Puzzles[0] = 1; } void combine_PuzzleItem2(int flag) { Lara.PuzzlesCombo[2] = 0; Lara.PuzzlesCombo[3] = 0; Lara.Puzzles[1] = 1; } void combine_PuzzleItem3(int flag) { Lara.PuzzlesCombo[4] = 0; Lara.PuzzlesCombo[5] = 0; Lara.Puzzles[2] = 1; } void combine_PuzzleItem4(int flag) { Lara.PuzzlesCombo[6] = 0; Lara.PuzzlesCombo[7] = 0; Lara.Puzzles[3] = 1; } void combine_PuzzleItem5(int flag) { Lara.PuzzlesCombo[8] = 0; Lara.PuzzlesCombo[9] = 0; Lara.Puzzles[4] = 1; } void combine_PuzzleItem6(int flag) { Lara.PuzzlesCombo[10] = 0; Lara.PuzzlesCombo[11] = 0; Lara.Puzzles[5] = 1; } void combine_PuzzleItem7(int flag) { Lara.PuzzlesCombo[12] = 0; Lara.PuzzlesCombo[13] = 0; Lara.Puzzles[6] = 1; } void combine_PuzzleItem8(int flag) { Lara.PuzzlesCombo[14] = 0; Lara.PuzzlesCombo[15] = 0; Lara.Puzzles[7] = 1; } void combine_PuzzleItem9(int flag) { Lara.PuzzlesCombo[16] = 0; Lara.PuzzlesCombo[17] = 0; Lara.Puzzles[8] = 1; } void combine_PuzzleItem10(int flag) { Lara.PuzzlesCombo[18] = 0; Lara.PuzzlesCombo[19] = 0; Lara.Puzzles[9] = 1; } void combine_PuzzleItem11(int flag) { Lara.PuzzlesCombo[20] = 0; Lara.PuzzlesCombo[21] = 0; Lara.Puzzles[10] = 1; } void combine_PuzzleItem12(int flag) { Lara.PuzzlesCombo[22] = 0; Lara.PuzzlesCombo[23] = 0; Lara.Puzzles[11] = 1; } void combine_PuzzleItem13(int flag) { Lara.PuzzlesCombo[24] = 0; Lara.PuzzlesCombo[25] = 0; Lara.Puzzles[12] = 1; } void combine_PuzzleItem14(int flag) { Lara.PuzzlesCombo[26] = 0; Lara.PuzzlesCombo[27] = 0; Lara.Puzzles[13] = 1; } void combine_PuzzleItem15(int flag) { Lara.PuzzlesCombo[28] = 0; Lara.PuzzlesCombo[29] = 0; Lara.Puzzles[14] = 1; } void combine_PuzzleItem16(int flag) { Lara.PuzzlesCombo[30] = 0; Lara.PuzzlesCombo[31] = 0; Lara.Puzzles[15] = 1; } void combine_KeyItem1(int flag) { Lara.Keys[0] = 1; Lara.KeysCombo[0] = 0; Lara.KeysCombo[1] = 0; } void combine_KeyItem2(int flag) { Lara.Keys[1] = 1; Lara.KeysCombo[2] = 0; Lara.KeysCombo[3] = 0; } void combine_KeyItem3(int flag) { Lara.Keys[2] = 1; Lara.KeysCombo[4] = 0; Lara.KeysCombo[5] = 0; } void combine_KeyItem4(int flag) { Lara.Keys[3] = 1; Lara.KeysCombo[6] = 0; Lara.KeysCombo[7] = 0; } void combine_KeyItem5(int flag) { Lara.Keys[4] = 1; Lara.KeysCombo[8] = 0; Lara.KeysCombo[9] = 0; } void combine_KeyItem6(int flag) { Lara.Keys[5] = 1; Lara.KeysCombo[10] = 0; Lara.KeysCombo[11] = 0; } void combine_KeyItem7(int flag) { Lara.Keys[6] = 1; Lara.KeysCombo[12] = 0; Lara.KeysCombo[13] = 0; } void combine_KeyItem8(int flag) { Lara.Keys[7] = 1; Lara.KeysCombo[14] = 0; Lara.KeysCombo[15] = 0; } void combine_KeyItem9(int flag) { Lara.Keys[8] = 1; Lara.KeysCombo[16] = 0; Lara.KeysCombo[17] = 0; } void combine_KeyItem10(int flag) { Lara.Keys[9] = 1; Lara.KeysCombo[18] = 0; Lara.KeysCombo[19] = 0; } void combine_KeyItem11(int flag) { Lara.Keys[10] = 1; Lara.KeysCombo[20] = 0; Lara.KeysCombo[21] = 0; } void combine_KeyItem12(int flag) { Lara.Keys[11] = 1; Lara.KeysCombo[22] = 0; Lara.KeysCombo[23] = 0; } void combine_KeyItem13(int flag) { Lara.Keys[12] = 1; Lara.KeysCombo[24] = 0; Lara.KeysCombo[25] = 0; } void combine_KeyItem14(int flag) { Lara.Keys[13] = 1; Lara.KeysCombo[26] = 0; Lara.KeysCombo[27] = 0; } void combine_KeyItem15(int flag) { Lara.Keys[14] = 1; Lara.KeysCombo[28] = 0; Lara.KeysCombo[29] = 0; } void combine_KeyItem16(int flag) { Lara.Keys[15] = 1; Lara.KeysCombo[30] = 0; Lara.KeysCombo[31] = 0; } void combine_PickupItem1(int flag) { Lara.Pickups[0] = 1; Lara.PickupsCombo[0] = 0; Lara.PickupsCombo[1] = 0; } void combine_PickupItem2(int flag) { Lara.Pickups[1] = 1; Lara.PickupsCombo[2] = 0; Lara.PickupsCombo[3] = 0; } void combine_PickupItem3(int flag) { Lara.Pickups[2] = 1; Lara.PickupsCombo[4] = 0; Lara.PickupsCombo[5] = 0; } void combine_PickupItem4(int flag) { Lara.Pickups[3] = 1; Lara.PickupsCombo[6] = 0; Lara.PickupsCombo[7] = 0; } void combine_PickupItem5(int flag) { Lara.Pickups[4] = 1; Lara.PickupsCombo[8] = 0; Lara.PickupsCombo[9] = 0; } void combine_PickupItem6(int flag) { Lara.Pickups[5] = 1; Lara.PickupsCombo[10] = 0; Lara.PickupsCombo[11] = 0; } void combine_PickupItem7(int flag) { Lara.Pickups[6] = 1; Lara.PickupsCombo[12] = 0; Lara.PickupsCombo[13] = 0; } void combine_PickupItem8(int flag) { Lara.Pickups[7] = 1; Lara.PickupsCombo[14] = 0; Lara.PickupsCombo[15] = 0; } void combine_PickupItem9(int flag) { Lara.Pickups[8] = 1; Lara.PickupsCombo[16] = 0; Lara.PickupsCombo[17] = 0; } void combine_PickupItem10(int flag) { Lara.Pickups[9] = 1; Lara.PickupsCombo[18] = 0; Lara.PickupsCombo[19] = 0; } void combine_PickupItem11(int flag) { Lara.Pickups[10] = 1; Lara.PickupsCombo[20] = 0; Lara.PickupsCombo[21] = 0; } void combine_PickupItem12(int flag) { Lara.Pickups[11] = 1; Lara.PickupsCombo[22] = 0; Lara.PickupsCombo[23] = 0; } void combine_PickupItem13(int flag) { Lara.Pickups[12] = 1; Lara.PickupsCombo[24] = 0; Lara.PickupsCombo[25] = 0; } void combine_PickupItem14(int flag) { Lara.Pickups[13] = 1; Lara.PickupsCombo[26] = 0; Lara.PickupsCombo[27] = 0; } void combine_PickupItem15(int flag) { Lara.Pickups[14] = 1; Lara.PickupsCombo[28] = 0; Lara.PickupsCombo[29] = 0; } void combine_PickupItem16(int flag) { Lara.Pickups[15] = 1; Lara.PickupsCombo[30] = 0; Lara.PickupsCombo[31] = 0; } void combine_Examine1(int flag) { Lara.Examines[0] = 1; Lara.ExaminesCombo[0] = 0; Lara.ExaminesCombo[1] = 0; } void combine_Examine2(int flag) { Lara.Examines[1] = 1; Lara.ExaminesCombo[2] = 0; Lara.ExaminesCombo[3] = 0; } void combine_Examine3(int flag) { Lara.Examines[2] = 1; Lara.ExaminesCombo[4] = 0; Lara.ExaminesCombo[5] = 0; } void combine_Examine4(int flag) { Lara.Examines[3] = 1; Lara.ExaminesCombo[6] = 0; Lara.ExaminesCombo[7] = 0; } void combine_Examine5(int flag) { Lara.Examines[4] = 1; Lara.ExaminesCombo[8] = 0; Lara.ExaminesCombo[9] = 0; } void combine_Examine6(int flag) { Lara.Examines[5] = 1; Lara.ExaminesCombo[10] = 0; Lara.ExaminesCombo[11] = 0; } void combine_Examine7(int flag) { Lara.Examines[6] = 1; Lara.ExaminesCombo[12] = 0; Lara.ExaminesCombo[13] = 0; } void combine_Examine8(int flag) { Lara.Examines[7] = 1; Lara.ExaminesCombo[14] = 0; Lara.ExaminesCombo[15] = 0; } void combine_ClockWorkBeetle(int flag) { Lara.hasBeetleThings &= 2;//remove combo1 Lara.hasBeetleThings &= 4;//remove combo2 Lara.hasBeetleThings |= 1;//get beetle } bool GuiController::PerformWaterskinCombine(int flag) { short small_liters, big_liters, small_capacity, big_capacity; int i; small_liters = Lara.small_waterskin - 1;//how many liters in the small one? big_liters = Lara.big_waterskin - 1;//how many liters in the big one? small_capacity = 3 - small_liters;//how many more liters can we fit in the small one? big_capacity = 5 - big_liters;//how many more liters can we fit in the big one? if (flag) { if (Lara.big_waterskin != 1 && small_capacity)//if the big one isn't empty and the small one isn't full { i = big_liters; do { if (small_capacity) { small_liters++; small_capacity--; big_liters--; } i--; } while (i); Lara.small_waterskin = small_liters + 1; Lara.big_waterskin = big_liters + 1; combine_obj1 = (small_liters + 1) + (INV_OBJECT_SMOL_WATERSKIN - 1); return 1; } } else { if (Lara.small_waterskin != 1 && big_capacity)//if the small one isn't empty and the big one isn't full { i = Lara.small_waterskin - 1; do { if (big_capacity) { big_liters++; big_capacity--; small_liters--; } i--; } while (i); Lara.small_waterskin = small_liters + 1; Lara.big_waterskin = big_liters + 1; combine_obj1 = (big_liters + 1) + (INV_OBJECT_BIG_WATERSKIN - 1); return 1; } } return 0; }