Move all scripting header files into new folder.

This commit is contained in:
hispidence 2021-12-14 21:04:19 +00:00
parent b43b9c704f
commit a9d8b78c96
29 changed files with 0 additions and 0 deletions

View file

@ -0,0 +1,142 @@
#pragma once
#include <array>
std::array kAudioTracks
{
"xa1_TL_10B.wav",
"xa1_Z10.wav",
"xa1_TL_05.wav",
"xa1_TL_08.wav",
"xa1_TL_11.wav",
"xa1_ANDYPEW.wav",
"xa1_SECRET.wav",
"xa1_TL_02.wav",
"xa2_HMMM05.wav",
"xa2_TL_01.wav",
"xa2_ATTACK04.wav",
"xa2_UWATER2B.wav",
"xa2_SPOOKY2A.wav",
"xa2_TL_10A.wav",
"xa2_HMMM02.wav",
"xa2_TOMS01.wav",
"xa3_Attack03.wav",
"xa3_Attack02.wav",
"xa3_Hmmm01.wav",
"xa3_Stealth1.wav",
"xa3_Stealth2.wav",
"xa3_Attack01.wav",
"xa3_TL_06.wav",
"xa3_TL_03.wav",
"xa4_hmmm06.wav",
"xa4_mil01.wav",
"xa4_Z_03.wav",
"xa4_hit01.wav",
"xa4_spooky05.wav",
"xa4_drama01.wav",
"xa4_stealth4.wav",
"xa4_mil05.wav",
"xa5_HMMM04.wav",
"xa5_MIL06.wav",
"xa5_SPOOKY02.wav",
"xa5_TL_12.wav",
"xa5_MIL02A.wav",
"xa5_HMMM03.wav",
"xa5_MIL02.wav",
"xa5_TL_04.wav",
"xa6_Mil04.wav",
"xa6_Solo01.wav",
"xa6_Z12.wav",
"xa6_Stealth3.wav",
"xa6_AuthSolo.wav",
"xa6_Spooky03.wav",
"xa6_Z13.wav",
"xa6_Z_04anim.wav",
"xa7_z_06a.wav",
"xa7_andyoooh.wav",
"xa7_andyooer.wav",
"xa7_tl_07.wav",
"xa7_z_02.wav",
"xa7_evibes01.wav",
"xa7_z_06.wav",
"xa7_authtr.wav",
"xa8_mil03.wav",
"xa8_fightsc.wav",
"xa8_richcut3.wav",
"xa8_z_13.wav",
"xa8_z_08.wav",
"xa8_uwater2a.wav",
"xa8_jobyalrm.wav",
"xa8_mil02b.wav",
"xa9_swampy.wav",
"xa9_evibes02.wav",
"xa9_gods01.wav",
"xa9_z_03.wav",
"xa9_richcut4.wav",
"xa9_title4.wav",
"xa9_spooky01.wav",
"xa9_chopin01.wav",
"xa10_echoir01.wav",
"xa10_title3.wav",
"xa10_perc01.wav",
"xa10_vc01.wav",
"xa10_title2.wav",
"xa10_z_09.wav",
"xa10_spooky04.wav",
"xa10_z_10.wav",
"xa11_vc01atv.wav",
"xa11_andy3.wav",
"xa11_title1.wav",
"xa11_flyby1.wav",
"xa11_monk_2.wav",
"xa11_andy4.wav",
"xa11_flyby3.wav",
"xa11_flyby2.wav",
"xa12_moses01.wav",
"xa12_andy4b.wav",
"xa12_z_10.wav",
"xa12_flyby4.wav",
"xa12_richcut1.wav",
"xa12_andy5.wav",
"xa12_z_05.wav",
"xa12_z_01.wav",
"xa13_Joby3.wav",
"xa13_Andy7.wav",
"xa13_Andrea3B.wav",
"xa13_cossack.wav",
"xa13_Z_07.wav",
"xa13_Andy6.wav",
"xa13_Andrea3.wav",
"xa13_Joby7.wav",
"xa14_uwater1.wav",
"xa14_joby1.wav",
"xa14_andy10.wav",
"xa14_richcut2.wav",
"xa14_andrea1.wav",
"xa14_andy8.wav",
"xa14_joby6.wav",
"xa14_ecredits.wav",
"xa15_boss_01.wav",
"xa15_joby2.wav",
"xa15_joby4.wav",
"xa15_joby5.wav",
"xa15_joby9.wav",
"xa15_a_andy.wav",
"xa15_a_rome.wav",
"xa15_andy2.wav",
"xa16_Joby8.wav",
"xa16_A_Sub_Amb.wav",
"xa16_Joby10.wav",
"xa16_A_Harbour_out.wav",
"xa16_A_Andy_Out_Norm.wav",
"xa16_A_Andy_Out_Spooky.wav",
"xa16_A_Rome_Day.wav",
"xa16_A_Underwater.wav",
"xa17_A_Rome_Night.wav",
"xa17_A_VC_Saga.wav",
"xa17_A_Industry.wav",
"xa17_Andrea2.wav",
"xa17_Andy1.wav",
"xa17_Andrea4.wav",
"xa17_Andy9.wav",
"xa17_Andy11.wav"
};

View file

@ -0,0 +1,69 @@
#pragma once
#include "LanguageScript.h"
#include "LuaHandler.h"
#include "GameLogicScript.h"
#include "GameScriptColor.h"
#include "GameScriptLevel.h"
#include "GameScriptSettings.h"
#include "GameScriptAudioTrack.h"
#include "GameScriptAnimations.h"
#include "ScriptInterfaceGame.h"
enum class TITLE_TYPE
{
FLYBY,
BACKGROUND
};
class GameFlow : public LuaHandler
{
private:
GameScriptSettings m_settings;
std::unordered_map < std::string, std::vector<std::string > > m_translationsMap;
std::vector<std::string> m_languageNames;
std::map<short, short> m_itemsMap;
public:
int FogInDistance{ 0 };
int FogOutDistance{ 0 };
int SelectedLevelForNewGame{ 0 };
int SelectedSaveGame{ 0 };
bool EnableLoadSave{ true };
bool PlayAnyLevel{ true };
bool FlyCheat{ true };
bool DebugMode{ false };
byte GameFarView{ 0 };
TITLE_TYPE TitleType{ TITLE_TYPE::FLYBY };
std::string IntroImagePath{};
std::string TitleScreenImagePath{};
// New animation flag table
GameScriptAnimations Animations{};
// Selected language set
std::vector<GameScriptLevel*> Levels;
GameFlow(sol::state* lua);
~GameFlow();
void AddLevel(GameScriptLevel const& level);
void SetAudioTracks(sol::as_table_t<std::vector<GameScriptAudioTrack>>&& src);
void LoadGameFlowScript();
char const * GetString(const char* id) const;
void SetStrings(sol::nested<std::unordered_map<std::string, std::vector<std::string>>> && src);
void SetLanguageNames(sol::as_table_t<std::vector<std::string>> && src);
void SetAnimations(GameScriptAnimations const & src);
void SetSettings(GameScriptSettings const & src);
GameScriptSettings* GetSettings();
GameScriptLevel* GetLevel(int id);
int GetNumLevels() const;
bool DoGameflow();
void SetIntroImagePath(std::string const& path);
void SetTitleScreenImagePath(std::string const& path);
void SetGameFarView(byte val);
};
extern GameFlow* g_GameFlow;
extern ScriptInterfaceGame * g_GameScript;

View file

@ -0,0 +1,127 @@
#pragma once
#include "ScriptInterfaceGame.h"
#include "Game/items.h"
#include "Game/room.h"
#include "LuaHandler.h"
#include "Specific/trmath.h"
#include <unordered_set>
#include "GameScriptColor.h"
#include "GameScriptPosition.h"
#include "GameScriptRotation.h"
#include "GameScriptItemInfo.h"
#include "GameScriptMeshInfo.h"
#include "GameScriptSinkInfo.h"
#include "GameScriptAIObject.h"
#include "GameScriptSoundSourceInfo.h"
#include "GameScriptCameraInfo.h"
#include "GameScriptDisplayString.h"
struct LuaFunction {
std::string Name;
std::string Code;
bool Executed;
};
struct GameScriptVector3 {
float x;
float y;
float z;
};
class LuaVariables
{
public:
std::unordered_map<std::string, sol::object> variables;
sol::object GetVariable(sol::table tab, std::string key);
void SetVariable(sol::table tab, std::string key, sol::object value);
};
struct LuaVariable
{
bool IsGlobal;
std::string Name;
int Type;
float FloatValue;
int IntValue;
std::string StringValue;
bool BoolValue;
};
using DisplayStringMap = std::unordered_map<DisplayStringIDType, UserDisplayString>;
class GameScript : public LuaHandler, public ScriptInterfaceGame
{
private:
LuaVariables m_globals{};
LuaVariables m_locals{};
DisplayStringMap m_userDisplayStrings{};
std::unordered_map<std::string, VarMapVal> m_nameMap{};
std::unordered_map<std::string, short> m_itemsMapName{};
std::unordered_map<std::string, sol::protected_function> m_levelFuncs{};
sol::protected_function m_onStart{};
sol::protected_function m_onLoad{};
sol::protected_function m_onControlPhase{};
sol::protected_function m_onSave{};
sol::protected_function m_onEnd{};
void ResetLevelTables();
CallbackDrawString m_callbackDrawSring;
public:
GameScript(sol::state* lua);
void FreeLevelScripts() override;
bool SetDisplayString(DisplayStringIDType id, UserDisplayString const & ds);
std::optional<std::reference_wrapper<UserDisplayString>> GetDisplayString(DisplayStringIDType id);
bool ScheduleRemoveDisplayString(DisplayStringIDType id);
bool SetLevelFunc(sol::table tab, std::string const& luaName, sol::object obj);
sol::protected_function GetLevelFunc(sol::table tab, std::string const& luaName);
void AssignItemsAndLara() override;
void ExecuteScriptFile(const std::string& luaFilename) override;
void ExecuteFunction(std::string const & name) override;
void MakeItemInvisible(short id);
template <typename R, char const* S>
std::unique_ptr<R> GetByName(std::string const& name)
{
ScriptAssertF(m_nameMap.find(name) != m_nameMap.end(), "{} name not found: {}", S, name);
return std::make_unique<R>(std::get<R::IdentifierType>(m_nameMap.at(name)), false);
}
bool AddName(std::string const& key, VarMapVal val) override
{
auto p = std::pair<std::string const&, VarMapVal>{ key, val };
return m_nameMap.insert(p).second;
}
bool RemoveName(std::string const& key)
{
return m_nameMap.erase(key);
}
// Variables
template <typename T>
void GetVariables(std::map<std::string, T>& locals, std::map<std::string, T>& globals);
template <typename T>
void SetVariables(std::map<std::string, T>& locals, std::map<std::string, T>& globals);
void ResetVariables();
void SetCallbackDrawString(CallbackDrawString cb) override;
void ShowString(GameScriptDisplayString const&, sol::optional<float> nSeconds);
void ProcessDisplayStrings(float dt) override;
void InitCallbacks() override;
void OnStart() override;
void OnLoad() override;
void OnControlPhase(float dt) override;
void OnSave() override;
void OnEnd() override;
};

View file

@ -0,0 +1,50 @@
#pragma once
#include "GameScriptNamedBase.h"
#include "Specific/level.h"
namespace sol {
class state;
}
class GameScriptPosition;
class GameScriptAIObject : public GameScriptNamedBase<GameScriptAIObject, AI_OBJECT&>
{
public:
GameScriptAIObject(AI_OBJECT& ref, bool temp);
~GameScriptAIObject();
GameScriptAIObject& operator=(GameScriptAIObject const& other) = delete;
GameScriptAIObject(GameScriptAIObject const& other) = delete;
static void Register(sol::state *);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const& pos);
short GetRoom() const;
void SetRoom(short Room);
std::string GetName() const;
void SetName(std::string const &);
GAME_OBJECT_ID GetObjID() const;
void SetObjID(GAME_OBJECT_ID);
short GetTriggerFlags() const;
void SetTriggerFlags(short);
short GetFlags() const;
void SetFlags(short);
short GetYRot() const;
void SetYRot(short);
short GetBoxNumber() const;
void SetBoxNumber(short);
private:
AI_OBJECT & m_aiObject;
bool m_temporary;
};

View file

@ -0,0 +1,16 @@
#pragma once
#include <string>
namespace sol {
class state;
}
struct GameScriptAudioTrack
{
std::string trackName;
bool looped;
GameScriptAudioTrack(std::string const & trackName, bool looped);
static void Register(sol::state* lua);
};

View file

@ -0,0 +1,34 @@
#pragma once
#include "GameScriptNamedBase.h"
#include "Specific/phd_global.h"
namespace sol {
class state;
}
class GameScriptPosition;
class GameScriptCameraInfo : public GameScriptNamedBase<GameScriptCameraInfo, LEVEL_CAMERA_INFO &>
{
public:
using IdentifierType = std::reference_wrapper<LEVEL_CAMERA_INFO>;
GameScriptCameraInfo(LEVEL_CAMERA_INFO& ref, bool temp);
~GameScriptCameraInfo();
GameScriptCameraInfo& operator=(GameScriptCameraInfo const& other) = delete;
GameScriptCameraInfo(GameScriptCameraInfo const& other) = delete;
static void Register(sol::state *);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const& pos);
short GetRoom() const;
void SetRoom(short Room);
std::string GetName() const;
void SetName(std::string const &);
private:
LEVEL_CAMERA_INFO & m_camera;
bool m_temporary;
};

View file

@ -0,0 +1,40 @@
#pragma once
#include "framework.h"
typedef DWORD D3DCOLOR;
namespace sol {
class state;
template <typename T> struct as_table_t;
}
class GameScriptColor {
public:
byte r{ 0 };
byte g{ 0 };
byte b{ 0 };
byte a{ 255 };
GameScriptColor(byte r, byte g, byte b);
GameScriptColor(byte r, byte g, byte b, byte a);
GameScriptColor(Vector3 const &);
GameScriptColor(Vector4 const &);
GameScriptColor(D3DCOLOR);
operator Vector3() const;
operator Vector4() const;
operator D3DCOLOR() const;
byte GetR() const;
void SetR(byte v);
byte GetG() const;
void SetG(byte v);
byte GetB() const;
void SetB(byte v);
byte GetA() const;
void SetA(byte v);
std::string ToString() const;
static void Register(sol::state* state);
};

View file

@ -0,0 +1,82 @@
#pragma once
#include "GameScriptColor.h"
enum class DisplayStringOptions : size_t
{
CENTER,
OUTLINE,
NUM_OPTIONS
};
static const std::unordered_map<std::string, DisplayStringOptions> kDisplayStringOptionNames
{
{"CENTER", DisplayStringOptions::CENTER},
{"SHADOW", DisplayStringOptions::OUTLINE}
};
using FlagArray = std::array<bool, static_cast<size_t>(DisplayStringOptions::NUM_OPTIONS)>;
// Used to store data used to render the string.
// This is separate from GameScriptDisplayString because the lifetimes
// of the classes differ slightly.
class UserDisplayString
{
public:
UserDisplayString(std::string const& key, int x, int y, D3DCOLOR col, FlagArray const & flags, bool translated);
private:
UserDisplayString() = default;
std::string m_key{};
D3DCOLOR m_color{ 0xFFFFFFFF };
FlagArray m_flags{};
int m_x{ 0 };
int m_y{ 0 };
bool m_deleteWhenZero{ false };
//seconds
float m_timeRemaining{ 0.0f };
bool m_isInfinite{ false };
bool m_isTranslated{ false };
friend class GameScript;
friend class GameScriptDisplayString;
};
using DisplayStringIDType = uintptr_t;
using SetItemCallback = std::function<bool(DisplayStringIDType, UserDisplayString const&)>;
using RemoveItemCallback = std::function<bool(DisplayStringIDType)>;
using GetItemCallback = std::function<std::optional<std::reference_wrapper<UserDisplayString>>(DisplayStringIDType)>;
class GameScriptDisplayString
{
private:
DisplayStringIDType m_id{ 0 };
public:
GameScriptDisplayString();
~GameScriptDisplayString();
DisplayStringIDType GetID() const;
static void Register(sol::state* state);
void SetPos(int x, int y);
std::tuple<int, int> GetPos() const;
void SetCol(GameScriptColor const&);
GameScriptColor GetCol();
void SetKey(std::string const&);
std::string GetKey() const;
static SetItemCallback s_setItemCallback;
static RemoveItemCallback s_removeItemCallback;
static GetItemCallback s_getItemCallback;
// Creating a GameScriptDisplayString requires us to add an identifier
// to a data structure. We use callbacks so this class doesn't have
// to know about said data structure.
static void SetCallbacks(SetItemCallback cba, RemoveItemCallback cbr, GetItemCallback cbg)
{
s_setItemCallback = cba;
s_removeItemCallback = cbr;
s_getItemCallback = cbg;
}
};

View file

@ -0,0 +1,41 @@
#pragma once
#include <string>
#include "ItemEnumPair.h"
#include "GameScriptRotation.h"
#include "Game/gui.h"
static const std::unordered_map<std::string, RotationFlags> kRotAxes{
{"X", RotationFlags::INV_ROT_X},
{"Y", RotationFlags::INV_ROT_Y},
{"Z", RotationFlags::INV_ROT_Z}
};
static const std::unordered_map<std::string, ItemOptions> kItemActions{
{"USE", ItemOptions::OPT_USE},
{"EQUIP", ItemOptions::OPT_EQUIP},
{"EXAMINE", ItemOptions::OPT_EXAMINABLE}
};
namespace sol {
class state;
}
struct GameScriptInventoryObject
{
std::string name{};
InventoryObjectTypes slot{ INV_OBJECT_PISTOLS };
short yOffset{ 0 };
float scale{ 1.0f };
GameScriptRotation rot{};
RotationFlags rotationFlags{ RotationFlags::INV_ROT_X };
int meshBits{ 0 };
ItemOptions action{ ItemOptions::OPT_USE };
GameScriptInventoryObject() = default;
GameScriptInventoryObject(std::string const & a_name, ItemEnumPair a_slot, short a_yOffset, float a_scale, GameScriptRotation const & a_rot, RotationFlags a_rotationFlags, int a_meshBits, ItemOptions a_actions);
static void Register(sol::state* lua);
void SetAction(ItemOptions a_action);
void SetSlot(ItemEnumPair a_slot);
};

View file

@ -0,0 +1,89 @@
#pragma once
#include "GameScriptNamedBase.h"
namespace sol {
class state;
template <typename T> struct as_table_t;
}
class GameScriptPosition;
class GameScriptRotation;
struct ITEM_INFO;
enum GAME_OBJECT_ID : short;
class GameScriptItemInfo : public GameScriptNamedBase<GameScriptItemInfo, short>
{
public:
using IdentifierType = short;
GameScriptItemInfo(short num, bool temporary);
~GameScriptItemInfo();
GameScriptItemInfo& operator=(GameScriptItemInfo const& other) = delete;
GameScriptItemInfo(GameScriptItemInfo const& other) = delete;
GameScriptItemInfo(GameScriptItemInfo && other) noexcept;
static void Register(sol::state *);
GAME_OBJECT_ID GetObjectID() const;
void SetObjectID(GAME_OBJECT_ID id);
std::string GetName() const;
void SetName(std::string const &);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const& pos);
GameScriptRotation GetRot() const;
void SetRot(GameScriptRotation const& rot);
int GetCurrentAnimState() const;
void SetCurrentAnimState(int animState);
int GetAnimNumber() const;
void SetAnimNumber(int animNumber);
int GetFrameNumber() const;
void SetFrameNumber(int frameNumber);
int GetRequiredAnimState() const;
void SetRequiredAnimState(short animState);
int GetGoalAnimState() const;
void SetGoalAnimState(int animState);
short GetHP() const;
void SetHP(short hp);
short GetOCB() const;
void SetOCB(short ocb);
sol::as_table_t<std::array<short, 8>> GetItemFlags() const;
void SetItemFlags(sol::as_table_t<std::array<short, 8>> const & arr);
byte GetAIBits() const;
void SetAIBits(byte bits);
short GetStatus() const;
void SetStatus(short status);
bool GetHitStatus() const;
void SetHitStatus(bool status);
bool GetActive() const;
void SetActive(bool active);
short GetRoom() const;
void SetRoom(short Room);
void EnableItem();
void DisableItem();
void Init();
private:
ITEM_INFO* m_item;
short m_num;
bool m_initialised;
bool m_temporary;
};

View file

@ -0,0 +1,68 @@
#pragma once
#include <string>
#include "GameScriptSkyLayer.h"
#include "GameScriptMirror.h"
#include "GameScriptColor.h"
#include "GameScriptInventoryObject.h"
#include <GameScriptFog.h>
enum class WeatherType
{
None,
Rain,
Snow
};
static const std::unordered_map<std::string, WeatherType> kWeatherTypes
{
{"None", WeatherType::None},
{"Rain", WeatherType::Rain},
{"Snow", WeatherType::Snow}
};
enum LaraType
{
Normal = 1,
Young = 2,
Bunhead = 3,
Catsuit = 4,
Divesuit = 5,
Invisible = 7
};
static const std::unordered_map<std::string, LaraType> kLaraTypes
{
{"Normal", LaraType::Normal},
{"Young", LaraType::Young},
{"Bunhead", LaraType::Bunhead},
{"Catsuit", LaraType::Catsuit},
{"Divesuit", LaraType::Divesuit},
{"Invisible", LaraType::Invisible}
};
struct GameScriptLevel
{
std::string NameStringKey;
std::string FileName;
std::string ScriptFileName;
std::string LoadScreenFileName;
std::string AmbientTrack;
GameScriptSkyLayer Layer1;
GameScriptSkyLayer Layer2;
bool Horizon{ false };
bool ColAddHorizon{ false };
GameScriptFog Fog;
bool Storm{ false };
WeatherType Weather{ WeatherType::None };
float WeatherStrength{ 1.0f };
bool Rumble{ false };
LaraType LaraType{ LaraType::Normal };
GameScriptMirror Mirror;
int LevelFarView{ 0 };
bool UnlimitedAir{ false };
std::vector<GameScriptInventoryObject> InventoryObjects;
void SetWeatherStrength(float val);
void SetLevelFarView(byte val);
static void Register(sol::state* state);
};

View file

@ -0,0 +1,39 @@
#pragma once
#include "GameScriptNamedBase.h"
#include "Game/room.h"
namespace sol {
class state;
}
class GameScriptPosition;
class GameScriptColor;
class GameScriptMeshInfo : public GameScriptNamedBase<GameScriptMeshInfo, MESH_INFO &>
{
public:
using IdentifierType = std::reference_wrapper<MESH_INFO>;
GameScriptMeshInfo(MESH_INFO & id, bool temporary);
~GameScriptMeshInfo();
GameScriptMeshInfo& operator=(GameScriptMeshInfo const& other) = delete;
GameScriptMeshInfo(GameScriptMeshInfo const& other) = delete;
static void Register(sol::state *);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const & pos);
int GetRot() const;
void SetRot(int yRot);
std::string GetName() const;
void SetName(std::string const & name);
int GetStaticNumber() const;
void SetStaticNumber(int staticNumber);
GameScriptColor GetColor() const;
void SetColor(GameScriptColor const & col);
int GetHP() const;
void SetHP(int hp);
private:
MESH_INFO & m_mesh;
bool m_temporary;
};

View file

@ -0,0 +1,21 @@
#pragma once
namespace sol {
class state;
}
struct GameScriptMirror
{
short Room{ -1 };
int StartX{ 0 };
int EndX{ 0 };
int StartZ{ 0 };
int EndZ{ 0 };
static void Register(sol::state* lua);
GameScriptMirror() = default;
GameScriptMirror(short room, int startX, int endX, int startZ, int endZ);
};

View file

@ -0,0 +1,40 @@
#pragma once
#include "ScriptAssert.h"
#include <functional>
#include <string>
template <typename S> using callbackSetName = std::function<bool(std::string const&, S identifier)>;
using callbackRemoveName = std::function<bool(std::string const&)>;
// Use the "curiously recurring template pattern" to allow classes to inherit static members and functions.
// T is the class that will both derive and instantiate this base class. S is the type used inside GameScriptWhateverInfo
// to actually reference the underlying TombEngine struct.
template <typename T, class S> class GameScriptNamedBase
{
public:
static void SetNameCallbacks(callbackSetName<S> cbs, callbackRemoveName cbr)
{
s_callbackSetName = cbs;
s_callbackRemoveName = cbr;
}
protected:
static callbackSetName<S> s_callbackSetName;
static callbackRemoveName s_callbackRemoveName;
};
// default callbacks
template <typename T, typename S> callbackSetName<S> GameScriptNamedBase<T, S>::s_callbackSetName = [](std::string const& n, S identifier) {
std::string err = "\"Set Name\" callback is not set.";
throw TENScriptException(err);
return false;
};
// this could potentially be called by the GameScriptItemInfo destructor, and thus cannot throw
template <typename T, typename S> callbackRemoveName GameScriptNamedBase<T, S>::s_callbackRemoveName = [](std::string const& n) {
TENLog("\"Remove Name\" callback is not set.", LogLevel::Error);
std::terminate();
return false;
};

View file

@ -0,0 +1,24 @@
#pragma once
#include "framework.h"
namespace sol {
class state;
}
struct PHD_3DPOS;
class GameScriptPosition {
public:
int x;
int y;
int z;
GameScriptPosition(int x, int y, int z);
GameScriptPosition(PHD_3DPOS const& pos);
std::string ToString() const;
void StoreInPHDPos(PHD_3DPOS& pos) const;
static void Register(sol::state*);
};

View file

@ -0,0 +1,25 @@
#pragma once
#include "framework.h"
namespace sol {
class state;
}
struct PHD_3DPOS;
class GameScriptRotation {
public:
short x{ 0 };
short y{ 0 };
short z{ 0 };
GameScriptRotation() = default;
GameScriptRotation(int x, int y, int z);
GameScriptRotation(PHD_3DPOS const& pos);
std::string ToString() const;
void StoreInPHDPos(PHD_3DPOS& pos) const;
static void Register(sol::state*);
};

View file

@ -0,0 +1,31 @@
#pragma once
#include "ScriptAssert.h"
#include <string>
static const std::unordered_map<std::string, ERROR_MODE> kErrorModes {
{"SILENT", ERROR_MODE::SILENT},
{"WARN", ERROR_MODE::WARN},
{"TERMINATE", ERROR_MODE::TERMINATE}
};
namespace sol {
class state;
}
struct GameScriptSettings
{
int ScreenWidth;
int ScreenHeight;
bool EnableLoadSave;
bool EnableDynamicShadows;
bool EnableWaterCaustics;
bool Windowed;
int DrawingDistance;
bool ShowRendererSteps;
bool ShowDebugInfo;
ERROR_MODE ErrorMode;
static void Register(sol::state* lua);
};

View file

@ -0,0 +1,36 @@
#pragma once
#include "GameScriptNamedBase.h"
#include "Specific/phd_global.h"
namespace sol {
class state;
}
class GameScriptPosition;
class GameScriptSinkInfo : public GameScriptNamedBase<GameScriptSinkInfo, SINK_INFO &>
{
public:
using IdentifierType = std::reference_wrapper<SINK_INFO>;
GameScriptSinkInfo(SINK_INFO& ref, bool temp);
~GameScriptSinkInfo();
GameScriptSinkInfo& operator=(GameScriptSinkInfo const& other) = delete;
GameScriptSinkInfo(GameScriptSinkInfo const& other) = delete;
static void Register(sol::state *);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const& pos);
int GetStrength() const;
void SetStrength(int strength);
int GetBoxIndex() const;
void SetBoxIndex(int Room);
std::string GetName() const;
void SetName(std::string const &);
private:
SINK_INFO & m_sink;
bool m_temporary;
};

View file

@ -0,0 +1,23 @@
#pragma once
#include "GameScriptColor.h"
namespace sol {
class state;
}
struct GameScriptSkyLayer
{
bool Enabled{ false };
byte R{ 0 };
byte G{ 0 };
byte B{ 0 };
short CloudSpeed{ 0 };
GameScriptSkyLayer() = default;
GameScriptSkyLayer(GameScriptColor const & col, short speed);
void SetColor(GameScriptColor const & col);
static void Register(sol::state *);
};

View file

@ -0,0 +1,38 @@
#pragma once
#include "GameScriptNamedBase.h"
#include "Specific/phd_global.h"
namespace sol {
class state;
}
class GameScriptPosition;
class GameScriptSoundSourceInfo : public GameScriptNamedBase<GameScriptSoundSourceInfo, SOUND_SOURCE_INFO &>
{
public:
using IdentifierType = std::reference_wrapper<SOUND_SOURCE_INFO>;
GameScriptSoundSourceInfo(SOUND_SOURCE_INFO& ref, bool temp);
~GameScriptSoundSourceInfo();
GameScriptSoundSourceInfo& operator=(GameScriptSoundSourceInfo const& other) = delete;
GameScriptSoundSourceInfo(GameScriptSoundSourceInfo const& other) = delete;
static void Register(sol::state *);
GameScriptPosition GetPos() const;
void SetPos(GameScriptPosition const& pos);
int GetSoundID() const;
void SetSoundID(int soundID);
int GetFlags() const;
void SetFlags(int flags);
std::string GetName() const;
void SetName(std::string const &);
private:
SOUND_SOURCE_INFO & m_soundSource;
bool m_temporary;
};

View file

@ -0,0 +1,467 @@
#pragma once
// Last generated on 23/8/2021.
#include <unordered_map>
#include <string>
#include "ItemEnumPair.h"
/***
Constants for items that can be used with GetInvItem and SetInvItem.
@enum InvItem
@pragma nostrip
*/
/*** InvItem constants.
The following constants are inside InvItem.
PISTOLS_ITEM
PISTOLS_AMMO_ITEM
UZI_ITEM
UZI_AMMO_ITEM
SHOTGUN_ITEM
SHOTGUN_AMMO1_ITEM
SHOTGUN_AMMO2_ITEM
REVOLVER_ITEM
REVOLVER_AMMO_ITEM
CROSSBOW_ITEM
CROSSBOW_AMMO1_ITEM
CROSSBOW_AMMO2_ITEM
CROSSBOW_AMMO3_ITEM
HK_ITEM
HK_AMMO_ITEM
GRENADE_GUN_ITEM
GRENADE_AMMO1_ITEM
GRENADE_AMMO2_ITEM
GRENADE_AMMO3_ITEM
HARPOON_ITEM
HARPOON_AMMO_ITEM
ROCKET_LAUNCHER_ITEM
ROCKET_LAUNCHER_AMMO_ITEM
LASERSIGHT_ITEM
SILENCER_ITEM
BIGMEDI_ITEM
SMALLMEDI_ITEM
BINOCULARS_ITEM
FLARE_INV_ITEM
TIMEX_ITEM
PC_LOAD_INV_ITEM
PC_LOAD_SAVE_ITEM
BURNING_TORCH_ITEM
CROWBAR_ITEM
DIARY_ITEM
COMPASS_ITEM
CLOCKWORK_BEETLE
CLOCKWORK_BEETLE_COMBO1
CLOCKWORK_BEETLE_COMBO2
WATERSKIN1_EMPTY
WATERSKIN1_1
WATERSKIN1_2
WATERSKIN1_3
WATERSKIN2_EMPTY
WATERSKIN2_1
WATERSKIN2_2
WATERSKIN2_3
WATERSKIN2_4
WATERSKIN2_5
OPEN_DIARY_ITEM
GOLDROSE_ITEM
PUZZLE_ITEM1
PUZZLE_ITEM2
PUZZLE_ITEM3
PUZZLE_ITEM4
PUZZLE_ITEM5
PUZZLE_ITEM6
PUZZLE_ITEM7
PUZZLE_ITEM8
PUZZLE_ITEM9
PUZZLE_ITEM10
PUZZLE_ITEM11
PUZZLE_ITEM12
PUZZLE_ITEM13
PUZZLE_ITEM14
PUZZLE_ITEM15
PUZZLE_ITEM16
PUZZLE_ITEM1_COMBO1
PUZZLE_ITEM1_COMBO2
PUZZLE_ITEM2_COMBO1
PUZZLE_ITEM2_COMBO2
PUZZLE_ITEM3_COMBO1
PUZZLE_ITEM3_COMBO2
PUZZLE_ITEM4_COMBO1
PUZZLE_ITEM4_COMBO2
PUZZLE_ITEM5_COMBO1
PUZZLE_ITEM5_COMBO2
PUZZLE_ITEM6_COMBO1
PUZZLE_ITEM6_COMBO2
PUZZLE_ITEM7_COMBO1
PUZZLE_ITEM7_COMBO2
PUZZLE_ITEM8_COMBO1
PUZZLE_ITEM8_COMBO2
PUZZLE_ITEM9_COMBO1
PUZZLE_ITEM9_COMBO2
PUZZLE_ITEM10_COMBO1
PUZZLE_ITEM10_COMBO2
PUZZLE_ITEM11_COMBO1
PUZZLE_ITEM11_COMBO2
PUZZLE_ITEM12_COMBO1
PUZZLE_ITEM12_COMBO2
PUZZLE_ITEM13_COMBO1
PUZZLE_ITEM13_COMBO2
PUZZLE_ITEM14_COMBO1
PUZZLE_ITEM14_COMBO2
PUZZLE_ITEM15_COMBO1
PUZZLE_ITEM15_COMBO2
PUZZLE_ITEM16_COMBO1
PUZZLE_ITEM16_COMBO2
KEY_ITEM1
KEY_ITEM2
KEY_ITEM3
KEY_ITEM4
KEY_ITEM5
KEY_ITEM6
KEY_ITEM7
KEY_ITEM8
KEY_ITEM9
KEY_ITEM10
KEY_ITEM11
KEY_ITEM12
KEY_ITEM13
KEY_ITEM14
KEY_ITEM15
KEY_ITEM16
KEY_ITEM1_COMBO1
KEY_ITEM1_COMBO2
KEY_ITEM2_COMBO1
KEY_ITEM2_COMBO2
KEY_ITEM3_COMBO1
KEY_ITEM3_COMBO2
KEY_ITEM4_COMBO1
KEY_ITEM4_COMBO2
KEY_ITEM5_COMBO1
KEY_ITEM5_COMBO2
KEY_ITEM6_COMBO1
KEY_ITEM6_COMBO2
KEY_ITEM7_COMBO1
KEY_ITEM7_COMBO2
KEY_ITEM8_COMBO1
KEY_ITEM8_COMBO2
KEY_ITEM9_COMBO1
KEY_ITEM9_COMBO2
KEY_ITEM10_COMBO1
KEY_ITEM10_COMBO2
KEY_ITEM11_COMBO1
KEY_ITEM11_COMBO2
KEY_ITEM12_COMBO1
KEY_ITEM12_COMBO2
KEY_ITEM13_COMBO1
KEY_ITEM13_COMBO2
KEY_ITEM14_COMBO1
KEY_ITEM14_COMBO2
KEY_ITEM15_COMBO1
KEY_ITEM15_COMBO2
KEY_ITEM16_COMBO1
KEY_ITEM16_COMBO2
PICKUP_ITEM1
PICKUP_ITEM2
PICKUP_ITEM3
PICKUP_ITEM4
PICKUP_ITEM5
PICKUP_ITEM6
PICKUP_ITEM7
PICKUP_ITEM8
PICKUP_ITEM9
PICKUP_ITEM10
PICKUP_ITEM11
PICKUP_ITEM12
PICKUP_ITEM13
PICKUP_ITEM14
PICKUP_ITEM15
PICKUP_ITEM16
PICKUP_ITEM1_COMBO1
PICKUP_ITEM1_COMBO2
PICKUP_ITEM2_COMBO1
PICKUP_ITEM2_COMBO2
PICKUP_ITEM3_COMBO1
PICKUP_ITEM3_COMBO2
PICKUP_ITEM4_COMBO1
PICKUP_ITEM4_COMBO2
PICKUP_ITEM5_COMBO1
PICKUP_ITEM5_COMBO2
PICKUP_ITEM6_COMBO1
PICKUP_ITEM6_COMBO2
PICKUP_ITEM7_COMBO1
PICKUP_ITEM7_COMBO2
PICKUP_ITEM8_COMBO1
PICKUP_ITEM8_COMBO2
PICKUP_ITEM9_COMBO1
PICKUP_ITEM9_COMBO2
PICKUP_ITEM10_COMBO1
PICKUP_ITEM10_COMBO2
PICKUP_ITEM11_COMBO1
PICKUP_ITEM11_COMBO2
PICKUP_ITEM12_COMBO1
PICKUP_ITEM12_COMBO2
PICKUP_ITEM13_COMBO1
PICKUP_ITEM13_COMBO2
PICKUP_ITEM14_COMBO1
PICKUP_ITEM14_COMBO2
PICKUP_ITEM15_COMBO1
PICKUP_ITEM15_COMBO2
PICKUP_ITEM16_COMBO1
PICKUP_ITEM16_COMBO2
EXAMINE_ITEM1
EXAMINE_ITEM2
EXAMINE_ITEM3
EXAMINE_ITEM4
EXAMINE_ITEM5
EXAMINE_ITEM6
EXAMINE_ITEM7
EXAMINE_ITEM8
EXAMINE_ITEM1_COMBO1
EXAMINE_ITEM1_COMBO2
EXAMINE_ITEM2_COMBO1
EXAMINE_ITEM2_COMBO2
EXAMINE_ITEM3_COMBO1
EXAMINE_ITEM3_COMBO2
EXAMINE_ITEM4_COMBO1
EXAMINE_ITEM4_COMBO2
EXAMINE_ITEM5_COMBO1
EXAMINE_ITEM5_COMBO2
EXAMINE_ITEM6_COMBO1
EXAMINE_ITEM6_COMBO2
EXAMINE_ITEM7_COMBO1
EXAMINE_ITEM7_COMBO2
EXAMINE_ITEM8_COMBO1
EXAMINE_ITEM8_COMBO2
@section InvItem
*/
/*** Table of constants to use with GetInvItem and SetInvItem.
@table CONSTANT_STRING_HERE
*/
static const std::unordered_map<std::string, ItemEnumPair> kInventorySlots {
{"PISTOLS_ITEM", {ID_PISTOLS_ITEM, INV_OBJECT_PISTOLS}},
{"PISTOLS_AMMO_ITEM", {ID_PISTOLS_AMMO_ITEM, INV_OBJECT_PISTOLS_AMMO}},
{"UZI_ITEM", {ID_UZI_ITEM, INV_OBJECT_UZIS}},
{"UZI_AMMO_ITEM", {ID_UZI_AMMO_ITEM, INV_OBJECT_UZI_AMMO}},
{"SHOTGUN_ITEM", {ID_SHOTGUN_ITEM, INV_OBJECT_SHOTGUN}},
{"SHOTGUN_AMMO1_ITEM", {ID_SHOTGUN_AMMO1_ITEM, INV_OBJECT_SHOTGUN_AMMO1}},
{"SHOTGUN_AMMO2_ITEM", {ID_SHOTGUN_AMMO2_ITEM, INV_OBJECT_SHOTGUN_AMMO2}},
{"REVOLVER_ITEM", {ID_REVOLVER_ITEM, INV_OBJECT_REVOLVER}},
{"REVOLVER_AMMO_ITEM", {ID_REVOLVER_AMMO_ITEM, INV_OBJECT_REVOLVER_AMMO}},
{"CROSSBOW_ITEM", {ID_CROSSBOW_ITEM, INV_OBJECT_CROSSBOW}},
{"CROSSBOW_AMMO1_ITEM", {ID_CROSSBOW_AMMO1_ITEM, INV_OBJECT_CROSSBOW_AMMO1}},
{"CROSSBOW_AMMO2_ITEM", {ID_CROSSBOW_AMMO2_ITEM, INV_OBJECT_CROSSBOW_AMMO2}},
{"CROSSBOW_AMMO3_ITEM", {ID_CROSSBOW_AMMO3_ITEM, INV_OBJECT_CROSSBOW_AMMO3}},
{"HK_ITEM", {ID_HK_ITEM, INV_OBJECT_HK}},
{"HK_AMMO_ITEM", {ID_HK_AMMO_ITEM, INV_OBJECT_HK_AMMO}},
{"GRENADE_GUN_ITEM", {ID_GRENADE_GUN_ITEM, INV_OBJECT_GRENADE_LAUNCHER}},
{"GRENADE_AMMO1_ITEM", {ID_GRENADE_AMMO1_ITEM, INV_OBJECT_GRENADE_AMMO1}},
{"GRENADE_AMMO2_ITEM", {ID_GRENADE_AMMO2_ITEM, INV_OBJECT_GRENADE_AMMO2}},
{"GRENADE_AMMO3_ITEM", {ID_GRENADE_AMMO3_ITEM, INV_OBJECT_GRENADE_AMMO3}},
{"HARPOON_ITEM", {ID_HARPOON_ITEM, INV_OBJECT_HARPOON_GUN}},
{"HARPOON_AMMO_ITEM", {ID_HARPOON_AMMO_ITEM, INV_OBJECT_HARPOON_AMMO}},
{"ROCKET_LAUNCHER_ITEM", {ID_ROCKET_LAUNCHER_ITEM, INV_OBJECT_ROCKET_LAUNCHER}},
{"ROCKET_LAUNCHER_AMMO_ITEM", {ID_ROCKET_LAUNCHER_AMMO_ITEM, INV_OBJECT_ROCKET_AMMO}},
{"LASERSIGHT_ITEM", {ID_LASERSIGHT_ITEM, INV_OBJECT_LASERSIGHT}},
{"SILENCER_ITEM", {ID_SILENCER_ITEM, INV_OBJECT_SILENCER}},
{"BIGMEDI_ITEM", {ID_BIGMEDI_ITEM, INV_OBJECT_LARGE_MEDIPACK}},
{"SMALLMEDI_ITEM", {ID_SMALLMEDI_ITEM, INV_OBJECT_SMALL_MEDIPACK}},
{"BINOCULARS_ITEM", {ID_BINOCULARS_ITEM, INV_OBJECT_BINOCULARS}},
{"FLARE_INV_ITEM", {ID_FLARE_INV_ITEM, INV_OBJECT_FLARES}},
{"TIMEX_ITEM", {ID_TIMEX_ITEM, INV_OBJECT_TIMEX}},
{"PC_LOAD_INV_ITEM", {ID_PC_LOAD_INV_ITEM, INV_OBJECT_LOAD_FLOPPY}},
{"PC_LOAD_SAVE_ITEM", {ID_PC_LOAD_SAVE_ITEM, INV_OBJECT_SAVE_FLOPPY}},
{"BURNING_TORCH_ITEM", {ID_BURNING_TORCH_ITEM, INV_OBJECT_BRUNING_TORCH}},
{"CROWBAR_ITEM", {ID_CROWBAR_ITEM, INV_OBJECT_CROWBAR}},
{"DIARY_ITEM", {ID_DIARY_ITEM, INV_OBJECT_DIARY}},
{"COMPASS_ITEM", {ID_COMPASS_ITEM, INV_OBJECT_COMPASS}},
{"CLOCKWORK_BEETLE", {ID_CLOCKWORK_BEETLE, INV_OBJECT_BEETLE}},
{"CLOCKWORK_BEETLE_COMBO1", {ID_CLOCKWORK_BEETLE_COMBO1, INV_OBJECT_BEETLE_PART1}},
{"CLOCKWORK_BEETLE_COMBO2", {ID_CLOCKWORK_BEETLE_COMBO2, INV_OBJECT_BEETLE_PART2}},
{"WATERSKIN1_EMPTY", {ID_WATERSKIN1_EMPTY, INV_OBJECT_SMOL_WATERSKIN}},
{"WATERSKIN1_1", {ID_WATERSKIN1_1, INV_OBJECT_SMOL_WATERSKIN1L}},
{"WATERSKIN1_2", {ID_WATERSKIN1_2, INV_OBJECT_SMOL_WATERSKIN2L}},
{"WATERSKIN1_3", {ID_WATERSKIN1_3, INV_OBJECT_SMOL_WATERSKIN3L}},
{"WATERSKIN2_EMPTY", {ID_WATERSKIN2_EMPTY, INV_OBJECT_BIG_WATERSKIN}},
{"WATERSKIN2_1", {ID_WATERSKIN2_1, INV_OBJECT_BIG_WATERSKIN1L}},
{"WATERSKIN2_2", {ID_WATERSKIN2_2, INV_OBJECT_BIG_WATERSKIN2L}},
{"WATERSKIN2_3", {ID_WATERSKIN2_3, INV_OBJECT_BIG_WATERSKIN3L}},
{"WATERSKIN2_4", {ID_WATERSKIN2_4, INV_OBJECT_BIG_WATERSKIN4L}},
{"WATERSKIN2_5", {ID_WATERSKIN2_5, INV_OBJECT_BIG_WATERSKIN5L}},
{"OPEN_DIARY_ITEM", {ID_OPEN_DIARY_ITEM, INV_OBJECT_OPEN_DIARY}},
{"GOLDROSE_ITEM", {ID_GOLDROSE_ITEM, INVENTORY_TABLE_SIZE}},
{"PUZZLE_ITEM1", {ID_PUZZLE_ITEM1, INV_OBJECT_PUZZLE1}},
{"PUZZLE_ITEM2", {ID_PUZZLE_ITEM2, INV_OBJECT_PUZZLE2}},
{"PUZZLE_ITEM3", {ID_PUZZLE_ITEM3, INV_OBJECT_PUZZLE3}},
{"PUZZLE_ITEM4", {ID_PUZZLE_ITEM4, INV_OBJECT_PUZZLE4}},
{"PUZZLE_ITEM5", {ID_PUZZLE_ITEM5, INV_OBJECT_PUZZLE5}},
{"PUZZLE_ITEM6", {ID_PUZZLE_ITEM6, INV_OBJECT_PUZZLE6}},
{"PUZZLE_ITEM7", {ID_PUZZLE_ITEM7, INV_OBJECT_PUZZLE7}},
{"PUZZLE_ITEM8", {ID_PUZZLE_ITEM8, INV_OBJECT_PUZZLE8}},
{"PUZZLE_ITEM9", {ID_PUZZLE_ITEM9, INV_OBJECT_PUZZLE9}},
{"PUZZLE_ITEM10", {ID_PUZZLE_ITEM10, INV_OBJECT_PUZZLE10}},
{"PUZZLE_ITEM11", {ID_PUZZLE_ITEM11, INV_OBJECT_PUZZLE11}},
{"PUZZLE_ITEM12", {ID_PUZZLE_ITEM12, INV_OBJECT_PUZZLE12}},
{"PUZZLE_ITEM13", {ID_PUZZLE_ITEM13, INV_OBJECT_PUZZLE13}},
{"PUZZLE_ITEM14", {ID_PUZZLE_ITEM14, INV_OBJECT_PUZZLE14}},
{"PUZZLE_ITEM15", {ID_PUZZLE_ITEM15, INV_OBJECT_PUZZLE15}},
{"PUZZLE_ITEM16", {ID_PUZZLE_ITEM16, INV_OBJECT_PUZZLE16}},
{"PUZZLE_ITEM1_COMBO1", {ID_PUZZLE_ITEM1_COMBO1, INV_OBJECT_PUZZLE1_COMBO1}},
{"PUZZLE_ITEM1_COMBO2", {ID_PUZZLE_ITEM1_COMBO2, INV_OBJECT_PUZZLE1_COMBO2}},
{"PUZZLE_ITEM2_COMBO1", {ID_PUZZLE_ITEM2_COMBO1, INV_OBJECT_PUZZLE2_COMBO1}},
{"PUZZLE_ITEM2_COMBO2", {ID_PUZZLE_ITEM2_COMBO2, INV_OBJECT_PUZZLE2_COMBO2}},
{"PUZZLE_ITEM3_COMBO1", {ID_PUZZLE_ITEM3_COMBO1, INV_OBJECT_PUZZLE3_COMBO1}},
{"PUZZLE_ITEM3_COMBO2", {ID_PUZZLE_ITEM3_COMBO2, INV_OBJECT_PUZZLE3_COMBO2}},
{"PUZZLE_ITEM4_COMBO1", {ID_PUZZLE_ITEM4_COMBO1, INV_OBJECT_PUZZLE4_COMBO1}},
{"PUZZLE_ITEM4_COMBO2", {ID_PUZZLE_ITEM4_COMBO2, INV_OBJECT_PUZZLE4_COMBO2}},
{"PUZZLE_ITEM5_COMBO1", {ID_PUZZLE_ITEM5_COMBO1, INV_OBJECT_PUZZLE5_COMBO1}},
{"PUZZLE_ITEM5_COMBO2", {ID_PUZZLE_ITEM5_COMBO2, INV_OBJECT_PUZZLE5_COMBO2}},
{"PUZZLE_ITEM6_COMBO1", {ID_PUZZLE_ITEM6_COMBO1, INV_OBJECT_PUZZLE6_COMBO1}},
{"PUZZLE_ITEM6_COMBO2", {ID_PUZZLE_ITEM6_COMBO2, INV_OBJECT_PUZZLE6_COMBO2}},
{"PUZZLE_ITEM7_COMBO1", {ID_PUZZLE_ITEM7_COMBO1, INV_OBJECT_PUZZLE7_COMBO1}},
{"PUZZLE_ITEM7_COMBO2", {ID_PUZZLE_ITEM7_COMBO2, INV_OBJECT_PUZZLE7_COMBO2}},
{"PUZZLE_ITEM8_COMBO1", {ID_PUZZLE_ITEM8_COMBO1, INV_OBJECT_PUZZLE8_COMBO1}},
{"PUZZLE_ITEM8_COMBO2", {ID_PUZZLE_ITEM8_COMBO2, INV_OBJECT_PUZZLE8_COMBO2}},
{"PUZZLE_ITEM9_COMBO1", {ID_PUZZLE_ITEM9_COMBO1, INV_OBJECT_PUZZLE9_COMBO1}},
{"PUZZLE_ITEM9_COMBO2", {ID_PUZZLE_ITEM9_COMBO2, INV_OBJECT_PUZZLE9_COMBO2}},
{"PUZZLE_ITEM10_COMBO1", {ID_PUZZLE_ITEM10_COMBO1, INV_OBJECT_PUZZLE10_COMBO1}},
{"PUZZLE_ITEM10_COMBO2", {ID_PUZZLE_ITEM10_COMBO2, INV_OBJECT_PUZZLE10_COMBO2}},
{"PUZZLE_ITEM11_COMBO1", {ID_PUZZLE_ITEM11_COMBO1, INV_OBJECT_PUZZLE11_COMBO1}},
{"PUZZLE_ITEM11_COMBO2", {ID_PUZZLE_ITEM11_COMBO2, INV_OBJECT_PUZZLE11_COMBO2}},
{"PUZZLE_ITEM12_COMBO1", {ID_PUZZLE_ITEM12_COMBO1, INV_OBJECT_PUZZLE12_COMBO1}},
{"PUZZLE_ITEM12_COMBO2", {ID_PUZZLE_ITEM12_COMBO2, INV_OBJECT_PUZZLE12_COMBO2}},
{"PUZZLE_ITEM13_COMBO1", {ID_PUZZLE_ITEM13_COMBO1, INV_OBJECT_PUZZLE13_COMBO1}},
{"PUZZLE_ITEM13_COMBO2", {ID_PUZZLE_ITEM13_COMBO2, INV_OBJECT_PUZZLE13_COMBO2}},
{"PUZZLE_ITEM14_COMBO1", {ID_PUZZLE_ITEM14_COMBO1, INV_OBJECT_PUZZLE14_COMBO1}},
{"PUZZLE_ITEM14_COMBO2", {ID_PUZZLE_ITEM14_COMBO2, INV_OBJECT_PUZZLE14_COMBO2}},
{"PUZZLE_ITEM15_COMBO1", {ID_PUZZLE_ITEM15_COMBO1, INV_OBJECT_PUZZLE15_COMBO1}},
{"PUZZLE_ITEM15_COMBO2", {ID_PUZZLE_ITEM15_COMBO2, INV_OBJECT_PUZZLE15_COMBO2}},
{"PUZZLE_ITEM16_COMBO1", {ID_PUZZLE_ITEM16_COMBO1, INV_OBJECT_PUZZLE16_COMBO1}},
{"PUZZLE_ITEM16_COMBO2", {ID_PUZZLE_ITEM16_COMBO2, INV_OBJECT_PUZZLE16_COMBO2}},
{"KEY_ITEM1", {ID_KEY_ITEM1, INV_OBJECT_KEY1}},
{"KEY_ITEM2", {ID_KEY_ITEM2, INV_OBJECT_KEY2}},
{"KEY_ITEM3", {ID_KEY_ITEM3, INV_OBJECT_KEY3}},
{"KEY_ITEM4", {ID_KEY_ITEM4, INV_OBJECT_KEY4}},
{"KEY_ITEM5", {ID_KEY_ITEM5, INV_OBJECT_KEY5}},
{"KEY_ITEM6", {ID_KEY_ITEM6, INV_OBJECT_KEY6}},
{"KEY_ITEM7", {ID_KEY_ITEM7, INV_OBJECT_KEY7}},
{"KEY_ITEM8", {ID_KEY_ITEM8, INV_OBJECT_KEY8}},
{"KEY_ITEM9", {ID_KEY_ITEM9, INV_OBJECT_KEY9}},
{"KEY_ITEM10", {ID_KEY_ITEM10, INV_OBJECT_KEY10}},
{"KEY_ITEM11", {ID_KEY_ITEM11, INV_OBJECT_KEY11}},
{"KEY_ITEM12", {ID_KEY_ITEM12, INV_OBJECT_KEY12}},
{"KEY_ITEM13", {ID_KEY_ITEM13, INV_OBJECT_KEY13}},
{"KEY_ITEM14", {ID_KEY_ITEM14, INV_OBJECT_KEY14}},
{"KEY_ITEM15", {ID_KEY_ITEM15, INV_OBJECT_KEY15}},
{"KEY_ITEM16", {ID_KEY_ITEM16, INV_OBJECT_KEY16}},
{"KEY_ITEM1_COMBO1", {ID_KEY_ITEM1_COMBO1, INV_OBJECT_KEY1_COMBO1}},
{"KEY_ITEM1_COMBO2", {ID_KEY_ITEM1_COMBO2, INV_OBJECT_KEY1_COMBO2}},
{"KEY_ITEM2_COMBO1", {ID_KEY_ITEM2_COMBO1, INV_OBJECT_KEY2_COMBO1}},
{"KEY_ITEM2_COMBO2", {ID_KEY_ITEM2_COMBO2, INV_OBJECT_KEY2_COMBO2}},
{"KEY_ITEM3_COMBO1", {ID_KEY_ITEM3_COMBO1, INV_OBJECT_KEY3_COMBO1}},
{"KEY_ITEM3_COMBO2", {ID_KEY_ITEM3_COMBO2, INV_OBJECT_KEY3_COMBO2}},
{"KEY_ITEM4_COMBO1", {ID_KEY_ITEM4_COMBO1, INV_OBJECT_KEY4_COMBO1}},
{"KEY_ITEM4_COMBO2", {ID_KEY_ITEM4_COMBO2, INV_OBJECT_KEY4_COMBO2}},
{"KEY_ITEM5_COMBO1", {ID_KEY_ITEM5_COMBO1, INV_OBJECT_KEY5_COMBO1}},
{"KEY_ITEM5_COMBO2", {ID_KEY_ITEM5_COMBO2, INV_OBJECT_KEY5_COMBO2}},
{"KEY_ITEM6_COMBO1", {ID_KEY_ITEM6_COMBO1, INV_OBJECT_KEY6_COMBO1}},
{"KEY_ITEM6_COMBO2", {ID_KEY_ITEM6_COMBO2, INV_OBJECT_KEY6_COMBO2}},
{"KEY_ITEM7_COMBO1", {ID_KEY_ITEM7_COMBO1, INV_OBJECT_KEY7_COMBO1}},
{"KEY_ITEM7_COMBO2", {ID_KEY_ITEM7_COMBO2, INV_OBJECT_KEY7_COMBO2}},
{"KEY_ITEM8_COMBO1", {ID_KEY_ITEM8_COMBO1, INV_OBJECT_KEY8_COMBO1}},
{"KEY_ITEM8_COMBO2", {ID_KEY_ITEM8_COMBO2, INV_OBJECT_KEY8_COMBO2}},
{"KEY_ITEM9_COMBO1", {ID_KEY_ITEM9_COMBO1, INV_OBJECT_KEY9_COMBO1}},
{"KEY_ITEM9_COMBO2", {ID_KEY_ITEM9_COMBO2, INV_OBJECT_KEY9_COMBO2}},
{"KEY_ITEM10_COMBO1", {ID_KEY_ITEM10_COMBO1, INV_OBJECT_KEY10_COMBO1}},
{"KEY_ITEM10_COMBO2", {ID_KEY_ITEM10_COMBO2, INV_OBJECT_KEY10_COMBO2}},
{"KEY_ITEM11_COMBO1", {ID_KEY_ITEM11_COMBO1, INV_OBJECT_KEY11_COMBO1}},
{"KEY_ITEM11_COMBO2", {ID_KEY_ITEM11_COMBO2, INV_OBJECT_KEY11_COMBO2}},
{"KEY_ITEM12_COMBO1", {ID_KEY_ITEM12_COMBO1, INV_OBJECT_KEY12_COMBO1}},
{"KEY_ITEM12_COMBO2", {ID_KEY_ITEM12_COMBO2, INV_OBJECT_KEY12_COMBO2}},
{"KEY_ITEM13_COMBO1", {ID_KEY_ITEM13_COMBO1, INV_OBJECT_KEY13_COMBO1}},
{"KEY_ITEM13_COMBO2", {ID_KEY_ITEM13_COMBO2, INV_OBJECT_KEY13_COMBO2}},
{"KEY_ITEM14_COMBO1", {ID_KEY_ITEM14_COMBO1, INV_OBJECT_KEY14_COMBO1}},
{"KEY_ITEM14_COMBO2", {ID_KEY_ITEM14_COMBO2, INV_OBJECT_KEY14_COMBO2}},
{"KEY_ITEM15_COMBO1", {ID_KEY_ITEM15_COMBO1, INV_OBJECT_KEY15_COMBO1}},
{"KEY_ITEM15_COMBO2", {ID_KEY_ITEM15_COMBO2, INV_OBJECT_KEY15_COMBO2}},
{"KEY_ITEM16_COMBO1", {ID_KEY_ITEM16_COMBO1, INV_OBJECT_KEY16_COMBO1}},
{"KEY_ITEM16_COMBO2", {ID_KEY_ITEM16_COMBO2, INV_OBJECT_KEY16_COMBO2}},
{"PICKUP_ITEM1", {ID_PICKUP_ITEM1, INV_OBJECT_PICKUP1}},
{"PICKUP_ITEM2", {ID_PICKUP_ITEM2, INV_OBJECT_PICKUP2}},
{"PICKUP_ITEM3", {ID_PICKUP_ITEM3, INV_OBJECT_PICKUP3}},
{"PICKUP_ITEM4", {ID_PICKUP_ITEM4, INV_OBJECT_PICKUP4}},
{"PICKUP_ITEM5", {ID_PICKUP_ITEM5, INV_OBJECT_PICKUP5}},
{"PICKUP_ITEM6", {ID_PICKUP_ITEM6, INV_OBJECT_PICKUP6}},
{"PICKUP_ITEM7", {ID_PICKUP_ITEM7, INV_OBJECT_PICKUP7}},
{"PICKUP_ITEM8", {ID_PICKUP_ITEM8, INV_OBJECT_PICKUP8}},
{"PICKUP_ITEM9", {ID_PICKUP_ITEM9, INV_OBJECT_PICKUP9}},
{"PICKUP_ITEM10", {ID_PICKUP_ITEM10, INV_OBJECT_PICKUP10}},
{"PICKUP_ITEM11", {ID_PICKUP_ITEM11, INV_OBJECT_PICKUP11}},
{"PICKUP_ITEM12", {ID_PICKUP_ITEM12, INV_OBJECT_PICKUP12}},
{"PICKUP_ITEM13", {ID_PICKUP_ITEM13, INV_OBJECT_PICKUP13}},
{"PICKUP_ITEM14", {ID_PICKUP_ITEM14, INV_OBJECT_PICKUP14}},
{"PICKUP_ITEM15", {ID_PICKUP_ITEM15, INV_OBJECT_PICKUP15}},
{"PICKUP_ITEM16", {ID_PICKUP_ITEM16, INV_OBJECT_PICKUP16}},
{"PICKUP_ITEM1_COMBO1", {ID_PICKUP_ITEM1_COMBO1, INV_OBJECT_PICKUP1_COMBO1}},
{"PICKUP_ITEM1_COMBO2", {ID_PICKUP_ITEM1_COMBO2, INV_OBJECT_PICKUP1_COMBO2}},
{"PICKUP_ITEM2_COMBO1", {ID_PICKUP_ITEM2_COMBO1, INV_OBJECT_PICKUP2_COMBO1}},
{"PICKUP_ITEM2_COMBO2", {ID_PICKUP_ITEM2_COMBO2, INV_OBJECT_PICKUP2_COMBO2}},
{"PICKUP_ITEM3_COMBO1", {ID_PICKUP_ITEM3_COMBO1, INV_OBJECT_PICKUP3_COMBO1}},
{"PICKUP_ITEM3_COMBO2", {ID_PICKUP_ITEM3_COMBO2, INV_OBJECT_PICKUP3_COMBO2}},
{"PICKUP_ITEM4_COMBO1", {ID_PICKUP_ITEM4_COMBO1, INV_OBJECT_PICKUP4_COMBO1}},
{"PICKUP_ITEM4_COMBO2", {ID_PICKUP_ITEM4_COMBO2, INV_OBJECT_PICKUP4_COMBO2}},
{"PICKUP_ITEM5_COMBO1", {ID_PICKUP_ITEM5_COMBO1, INV_OBJECT_PICKUP5_COMBO1}},
{"PICKUP_ITEM5_COMBO2", {ID_PICKUP_ITEM5_COMBO2, INV_OBJECT_PICKUP5_COMBO2}},
{"PICKUP_ITEM6_COMBO1", {ID_PICKUP_ITEM6_COMBO1, INV_OBJECT_PICKUP6_COMBO1}},
{"PICKUP_ITEM6_COMBO2", {ID_PICKUP_ITEM6_COMBO2, INV_OBJECT_PICKUP6_COMBO2}},
{"PICKUP_ITEM7_COMBO1", {ID_PICKUP_ITEM7_COMBO1, INV_OBJECT_PICKUP7_COMBO1}},
{"PICKUP_ITEM7_COMBO2", {ID_PICKUP_ITEM7_COMBO2, INV_OBJECT_PICKUP7_COMBO2}},
{"PICKUP_ITEM8_COMBO1", {ID_PICKUP_ITEM8_COMBO1, INV_OBJECT_PICKUP8_COMBO1}},
{"PICKUP_ITEM8_COMBO2", {ID_PICKUP_ITEM8_COMBO2, INV_OBJECT_PICKUP8_COMBO2}},
{"PICKUP_ITEM9_COMBO1", {ID_PICKUP_ITEM9_COMBO1, INV_OBJECT_PICKUP9_COMBO1}},
{"PICKUP_ITEM9_COMBO2", {ID_PICKUP_ITEM9_COMBO2, INV_OBJECT_PICKUP9_COMBO2}},
{"PICKUP_ITEM10_COMBO1", {ID_PICKUP_ITEM10_COMBO1, INV_OBJECT_PICKUP10_COMBO1}},
{"PICKUP_ITEM10_COMBO2", {ID_PICKUP_ITEM10_COMBO2, INV_OBJECT_PICKUP10_COMBO2}},
{"PICKUP_ITEM11_COMBO1", {ID_PICKUP_ITEM11_COMBO1, INV_OBJECT_PICKUP11_COMBO1}},
{"PICKUP_ITEM11_COMBO2", {ID_PICKUP_ITEM11_COMBO2, INV_OBJECT_PICKUP11_COMBO2}},
{"PICKUP_ITEM12_COMBO1", {ID_PICKUP_ITEM12_COMBO1, INV_OBJECT_PICKUP12_COMBO1}},
{"PICKUP_ITEM12_COMBO2", {ID_PICKUP_ITEM12_COMBO2, INV_OBJECT_PICKUP12_COMBO2}},
{"PICKUP_ITEM13_COMBO1", {ID_PICKUP_ITEM13_COMBO1, INV_OBJECT_PICKUP13_COMBO1}},
{"PICKUP_ITEM13_COMBO2", {ID_PICKUP_ITEM13_COMBO2, INV_OBJECT_PICKUP13_COMBO2}},
{"PICKUP_ITEM14_COMBO1", {ID_PICKUP_ITEM14_COMBO1, INV_OBJECT_PICKUP14_COMBO1}},
{"PICKUP_ITEM14_COMBO2", {ID_PICKUP_ITEM14_COMBO2, INV_OBJECT_PICKUP14_COMBO2}},
{"PICKUP_ITEM15_COMBO1", {ID_PICKUP_ITEM15_COMBO1, INV_OBJECT_PICKUP15_COMBO1}},
{"PICKUP_ITEM15_COMBO2", {ID_PICKUP_ITEM15_COMBO2, INV_OBJECT_PICKUP15_COMBO2}},
{"PICKUP_ITEM16_COMBO1", {ID_PICKUP_ITEM16_COMBO1, INV_OBJECT_PICKUP16_COMBO1}},
{"PICKUP_ITEM16_COMBO2", {ID_PICKUP_ITEM16_COMBO2, INV_OBJECT_PICKUP16_COMBO2}},
{"EXAMINE_ITEM1", {ID_EXAMINE1, INV_OBJECT_EXAMINE1}},
{"EXAMINE_ITEM2", {ID_EXAMINE2, INV_OBJECT_EXAMINE2}},
{"EXAMINE_ITEM3", {ID_EXAMINE3, INV_OBJECT_EXAMINE3}},
{"EXAMINE_ITEM4", {ID_EXAMINE4, INV_OBJECT_EXAMINE4}},
{"EXAMINE_ITEM5", {ID_EXAMINE5, INV_OBJECT_EXAMINE5}},
{"EXAMINE_ITEM6", {ID_EXAMINE6, INV_OBJECT_EXAMINE6}},
{"EXAMINE_ITEM7", {ID_EXAMINE7, INV_OBJECT_EXAMINE7}},
{"EXAMINE_ITEM8", {ID_EXAMINE8, INV_OBJECT_EXAMINE8}},
{"EXAMINE_ITEM1_COMBO1", {ID_EXAMINE1_COMBO1, INV_OBJECT_EXAMINE1_COMBO1}},
{"EXAMINE_ITEM1_COMBO2", {ID_EXAMINE1_COMBO2, INV_OBJECT_EXAMINE1_COMBO2}},
{"EXAMINE_ITEM2_COMBO1", {ID_EXAMINE2_COMBO1, INV_OBJECT_EXAMINE2_COMBO1}},
{"EXAMINE_ITEM2_COMBO2", {ID_EXAMINE2_COMBO2, INV_OBJECT_EXAMINE2_COMBO2}},
{"EXAMINE_ITEM3_COMBO1", {ID_EXAMINE3_COMBO1, INV_OBJECT_EXAMINE3_COMBO1}},
{"EXAMINE_ITEM3_COMBO2", {ID_EXAMINE3_COMBO2, INV_OBJECT_EXAMINE3_COMBO2}},
{"EXAMINE_ITEM4_COMBO1", {ID_EXAMINE4_COMBO1, INV_OBJECT_EXAMINE4_COMBO1}},
{"EXAMINE_ITEM4_COMBO2", {ID_EXAMINE4_COMBO2, INV_OBJECT_EXAMINE4_COMBO2}},
{"EXAMINE_ITEM5_COMBO1", {ID_EXAMINE5_COMBO1, INV_OBJECT_EXAMINE5_COMBO1}},
{"EXAMINE_ITEM5_COMBO2", {ID_EXAMINE5_COMBO2, INV_OBJECT_EXAMINE5_COMBO2}},
{"EXAMINE_ITEM6_COMBO1", {ID_EXAMINE6_COMBO1, INV_OBJECT_EXAMINE6_COMBO1}},
{"EXAMINE_ITEM6_COMBO2", {ID_EXAMINE6_COMBO2, INV_OBJECT_EXAMINE6_COMBO2}},
{"EXAMINE_ITEM7_COMBO1", {ID_EXAMINE7_COMBO1, INV_OBJECT_EXAMINE7_COMBO1}},
{"EXAMINE_ITEM7_COMBO2", {ID_EXAMINE7_COMBO2, INV_OBJECT_EXAMINE7_COMBO2}},
{"EXAMINE_ITEM8_COMBO1", {ID_EXAMINE8_COMBO1, INV_OBJECT_EXAMINE8_COMBO1}},
{"EXAMINE_ITEM8_COMBO2", {ID_EXAMINE8_COMBO2, INV_OBJECT_EXAMINE8_COMBO2}}
};

View file

@ -0,0 +1,10 @@
#pragma once
#include "Game/gui.h"
#include "Objects/objectslist.h"
#include <utility>
struct ItemEnumPair
{
std::pair<GAME_OBJECT_ID, InventoryObjectTypes> m_pair;
ItemEnumPair(GAME_OBJECT_ID id, InventoryObjectTypes id2) : m_pair { id, id2 } {}
};

View file

@ -0,0 +1,124 @@
#pragma once
// Define std::string ids
#define STRING_WINDOW_TITLE "window_title"
#define STRING_PASSPORT "passport"
#define STRING_LARA_HOME "lara_home"
#define STRING_CONTROLS "controls"
#define STRING_DISPLAY "display"
#define STRING_SOUND "sounds"
#define STRING_NEW_GAME "new_game"
#define STRING_LOAD_GAME "load_game"
#define STRING_SAVE_GAME "save_game"
#define STRING_EXIT_GAME "exit_game"
#define STRING_EXIT_TO_TITLE "exit_to_title"
#define STRING_UZI "uzi"
#define STRING_PISTOLS "pistols_ammo"
#define STRING_SHOTGUN "shotgun"
#define STRING_REVOLVER "revolver"
#define STRING_REVOLVER_LASER "reolver_laser"
#define STRING_HK "hk"
#define STRING_HK_SILENCED "hk_silenced"
#define STRING_SHOTGUN_AMMO1 "shotgun_ammo1"
#define STRING_SHOTGUN_AMMO2 "shotgun_ammo2"
#define STRING_HK_SNIPER_MODE "hk_sniper_mode"
#define STRING_HK_BURST_MODE "hk_burst_mode"
#define STRING_HK_RAPID_MODE "hk_rapid_mode"
#define STRING_HK_AMMO "hk_ammo"
#define STRING_REVOLVER_AMMO "revolver_ammo"
#define STRING_UZI_AMMO "uzi_ammo"
#define STRING_PISTOLS_AMMO "pistols_ammo"
#define STRING_LASERSIGHT "lasersight"
#define STRING_SILENCER "silencer"
#define STRING_LARGE_MEDIPACK "large_medipack"
#define STRING_SMALL_MEDIPACK "small_medipack"
#define STRING_BINOCULARS "binoculars"
#define STRING_HEADSET "headset"
#define STRING_FLARES "flares"
#define STRING_TIMEX "timex"
#define STRING_CROWBAR "crowbar"
#define STRING_USE "use"
#define STRING_COMBINE "combine"
#define STRING_SEPARE "separe"
#define STRING_CHOOSE_AMMO "choose_ammo"
#define STRING_SELECT_LEVEL "select_level"
#define STRING_GRENADE_LAUNCHER "grenade_launcher"
#define STRING_GRENADE_AMMO1 "grenade_launcher_ammo1"
#define STRING_GRENADE_AMMO2 "grenade_launcher_ammo2"
#define STRING_GRENADE_AMMO3 "grenade_launcher_ammo3"
#define STRING_HARPOON_GUN "harpoon_gun"
#define STRING_HARPOON_AMMO "harpoon_ammo"
#define STRING_ROCKET_LAUNCHER "rocket_launcher"
#define STRING_ROCKET_AMMO "rocket_ammo"
#define STRING_CROSSBOW "crossbow"
#define STRING_CROSSBOW_LASER "crossbow_laser"
#define STRING_CROSSBOW_AMMO1 "crossbow_ammo1"
#define STRING_CROSSBOW_AMMO2 "crossbow_ammo2"
#define STRING_CROSSBOW_AMMO3 "crossbow_ammo3"
#define STRING_DIARY "diary"
#define STRING_ENABLED "enabled"
#define STRING_DISABLED "disabled"
#define STRING_MUSIC_VOLUME "music_volume"
#define STRING_SFX_VOLUME "sfx_volume"
#define STRING_SCREEN_RESOLUTION "screen_resolution"
#define STRING_SHADOWS "shadows"
#define STRING_CAUSTICS "caustics"
#define STRING_VOLUMETRIC_FOG "volumetric_fog"
#define STRING_APPLY "apply"
#define STRING_BACK "back"
#define STRING_ENABLE_SOUND "enable_sound"
#define STRING_SPECIAL_SOUND_FX "special_sound_fx"
#define STRING_CONTROLS_MOVE_FORWARD "controls_move_forward"
#define STRING_CONTROLS_MOVE_BACKWARD "controls_move_backward"
#define STRING_CONTROLS_MOVE_LEFT "controls_move_left"
#define STRING_CONTROLS_MOVE_RIGHT "controls_move_right"
#define STRING_CONTROLS_DUCK "controls_duck"
#define STRING_CONTROLS_DASH "controls_dash"
#define STRING_CONTROLS_WALK "controls_walk"
#define STRING_CONTROLS_JUMP "controls_jump"
#define STRING_CONTROLS_ACTION "controls_action"
#define STRING_CONTROLS_DRAW_WEAPON "controls_draw_weapon"
#define STRING_CONTROLS_USE_FLARE "controls_use_flare"
#define STRING_CONTROLS_LOOK "controls_look"
#define STRING_CONTROLS_ROLL "controls_roll"
#define STRING_CONTROLS_INVENTORY "controls_inventory"
#define STRING_CONTROLS_STEP_LEFT "controls_step_left"
#define STRING_CONTROLS_STEP_RIGHT "controls_step_right"
#define STRING_TITLE_ITEMS "items"
#define STRING_TITLE_PUZZLES "puzzles"
#define STRING_TITLE_SETTINGS "settings"
#define STRING_TITLE_CHOOSE_AMMO "choose_ammo"
#define STRING_TITLE_COMBINE "combine"
#define STRING_WAITING_FOR_KEY "waiting_for_key"
#define STRING_WINDOWED "windowed"
#define STRING_OK "ok"
#define STRING_CANCEL "cancel"
#define STRING_RENDER_OPTIONS "render_options"
#define STRING_DISPLAY_ADAPTER "display_adapter"
#define STRING_OUTPUT_SETTINGS "output_settings"
#define STRING_EQUIP "equip"
#define STRING_COMBINE_WITH "combine_with"
#define STRING_EXAMINE "examine"
#define STRING_STATISTICS "statistics"
#define STRING_CHOOSE_WEAPON "choose_weapon"
#define STRING_UNUSED "unused"
#define STRING_SAVEGAME_TIMESTAMP "savegame_timestamp"
#define STRING_TIME_TAKEN "time_taken"
#define STRING_DISTANCE_TRAVELLED "distance_travelled"
#define STRING_USED_MEDIPACKS "used_medipacks"
#define STRING_USED_AMMOS "used_ammos"
#define STRING_SECRETS_FOUND "secrets_found"
#define STRING_WATERSKIN_SMALL_EMPTY "waterskin_small_empty"
#define STRING_WATERSKIN_SMALL_1 "waterskin_small_1"
#define STRING_WATERSKIN_SMALL_2 "waterskin_small_2"
#define STRING_WATERSKIN_SMALL_3 "waterskin_small_3"
#define STRING_WATERSKIN_LARGE_EMPTY "waterskin_large_empty"
#define STRING_WATERSKIN_LARGE_1 "waterskin_large_1"
#define STRING_WATERSKIN_LARGE_2 "waterskin_large_2"
#define STRING_WATERSKIN_LARGE_3 "waterskin_large_3"
#define STRING_WATERSKIN_LARGE_4 "waterskin_large_4"
#define STRING_WATERSKIN_LARGE_5 "waterskin_large_5"
#define STRING_TORCH "torch"
#define STRING_CLOCKWORK_BEETLE "clockwork_beetle"
#define STRING_CLOCKWORK_BEETLE_COMBO1 "clockwork_beetle_combo1"
#define STRING_CLOCKWORK_BEETLE_COMBO2 "clockwork_beetle_combo2"

View file

@ -0,0 +1,50 @@
#pragma once
#include "frameworkandsol.h"
class LuaHandler {
protected:
sol::state* m_lua;
~LuaHandler() = default;
public:
LuaHandler(sol::state* lua);
LuaHandler(LuaHandler const &) = delete;
LuaHandler& operator=(LuaHandler const &) = delete;
void ExecuteScript(const std::string & luaFilename);
void ExecuteString(const std::string & command);
template <typename T>void MakeReadOnlyTable(std::string const& tableName, T const& container)
{
auto mt = tableName + "Meta";
// Put all the data in the metatable
m_lua->set(mt, sol::as_table(container));
auto mtmt = tableName + "MetaMeta";
m_lua->create_named_table(mtmt);
// TODO Make these not raise exceptions by default but just do ScriptAsserts -- squidshire, 29/08/2021
// Make the metatable's metatable's __index throw an error so that trying to use a variable
// that doesn't exist just errors.
m_lua->safe_script(mtmt + ".__index = function(t, key) error('" + tableName +" has no member \"' .. tostring(key) .. '\"') end");
m_lua->safe_script("setmetatable(" + mt + ", " + mtmt + ")");
// Make the metatable's __index refer to itself so that requests
// to the main table will go through to the metatable (and thus the
// container's members)
m_lua->safe_script(mt + ".__index = " + mt);
// Don't allow the table to have new elements put into it
m_lua->safe_script(mt + ".__newindex = function() error('" + tableName + " is read-only') end");
// Protect the metatable
m_lua->safe_script(mt + ".__metatable = 'metatable is protected'");
m_lua->create_named_table(tableName);
m_lua->safe_script("setmetatable(" + tableName + ", " + mt + ")");
// point the initial metatable variable away from its contents. this is just for cleanliness
m_lua->safe_script(mt + " = nil");
m_lua->safe_script(mtmt + " = nil");
}
};

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,38 @@
#pragma once
// Classes
static constexpr char const ScriptReserved_ItemInfo[] = "ItemInfo";
static constexpr char const ScriptReserved_MeshInfo[] = "MeshInfo";
static constexpr char const ScriptReserved_CameraInfo[] = "CameraInfo";
static constexpr char const ScriptReserved_SinkInfo[] = "SinkInfo";
static constexpr char const ScriptReserved_SoundSourceInfo[] = "SoundSourceInfo";
static constexpr char const ScriptReserved_AIObject[] = "AIObject";
static constexpr char const ScriptReserved_DisplayString[] = "DisplayString";
// Functions
static constexpr char const ScriptReserved_ShowString[] = "ShowString";
static constexpr char const ScriptReserved_HideString[] = "HideString";
static constexpr char const ScriptReserved_SetAmbientTrack[] = "SetAmbientTrack";
static constexpr char const ScriptReserved_PlayAudioTrack[] = "PlayAudioTrack";
static constexpr char const ScriptReserved_GiveInvItem[] = "GiveInvItem";
static constexpr char const ScriptReserved_TakeInvItem[] = "TakeInvItem";
static constexpr char const ScriptReserved_GetInvItemCount[] = "GetInvItemCount";
static constexpr char const ScriptReserved_SetInvItemCount[] = "SetInvItemCount";
static constexpr char const ScriptReserved_GetItemByName[] = "GetItemByName";
static constexpr char const ScriptReserved_GetMeshByName[] = "GetMeshByName";
static constexpr char const ScriptReserved_GetCameraByName[] = "GetCameraByName";
static constexpr char const ScriptReserved_GetSinkByName[] = "GetSinkByName";
static constexpr char const ScriptReserved_GetSoundSourceByName[] = "GetSoundSourceByName";
static constexpr char const ScriptReserved_CalculateDistance[] = "CalculateDistance";
static constexpr char const ScriptReserved_CalculateHorizontalDistance[] = "CalculateHorizontalDistance";
static constexpr char const ScriptReserved_ScreenToPercent[] = "ScreenToPercent";
static constexpr char const ScriptReserved_PercentToScreen[] = "PercentToScreen";
// Functions
static constexpr char const ScriptReserved_ObjID[] = "ObjID";
static constexpr char const ScriptReserved_DisplayStringOption[] = "DisplayStringOption";
static constexpr char const ScriptReserved_LevelVars[] = "LevelVars";
static constexpr char const ScriptReserved_GameVars[] = "GameVars";
static constexpr char const ScriptReserved_LevelFuncs[] = "LevelFuncs";

View file

@ -0,0 +1,51 @@
#pragma once
#include <string>
#include <optional>
#include <spdlog/fmt/fmt.h>
enum class ERROR_MODE
{
SILENT,
WARN,
TERMINATE
};
void SetScriptErrorMode(ERROR_MODE mode);
ERROR_MODE GetScriptErrorMode();
void ScriptWarn(std::string const& msg);
bool ScriptAssert(bool cond, std::string const& msg, std::optional<ERROR_MODE> forceMode = std::nullopt);
template <typename ... Ts> bool ScriptAssertF(bool cond, std::string_view str, Ts...args)
{
if (!cond)
{
auto msg = fmt::format(str, args...);
auto mode = GetScriptErrorMode();
switch (mode)
{
case ERROR_MODE::WARN:
TENLog(msg, LogLevel::Error, LogConfig::All);
break;
case ERROR_MODE::TERMINATE:
TENLog(msg, LogLevel::Error, LogConfig::All);
throw TENScriptException(msg);
break;
}
}
return cond;
}
template <typename ... Ts> bool ScriptAssertTerminateF(bool cond, std::string_view str, Ts...args)
{
if (!cond)
{
auto msg = fmt::format(str, args...);
TENLog(msg, LogLevel::Error, LogConfig::All);
throw TENScriptException(msg);
}
return cond;
}

View file

@ -0,0 +1,38 @@
#pragma once
#include <memory>
#include <string>
#include <functional>
#include "room.h"
#include "level.h"
typedef DWORD D3DCOLOR;
using VarMapVal = std::variant< short,
std::reference_wrapper<MESH_INFO>,
std::reference_wrapper<LEVEL_CAMERA_INFO>,
std::reference_wrapper<SINK_INFO>,
std::reference_wrapper<SOUND_SOURCE_INFO>,
std::reference_wrapper<AI_OBJECT>>;
using CallbackDrawString = std::function<void(std::string const&, D3DCOLOR, int, int, int)>;
class ScriptInterfaceGame {
public:
virtual ~ScriptInterfaceGame() = default;
virtual void ProcessDisplayStrings(float dt) = 0;
virtual void InitCallbacks() = 0;
virtual void OnStart() = 0;
virtual void OnLoad() = 0;
virtual void OnControlPhase(float dt) = 0;
virtual void OnSave() = 0;
virtual void OnEnd() = 0;
virtual void SetCallbackDrawString(CallbackDrawString) = 0;
virtual void FreeLevelScripts() = 0;
virtual bool AddName(std::string const& key, VarMapVal val) = 0;
virtual void ExecuteScriptFile(std::string const& luaFileName) = 0;
virtual void ExecuteFunction(std::string const& luaFileName) = 0;
virtual void AssignItemsAndLara() = 0;
};

View file

@ -0,0 +1,13 @@
#pragma once
#define index_error_maker(CPP_TYPE, LUA_CLASS_NAME) [](CPP_TYPE & item, sol::object key) \
{ \
std::string err = "Attempted to read non-existant var \"" + key.as<std::string>() + "\" from " + LUA_CLASS_NAME; \
ScriptAssert(false, err);\
}
#define newindex_error_maker(CPP_TYPE, LUA_CLASS_NAME) [](CPP_TYPE & item, sol::object key) \
{ \
std::string err = "Attempted to set non-existant var \"" + key.as<std::string>() + "\" of " + LUA_CLASS_NAME; \
ScriptAssert(false, err);\
}