From df11377a51fed9eabc148453b51fbb3412701d36 Mon Sep 17 00:00:00 2001 From: hispidence Date: Tue, 20 Jul 2021 17:58:11 +0100 Subject: [PATCH] Make GetItemByName take a const ref, and make its error print the name of the item that could not be found. Register GetItemByName in GameLogicScript instead of winmain. Register GameScriptColor too. Define the lambdas passed to GameScriptItemInfo in terms of the actual functions we define. Functions that make a GameScriptItemInfo should pass false to make_unique (so the Lua object made does not control the lifetime of the ITEM_INFO). --- TR5Main/Scripting/GameLogicScript.cpp | 19 +++++++++++++------ TR5Main/Specific/winmain.cpp | 2 -- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/TR5Main/Scripting/GameLogicScript.cpp b/TR5Main/Scripting/GameLogicScript.cpp index 5fcc3e469..556aad59c 100644 --- a/TR5Main/Scripting/GameLogicScript.cpp +++ b/TR5Main/Scripting/GameLogicScript.cpp @@ -35,6 +35,8 @@ GameScript::GameScript(sol::state* lua) : LuaHandler{ lua } m_lua->set_function("GetInvItemCount", &GameScript::InventoryGetCount); m_lua->set_function("SetInvItemCount", &GameScript::InventorySetCount); + m_lua->set_function("GetItemByName", &GameScript::GetItemByName, this); + m_lua->set_function("GetItemByID", &GameScript::GetItemById, this); auto makeReadOnlyTable = [this](std::string const & tableName, auto const& container) { auto mt = tableName + "Meta"; @@ -65,16 +67,17 @@ GameScript::GameScript(sol::state* lua) : LuaHandler{ lua } GameScriptItemInfo::Register(m_lua); auto addLuaName = [this](std::string const& str, short num) { - return m_itemsMapName.insert(std::pair(str, num)).second; + return AddLuaName(str, num); }; auto removeLuaName = [this](std::string const& str) { - return m_itemsMapName.erase(str); + return RemoveLuaName(str); }; GameScriptItemInfo::SetNameCallbacks(addLuaName, removeLuaName); GameScriptPosition::Register(m_lua); GameScriptRotation::Register(m_lua); + GameScriptColor::Register(m_lua); m_lua->new_enum("Object", { {"LARA", ID_LARA} @@ -268,19 +271,23 @@ std::unique_ptr GameScript::GetItemById(int id) return std::unique_ptr(nullptr); } - return std::make_unique(m_itemsMapId[id]); + return std::make_unique(m_itemsMapId[id], false); } -std::unique_ptr GameScript::GetItemByName(std::string name) +std::unique_ptr GameScript::GetItemByName(std::string const & name) { if (m_itemsMapName.find(name) == m_itemsMapName.end()) { if (WarningsAsErrors) - throw "item name not found"; + { + std::string error{ "Item name not found: " }; + error += name; + throw std::runtime_error{error}; + } return std::unique_ptr(nullptr); } - return std::make_unique(m_itemsMapName[name]); + return std::make_unique(m_itemsMapName[name], false); } void GameScript::PlayAudioTrack(std::string const & trackName, bool looped) diff --git a/TR5Main/Specific/winmain.cpp b/TR5Main/Specific/winmain.cpp index ede4ad6ff..4efa2cc5e 100644 --- a/TR5Main/Specific/winmain.cpp +++ b/TR5Main/Specific/winmain.cpp @@ -229,8 +229,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_GameScript = new GameScript(&luaState); - luaState.set_function("GetItemByID", &GameScript::GetItemById, g_GameScript); - luaState.set_function("GetItemByName", &GameScript::GetItemByName, g_GameScript); //luaState.set_function("CreatePosition", &GameScript::CreatePosition, g_GameScript); //luaState.set_function("CreateRotation", &GameScript::CreateRotation, g_GameScript); luaState.set_function("CalculateDistance", &GameScript::CalculateDistance, g_GameScript);