TombEngine/TR5Main/Scripting/GameLogicScript.cpp

1607 lines
52 KiB
C++
Raw Normal View History

#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;
2020-04-28 12:24:10 -03:00
GameScript* g_GameScript;
bool WarningsAsErrors = false;
GameScript::GameScript(sol::state* lua)
{
m_lua = lua;
// Add constants
2020-04-28 12:24:10 -03:00
//ExecuteScript("Scripts\\Constants.lua");
m_lua->new_enum<GAME_OBJECT_ID>("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},
2020-04-28 12:24:10 -03:00
{"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},
{"HAMMERHEAD", ID_HAMMERHEAD},
{"CROCODILE_GOD", ID_CROCODILE_GOD},
2020-04-28 12:24:10 -03:00
{"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},
2020-04-28 12:24:10 -03:00
{"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},
2020-04-28 12:24:10 -03:00
{"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},
2020-04-28 12:24:10 -03:00
{"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},
2020-04-28 12:24:10 -03:00
{"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},
2020-04-28 12:24:10 -03:00
{"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
2020-04-28 12:24:10 -03:00
m_lua->new_usertype<GameScriptPosition>("Position",
"X", sol::property(&GameScriptPosition::GetXPos, &GameScriptPosition::SetXPos),
"Y", sol::property(&GameScriptPosition::GetYPos, &GameScriptPosition::SetYPos),
"Z", sol::property(&GameScriptPosition::GetZPos, &GameScriptPosition::SetZPos),
2020-04-28 12:24:10 -03:00
"new", sol::no_constructor
);
m_lua->new_usertype<GameScriptRotation>("Rotation",
"X", sol::property(&GameScriptRotation::GetXRot, &GameScriptRotation::SetXRot),
"Y", sol::property(&GameScriptRotation::GetYRot, &GameScriptRotation::SetYRot),
"Z", sol::property(&GameScriptRotation::GetZRot, &GameScriptRotation::SetZRot),
2020-04-28 12:24:10 -03:00
"new", sol::no_constructor
);
m_lua->new_usertype<GameScriptItem>("Item",
"Position", sol::property(&GameScriptItem::GetPosition),
"Rotation", sol::property(&GameScriptItem::GetRotation),
"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),
2020-04-28 12:24:10 -03:00
"new", sol::no_constructor
);
2020-04-28 12:24:10 -03:00
m_lua->set_function("EnableItem", &GameScriptItem::EnableItem);
m_lua->set_function("DisableItem", &GameScriptItem::DisableItem);
m_lua->new_usertype<LuaVariables>("Variable",
sol::meta_function::index, &LuaVariables::GetVariable,
sol::meta_function::new_index, &LuaVariables::SetVariable,
"new", sol::no_constructor
);
// GameScript type
2020-04-28 12:24:10 -03:00
/*m_lua->new_usertype<GameScript>("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
2020-04-28 12:24:10 -03:00
);*/
2018-09-23 12:01:07 +02:00
m_lua->set_function("GetItemByID", &GameScript::GetItemById);
2020-04-28 12:24:10 -03:00
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);
2020-04-28 12:24:10 -03:00
// Add global variables and namespaces
//(*m_lua)["TR"] = this;
}
void GameScript::AddTrigger(LuaFunction* function)
{
m_triggers.push_back(function);
(*m_lua).script(function->Code);
}
2020-04-28 12:24:10 -03:00
void GameScript::AddLuaId(int luaId, short itemNumber)
{
m_itemsMapId.insert(pair<int, short>(luaId, itemNumber));
}
void GameScript::AddLuaName(string luaName, short itemNumber)
{
2020-04-28 12:24:10 -03:00
m_itemsMapName.insert(pair<string, short>(luaName, itemNumber));
}
void GameScript::FreeLevelScripts()
{
2020-04-28 12:24:10 -03:00
/*
// Delete all triggers
2019-12-02 09:11:21 +01:00
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;
2020-04-28 12:24:10 -03:00
*/
}
bool GameScript::ExecuteScript(const string& luaFilename, string& message)
{
auto result = m_lua->safe_script_file(luaFilename, sol::environment(m_lua->lua_state(), sol::create, m_lua->globals()), sol::script_pass_on_error);
2020-04-28 12:24:10 -03:00
if (!result.valid())
{
sol::error error = result;
message = error.what();
2020-04-28 12:24:10 -03:00
return false;
}
return true;
}
bool GameScript::ExecuteString(const string& command, string& message)
{
auto result = m_lua->safe_script(command, 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;
}
return true;
}
2019-12-02 09:11:21 +01:00
bool GameScript::ExecuteTrigger(short index)
2018-09-23 12:01:07 +02:00
{
2020-04-28 12:24:10 -03:00
return true;
/*
2018-09-23 12:01:07 +02:00
// Is this a valid trigger?
if (index >= m_triggers.size())
2018-09-23 12:01:07 +02:00
return true;
LuaFunction* trigger = m_triggers[index];
2018-09-23 12:01:07 +02:00
// 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<bool>())
std::cout << key.as<string>() << " " << value.as<bool>() << std::endl;
else if (value.is<string>())
std::cout << key.as<string>() << " " << value.as<string>() << std::endl;
else
std::cout << key.as<string>() << " " << value.as<int>() << std::endl;
});
2018-09-23 12:01:07 +02:00
return result;
2020-04-28 12:24:10 -03:00
*/
}
2019-12-02 09:11:21 +01:00
void GameScript::PlayAudioTrack(short track)
{
S_CDPlay(track, SOUND_TRACK_ONESHOT);
}
2019-12-02 09:11:21 +01:00
void GameScript::ChangeAmbientSoundTrack(short track)
{
CurrentAtmosphere = track;
S_CDStop();
S_CDPlay(track, SOUND_TRACK_BGM);
}
2019-12-02 09:11:21 +01:00
void GameScript::JumpToLevel(int levelNum)
{
if (levelNum >= g_GameFlow->GetNumLevels())
return;
LevelComplete = levelNum;
}
2019-12-02 09:11:21 +01:00
int GameScript::GetSecretsCount()
{
return Savegame.Level.Secrets;
}
2019-12-02 09:11:21 +01:00
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);
}
2020-04-28 12:24:10 -03:00
/*
2019-12-02 09:11:21 +01:00
void GameScript::MakeItemInvisible(short id)
{
if (m_itemsMap.find(id) == m_itemsMap.end())
return;
2019-12-02 09:11:21 +01:00
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;
}
}
}
2020-04-28 12:24:10 -03:00
*/
template <typename T>
void GameScript::GetVariables(map<string, T>& locals, map<string, T>& globals)
{
for (const auto& it : m_locals.variables)
2020-04-28 12:24:10 -03:00
{
if (it.second.is<T>())
locals.insert(pair<string, T>(it.first, it.second.as<T>()));
2020-04-28 12:24:10 -03:00
}
for (const auto& it : m_globals.variables)
2020-04-28 12:24:10 -03:00
{
if (it.second.is<T>())
globals.insert(pair<string, T>(it.first, it.second.as<T>()));
2020-04-28 12:24:10 -03:00
}
}
template void GameScript::GetVariables<bool>(map<string, bool>& locals, map<string, bool>& globals);
template void GameScript::GetVariables<float>(map<string, float>& locals, map<string, float>& globals);
template void GameScript::GetVariables<string>(map<string, string>& locals, map<string, string>& globals);
2020-04-28 12:24:10 -03:00
template <typename T>
void GameScript::SetVariables(map<string, T>& locals, map<string, T>& globals)
2020-04-28 12:24:10 -03:00
{
m_locals.variables.clear();
for (const auto& it : locals)
2020-04-28 12:24:10 -03:00
{
m_locals.variables.insert(pair<string, sol::object>(it.first, sol::object(m_lua->lua_state(), sol::in_place, it.second)));
2020-04-28 12:24:10 -03:00
}
for (const auto& it : globals)
2020-04-28 12:24:10 -03:00
{
m_globals.variables.insert(pair<string, sol::object>(it.first, sol::object(m_lua->lua_state(), sol::in_place, it.second)));
2020-04-28 12:24:10 -03:00
}
}
template void GameScript::SetVariables<bool>(map<string, bool>& locals, map<string, bool>& globals);
template void GameScript::SetVariables<float>(map<string, float>& locals, map<string, float>& globals);
template void GameScript::SetVariables<string>(map<string, string>& locals, map<string, string>& globals);
2020-04-28 12:24:10 -03:00
unique_ptr<GameScriptItem> GameScript::GetItemById(int id)
{
if (m_itemsMapId.find(id) == m_itemsMapId.end())
{
if (WarningsAsErrors)
throw "item id not found";
return unique_ptr<GameScriptItem>(nullptr);
}
return unique_ptr<GameScriptItem>(new GameScriptItem(m_itemsMapId[id]));
2020-04-28 12:24:10 -03:00
}
unique_ptr<GameScriptItem> GameScript::GetItemByName(string name)
{
if (m_itemsMapName.find(name) == m_itemsMapName.end())
{
if (WarningsAsErrors)
throw "item name not found";
return unique_ptr<GameScriptItem>(nullptr);
}
return unique_ptr<GameScriptItem>(new GameScriptItem(m_itemsMapName[name]));
}
2019-12-02 09:11:21 +01:00
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);
}
2019-12-02 09:11:21 +01:00
void GameScript::PlaySoundEffect(short id, int flags)
{
SoundEffect(id, NULL, flags);
}
2018-10-09 00:02:14 +02:00
void GameScript::AssignItemsAndLara()
{
2020-04-28 12:24:10 -03:00
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;
}
2020-04-28 12:24:10 -03:00
GameScriptPosition GameScript::CreatePosition(float x, float y, float z)
{
2020-04-28 12:24:10 -03:00
return GameScriptPosition(x, y, z);
}
GameScriptPosition GameScript::CreateSectorPosition(float x, float y, float z)
{
return GameScriptPosition(1024 * x + 512, 1024 * y + 512, 1024 * z + 512);
}
2020-04-28 12:24:10 -03:00
GameScriptRotation GameScript::CreateRotation(float x, float y, float z)
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
return GameScriptRotation(x, y, z);
}
2018-10-09 00:02:14 +02:00
2020-04-28 12:24:10 -03:00
float GameScript::CalculateDistance(GameScriptPosition pos1, GameScriptPosition pos2)
{
return sqrt(SQUARE(pos1.GetXPos() - pos2.GetXPos()) + SQUARE(pos1.GetYPos() - pos2.GetYPos()) + SQUARE(pos1.GetZPos() - pos2.GetZPos()));
}
2018-10-09 00:02:14 +02:00
2020-04-28 12:24:10 -03:00
float GameScript::CalculateHorizontalDistance(GameScriptPosition pos1, GameScriptPosition pos2)
{
return sqrt(SQUARE(pos1.GetXPos() - pos2.GetXPos()) + SQUARE(pos1.GetZPos() - pos2.GetZPos()));
}
2018-10-09 00:02:14 +02:00
GameScriptPosition::GameScriptPosition(float x, float y, float z)
:
xPos(x),
yPos(y),
zPos(z)
{
}
GameScriptPosition::GameScriptPosition(function<float()> readX, function<void(float)> writeX, function<float()> readY, function<void(float)> writeY, function<float()> readZ, function<void(float)> writeZ)
:
readXPos(readX),
writeXPos(writeX),
readYPos(readY),
writeYPos(writeY),
readZPos(readZ),
writeZPos(writeZ)
2020-04-28 12:24:10 -03:00
{
}
float GameScriptPosition::GetXPos()
{
if (readXPos)
xPos = readXPos();
2020-04-28 12:24:10 -03:00
return xPos;
}
void GameScriptPosition::SetXPos(float x)
{
xPos = x;
if (writeXPos)
writeXPos(xPos);
2020-04-28 12:24:10 -03:00
}
float GameScriptPosition::GetYPos()
{
if (readYPos)
yPos = readYPos();
2020-04-28 12:24:10 -03:00
return yPos;
}
void GameScriptPosition::SetYPos(float y)
{
yPos = y;
if (writeYPos)
writeYPos(yPos);
2020-04-28 12:24:10 -03:00
}
float GameScriptPosition::GetZPos()
{
if (readZPos)
zPos = readZPos();
2020-04-28 12:24:10 -03:00
return zPos;
}
void GameScriptPosition::SetZPos(float z)
{
zPos = z;
if (writeZPos)
writeZPos(zPos);
2020-04-28 12:24:10 -03:00
}
GameScriptRotation::GameScriptRotation(float x, float y, float z)
:
xRot(x),
yRot(y),
zRot(z)
{
}
GameScriptRotation::GameScriptRotation(function<float()> readX, function<void(float)> writeX, function<float()> readY, function<void(float)> writeY, function<float()> readZ, function<void(float)> writeZ)
:
readXRot(readX),
writeXRot(writeX),
readYRot(readY),
writeYRot(writeY),
readZRot(readZ),
writeZRot(writeZ)
2020-04-28 12:24:10 -03:00
{
}
float GameScriptRotation::GetXRot()
{
if (readXRot)
xRot = readXRot();
2020-04-28 12:24:10 -03:00
return xRot;
}
void GameScriptRotation::SetXRot(float x)
{
x = remainder(x, 360);
if (x < 0)
x += 360;
xRot = x;
if (writeXRot)
writeXRot(xRot);
2020-04-28 12:24:10 -03:00
}
float GameScriptRotation::GetYRot()
{
if (readYRot)
yRot = readYRot();
2020-04-28 12:24:10 -03:00
return yRot;
}
void GameScriptRotation::SetYRot(float y)
{
y = remainder(y, 360);
if (y < 0)
y += 360;
yRot = y;
if (writeYRot)
writeYRot(yRot);
2020-04-28 12:24:10 -03:00
}
float GameScriptRotation::GetZRot()
{
if (readZRot)
zRot = readZRot();
2020-04-28 12:24:10 -03:00
return zRot;
}
void GameScriptRotation::SetZRot(float z)
{
z = remainder(z, 360);
if (z < 0)
z += 360;
zRot = z;
if (writeZRot)
writeZRot(zRot);
2020-04-28 12:24:10 -03:00
}
GameScriptItem::GameScriptItem(short itemNumber)
:
NativeItemNumber(itemNumber),
NativeItem(&Items[itemNumber])
2020-04-28 12:24:10 -03:00
{
}
GameScriptPosition GameScriptItem::GetPosition()
2020-04-28 12:24:10 -03:00
{
return GameScriptPosition(
[this]() -> float { return NativeItem->pos.xPos; },
[this](float x) -> void { NativeItem->pos.xPos = x; },
[this]() -> float { return NativeItem->pos.yPos; },
[this](float y) -> void { NativeItem->pos.yPos = y; },
[this]() -> float { return NativeItem->pos.zPos; },
[this](float z) -> void { NativeItem->pos.zPos = z; }
);
2020-04-28 12:24:10 -03:00
}
GameScriptRotation GameScriptItem::GetRotation()
2020-04-28 12:24:10 -03:00
{
return GameScriptRotation(
[this]() -> float { return TO_DEGREES(NativeItem->pos.xRot); },
[this](float x) -> void { NativeItem->pos.xRot = ANGLE(x); },
[this]() -> float { return TO_DEGREES(NativeItem->pos.yRot); },
[this](float y) -> void { NativeItem->pos.yRot = ANGLE(y); },
[this]() -> float { return TO_DEGREES(NativeItem->pos.zRot); },
[this](float z) -> void { NativeItem->pos.zRot = ANGLE(z); }
);
2020-04-28 12:24:10 -03:00
}
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)
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
hp = 0;
2018-10-09 00:02:14 +02:00
}
2020-04-28 12:24:10 -03:00
else if (hp > Objects[NativeItem->objectNumber].hitPoints)
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
hp = Objects[NativeItem->objectNumber].hitPoints;
2018-10-09 00:02:14 +02:00
}
2020-04-28 12:24:10 -03:00
}
NativeItem->hitPoints = hp;
}
short GameScriptItem::GetRoom()
{
return NativeItem->roomNumber;
}
void GameScriptItem::SetRoom(short room)
{
if (room < 0 || room >= Rooms.size())
2020-04-28 12:24:10 -03:00
{
if (WarningsAsErrors)
throw runtime_error("invalid room number");
return;
}
NativeItem->roomNumber = room;
}
void GameScriptItem::EnableItem()
{
if (!NativeItem->active)
{
if (Objects[NativeItem->objectNumber].intelligent)
2018-10-09 00:02:14 +02:00
{
if (NativeItem->status == ITEM_DEACTIVATED)
2020-04-28 12:24:10 -03:00
{
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);
}
2018-10-09 00:02:14 +02:00
}
2020-04-28 12:24:10 -03:00
else
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
NativeItem->touchBits = 0;
AddActiveItem(NativeItemNumber);
NativeItem->status = ITEM_ACTIVE;
2018-10-09 00:02:14 +02:00
}
2020-04-28 12:24:10 -03:00
}
2018-10-09 00:02:14 +02:00
}
2020-04-28 12:24:10 -03:00
void GameScriptItem::DisableItem()
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
if (NativeItem->active)
2018-10-09 00:02:14 +02:00
{
2020-04-28 12:24:10 -03:00
if (Objects[NativeItem->objectNumber].intelligent)
2018-10-24 23:32:22 +02:00
{
2020-04-28 12:24:10 -03:00
if (NativeItem->status == ITEM_ACTIVE)
{
NativeItem->touchBits = 0;
NativeItem->status = ITEM_DEACTIVATED;
2020-04-28 12:24:10 -03:00
RemoveActiveItem(NativeItemNumber);
DisableBaddieAI(NativeItemNumber);
}
2018-10-24 23:32:22 +02:00
}
else
{
2020-04-28 12:24:10 -03:00
NativeItem->touchBits = 0;
RemoveActiveItem(NativeItemNumber);
NativeItem->status = ITEM_DEACTIVATED;
2018-10-24 23:32:22 +02:00
}
2018-10-09 00:02:14 +02:00
}
}
2020-04-28 12:24:10 -03:00
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;
}
}