Replace Get*ByName with GetByName, AddLuaName* with AddName, and RemoveLuaName* with RemoveName. Replace m_*MapName with m_nameMap. Use a std::variant for the types that m_nameMap elements could be. Modify SetNameCallbacks params to be variadic. These do make it look more complex, but also make it more generic, and mean that specific parameters do not need to be repeated (which will make it easier if/when we change said parameters).

This commit is contained in:
hispidence 2021-08-27 18:21:37 +01:00
parent b71555efa8
commit 5a5ca519dc
2 changed files with 50 additions and 128 deletions

View file

@ -14,6 +14,7 @@
#include "pickup.h"
#include "newinv2.h"
#include "ObjectIDs.h"
#include "ReservedScriptNames.h"
/***
Functions and callbacks for level-specific logic scripts.
@ -246,7 +247,7 @@ Get an ItemInfo by its name.
@tparam string name the unique name of the item as set in, or generated by, Tomb Editor
@treturn ItemInfo a non-owning ItemInfo referencing the item.
*/
m_lua->set_function("GetItemByName", &GameScript::GetItemByName, this);
m_lua->set_function("GetItemByName", &GameScript::GetByName<GameScriptItemInfo, ScriptReserved_ItemInfo>, this);
/***
Get a MeshInfo by its name.
@ -254,7 +255,7 @@ Get a MeshInfo by its name.
@tparam string name the unique name of the mesh as set in, or generated by, Tomb Editor
@treturn MeshInfo a non-owning MeshInfo referencing the mesh.
*/
m_lua->set_function("GetMeshByName", &GameScript::GetMeshByName, this);
m_lua->set_function("GetMeshByName", &GameScript::GetByName<GameScriptMeshInfo, ScriptReserved_MeshInfo>, this);
/***
Get a CameraInfo by its name.
@ -262,7 +263,7 @@ Get a CameraInfo by its name.
@tparam string name the unique name of the camera as set in, or generated by, Tomb Editor
@treturn CameraInfo a non-owning CameraInfo referencing the camera.
*/
m_lua->set_function("GetCameraByName", &GameScript::GetCameraByName, this);
m_lua->set_function("GetCameraByName", &GameScript::GetByName<GameScriptCameraInfo, ScriptReserved_CameraInfo>, this);
/***
Get a SinkInfo by its name.
@ -270,7 +271,7 @@ Get a SinkInfo by its name.
@tparam string name the unique name of the sink as set in, or generated by, Tomb Editor
@treturn SinkInfo a non-owning SinkInfo referencing the sink.
*/
m_lua->set_function("GetSinkByName", &GameScript::GetSinkByName, this);
m_lua->set_function("GetSinkByName", &GameScript::GetByName<GameScriptSinkInfo, ScriptReserved_SinkInfo>, this);
/***
Get a SoundSourceInfo by its name.
@ -278,7 +279,7 @@ Get a SoundSourceInfo by its name.
@tparam string name the unique name of the sink as set in, or generated by, Tomb Editor
@treturn SoundSourceInfo a non-owning SoundSourceInfo referencing the sink.
*/
m_lua->set_function("GetSoundSourceByName", &GameScript::GetSoundSourceByName, this);
m_lua->set_function("GetSoundSourceByName", &GameScript::GetByName<GameScriptSoundSourceInfo, ScriptReserved_SoundSourceInfo>, this);
/***
Calculate the distance between two positions.
@ -306,38 +307,38 @@ Calculate the horizontal distance between two positions.
GameScriptItemInfo::Register(m_lua);
GameScriptItemInfo::SetNameCallbacks(
[this](std::string const& str, short num) { return AddLuaNameItem(str, num); },
[this](std::string const& str) { return RemoveLuaNameItem(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptMeshInfo::Register(m_lua);
GameScriptMeshInfo::SetNameCallbacks(
[this](std::string const& str, MESH_INFO & info) { return AddLuaNameMesh(str, info); },
[this](std::string const& str) { return RemoveLuaNameMesh(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptCameraInfo::Register(m_lua);
GameScriptCameraInfo::SetNameCallbacks(
[this](std::string const& str, LEVEL_CAMERA_INFO & info) { return AddLuaNameCamera(str, info); },
[this](std::string const& str) { return RemoveLuaNameCamera(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptSinkInfo::Register(m_lua);
GameScriptSinkInfo::SetNameCallbacks(
[this](std::string const& str, SINK_INFO & info) { return AddLuaNameSink(str, info); },
[this](std::string const& str) { return RemoveLuaNameSink(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptAIObject::Register(m_lua);
GameScriptAIObject::SetNameCallbacks(
[this](std::string const& str, AI_OBJECT & info) { return AddLuaNameAIObject(str, info); },
[this](std::string const& str) { return RemoveLuaNameAIObject(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptSoundSourceInfo::Register(m_lua);
GameScriptSoundSourceInfo::SetNameCallbacks(
[this](std::string const& str, SOUND_SOURCE_INFO & info) { return AddLuaNameSoundSource(str, info); },
[this](std::string const& str) { return RemoveLuaNameSoundSource(str); }
[this](auto && ... param) { return AddName(std::forward<decltype(param)>(param)...); },
[this](auto && ... param) { return RemoveName(std::forward<decltype(param)>(param)...); }
);
GameScriptPosition::Register(m_lua);
@ -378,67 +379,20 @@ bool GameScript::SetLevelFunc(sol::table tab, std::string const& luaName, sol::o
return true;
}
bool GameScript::RemoveLuaNameItem(std::string const & luaName)
{
return m_itemsMapName.erase(luaName);
}
bool GameScript::AddLuaNameItem(std::string const & luaName, short itemNumber)
{
return m_itemsMapName.insert(std::pair<std::string, short>(luaName, itemNumber)).second;
}
bool GameScript::RemoveLuaNameMesh(std::string const & luaName)
{
return m_meshesMapName.erase(luaName);
}
bool GameScript::AddLuaNameMesh(std::string const& luaName, MESH_INFO& infoRef)
{
return m_meshesMapName.insert(std::pair<std::string, MESH_INFO&>(luaName, infoRef)).second;
}
bool GameScript::RemoveLuaNameCamera(std::string const & luaName)
{
return m_camerasMapName.erase(luaName);
}
bool GameScript::AddLuaNameCamera(std::string const& luaName, LEVEL_CAMERA_INFO& infoRef)
{
return m_camerasMapName.insert(std::pair<std::string, LEVEL_CAMERA_INFO&>(luaName, infoRef)).second;
}
bool GameScript::RemoveLuaNameSink(std::string const & luaName)
{
return m_sinksMapName.erase(luaName);
}
bool GameScript::AddLuaNameSink(std::string const& luaName, SINK_INFO& infoRef)
{
return m_sinksMapName.insert(std::pair<std::string, SINK_INFO&>(luaName, infoRef)).second;
}
bool GameScript::RemoveLuaNameSoundSource(std::string const & luaName)
{
return m_soundSourcesMapName.erase(luaName);
}
bool GameScript::AddLuaNameSoundSource(std::string const& luaName, SOUND_SOURCE_INFO& infoRef)
{
return m_soundSourcesMapName.insert(std::pair<std::string, SOUND_SOURCE_INFO&>(luaName, infoRef)).second;
}
bool GameScript::RemoveLuaNameAIObject(std::string const & luaName)
{
return m_aiObjectsMapName.erase(luaName);
}
bool GameScript::AddLuaNameAIObject(std::string const& luaName, AI_OBJECT & ref)
{
return m_aiObjectsMapName.insert(std::pair<std::string, AI_OBJECT&>(luaName, ref)).second;
}
void GameScript::FreeLevelScripts()
{
m_nameMap.clear();
m_levelFuncs.clear();
m_locals = LuaVariables{};
ResetLevelTables();
@ -543,44 +497,13 @@ template void GameScript::SetVariables<bool>(std::map<std::string, bool>& locals
template void GameScript::SetVariables<float>(std::map<std::string, float>& locals, std::map<std::string, float>& globals);
template void GameScript::SetVariables<std::string>(std::map<std::string, std::string>& locals, std::map<std::string, std::string>& globals);
template <typename T, typename Stored>
std::unique_ptr<T> GetTByName(std::string const & type, std::string const& name, std::unordered_map<std::string, Stored> const & map)
template <typename R, char const * S, typename mapType>
std::unique_ptr<R> GetByName(std::string const & type, std::string const & name, mapType const & map)
{
ScriptAssert(map.find(name) != map.end(), std::string{ type + " name not found: " + name }, ERROR_MODE::TERMINATE);
return std::make_unique<T>(map.at(name), false);
return std::make_unique<R>(map.at(name), false);
}
std::unique_ptr<GameScriptItemInfo> GameScript::GetItemByName(std::string const & name)
{
return GetTByName<GameScriptItemInfo, short>("ItemInfo", name, m_itemsMapName);
}
std::unique_ptr<GameScriptMeshInfo> GameScript::GetMeshByName(std::string const & name)
{
return GetTByName<GameScriptMeshInfo, MESH_INFO &>("MeshInfo", name, m_meshesMapName);
}
std::unique_ptr<GameScriptCameraInfo> GameScript::GetCameraByName(std::string const & name)
{
return GetTByName<GameScriptCameraInfo, LEVEL_CAMERA_INFO &>("CameraInfo", name, m_camerasMapName);
}
std::unique_ptr<GameScriptSinkInfo> GameScript::GetSinkByName(std::string const & name)
{
return GetTByName<GameScriptSinkInfo, SINK_INFO &>("SinkInfo", name, m_sinksMapName);
}
std::unique_ptr<GameScriptAIObject> GameScript::GetAIObjectByName(std::string const & name)
{
return GetTByName<GameScriptAIObject, AI_OBJECT &>("AIObject", name, m_aiObjectsMapName);
}
std::unique_ptr<GameScriptSoundSourceInfo> GameScript::GetSoundSourceByName(std::string const & name)
{
return GetTByName<GameScriptSoundSourceInfo, SOUND_SOURCE_INFO &>("SoundSourceInfo", name, m_soundSourcesMapName);
}
void GameScript::AssignItemsAndLara()
{
m_lua->set("Lara", GameScriptItemInfo(Lara.itemNumber, false));