#include "framework.h" #include "GameLogicScript.h" #include "items.h" #include "box.h" #include "lara.h" #include "savegame.h" #include "lot.h" #include "sound.h" #include "setup.h" #include "level.h" extern GameFlow* g_GameFlow; GameScript* g_GameScript; bool WarningsAsErrors = false; GameScript::GameScript(sol::state* lua) { m_lua = lua; // Add constants //ExecuteScript("Scripts\\Constants.lua"); m_lua->new_enum("Object", { {"LARA", ID_LARA}, {"LARA_EXTRA_ANIMS", ID_LARA_EXTRA_ANIMS}, {"PISTOLS_ANIM", ID_PISTOLS_ANIM}, {"UZI_ANIM", ID_UZI_ANIM}, {"SHOTGUN_ANIM", ID_SHOTGUN_ANIM}, {"REVOLVER_ANIM", ID_REVOLVER_ANIM}, {"CROSSBOW_ANIM", ID_CROSSBOW_ANIM}, {"HK_ANIM", ID_HK_ANIM}, {"GRENADE_ANIM", ID_GRENADE_ANIM}, {"ROCKET_ANIM", ID_ROCKET_ANIM}, {"HARPOON_ANIM", ID_HARPOON_ANIM}, {"LARA_FLARE_ANIM", ID_LARA_FLARE_ANIM}, {"LARA_SKIN", ID_LARA_SKIN}, {"LARA_SKIN_JOINTS", ID_LARA_SKIN_JOINTS}, {"LARA_SCREAM", ID_LARA_SCREAM}, {"LARA_CROSSBOW_LASER", ID_LARA_CROSSBOW_LASER}, {"LARA_REVOLVER_LASER", ID_LARA_REVOLVER_LASER}, {"LARA_HOLSTERS", ID_LARA_HOLSTERS}, {"LARA_HOLSTERS_PISTOLS", ID_LARA_HOLSTERS_PISTOLS}, {"LARA_HOLSTERS_UZIS", ID_LARA_HOLSTERS_UZIS}, {"LARA_HOLSTERS_REVOLVER", ID_LARA_HOLSTERS_REVOLVER}, {"LARA_SPEECH_HEAD1", ID_LARA_SPEECH_HEAD1}, {"LARA_SPEECH_HEAD2", ID_LARA_SPEECH_HEAD2}, {"LARA_SPEECH_HEAD3", ID_LARA_SPEECH_HEAD3}, {"LARA_SPEECH_HEAD4", ID_LARA_SPEECH_HEAD4}, {"ACTOR1_SPEECH_HEAD1", ID_ACTOR1_SPEECH_HEAD1}, {"ACTOR1_SPEECH_HEAD2", ID_ACTOR1_SPEECH_HEAD2}, {"ACTOR2_SPEECH_HEAD1", ID_ACTOR2_SPEECH_HEAD1}, {"ACTOR2_SPEECH_HEAD2", ID_ACTOR2_SPEECH_HEAD2}, {"LARA_EXTRA_MESH1", ID_LARA_EXTRA_MESH1}, {"LARA_EXTRA_MESH2", ID_LARA_EXTRA_MESH2}, {"LARA_EXTRA_MESH3", ID_LARA_EXTRA_MESH3}, {"LARA_WATER_MESH", ID_LARA_WATER_MESH}, {"LARA_PETROL_MESH", ID_LARA_PETROL_MESH}, {"LARA_DIRT_MESH", ID_LARA_DIRT_MESH}, {"LARA_CROWBAR_ANIM", ID_LARA_CROWBAR_ANIM}, {"LARA_TORCH_ANIM", ID_LARA_TORCH_ANIM}, {"LARA_HAIR", ID_LARA_HAIR}, {"SNOWMOBILE_LARA_ANIMS", ID_SNOWMOBILE_LARA_ANIMS}, {"SNOWMOBILE", ID_SNOWMOBILE}, {"QUAD_LARA_ANIMS", ID_QUAD_LARA_ANIMS}, {"QUAD", ID_QUAD}, {"SPEEDBOAT_LARA_ANIMS", ID_SPEEDBOAT_LARA_ANIMS}, {"SPEEDBOAT", ID_SPEEDBOAT}, {"KAYAK_LARA_ANIMS", ID_KAYAK_LARA_ANIMS}, {"KAYAK", ID_KAYAK}, {"UPV_LARA_ANIMS", ID_UPV_LARA_ANIMS}, {"UPV", ID_UPV}, {"MINECART_LARA_ANIMS", ID_MINECART_LARA_ANIMS}, {"MINECART", ID_MINECART}, {"JEEP_LARA_ANIMS", ID_JEEP_LARA_ANIMS}, {"JEEP", ID_JEEP}, {"MOTORBIKE_LARA_ANIMS", ID_MOTORBIKE_LARA_ANIMS}, {"MOTORBIKE", ID_MOTORBIKE}, {"RUBBER_BOAT_LARA_ANIMS", ID_RUBBER_BOAT_LARA_ANIMS}, {"RUBBER_BOAT_BOAT", ID_RUBBER_BOAT_BOAT}, {"VEHICLE_SMASHABLE_FLOOR", ID_VEHICLE_SMASHABLE_FLOOR}, {"VEHICLE_SMASHABLE_WALL", ID_VEHICLE_SMASHABLE_WALL}, {"WOLF", ID_WOLF}, {"BEAR", ID_BEAR}, {"APE", ID_APE}, {"SMALL_SPIDER", ID_SMALL_SPIDER}, {"BIG_SPIDER", ID_BIG_SPIDER}, {"CROW", ID_CROW}, {"TIGER", ID_TIGER}, {"EAGLE", ID_EAGLE}, {"RAPTOR", ID_RAPTOR}, {"TYRANNOSAUR", ID_TYRANNOSAUR}, {"COBRA", ID_COBRA}, {"MONKEY", ID_MONKEY}, {"WHALE", ID_WHALE}, {"SMALL_DINOSAUR", ID_SMALL_DINOSAUR}, {"FISH_EMITTER", ID_FISH_EMITTER}, {"RAT", ID_RAT}, {"BIG_RAT", ID_BIG_RAT}, {"CROCODILE", ID_CROCODILE}, {"BAT", ID_BAT}, {"SPHINX", ID_SPHINX}, {"WILD_BOAR", ID_WILD_BOAR}, {"HARPY", ID_HARPY}, {"BIG_SCORPION", ID_BIG_SCORPION}, {"SMALL_SCORPION", ID_SMALL_SCORPION}, {"BABOON_NORMAL", ID_BABOON_NORMAL}, {"BABOON_INV", ID_BABOON_INV}, {"BABOON_SILENT", ID_BABOON_SILENT}, {"LITTLE_BEETLE", ID_LITTLE_BEETLE}, {"LOCUSTS", ID_LOCUSTS}, {"SHARK", ID_SHARK}, {"HUSKIE", ID_HUSKIE}, {"DOG", ID_DOG}, {"BATS_EMITTER", ID_BATS_EMITTER}, {"RATS_EMITTER", ID_RATS_EMITTER}, {"SPIDERS_EMITTER", ID_SPIDERS_EMITTER}, {"LION", ID_LION}, {"DOBERMAN", ID_DOBERMAN}, {"SCUBA_HARPOON", ID_SCUBA_HARPOON}, {"SCUBA_DIVER", ID_SCUBA_DIVER}, {"GOON_SILENCER1", ID_GOON_SILENCER1}, {"GOON_SILENCER2", ID_GOON_SILENCER2}, {"GOON_SILENCER3", ID_GOON_SILENCER3}, {"BARRACUDA", ID_BARRACUDA}, {"WORKER_SHOTGUN", ID_WORKER_SHOTGUN}, {"WORKER_MACHINEGUN", ID_WORKER_MACHINEGUN}, {"WORKER_DUAL_REVOLVER", ID_WORKER_DUAL_REVOLVER}, {"WORKER_FLAMETHROWER", ID_WORKER_FLAMETHROWER}, {"MONK1", ID_MONK1}, {"MONK2", ID_MONK2}, {"KNIFETHROWER", ID_KNIFETHROWER}, {"KNIFETHROWER_KNIFE", ID_KNIFETHROWER_KNIFE}, {"MERCENARY_UZI", ID_MERCENARY_UZI}, {"MERCENARY_AUTOPISTOLS1", ID_MERCENARY_AUTOPISTOLS1}, {"MERCENARY_AUTOPISTOLS2", ID_MERCENARY_AUTOPISTOLS2}, {"SNOWMOBILE_GUN", ID_SNOWMOBILE_GUN}, {"SNOWMOBILE_DRIVER", ID_SNOWMOBILE_DRIVER}, {"FLAMETHROWER_BADDY", ID_FLAMETHROWER_BADDY}, {"TRIBESMAN_WITH_AX", ID_TRIBESMAN_WITH_AX}, {"TRIBESMAN_WITH_DARTS", ID_TRIBESMAN_WITH_DARTS}, {"MP_WITH_STICK", ID_MP_WITH_STICK}, {"MP_WITH_GUN", ID_MP_WITH_GUN}, {"BADDY1", ID_BADDY1}, {"BADDY2", ID_BADDY2}, {"SAS_CAIRO", ID_SAS_CAIRO}, {"SAS_DYING", ID_SAS_DYING}, {"SAS_CAPTAIN", ID_SAS_CAPTAIN}, {"SAS_DRAG_BLOKE", ID_SAS_DRAG_BLOKE}, {"GUIDE", ID_GUIDE}, {"VON_CROY", ID_VON_CROY}, {"TROOPS", ID_TROOPS}, {"SAS", ID_SAS}, {"SWAT", ID_SWAT}, {"SWAT_PLUS", ID_SWAT_PLUS}, {"GUARD1", ID_GUARD1}, {"GUARD_LASER", ID_GUARD_LASER}, {"LARSON", ID_LARSON}, {"PIERRE", ID_PIERRE}, {"MAFIA", ID_MAFIA}, {"MAFIA2", ID_MAFIA2}, {"GUARD2", ID_GUARD2}, {"GUARD3", ID_GUARD3}, {"GLADIATOR", ID_GLADIATOR}, {"HITMAN", ID_HITMAN}, {"SNIPER", ID_SNIPER}, {"CHEF", ID_CHEF}, {"WINGED_MUMMY", ID_WINGED_MUMMY}, {"CENTAUR_MUTANT", ID_CENTAUR_MUTANT}, {"DOPPELGANGER", ID_LARA_DOPPELGANGER}, {"NATLA", ID_NATLA}, {"WINGED_NATLA", ID_WINGED_NATLA}, {"GIANT_MUTANT", ID_GIANT_MUTANT}, {"PROJ_NATLA", ID_PROJ_NATLA}, {"PROJ_SHARD", ID_PROJ_SHARD}, {"PROJ_BOMB", ID_PROJ_BOMB}, {"YETI", ID_YETI}, {"BIRDMONSTER", ID_BIRDMONSTER}, {"MARCO_BARTOLI", ID_MARCO_BARTOLI}, {"DRAGON_FRONT", ID_DRAGON_FRONT}, {"DRAGON_BACK", ID_DRAGON_BACK}, {"DRAGON_BONE_FRONT", ID_DRAGON_BONE_FRONT}, {"DRAGON_BONE_BACK", ID_DRAGON_BONE_BACK}, {"SPHERE_OF_DOOM", ID_SPHERE_OF_DOOM}, {"SPHERE_OF_DOOM2", ID_SPHERE_OF_DOOM2}, {"SPHERE_OF_DOOM3", ID_SPHERE_OF_DOOM3}, {"CIVVIE", ID_CIVVIE}, {"SPEAR_GUARDIAN", ID_SPEAR_GUARDIAN}, {"SPEAR_GUARDIAN_STATUE", ID_SPEAR_GUARDIAN_STATUE}, {"SWORD_GUARDIAN", ID_SWORD_GUARDIAN}, {"SWORD_GUARDIAN_STATUE", ID_SWORD_GUARDIAN_STATUE}, {"SHIVA", ID_SHIVA}, {"SHIVA_STATUE", ID_SHIVA_STATUE}, {"TRIBEBOSS", ID_TRIBEBOSS}, {"CIVVY", ID_CIVVY}, {"MUTANT2", ID_MUTANT2}, {"LIZARD", ID_LIZARD}, {"TONY_BOSS", ID_TONY_BOSS}, {"TONY_BOSS_FLAME", ID_TONY_BOSS_FLAME}, {"PUNA_BOSS", ID_PUNA_BOSS}, {"SOPHIA_LEE_BOSS", ID_SOPHIA_LEE_BOSS}, {"LASER_BOLT", ID_LASER_BOLT}, {"SKELETON", ID_SKELETON}, {"MUMMY", ID_MUMMY}, {"ENEMY_JEEP", ID_ENEMY_JEEP}, {"HORSE", ID_HORSE}, {"HORSEMAN", ID_HORSEMAN}, {"DEMIGOD1", ID_DEMIGOD1}, {"DEMIGOD2", ID_DEMIGOD2}, {"DEMIGOD3", ID_DEMIGOD3}, {"SETHA", ID_SETHA}, {"KNIGHT_TEMPLAR", ID_KNIGHT_TEMPLAR}, {"AHMET", ID_AHMET}, {"BIG_BEETLE", ID_BIG_BEETLE}, {"JEAN_YVES", ID_JEAN_YVES}, {"WRAITH1", ID_WRAITH1}, {"WRAITH2", ID_WRAITH2}, {"WRAITH3", ID_WRAITH3}, {"WRAITH4", ID_WRAITH4}, {"LARA_DOUBLE", ID_LARA_DOUBLE}, {"COMPY", ID_COMPY}, {"HYDRA", ID_HYDRA}, {"LASERHEAD", ID_LASERHEAD}, {"SCIENTIST", ID_SCIENTIST}, {"MERCENARY", ID_MERCENARY}, {"WILLOWISP", ID_WILLOWISP}, {"INVISIBLE_GHOST", ID_INVISIBLE_GHOST}, {"REAPER", ID_REAPER}, {"BROWN_BEAST", ID_BROWN_BEAST}, {"ATTACK_SUB", ID_ATTACK_SUB}, {"IMP", ID_IMP}, {"IMP_ROCK", ID_IMP_ROCK}, {"GUNSHIP", ID_GUNSHIP}, {"AUTOGUN", ID_AUTOGUN}, {"ROMAN_GOD1", ID_ROMAN_GOD1}, {"ROMAN_GOD2", ID_ROMAN_GOD2}, {"LAGOON_WITCH", ID_LAGOON_WITCH}, {"BOSS_SHIELD", ID_BOSS_SHIELD}, {"BOSS_EXPLOSION_SHOCKWAVE", ID_BOSS_EXPLOSION_SHOCKWAVE}, {"BOSS_EXPLOSION_RING", ID_BOSS_EXPLOSION_RING}, {"SPRINGBOARD", ID_SPRINGBOARD}, {"ROLLING_SPINDLE", ID_ROLLING_SPINDLE}, {"DISK_SHOOTER", ID_DISK_SHOOTER}, {"DISK", ID_DISK}, {"WALL_MOUNTED_BLADE", ID_WALL_MOUNTED_BLADE}, {"STATUE_WITH_BLADE", ID_STATUE_WITH_BLADE}, {"COG", ID_COG}, {"SPIKEBALL", ID_SPIKEBALL}, {"FLOOR_4BLADES", ID_FLOOR_4BLADES}, {"CEILING_4BLADES", ID_CEILING_4BLADES}, {"CATWALK_BLADE", ID_CATWALK_BLADE}, {"SETH_BLADE", ID_SETH_BLADE}, {"PLINTH_BLADE", ID_PLINTH_BLADE}, {"SLICER_DICER", ID_SLICER_DICER}, {"BIRD_BLADE", ID_BIRD_BLADE}, {"CHAIN", ID_CHAIN}, {"PLOUGH", ID_PLOUGH}, {"STARGATE", ID_STARGATE}, {"SPIKY_FLOOR", ID_SPIKY_FLOOR}, {"SPIKY_WALL", ID_SPIKY_WALL}, {"SPIKY_CEILING", ID_SPIKY_CEILING}, {"TEETH_SPIKES", ID_TEETH_SPIKES}, {"JOBY_SPIKES", ID_JOBY_SPIKES}, {"SENTRY_GUN", ID_SENTRY_GUN}, {"MAPPER", ID_MAPPER}, {"MOVING_BLADE", ID_MOVING_BLADE}, {"ELEMENT_PUZZLE", ID_ELEMENT_PUZZLE}, {"LIGHTING_CONDUCTOR", ID_LIGHTING_CONDUCTOR}, {"HAMMER", ID_HAMMER}, {"OBELISK", ID_OBELISK}, {"WHEEL_OF_FORTUNE", ID_WHEEL_OF_FORTUNE}, {"GAME_PIECE1", ID_GAME_PIECE1}, {"GAME_PIECE2", ID_GAME_PIECE2}, {"GAME_PIECE3", ID_GAME_PIECE3}, {"RAISING_COG", ID_RAISING_COG}, {"MINE", ID_MINE}, {"SCALES", ID_SCALES}, {"ROME_HAMMER", ID_ROME_HAMMER}, {"FLAME", ID_FLAME}, {"FLAME_EMITTER", ID_FLAME_EMITTER}, {"FLAME_EMITTER2", ID_FLAME_EMITTER2}, {"FLAME_EMITTER3", ID_FLAME_EMITTER3}, {"BURNING_ROOTS", ID_BURNING_ROOTS}, {"ROPE", ID_ROPE}, {"FIREROPE", ID_FIREROPE}, {"POLEROPE", ID_POLEROPE}, {"ELECTRICAL_CABLES", ID_ELECTRICAL_CABLES}, {"BURNING_FLOOR", ID_BURNING_FLOOR}, {"DARTS", ID_DARTS}, {"DART_EMITTER", ID_DART_EMITTER}, {"HOMING_DART_EMITTER", ID_HOMING_DART_EMITTER}, {"FALLING_CEILING", ID_FALLING_CEILING}, {"FALLING_BLOCK", ID_FALLING_BLOCK}, {"FALLING_BLOCK2", ID_FALLING_BLOCK2}, {"CRUMBLING_FLOOR", ID_CRUMBLING_FLOOR}, {"TRAPDOOR1", ID_TRAPDOOR1}, {"TRAPDOOR2", ID_TRAPDOOR2}, {"TRAPDOOR3", ID_TRAPDOOR3}, {"FLOOR_TRAPDOOR1", ID_FLOOR_TRAPDOOR1}, {"FLOOR_TRAPDOOR2", ID_FLOOR_TRAPDOOR2}, {"CEILING_TRAPDOOR1", ID_CEILING_TRAPDOOR1}, {"CEILING_TRAPDOOR2", ID_CEILING_TRAPDOOR2}, {"SCALING_TRAPDOOR", ID_SCALING_TRAPDOOR}, {"ROLLINGBALL", ID_ROLLINGBALL}, {"ROLLINGBARREL", ID_ROLLINGBARREL}, {"PROPELLER_H", ID_PROPELLER_H}, {"PROPELLER_V", ID_PROPELLER_V}, {"ONEBLOCK_PLATFORM", ID_ONEBLOCK_PLATFORM}, {"TWOBLOCK_PLATFORM", ID_TWOBLOCK_PLATFORM}, {"RAISING_BLOCK1", ID_RAISING_BLOCK1}, {"RAISING_BLOCK2", ID_RAISING_BLOCK2}, {"RAISING_BLOCK3", ID_RAISING_BLOCK3}, {"RAISING_BLOCK4", ID_RAISING_BLOCK4}, {"PUSHABLE_OBJECT1", ID_PUSHABLE_OBJECT1}, {"PUSHABLE_OBJECT2", ID_PUSHABLE_OBJECT2}, {"PUSHABLE_OBJECT3", ID_PUSHABLE_OBJECT3}, {"PUSHABLE_OBJECT4", ID_PUSHABLE_OBJECT4}, {"PUSHABLE_OBJECT5", ID_PUSHABLE_OBJECT5}, {"PUSHABLE_OBJECT6", ID_PUSHABLE_OBJECT6}, {"PUSHABLE_OBJECT7", ID_PUSHABLE_OBJECT7}, {"PUSHABLE_OBJECT8", ID_PUSHABLE_OBJECT8}, {"PUSHABLE_OBJECT9", ID_PUSHABLE_OBJECT9}, {"PUSHABLE_OBJECT10", ID_PUSHABLE_OBJECT10}, {"WRECKING_BALL", ID_WRECKING_BALL}, {"ZIPLINE_HANDLE", ID_ZIPLINE_HANDLE}, {"TORPEDO", ID_TORPEDO}, {"CHAFF", ID_CHAFF}, {"ELECTRIC_FENCE", ID_ELECTRIC_FENCE}, {"LIFT", ID_LIFT}, {"TIGHT_ROPE", ID_TIGHT_ROPE}, {"PARALLEL_BARS", ID_PARALLEL_BARS}, {"XRAY_CONTROLLER", ID_XRAY_CONTROLLER}, {"PORTAL", ID_PORTAL}, {"GEN_SLOT1", ID_GEN_SLOT1}, {"GEN_SLOT2", ID_GEN_SLOT2}, {"GEN_SLOT3", ID_GEN_SLOT3}, {"GEN_SLOT4", ID_GEN_SLOT4}, {"SEARCH_OBJECT1", ID_SEARCH_OBJECT1}, {"SEARCH_OBJECT2", ID_SEARCH_OBJECT2}, {"SEARCH_OBJECT3", ID_SEARCH_OBJECT3}, {"SEARCH_OBJECT4", ID_SEARCH_OBJECT4}, {"SARCOPHAGUS", ID_SARCOPHAGUS}, {"ENEMY_PIECE", ID_ENEMY_PIECE}, {"EXPANDING_PLATFORM", ID_EXPANDING_PLATFORM}, {"SQUISHY_BLOCK1", ID_SQUISHY_BLOCK1}, {"SQUISHY_BLOCK2", ID_SQUISHY_BLOCK2}, {"TRIPWIRE", ID_TRIPWIRE}, {"MINE_DETECTOR", ID_MINE_DETECTOR}, {"MAP", ID_MAP}, {"SECRET_MAP", ID_SECRET_MAP}, {"SETH_DOOR", ID_SETH_DOOR}, {"HORUS_STATUE", ID_HORUS_STATUE}, {"STATUE_PLINTH", ID_STATUE_PLINTH}, {"PUZZLE_ITEM1", ID_PUZZLE_ITEM1}, {"PUZZLE_ITEM2", ID_PUZZLE_ITEM2}, {"PUZZLE_ITEM3", ID_PUZZLE_ITEM3}, {"PUZZLE_ITEM4", ID_PUZZLE_ITEM4}, {"PUZZLE_ITEM5", ID_PUZZLE_ITEM5}, {"PUZZLE_ITEM6", ID_PUZZLE_ITEM6}, {"PUZZLE_ITEM7", ID_PUZZLE_ITEM7}, {"PUZZLE_ITEM8", ID_PUZZLE_ITEM8}, {"PUZZLE_ITEM9", ID_PUZZLE_ITEM9}, {"PUZZLE_ITEM10", ID_PUZZLE_ITEM10}, {"PUZZLE_ITEM11", ID_PUZZLE_ITEM11}, {"PUZZLE_ITEM12", ID_PUZZLE_ITEM12}, {"PUZZLE_ITEM13", ID_PUZZLE_ITEM13}, {"PUZZLE_ITEM14", ID_PUZZLE_ITEM14}, {"PUZZLE_ITEM15", ID_PUZZLE_ITEM15}, {"PUZZLE_ITEM16", ID_PUZZLE_ITEM16}, {"PUZZLE_ITEM1_COMBO1", ID_PUZZLE_ITEM1_COMBO1}, {"PUZZLE_ITEM1_COMBO2", ID_PUZZLE_ITEM1_COMBO2}, {"PUZZLE_ITEM2_COMBO1", ID_PUZZLE_ITEM2_COMBO1}, {"PUZZLE_ITEM2_COMBO2", ID_PUZZLE_ITEM2_COMBO2}, {"PUZZLE_ITEM3_COMBO1", ID_PUZZLE_ITEM3_COMBO1}, {"PUZZLE_ITEM3_COMBO2", ID_PUZZLE_ITEM3_COMBO2}, {"PUZZLE_ITEM4_COMBO1", ID_PUZZLE_ITEM4_COMBO1}, {"PUZZLE_ITEM4_COMBO2", ID_PUZZLE_ITEM4_COMBO2}, {"PUZZLE_ITEM5_COMBO1", ID_PUZZLE_ITEM5_COMBO1}, {"PUZZLE_ITEM5_COMBO2", ID_PUZZLE_ITEM5_COMBO2}, {"PUZZLE_ITEM6_COMBO1", ID_PUZZLE_ITEM6_COMBO1}, {"PUZZLE_ITEM6_COMBO2", ID_PUZZLE_ITEM6_COMBO2}, {"PUZZLE_ITEM7_COMBO1", ID_PUZZLE_ITEM7_COMBO1}, {"PUZZLE_ITEM7_COMBO2", ID_PUZZLE_ITEM7_COMBO2}, {"PUZZLE_ITEM8_COMBO1", ID_PUZZLE_ITEM8_COMBO1}, {"PUZZLE_ITEM8_COMBO2", ID_PUZZLE_ITEM8_COMBO2}, {"PUZZLE_ITEM9_COMBO1", ID_PUZZLE_ITEM9_COMBO1}, {"PUZZLE_ITEM9_COMBO2", ID_PUZZLE_ITEM9_COMBO2}, {"PUZZLE_ITEM10_COMBO1", ID_PUZZLE_ITEM10_COMBO1}, {"PUZZLE_ITEM10_COMBO2", ID_PUZZLE_ITEM10_COMBO2}, {"PUZZLE_ITEM11_COMBO1", ID_PUZZLE_ITEM11_COMBO1}, {"PUZZLE_ITEM11_COMBO2", ID_PUZZLE_ITEM11_COMBO2}, {"PUZZLE_ITEM12_COMBO1", ID_PUZZLE_ITEM12_COMBO1}, {"PUZZLE_ITEM12_COMBO2", ID_PUZZLE_ITEM12_COMBO2}, {"PUZZLE_ITEM13_COMBO1", ID_PUZZLE_ITEM13_COMBO1}, {"PUZZLE_ITEM13_COMBO2", ID_PUZZLE_ITEM13_COMBO2}, {"PUZZLE_ITEM14_COMBO1", ID_PUZZLE_ITEM14_COMBO1}, {"PUZZLE_ITEM14_COMBO2", ID_PUZZLE_ITEM14_COMBO2}, {"PUZZLE_ITEM15_COMBO1", ID_PUZZLE_ITEM15_COMBO1}, {"PUZZLE_ITEM15_COMBO2", ID_PUZZLE_ITEM15_COMBO2}, {"PUZZLE_ITEM16_COMBO1", ID_PUZZLE_ITEM16_COMBO1}, {"PUZZLE_ITEM16_COMBO2", ID_PUZZLE_ITEM16_COMBO2}, {"KEY_ITEM1", ID_KEY_ITEM1}, {"KEY_ITEM2", ID_KEY_ITEM2}, {"KEY_ITEM3", ID_KEY_ITEM3}, {"KEY_ITEM4", ID_KEY_ITEM4}, {"KEY_ITEM5", ID_KEY_ITEM5}, {"KEY_ITEM6", ID_KEY_ITEM6}, {"KEY_ITEM7", ID_KEY_ITEM7}, {"KEY_ITEM8", ID_KEY_ITEM8}, {"KEY_ITEM9", ID_KEY_ITEM9}, {"KEY_ITEM10", ID_KEY_ITEM10}, {"KEY_ITEM11", ID_KEY_ITEM11}, {"KEY_ITEM12", ID_KEY_ITEM12}, {"KEY_ITEM13", ID_KEY_ITEM13}, {"KEY_ITEM14", ID_KEY_ITEM14}, {"KEY_ITEM15", ID_KEY_ITEM15}, {"KEY_ITEM16", ID_KEY_ITEM16}, {"KEY_ITEM1_COMBO1", ID_KEY_ITEM1_COMBO1}, {"KEY_ITEM1_COMBO2", ID_KEY_ITEM1_COMBO2}, {"KEY_ITEM2_COMBO1", ID_KEY_ITEM2_COMBO1}, {"KEY_ITEM2_COMBO2", ID_KEY_ITEM2_COMBO2}, {"KEY_ITEM3_COMBO1", ID_KEY_ITEM3_COMBO1}, {"KEY_ITEM3_COMBO2", ID_KEY_ITEM3_COMBO2}, {"KEY_ITEM4_COMBO1", ID_KEY_ITEM4_COMBO1}, {"KEY_ITEM4_COMBO2", ID_KEY_ITEM4_COMBO2}, {"KEY_ITEM5_COMBO1", ID_KEY_ITEM5_COMBO1}, {"KEY_ITEM5_COMBO2", ID_KEY_ITEM5_COMBO2}, {"KEY_ITEM6_COMBO1", ID_KEY_ITEM6_COMBO1}, {"KEY_ITEM6_COMBO2", ID_KEY_ITEM6_COMBO2}, {"KEY_ITEM7_COMBO1", ID_KEY_ITEM7_COMBO1}, {"KEY_ITEM7_COMBO2", ID_KEY_ITEM7_COMBO2}, {"KEY_ITEM8_COMBO1", ID_KEY_ITEM8_COMBO1}, {"KEY_ITEM8_COMBO2", ID_KEY_ITEM8_COMBO2}, {"KEY_ITEM9_COMBO1", ID_KEY_ITEM9_COMBO1}, {"KEY_ITEM9_COMBO2", ID_KEY_ITEM9_COMBO2}, {"KEY_ITEM10_COMBO1", ID_KEY_ITEM10_COMBO1}, {"KEY_ITEM10_COMBO2", ID_KEY_ITEM10_COMBO2}, {"KEY_ITEM11_COMBO1", ID_KEY_ITEM11_COMBO1}, {"KEY_ITEM11_COMBO2", ID_KEY_ITEM11_COMBO2}, {"KEY_ITEM12_COMBO1", ID_KEY_ITEM12_COMBO1}, {"KEY_ITEM12_COMBO2", ID_KEY_ITEM12_COMBO2}, {"KEY_ITEM13_COMBO1", ID_KEY_ITEM13_COMBO1}, {"KEY_ITEM13_COMBO2", ID_KEY_ITEM13_COMBO2}, {"KEY_ITEM14_COMBO1", ID_KEY_ITEM14_COMBO1}, {"KEY_ITEM14_COMBO2", ID_KEY_ITEM14_COMBO2}, {"KEY_ITEM15_COMBO1", ID_KEY_ITEM15_COMBO1}, {"KEY_ITEM15_COMBO2", ID_KEY_ITEM15_COMBO2}, {"KEY_ITEM16_COMBO1", ID_KEY_ITEM16_COMBO1}, {"KEY_ITEM16_COMBO2", ID_KEY_ITEM16_COMBO2}, {"PICKUP_ITEM1", ID_PICKUP_ITEM1}, {"PICKUP_ITEM2", ID_PICKUP_ITEM2}, {"PICKUP_ITEM3", ID_PICKUP_ITEM3}, {"PICKUP_ITEM4", ID_PICKUP_ITEM4}, {"PICKUP_ITEM5", ID_PICKUP_ITEM5}, {"PICKUP_ITEM6", ID_PICKUP_ITEM6}, {"PICKUP_ITEM7", ID_PICKUP_ITEM7}, {"PICKUP_ITEM8", ID_PICKUP_ITEM8}, {"PICKUP_ITEM9", ID_PICKUP_ITEM9}, {"PICKUP_ITEM10", ID_PICKUP_ITEM10}, {"PICKUP_ITEM11", ID_PICKUP_ITEM11}, {"PICKUP_ITEM12", ID_PICKUP_ITEM12}, {"PICKUP_ITEM13", ID_PICKUP_ITEM13}, {"PICKUP_ITEM14", ID_PICKUP_ITEM14}, {"PICKUP_ITEM15", ID_PICKUP_ITEM15}, {"PICKUP_ITEM16", ID_PICKUP_ITEM16}, {"PICKUP_ITEM1_COMBO1", ID_PICKUP_ITEM1_COMBO1}, {"PICKUP_ITEM1_COMBO2", ID_PICKUP_ITEM1_COMBO2}, {"PICKUP_ITEM2_COMBO1", ID_PICKUP_ITEM2_COMBO1}, {"PICKUP_ITEM2_COMBO2", ID_PICKUP_ITEM2_COMBO2}, {"PICKUP_ITEM3_COMBO1", ID_PICKUP_ITEM3_COMBO1}, {"PICKUP_ITEM3_COMBO2", ID_PICKUP_ITEM3_COMBO2}, {"PICKUP_ITEM4_COMBO1", ID_PICKUP_ITEM4_COMBO1}, {"PICKUP_ITEM4_COMBO2", ID_PICKUP_ITEM4_COMBO2}, {"PICKUP_ITEM5_COMBO1", ID_PICKUP_ITEM5_COMBO1}, {"PICKUP_ITEM5_COMBO2", ID_PICKUP_ITEM5_COMBO2}, {"PICKUP_ITEM6_COMBO1", ID_PICKUP_ITEM6_COMBO1}, {"PICKUP_ITEM6_COMBO2", ID_PICKUP_ITEM6_COMBO2}, {"PICKUP_ITEM7_COMBO1", ID_PICKUP_ITEM7_COMBO1}, {"PICKUP_ITEM7_COMBO2", ID_PICKUP_ITEM7_COMBO2}, {"PICKUP_ITEM8_COMBO1", ID_PICKUP_ITEM8_COMBO1}, {"PICKUP_ITEM8_COMBO2", ID_PICKUP_ITEM8_COMBO2}, {"PICKUP_ITEM9_COMBO1", ID_PICKUP_ITEM9_COMBO1}, {"PICKUP_ITEM9_COMBO2", ID_PICKUP_ITEM9_COMBO2}, {"PICKUP_ITEM10_COMBO1", ID_PICKUP_ITEM10_COMBO1}, {"PICKUP_ITEM10_COMBO2", ID_PICKUP_ITEM10_COMBO2}, {"PICKUP_ITEM11_COMBO1", ID_PICKUP_ITEM11_COMBO1}, {"PICKUP_ITEM11_COMBO2", ID_PICKUP_ITEM11_COMBO2}, {"PICKUP_ITEM12_COMBO1", ID_PICKUP_ITEM12_COMBO1}, {"PICKUP_ITEM12_COMBO2", ID_PICKUP_ITEM12_COMBO2}, {"PICKUP_ITEM13_COMBO1", ID_PICKUP_ITEM13_COMBO1}, {"PICKUP_ITEM13_COMBO2", ID_PICKUP_ITEM13_COMBO2}, {"PICKUP_ITEM14_COMBO1", ID_PICKUP_ITEM14_COMBO1}, {"PICKUP_ITEM14_COMBO2", ID_PICKUP_ITEM14_COMBO2}, {"PICKUP_ITEM15_COMBO1", ID_PICKUP_ITEM15_COMBO1}, {"PICKUP_ITEM15_COMBO2", ID_PICKUP_ITEM15_COMBO2}, {"PICKUP_ITEM16_COMBO1", ID_PICKUP_ITEM16_COMBO1}, {"PICKUP_ITEM16_COMBO2", ID_PICKUP_ITEM16_COMBO2}, {"EXAMINE1", ID_EXAMINE1}, {"EXAMINE2", ID_EXAMINE2}, {"EXAMINE3", ID_EXAMINE3}, {"EXAMINE4", ID_EXAMINE4}, {"EXAMINE5", ID_EXAMINE5}, {"EXAMINE6", ID_EXAMINE6}, {"EXAMINE7", ID_EXAMINE7}, {"EXAMINE8", ID_EXAMINE8}, {"EXAMINE1_COMBO1", ID_EXAMINE1_COMBO1}, {"EXAMINE1_COMBO2", ID_EXAMINE1_COMBO2}, {"EXAMINE2_COMBO1", ID_EXAMINE2_COMBO1}, {"EXAMINE2_COMBO2", ID_EXAMINE2_COMBO2}, {"EXAMINE3_COMBO1", ID_EXAMINE3_COMBO1}, {"EXAMINE3_COMBO2", ID_EXAMINE3_COMBO2}, {"EXAMINE4_COMBO1", ID_EXAMINE4_COMBO1}, {"EXAMINE4_COMBO2", ID_EXAMINE4_COMBO2}, {"EXAMINE5_COMBO1", ID_EXAMINE5_COMBO1}, {"EXAMINE5_COMBO2", ID_EXAMINE5_COMBO2}, {"EXAMINE6_COMBO1", ID_EXAMINE6_COMBO1}, {"EXAMINE6_COMBO2", ID_EXAMINE6_COMBO2}, {"EXAMINE7_COMBO1", ID_EXAMINE7_COMBO1}, {"EXAMINE7_COMBO2", ID_EXAMINE7_COMBO2}, {"EXAMINE8_COMBO1", ID_EXAMINE8_COMBO1}, {"EXAMINE8_COMBO2", ID_EXAMINE8_COMBO2}, {"PUZZLE_HOLE1", ID_PUZZLE_HOLE1}, {"PUZZLE_HOLE2", ID_PUZZLE_HOLE2}, {"PUZZLE_HOLE3", ID_PUZZLE_HOLE3}, {"PUZZLE_HOLE4", ID_PUZZLE_HOLE4}, {"PUZZLE_HOLE5", ID_PUZZLE_HOLE5}, {"PUZZLE_HOLE6", ID_PUZZLE_HOLE6}, {"PUZZLE_HOLE7", ID_PUZZLE_HOLE7}, {"PUZZLE_HOLE8", ID_PUZZLE_HOLE8}, {"PUZZLE_HOLE9", ID_PUZZLE_HOLE9}, {"PUZZLE_HOLE10", ID_PUZZLE_HOLE10}, {"PUZZLE_HOLE11", ID_PUZZLE_HOLE11}, {"PUZZLE_HOLE12", ID_PUZZLE_HOLE12}, {"PUZZLE_HOLE13", ID_PUZZLE_HOLE13}, {"PUZZLE_HOLE14", ID_PUZZLE_HOLE14}, {"PUZZLE_HOLE15", ID_PUZZLE_HOLE15}, {"PUZZLE_HOLE16", ID_PUZZLE_HOLE16}, {"PUZZLE_DONE1", ID_PUZZLE_DONE1}, {"PUZZLE_DONE2", ID_PUZZLE_DONE2}, {"PUZZLE_DONE3", ID_PUZZLE_DONE3}, {"PUZZLE_DONE4", ID_PUZZLE_DONE4}, {"PUZZLE_DONE5", ID_PUZZLE_DONE5}, {"PUZZLE_DONE6", ID_PUZZLE_DONE6}, {"PUZZLE_DONE7", ID_PUZZLE_DONE7}, {"PUZZLE_DONE8", ID_PUZZLE_DONE8}, {"PUZZLE_DONE9", ID_PUZZLE_DONE9}, {"PUZZLE_DONE10", ID_PUZZLE_DONE10}, {"PUZZLE_DONE11", ID_PUZZLE_DONE11}, {"PUZZLE_DONE12", ID_PUZZLE_DONE12}, {"PUZZLE_DONE13", ID_PUZZLE_DONE13}, {"PUZZLE_DONE14", ID_PUZZLE_DONE14}, {"PUZZLE_DONE15", ID_PUZZLE_DONE15}, {"PUZZLE_DONE16", ID_PUZZLE_DONE16}, {"KEY_HOLE1", ID_KEY_HOLE1}, {"KEY_HOLE2", ID_KEY_HOLE2}, {"KEY_HOLE3", ID_KEY_HOLE3}, {"KEY_HOLE4", ID_KEY_HOLE4}, {"KEY_HOLE5", ID_KEY_HOLE5}, {"KEY_HOLE6", ID_KEY_HOLE6}, {"KEY_HOLE7", ID_KEY_HOLE7}, {"KEY_HOLE8", ID_KEY_HOLE8}, {"KEY_HOLE9", ID_KEY_HOLE9}, {"KEY_HOLE10", ID_KEY_HOLE10}, {"KEY_HOLE11", ID_KEY_HOLE11}, {"KEY_HOLE12", ID_KEY_HOLE12}, {"KEY_HOLE13", ID_KEY_HOLE13}, {"KEY_HOLE14", ID_KEY_HOLE14}, {"KEY_HOLE15", ID_KEY_HOLE15}, {"KEY_HOLE16", ID_KEY_HOLE16}, {"WATERSKIN1_EMPTY", ID_WATERSKIN1_EMPTY}, {"WATERSKIN1_1", ID_WATERSKIN1_1}, {"WATERSKIN1_2", ID_WATERSKIN1_2}, {"WATERSKIN1_3", ID_WATERSKIN1_3}, {"WATERSKIN2_EMPTY", ID_WATERSKIN2_EMPTY}, {"WATERSKIN2_1", ID_WATERSKIN2_1}, {"WATERSKIN2_2", ID_WATERSKIN2_2}, {"WATERSKIN2_3", ID_WATERSKIN2_3}, {"WATERSKIN2_4", ID_WATERSKIN2_4}, {"WATERSKIN2_5", ID_WATERSKIN2_5}, {"HAMMER_ITEM", ID_HAMMER_ITEM}, {"CROWBAR_ITEM", ID_CROWBAR_ITEM}, {"BURNING_TORCH_ITEM", ID_BURNING_TORCH_ITEM}, {"CLOCKWORK_BEETLE", ID_CLOCKWORK_BEETLE}, {"CLOCKWORK_BEETLE_COMBO1", ID_CLOCKWORK_BEETLE_COMBO1}, {"CLOCKWORK_BEETLE_COMBO2", ID_CLOCKWORK_BEETLE_COMBO2}, {"SWITCH_TYPE1", ID_SWITCH_TYPE1}, {"SWITCH_TYPE2", ID_SWITCH_TYPE2}, {"SWITCH_TYPE3", ID_SWITCH_TYPE3}, {"SWITCH_TYPE4", ID_SWITCH_TYPE4}, {"SWITCH_TYPE5", ID_SWITCH_TYPE5}, {"SWITCH_TYPE6", ID_SWITCH_TYPE6}, {"SWITCH_TYPE7", ID_SWITCH_TYPE7}, {"SWITCH_TYPE8", ID_SWITCH_TYPE8}, {"SWITCH_TYPE9", ID_SWITCH_TYPE9}, {"SWITCH_TYPE10", ID_SWITCH_TYPE10}, {"SWITCH_TYPE11", ID_SWITCH_TYPE11}, {"SWITCH_TYPE12", ID_SWITCH_TYPE12}, {"SWITCH_TYPE13", ID_SWITCH_TYPE13}, {"SWITCH_TYPE14", ID_SWITCH_TYPE14}, {"SWITCH_TYPE15", ID_SWITCH_TYPE15}, {"SWITCH_TYPE16", ID_SWITCH_TYPE16}, {"SHOOT_SWITCH1", ID_SHOOT_SWITCH1}, {"SHOOT_SWITCH2", ID_SHOOT_SWITCH2}, {"SHOOT_SWITCH3", ID_SHOOT_SWITCH3}, {"SHOOT_SWITCH4", ID_SHOOT_SWITCH4}, {"AIRLOCK_SWITCH", ID_AIRLOCK_SWITCH}, {"UNDERWATER_SWITCH1", ID_UNDERWATER_SWITCH1}, {"UNDERWATER_SWITCH2", ID_UNDERWATER_SWITCH2}, {"UNDERWATER_SWITCH3", ID_UNDERWATER_SWITCH3}, {"UNDERWATER_SWITCH4", ID_UNDERWATER_SWITCH4}, {"TURN_SWITCH", ID_TURN_SWITCH}, {"COG_SWITCH", ID_COG_SWITCH}, {"LEVER_SWITCH", ID_LEVER_SWITCH}, {"JUMP_SWITCH", ID_JUMP_SWITCH}, {"CROWBAR_SWITCH", ID_CROWBAR_SWITCH}, {"PULLEY", ID_PULLEY}, {"CROWDOVE_SWITCH", ID_CROWDOVE_SWITCH}, {"DOOR_TYPE1", ID_DOOR_TYPE1}, {"DOOR_TYPE2", ID_DOOR_TYPE2}, {"DOOR_TYPE3", ID_DOOR_TYPE3}, {"DOOR_TYPE4", ID_DOOR_TYPE4}, {"DOOR_TYPE5", ID_DOOR_TYPE5}, {"DOOR_TYPE6", ID_DOOR_TYPE6}, {"DOOR_TYPE7", ID_DOOR_TYPE7}, {"DOOR_TYPE8", ID_DOOR_TYPE8}, {"DOOR_TYPE9", ID_DOOR_TYPE9}, {"DOOR_TYPE10", ID_DOOR_TYPE10}, {"DOOR_TYPE11", ID_DOOR_TYPE11}, {"DOOR_TYPE12", ID_DOOR_TYPE12}, {"DOOR_TYPE13", ID_DOOR_TYPE13}, {"DOOR_TYPE14", ID_DOOR_TYPE14}, {"DOOR_TYPE15", ID_DOOR_TYPE15}, {"DOOR_TYPE16", ID_DOOR_TYPE16}, {"DOOR_TYPE17", ID_DOOR_TYPE17}, {"DOOR_TYPE18", ID_DOOR_TYPE18}, {"DOOR_TYPE19", ID_DOOR_TYPE19}, {"DOOR_TYPE20", ID_DOOR_TYPE20}, {"DOOR_TYPE21", ID_DOOR_TYPE21}, {"DOOR_TYPE22", ID_DOOR_TYPE22}, {"DOOR_TYPE23", ID_DOOR_TYPE23}, {"DOOR_TYPE24", ID_DOOR_TYPE24}, {"CLOSED_DOOR1", ID_CLOSED_DOOR1}, {"CLOSED_DOOR2", ID_CLOSED_DOOR2}, {"CLOSED_DOOR3", ID_CLOSED_DOOR3}, {"CLOSED_DOOR4", ID_CLOSED_DOOR4}, {"CLOSED_DOOR5", ID_CLOSED_DOOR5}, {"CLOSED_DOOR6", ID_CLOSED_DOOR6}, {"LIFT_DOORS1", ID_LIFT_DOORS1}, {"LIFT_DOORS2", ID_LIFT_DOORS2}, {"PUSHPULL_DOOR1", ID_PUSHPULL_DOOR1}, {"PUSHPULL_DOOR2", ID_PUSHPULL_DOOR2}, {"PUSHPULL_DOOR3", ID_PUSHPULL_DOOR3}, {"PUSHPULL_DOOR4", ID_PUSHPULL_DOOR4}, {"KICK_DOOR1", ID_KICK_DOOR1}, {"KICK_DOOR2", ID_KICK_DOOR2}, {"KICK_DOOR3", ID_KICK_DOOR3}, {"KICK_DOOR4", ID_KICK_DOOR4}, {"UNDERWATER_DOOR1", ID_UNDERWATER_DOOR1}, {"UNDERWATER_DOOR2", ID_UNDERWATER_DOOR2}, {"UNDERWATER_DOOR3", ID_UNDERWATER_DOOR3}, {"UNDERWATER_DOOR4", ID_UNDERWATER_DOOR4}, {"DOUBLE_DOORS1", ID_DOUBLE_DOORS1}, {"DOUBLE_DOORS2", ID_DOUBLE_DOORS2}, {"DOUBLE_DOORS3", ID_DOUBLE_DOORS3}, {"DOUBLE_DOORS4", ID_DOUBLE_DOORS4}, {"SEQUENCE_DOOR1", ID_SEQUENCE_DOOR1}, {"SEQUENCE_SWITCH1", ID_SEQUENCE_SWITCH1}, {"SEQUENCE_SWITCH2", ID_SEQUENCE_SWITCH2}, {"SEQUENCE_SWITCH3", ID_SEQUENCE_SWITCH3}, {"STEEL_DOOR", ID_STEEL_DOOR}, {"GOD_HEAD", ID_GOD_HEAD}, {"PISTOLS_ITEM", ID_PISTOLS_ITEM}, {"PISTOLS_AMMO_ITEM", ID_PISTOLS_AMMO_ITEM}, {"UZI_ITEM", ID_UZI_ITEM}, {"UZI_AMMO_ITEM", ID_UZI_AMMO_ITEM}, {"SHOTGUN_ITEM", ID_SHOTGUN_ITEM}, {"SHOTGUN_AMMO1_ITEM", ID_SHOTGUN_AMMO1_ITEM}, {"SHOTGUN_AMMO2_ITEM", ID_SHOTGUN_AMMO2_ITEM}, {"REVOLVER_ITEM", ID_REVOLVER_ITEM}, {"REVOLVER_AMMO_ITEM", ID_REVOLVER_AMMO_ITEM}, {"CROSSBOW_ITEM", ID_CROSSBOW_ITEM}, {"CROSSBOW_AMMO1_ITEM", ID_CROSSBOW_AMMO1_ITEM}, {"CROSSBOW_AMMO2_ITEM", ID_CROSSBOW_AMMO2_ITEM}, {"CROSSBOW_AMMO3_ITEM", ID_CROSSBOW_AMMO3_ITEM}, {"CROSSBOW_BOLT", ID_CROSSBOW_BOLT}, {"HK_ITEM", ID_HK_ITEM}, {"HK_AMMO_ITEM", ID_HK_AMMO_ITEM}, {"GRENADE_GUN_ITEM", ID_GRENADE_GUN_ITEM}, {"GRENADE_AMMO1_ITEM", ID_GRENADE_AMMO1_ITEM}, {"GRENADE_AMMO2_ITEM", ID_GRENADE_AMMO2_ITEM}, {"GRENADE_AMMO3_ITEM", ID_GRENADE_AMMO3_ITEM}, {"GRENADE", ID_GRENADE}, {"ROCKET_LAUNCHER_ITEM", ID_ROCKET_LAUNCHER_ITEM}, {"ROCKET_LAUNCHER_AMMO_ITEM", ID_ROCKET_LAUNCHER_AMMO_ITEM}, {"ROCKET", ID_ROCKET}, {"HARPOON_ITEM", ID_HARPOON_ITEM}, {"HARPOON_AMMO_ITEM", ID_HARPOON_AMMO_ITEM}, {"HARPOON", ID_HARPOON}, {"GOLDROSE_ITEM", ID_GOLDROSE_ITEM}, {"BIGMEDI_ITEM", ID_BIGMEDI_ITEM}, {"SMALLMEDI_ITEM", ID_SMALLMEDI_ITEM}, {"LASERSIGHT_ITEM", ID_LASERSIGHT_ITEM}, {"BINOCULARS_ITEM", ID_BINOCULARS_ITEM}, {"SILENCER_ITEM", ID_SILENCER_ITEM}, {"FLARE_ITEM", ID_FLARE_ITEM}, {"FLARE_INV_ITEM", ID_FLARE_INV_ITEM}, {"COMPASS_ITEM", ID_COMPASS_ITEM}, {"DIARY_ITEM", ID_DIARY_ITEM}, {"INVENTORY_PASSPORT", ID_INVENTORY_PASSPORT}, {"INVENTORY_SUNGLASSES", ID_INVENTORY_SUNGLASSES}, {"INVENTORY_KEYS", ID_INVENTORY_KEYS}, {"INVENTORY_HEADPHONES", ID_INVENTORY_HEADPHONES}, {"INVENTORY_POLAROID", ID_INVENTORY_POLAROID}, {"SMOKE_EMITTER_WHITE", ID_SMOKE_EMITTER_WHITE}, {"SMOKE_EMITTER_BLACK", ID_SMOKE_EMITTER_BLACK}, {"SMOKE_EMITTER", ID_SMOKE_EMITTER}, {"LOCUST_EMITTER", ID_LOCUST_EMITTER}, {"EARTHQUAKE", ID_EARTHQUAKE}, {"BUBBLES", ID_BUBBLES}, {"WATERFALLMIST", ID_WATERFALLMIST}, {"GUNSHELL", ID_GUNSHELL}, {"SHOTGUNSHELL", ID_SHOTGUNSHELL}, {"GUN_FLASH", ID_GUN_FLASH}, {"GUN_FLASH2", ID_GUN_FLASH2}, {"COLOR_LIGHT", ID_COLOR_LIGHT}, {"BLINKING_LIGHT", ID_BLINKING_LIGHT}, {"PULSE_LIGHT", ID_PULSE_LIGHT}, {"STROBE_LIGHT", ID_STROBE_LIGHT}, {"ELECTRICAL_LIGHT", ID_ELECTRICAL_LIGHT}, {"LENS_FLARE", ID_LENS_FLARE}, {"ENERGY_BUBBLES", ID_ENERGY_BUBBLES}, {"PLANET_EFFECT", ID_PLANET_EFFECT}, {"BUTTERFLY", ID_BUTTERFLY}, {"AI_GUARD", ID_AI_GUARD}, {"AI_AMBUSH", ID_AI_AMBUSH}, {"AI_PATROL1", ID_AI_PATROL1}, {"AI_MODIFY", ID_AI_MODIFY}, {"AI_FOLLOW", ID_AI_FOLLOW}, {"AI_PATROL2", ID_AI_PATROL2}, {"AI_X1", ID_AI_X1}, {"AI_X2", ID_AI_X2}, {"LARA_START_POS", ID_LARA_START_POS}, {"TELEPORTER", ID_TELEPORTER}, {"LIFT_TELEPORTER", ID_LIFT_TELEPORTER}, {"LASERS", ID_LASERS}, {"STEAM_LASERS", ID_STEAM_LASERS}, {"FLOOR_LASERS", ID_FLOOR_LASERS}, {"KILL_ALL_TRIGGERS", ID_KILL_ALL_TRIGGERS}, {"TRIGGER_TRIGGERER", ID_TRIGGER_TRIGGERER}, {"HIGH_OBJECT1", ID_HIGH_OBJECT1}, {"HIGH_OBJECT2", ID_HIGH_OBJECT2}, {"SMASH_OBJECT1", ID_SMASH_OBJECT1}, {"SMASH_OBJECT2", ID_SMASH_OBJECT2}, {"SMASH_OBJECT3", ID_SMASH_OBJECT3}, {"SMASH_OBJECT4", ID_SMASH_OBJECT4}, {"SMASH_OBJECT5", ID_SMASH_OBJECT5}, {"SMASH_OBJECT6", ID_SMASH_OBJECT6}, {"SMASH_OBJECT7", ID_SMASH_OBJECT7}, {"SMASH_OBJECT8", ID_SMASH_OBJECT8}, {"SMASH_OBJECT9", ID_SMASH_OBJECT9}, {"SMASH_OBJECT10", ID_SMASH_OBJECT10}, {"SMASH_OBJECT11", ID_SMASH_OBJECT11}, {"SMASH_OBJECT12", ID_SMASH_OBJECT12}, {"SMASH_OBJECT13", ID_SMASH_OBJECT13}, {"SMASH_OBJECT14", ID_SMASH_OBJECT14}, {"SMASH_OBJECT15", ID_SMASH_OBJECT15}, {"SMASH_OBJECT16", ID_SMASH_OBJECT16}, {"BODY_PART", ID_BODY_PART}, {"CAMERA_TARGET", ID_CAMERA_TARGET}, {"WATERFALL1", ID_WATERFALL1}, {"WATERFALL2", ID_WATERFALL2}, {"WATERFALL3", ID_WATERFALL3}, {"WATERFALL4", ID_WATERFALL4}, {"WATERFALL5", ID_WATERFALL5}, {"WATERFALL6", ID_WATERFALL6}, {"WATERFALLSS1", ID_WATERFALLSS1}, {"WATERFALLSS2", ID_WATERFALLSS2}, {"FISHTANK", ID_FISHTANK}, {"MESHSWAP1", ID_MESHSWAP1}, {"MESHSWAP2", ID_MESHSWAP2}, {"MESHSWAP3", ID_MESHSWAP3}, {"MESHSWAP4", ID_MESHSWAP4}, {"MESHSWAP5", ID_MESHSWAP5}, {"MESHSWAP6", ID_MESHSWAP6}, {"MESHSWAP7", ID_MESHSWAP7}, {"MESHSWAP8", ID_MESHSWAP8}, {"MESHSWAP9", ID_MESHSWAP9}, {"MESHSWAP10", ID_MESHSWAP10}, {"MESHSWAP_BADDY1", ID_MESHSWAP_BADDY1}, {"MESHSWAP_BADDY2", ID_MESHSWAP_BADDY2}, {"MESHSWAP_MAFIA2", ID_MESHSWAP_MAFIA2}, {"MESHSWAP_IMP", ID_MESHSWAP_IMP}, {"MESHSWAP_HITMAN", ID_MESHSWAP_HITMAN}, {"MESHSWAP_ROMAN_GOD1", ID_MESHSWAP_ROMAN_GOD1}, {"MESHSWAP_ROMAN_GOD2", ID_MESHSWAP_ROMAN_GOD2}, {"ANIMATING1", ID_ANIMATING1}, {"ANIMATING2", ID_ANIMATING2}, {"ANIMATING3", ID_ANIMATING3}, {"ANIMATING4", ID_ANIMATING4}, {"ANIMATING5", ID_ANIMATING5}, {"ANIMATING6", ID_ANIMATING6}, {"ANIMATING7", ID_ANIMATING7}, {"ANIMATING8", ID_ANIMATING8}, {"ANIMATING9", ID_ANIMATING9}, {"ANIMATING10", ID_ANIMATING10}, {"ANIMATING11", ID_ANIMATING11}, {"ANIMATING12", ID_ANIMATING12}, {"ANIMATING13", ID_ANIMATING13}, {"ANIMATING14", ID_ANIMATING14}, {"ANIMATING15", ID_ANIMATING15}, {"ANIMATING16", ID_ANIMATING16}, {"ANIMATING17", ID_ANIMATING17}, {"ANIMATING18", ID_ANIMATING18}, {"ANIMATING19", ID_ANIMATING19}, {"ANIMATING20", ID_ANIMATING20}, {"ANIMATING21", ID_ANIMATING21}, {"ANIMATING22", ID_ANIMATING22}, {"ANIMATING23", ID_ANIMATING23}, {"ANIMATING24", ID_ANIMATING24}, {"ANIMATING25", ID_ANIMATING25}, {"ANIMATING26", ID_ANIMATING26}, {"ANIMATING27", ID_ANIMATING27}, {"ANIMATING28", ID_ANIMATING28}, {"ANIMATING29", ID_ANIMATING29}, {"ANIMATING30", ID_ANIMATING30}, {"ANIMATING31", ID_ANIMATING31}, {"ANIMATING32", ID_ANIMATING32}, {"ANIMATING33", ID_ANIMATING33}, {"ANIMATING34", ID_ANIMATING34}, {"ANIMATING35", ID_ANIMATING35}, {"ANIMATING36", ID_ANIMATING36}, {"ANIMATING37", ID_ANIMATING37}, {"ANIMATING38", ID_ANIMATING38}, {"ANIMATING39", ID_ANIMATING39}, {"ANIMATING40", ID_ANIMATING40}, {"ANIMATING41", ID_ANIMATING41}, {"ANIMATING42", ID_ANIMATING42}, {"ANIMATING43", ID_ANIMATING43}, {"ANIMATING44", ID_ANIMATING44}, {"ANIMATING45", ID_ANIMATING45}, {"ANIMATING46", ID_ANIMATING46}, {"ANIMATING47", ID_ANIMATING47}, {"ANIMATING48", ID_ANIMATING48}, {"ANIMATING49", ID_ANIMATING49}, {"ANIMATING50", ID_ANIMATING50}, {"ANIMATING51", ID_ANIMATING51}, {"ANIMATING52", ID_ANIMATING52}, {"ANIMATING53", ID_ANIMATING53}, {"ANIMATING54", ID_ANIMATING54}, {"ANIMATING55", ID_ANIMATING55}, {"ANIMATING56", ID_ANIMATING56}, {"ANIMATING57", ID_ANIMATING57}, {"ANIMATING58", ID_ANIMATING58}, {"ANIMATING59", ID_ANIMATING59}, {"ANIMATING60", ID_ANIMATING60}, {"ANIMATING61", ID_ANIMATING61}, {"ANIMATING62", ID_ANIMATING62}, {"ANIMATING63", ID_ANIMATING63}, {"ANIMATING64", ID_ANIMATING64}, {"ANIMATING65", ID_ANIMATING65}, {"ANIMATING66", ID_ANIMATING66}, {"ANIMATING67", ID_ANIMATING67}, {"ANIMATING68", ID_ANIMATING68}, {"ANIMATING69", ID_ANIMATING69}, {"ANIMATING70", ID_ANIMATING70}, {"ANIMATING71", ID_ANIMATING71}, {"ANIMATING72", ID_ANIMATING72}, {"ANIMATING73", ID_ANIMATING73}, {"ANIMATING74", ID_ANIMATING74}, {"ANIMATING75", ID_ANIMATING75}, {"ANIMATING76", ID_ANIMATING76}, {"ANIMATING77", ID_ANIMATING77}, {"ANIMATING78", ID_ANIMATING78}, {"ANIMATING79", ID_ANIMATING79}, {"ANIMATING80", ID_ANIMATING80}, {"ANIMATING81", ID_ANIMATING81}, {"ANIMATING82", ID_ANIMATING82}, {"ANIMATING83", ID_ANIMATING83}, {"ANIMATING84", ID_ANIMATING84}, {"ANIMATING85", ID_ANIMATING85}, {"ANIMATING86", ID_ANIMATING86}, {"ANIMATING87", ID_ANIMATING87}, {"ANIMATING88", ID_ANIMATING88}, {"ANIMATING89", ID_ANIMATING89}, {"ANIMATING90", ID_ANIMATING90}, {"ANIMATING91", ID_ANIMATING91}, {"ANIMATING92", ID_ANIMATING92}, {"ANIMATING93", ID_ANIMATING93}, {"ANIMATING94", ID_ANIMATING94}, {"ANIMATING95", ID_ANIMATING95}, {"ANIMATING96", ID_ANIMATING96}, {"ANIMATING97", ID_ANIMATING97}, {"ANIMATING98", ID_ANIMATING98}, {"ANIMATING99", ID_ANIMATING99}, {"ANIMATING100", ID_ANIMATING100}, {"ANIMATING101", ID_ANIMATING101}, {"ANIMATING102", ID_ANIMATING102}, {"ANIMATING103", ID_ANIMATING103}, {"ANIMATING104", ID_ANIMATING104}, {"ANIMATING105", ID_ANIMATING105}, {"ANIMATING106", ID_ANIMATING106}, {"ANIMATING107", ID_ANIMATING107}, {"ANIMATING108", ID_ANIMATING108}, {"ANIMATING109", ID_ANIMATING109}, {"ANIMATING110", ID_ANIMATING110}, {"ANIMATING111", ID_ANIMATING111}, {"ANIMATING112", ID_ANIMATING112}, {"ANIMATING113", ID_ANIMATING113}, {"ANIMATING114", ID_ANIMATING114}, {"ANIMATING115", ID_ANIMATING115}, {"ANIMATING116", ID_ANIMATING116}, {"ANIMATING117", ID_ANIMATING117}, {"ANIMATING118", ID_ANIMATING118}, {"ANIMATING119", ID_ANIMATING119}, {"ANIMATING120", ID_ANIMATING120}, {"ANIMATING121", ID_ANIMATING121}, {"ANIMATING122", ID_ANIMATING122}, {"ANIMATING123", ID_ANIMATING123}, {"ANIMATING124", ID_ANIMATING124}, {"ANIMATING125", ID_ANIMATING125}, {"ANIMATING126", ID_ANIMATING126}, {"ANIMATING127", ID_ANIMATING127}, {"ANIMATING128", ID_ANIMATING128}, {"LASERHEAD_BASE", ID_LASERHEAD_BASE}, {"LASERHEAD_TENTACLE", ID_LASERHEAD_TENTACLE}, {"BRIDGE_FLAT", ID_BRIDGE_FLAT}, {"BRIDGE_TILT1", ID_BRIDGE_TILT1}, {"BRIDGE_TILT2", ID_BRIDGE_TILT2}, {"BRIDGE_TILT3", ID_BRIDGE_TILT3}, {"BRIDGE_TILT4", ID_BRIDGE_TILT4}, {"BRIDGE_CUSTOM", ID_BRIDGE_CUSTOM}, {"HORIZON", ID_HORIZON}, {"BINOCULAR_GRAPHICS", ID_BINOCULAR_GRAPHICS}, {"TARGET_GRAPHICS", ID_TARGET_GRAPHICS}, {"SKY_GRAPHICS", ID_SKY_GRAPHICS}, {"DEFAULT_SPRITES", ID_DEFAULT_SPRITES}, {"MISC_SPRITES", ID_MISC_SPRITES}, {"CUSTOM_SPRITES", ID_CUSTOM_SPRITES}, {"PANEL_BORDER", ID_PANEL_BORDER}, {"PANEL_MIDDLE", ID_PANEL_MIDDLE}, {"PANEL_CORNER", ID_PANEL_CORNER}, {"PANEL_DIAGONAL", ID_PANEL_DIAGONAL}, {"PANEL_STRIP", ID_PANEL_STRIP}, {"PANEL_HALF_BORDER1", ID_PANEL_HALF_BORDER1}, {"PANEL_HALF_BORDER2", ID_PANEL_HALF_BORDER2}, {"PANEL_MIDDLE_CORNER", ID_PANEL_MIDDLE_CORNER} }); // Add the item type m_lua->new_usertype("Position", "xPos", sol::property(&GameScriptPosition::GetXPos, &GameScriptPosition::SetXPos), "yPos", sol::property(&GameScriptPosition::GetYPos, &GameScriptPosition::SetYPos), "zPos", sol::property(&GameScriptPosition::GetZPos, &GameScriptPosition::SetZPos), "new", sol::no_constructor ); m_lua->new_usertype("Rotation", "xRot", sol::property(&GameScriptRotation::GetXRot, &GameScriptRotation::SetXRot), "yRot", sol::property(&GameScriptRotation::GetYRot, &GameScriptRotation::SetYRot), "zRot", sol::property(&GameScriptRotation::GetZRot, &GameScriptRotation::SetZRot), "new", sol::no_constructor ); m_lua->new_usertype("Item", "xPos", sol::property(&GameScriptItem::GetXPos, &GameScriptItem::SetXPos), "yPos", sol::property(&GameScriptItem::GetYPos, &GameScriptItem::SetYPos), "zPos", sol::property(&GameScriptItem::GetZPos, &GameScriptItem::SetZPos), "xRot", sol::property(&GameScriptItem::GetXRot, &GameScriptItem::SetXRot), "yRot", sol::property(&GameScriptItem::GetYRot, &GameScriptItem::SetYRot), "zRot", sol::property(&GameScriptItem::GetZRot, &GameScriptItem::SetZRot), "hp", sol::property(&GameScriptItem::GetHP, &GameScriptItem::SetHP), "room", sol::property(&GameScriptItem::GetRoom, &GameScriptItem::SetRoom), "currentState", sol::property(&GameScriptItem::GetCurrentState, &GameScriptItem::SetCurrentState), "goalState", sol::property(&GameScriptItem::GetGoalState, &GameScriptItem::SetGoalState), "requiredState", sol::property(&GameScriptItem::GetRequiredState, &GameScriptItem::SetRequiredState), "new", sol::no_constructor ); m_lua->set_function("EnableItem", &GameScriptItem::EnableItem); m_lua->set_function("DisableItem", &GameScriptItem::DisableItem); // GameScript type /*m_lua->new_usertype("GameScript", "PlayAudioTrack", &GameScript::PlayAudioTrack, "ChangeAmbientSoundTrack", &GameScript::ChangeAmbientSoundTrack, "MakeItemInvisible", &GameScript::MakeItemInvisible, "GetSecretsCount", &GameScript::GetSecretsCount, "SetSecretsCount", &GameScript::SetSecretsCount, "AddOneSecret", &GameScript::AddOneSecret, "JumpToLevel", &GameScript::JumpToLevel, "PlaySoundEffect", &GameScript::PlaySoundEffect, "PlaySoundEffectAtPosition", &GameScript::PlaySoundEffectAtPosition );*/ m_lua->set_function("GetItemById", &GameScript::GetItemById); m_lua->set_function("GetItemByName", &GameScript::GetItemByName); m_lua->set_function("CreatePosition", &GameScript::CreatePosition); m_lua->set_function("CreateRotation", &GameScript::CreateRotation); m_lua->set_function("CalculateDistance", &GameScript::CalculateDistance); m_lua->set_function("CalculateHorizontalDistance", &GameScript::CalculateHorizontalDistance); // Add global variables and namespaces //(*m_lua)["TR"] = this; } void GameScript::AddTrigger(LuaFunction* function) { m_triggers.push_back(function); (*m_lua).script(function->Code); } void GameScript::AddLuaId(int luaId, short itemNumber) { m_itemsMapId.insert(pair(luaId, itemNumber)); } void GameScript::AddLuaName(string luaName, short itemNumber) { m_itemsMapName.insert(pair(luaName, itemNumber)); } void GameScript::FreeLevelScripts() { /* // Delete all triggers for (int i = 0; i < m_triggers.size(); i++) { LuaFunction* trigger = m_triggers[i]; char* name = (char*)trigger->Name.c_str(); (*m_lua)[name] = NULL; delete m_triggers[i]; } m_triggers.clear(); // Clear the items mapping m_itemsMap.clear(); (*m_lua)["Lara"] = NULL; //delete m_Lara; */ } string GameScript::loadScriptFromFile(const char* luaFilename) { ifstream ifs(luaFilename, ios::in | ios::binary | ios::ate); ifstream::pos_type fileSize = ifs.tellg(); ifs.seekg(0, ios::beg); vector bytes(fileSize); ifs.read(bytes.data(), fileSize); return string(bytes.data(), fileSize); } bool GameScript::ExecuteScript(const char* luaFilename, string* message) { sol::protected_function_result result; result = m_lua->safe_script_file(luaFilename, sol::environment(m_lua->lua_state(), sol::create, m_lua->globals()), sol::script_pass_on_error); if (!result.valid()) { sol::error error = result; *message = error.what(); return false; } message->clear(); return true; } bool GameScript::ExecuteString(const char* command, string* message) { sol::protected_function_result result; result = m_lua->safe_script(command); if (!result.valid()) { sol::error error = result; *message = error.what(); return false; } message->clear(); return true; } bool GameScript::ExecuteTrigger(short index) { return true; /* // Is this a valid trigger? if (index >= m_triggers.size()) return true; LuaFunction* trigger = m_triggers[index]; // We want to execute a trigger just one time // TODO: implement in the future continoous trigger? if (trigger->Executed) return true; // Get the trigger function name char* name = (char*)trigger->Name.c_str(); // Execute trigger bool result = (*m_lua)[name](); // Trigger was executed, don't execute it anymore trigger->Executed = result; m_locals.for_each([&](sol::object const& key, sol::object const& value) { if (value.is()) std::cout << key.as() << " " << value.as() << std::endl; else if (value.is()) std::cout << key.as() << " " << value.as() << std::endl; else std::cout << key.as() << " " << value.as() << std::endl; }); return result; */ } void GameScript::PlayAudioTrack(short track) { S_CDPlay(track, SOUND_TRACK_ONESHOT); } void GameScript::ChangeAmbientSoundTrack(short track) { CurrentAtmosphere = track; S_CDStop(); S_CDPlay(track, SOUND_TRACK_BGM); } void GameScript::JumpToLevel(int levelNum) { if (levelNum >= g_GameFlow->GetNumLevels()) return; LevelComplete = levelNum; } int GameScript::GetSecretsCount() { return Savegame.Level.Secrets; } void GameScript::SetSecretsCount(int secretsNum) { if (secretsNum > 255) return; Savegame.Level.Secrets = secretsNum; } void GameScript::AddOneSecret() { if (Savegame.Level.Secrets >= 255) return; Savegame.Level.Secrets++; S_CDPlay(6, 0); } /* void GameScript::MakeItemInvisible(short id) { if (m_itemsMap.find(id) == m_itemsMap.end()) return; short itemNum = m_itemsMap[id]; ITEM_INFO* item = &Items[itemNum]; if (item->active) { if (Objects[item->objectNumber].intelligent) { if (item->status == ITEM_ACTIVE) { item->touchBits = 0; item->status = ITEM_INVISIBLE; DisableBaddieAI(itemNum); } } else { item->touchBits = 0; item->status = ITEM_INVISIBLE; } } } */ void GameScript::GetBooleanVariables(map* locals, map* globals) { for (map::iterator it = m_locals.variables.begin(); it != m_locals.variables.end(); ++it) { if (it->second.get_type() == sol::type::boolean) locals->insert(pair(it->first, it->second.as())); } for (map::iterator it = m_globals.variables.begin(); it != m_globals.variables.end(); ++it) { if (it->second.get_type() == sol::type::boolean) globals->insert(pair(it->first, it->second.as())); } } void GameScript::SetBooleanVariables(map* locals, map* globals) { m_locals.variables.clear(); for (map::iterator it = locals->begin(); it != locals->end(); ++it) { m_locals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } for (map::iterator it = globals->begin(); it != globals->end(); ++it) { m_globals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } } void GameScript::GetNumberVariables(map* locals, map* globals) { for (map::iterator it = m_locals.variables.begin(); it != m_locals.variables.end(); ++it) { if (it->second.get_type() == sol::type::number) locals->insert(pair(it->first, it->second.as())); } for (map::iterator it = m_globals.variables.begin(); it != m_globals.variables.end(); ++it) { if (it->second.get_type() == sol::type::number) globals->insert(pair(it->first, it->second.as())); } } void GameScript::SetNumberVariables(map* locals, map* globals) { m_locals.variables.clear(); for (map::iterator it = locals->begin(); it != locals->end(); ++it) { m_locals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } for (map::iterator it = globals->begin(); it != globals->end(); ++it) { m_globals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } } void GameScript::GetStringVariables(map* locals, map* globals) { for (map::iterator it = m_locals.variables.begin(); it != m_locals.variables.end(); ++it) { if (it->second.get_type() == sol::type::string) locals->insert(pair(it->first, it->second.as())); } for (map::iterator it = m_globals.variables.begin(); it != m_globals.variables.end(); ++it) { if (it->second.get_type() == sol::type::string) globals->insert(pair(it->first, it->second.as())); } } void GameScript::SetStringVariables(map* locals, map* globals) { m_locals.variables.clear(); for (map::iterator it = locals->begin(); it != locals->end(); ++it) { m_locals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } for (map::iterator it = globals->begin(); it != globals->end(); ++it) { m_globals.variables.insert(pair(it->first, sol::object(m_lua->lua_state(), sol::in_place, it->second))); } } unique_ptr GameScript::GetItemById(int id) { if (m_itemsMapId.find(id) == m_itemsMapId.end()) { if (WarningsAsErrors) throw "item id not found"; return unique_ptr(nullptr); } short itemNumber = m_itemsMapId[id]; return unique_ptr(new GameScriptItem(itemNumber)); } unique_ptr GameScript::GetItemByName(string name) { if (m_itemsMapName.find(name) == m_itemsMapName.end()) { if (WarningsAsErrors) throw "item name not found"; return unique_ptr(nullptr); } short itemNumber = m_itemsMapName[name]; return unique_ptr(new GameScriptItem(itemNumber)); } void GameScript::PlaySoundEffectAtPosition(short id, int x, int y, int z, int flags) { PHD_3DPOS pos; pos.xPos = x; pos.yPos = y; pos.zPos = z; pos.xRot = 0; pos.yRot = 0; pos.zRot = 0; SoundEffect(id, &pos, flags); } void GameScript::PlaySoundEffect(short id, int flags) { SoundEffect(id, NULL, flags); } void GameScript::AssignItemsAndLara() { m_lua->set("Level", m_locals); m_lua->set("Game", m_globals); m_lua->set("Lara", GameScriptItem(Lara.itemNumber)); } void GameScript::ResetVariables() { (*m_lua)["Lara"] = NULL; } GameScriptPosition GameScript::CreatePosition(float x, float y, float z) { return GameScriptPosition(x, y, z); } GameScriptRotation GameScript::CreateRotation(float x, float y, float z) { return GameScriptRotation(x, y, z); } float GameScript::CalculateDistance(GameScriptPosition pos1, GameScriptPosition pos2) { return sqrt(SQUARE(pos1.GetXPos() - pos2.GetXPos()) + SQUARE(pos1.GetYPos() - pos2.GetYPos()) + SQUARE(pos1.GetZPos() - pos2.GetZPos())); } float GameScript::CalculateHorizontalDistance(GameScriptPosition pos1, GameScriptPosition pos2) { return sqrt(SQUARE(pos1.GetXPos() - pos2.GetXPos()) + SQUARE(pos1.GetZPos() - pos2.GetZPos())); } GameScriptPosition::GameScriptPosition(float x, float y, float z) : xPos(x), yPos(y), zPos(z) { } float GameScriptPosition::GetXPos() { return xPos; } void GameScriptPosition::SetXPos(float x) { xPos = x; } float GameScriptPosition::GetYPos() { return yPos; } void GameScriptPosition::SetYPos(float y) { yPos = y; } float GameScriptPosition::GetZPos() { return zPos; } void GameScriptPosition::SetZPos(float z) { zPos = z; } GameScriptRotation::GameScriptRotation(float x, float y, float z) : xRot(x), yRot(y), zRot(z) { } float GameScriptRotation::GetXRot() { return xRot; } void GameScriptRotation::SetXRot(float x) { x = remainder(x, 360); if (x < 0) x += 360; xRot = x; } float GameScriptRotation::GetYRot() { return yRot; } void GameScriptRotation::SetYRot(float y) { y = remainder(y, 360); if (y < 0) y += 360; yRot = y; } float GameScriptRotation::GetZRot() { return zRot; } void GameScriptRotation::SetZRot(float z) { z = remainder(z, 360); if (z < 0) z += 360; zRot = z; } GameScriptItem::GameScriptItem(short itemNumber) : NativeItemNumber(itemNumber), NativeItem(&Items[itemNumber]) { } float GameScriptItem::GetXPos() { return (float) (NativeItem->pos.xPos - 512) / 1024; } void GameScriptItem::SetXPos(float x) { NativeItem->pos.xPos = 1024 * x + 512; } float GameScriptItem::GetYPos() { return (float) NativeItem->pos.yPos / -256; } void GameScriptItem::SetYPos(float y) { NativeItem->pos.yPos = -256 * y; } float GameScriptItem::GetZPos() { return (float) (NativeItem->pos.zPos - 512) / 1024; } void GameScriptItem::SetZPos(float z) { NativeItem->pos.zPos = 1024 * z + 512; } float GameScriptItem::GetXRot() { return TO_DEGREES(NativeItem->pos.xRot); } void GameScriptItem::SetXRot(float x) { x = remainder(x, 360); if (x < 0) x += 360; NativeItem->pos.xRot = ANGLE(x); } float GameScriptItem::GetYRot() { return TO_DEGREES(NativeItem->pos.yRot); } void GameScriptItem::SetYRot(float y) { y = remainder(y, 360); if (y < 0) y += 360; NativeItem->pos.yRot = ANGLE(y); } float GameScriptItem::GetZRot() { return TO_DEGREES(NativeItem->pos.zRot); } void GameScriptItem::SetZRot(float z) { z = remainder(z, 360); if (z < 0) z += 360; NativeItem->pos.zRot = ANGLE(z); } short GameScriptItem::GetHP() { return NativeItem->hitPoints; } void GameScriptItem::SetHP(short hp) { if (hp < 0 || hp > Objects[NativeItem->objectNumber].hitPoints) { if (WarningsAsErrors) throw runtime_error("invalid HP"); if (hp < 0) { hp = 0; } else if (hp > Objects[NativeItem->objectNumber].hitPoints) { hp = Objects[NativeItem->objectNumber].hitPoints; } } NativeItem->hitPoints = hp; } short GameScriptItem::GetRoom() { return NativeItem->roomNumber; } void GameScriptItem::SetRoom(short room) { if (room < 0 || room >= NumberRooms) { if (WarningsAsErrors) throw runtime_error("invalid room number"); return; } NativeItem->roomNumber = room; } void GameScriptItem::EnableItem() { if (!NativeItem->active) { if (Objects[NativeItem->objectNumber].intelligent) { if (NativeItem->status == ITEM_DEACTIVATED) { NativeItem->touchBits = 0; NativeItem->status = ITEM_ACTIVE; AddActiveItem(NativeItemNumber); EnableBaddieAI(NativeItemNumber, 1); } else if (NativeItem->status == ITEM_INVISIBLE) { NativeItem->touchBits = 0; if (EnableBaddieAI(NativeItemNumber, 0)) NativeItem->status = ITEM_ACTIVE; else NativeItem->status = ITEM_INVISIBLE; AddActiveItem(NativeItemNumber); } } else { NativeItem->touchBits = 0; AddActiveItem(NativeItemNumber); NativeItem->status = ITEM_ACTIVE; } } } void GameScriptItem::DisableItem() { if (NativeItem->active) { if (Objects[NativeItem->objectNumber].intelligent) { if (NativeItem->status == ITEM_ACTIVE) { NativeItem->touchBits = 0; NativeItem->status = ITEM_DEACTIVATED; RemoveActiveItem(NativeItemNumber); DisableBaddieAI(NativeItemNumber); } } else { NativeItem->touchBits = 0; RemoveActiveItem(NativeItemNumber); NativeItem->status = ITEM_DEACTIVATED; } } } short GameScriptItem::GetCurrentState() { return NativeItem->currentAnimState; } void GameScriptItem::SetCurrentState(short state) { NativeItem->currentAnimState = state; } short GameScriptItem::GetGoalState() { return NativeItem->goalAnimState; } void GameScriptItem::SetGoalState(short state) { NativeItem->goalAnimState = state; } short GameScriptItem::GetRequiredState() { return NativeItem->requiredAnimState; } void GameScriptItem::SetRequiredState(short state) { NativeItem->requiredAnimState = state; } sol::object LuaVariables::GetVariable(string key) { if (variables.find(key) == variables.end()) return sol::lua_nil; return variables[key]; } void LuaVariables::SetVariable(string key, sol::object value) { switch (value.get_type()) { case sol::type::lua_nil: variables.erase(key); break; case sol::type::boolean: case sol::type::number: case sol::type::string: variables[key] = value; break; default: if (WarningsAsErrors) throw runtime_error("unsupported variable type"); break; } }