Register GameScriptRotation and GameScriptPosition in GameScript constructor. Remove GameScriptItem class, which has been merged into GameScriptItemInfo.

This commit is contained in:
hispidence 2021-07-01 19:29:58 +01:00
parent 3b6e0e1b8c
commit f22551ab32
2 changed files with 16 additions and 197 deletions

View file

@ -14,44 +14,18 @@
extern GameFlow* g_GameFlow;
GameScript* g_GameScript;
bool WarningsAsErrors = false;
extern bool const WarningsAsErrors = true;
GameScript::GameScript(sol::state* lua) : LuaHandler{ lua }
{
GameScriptItemInfo::Register(m_lua);
GameScriptPosition::Register(m_lua);
GameScriptRotation::Register(m_lua);
m_lua->new_enum<GAME_OBJECT_ID>("Object", {
{"LARA", ID_LARA}
});
// Add the item type
m_lua->new_usertype<GameScriptPosition>("Position",
sol::constructors<GameScriptPosition(int, int, int)>(),
"X", sol::property(&GameScriptPosition::GetX, &GameScriptPosition::SetX),
"Y", sol::property(&GameScriptPosition::GetY, &GameScriptPosition::SetY),
"Z", sol::property(&GameScriptPosition::GetZ, &GameScriptPosition::SetZ)
);
m_lua->new_usertype<GameScriptRotation>("Rotation",
sol::constructors<GameScriptRotation(int, int, int)>(),
"X", sol::property(&GameScriptRotation::GetX, &GameScriptRotation::SetX),
"Y", sol::property(&GameScriptRotation::GetY, &GameScriptRotation::SetY),
"Z", sol::property(&GameScriptRotation::GetZ, &GameScriptRotation::SetZ)
);
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),
"new", sol::no_constructor
);
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,
@ -226,28 +200,28 @@ 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);
std::unique_ptr<GameScriptItem> GameScript::GetItemById(int id)
std::unique_ptr<GameScriptItemInfo> GameScript::GetItemById(int id)
{
if (m_itemsMapId.find(id) == m_itemsMapId.end())
{
if (WarningsAsErrors)
throw "item id not found";
return std::unique_ptr<GameScriptItem>(nullptr);
return std::unique_ptr<GameScriptItemInfo>(nullptr);
}
return std::unique_ptr<GameScriptItem>(new GameScriptItem(m_itemsMapId[id]));
return std::make_unique<GameScriptItemInfo>(m_itemsMapId[id]);
}
std::unique_ptr<GameScriptItem> GameScript::GetItemByName(std::string name)
std::unique_ptr<GameScriptItemInfo> GameScript::GetItemByName(std::string name)
{
if (m_itemsMapName.find(name) == m_itemsMapName.end())
{
if (WarningsAsErrors)
throw "item name not found";
return std::unique_ptr<GameScriptItem>(nullptr);
return std::unique_ptr<GameScriptItemInfo>(nullptr);
}
return std::unique_ptr<GameScriptItem>(new GameScriptItem(m_itemsMapName[name]));
return std::make_unique<GameScriptItemInfo>(m_itemsMapName[name]);
}
void GameScript::PlayAudioTrack(std::string trackName, bool looped)
@ -259,9 +233,9 @@ void GameScript::PlaySoundEffect(int id, GameScriptPosition p, int flags)
{
PHD_3DPOS pos;
pos.xPos = p.x;
pos.yPos = p.y;
pos.zPos = p.z;
pos.xPos = p.GetX();
pos.yPos = p.GetY();
pos.zPos = p.GetZ();
pos.xRot = 0;
pos.yRot = 0;
pos.zRot = 0;
@ -371,7 +345,7 @@ void GameScript::AssignItemsAndLara()
{
m_lua->set("Level", m_locals);
m_lua->set("Game", m_globals);
m_lua->set("Lara", GameScriptItem(Lara.itemNumber));
m_lua->set("Lara", GameScriptItemInfo(Lara.itemNumber));
}
void GameScript::ResetVariables()
@ -389,138 +363,6 @@ int GameScript::CalculateHorizontalDistance(GameScriptPosition pos1, GameScriptP
return sqrt(SQUARE(pos1.GetX() - pos2.GetX()) + SQUARE(pos1.GetZ() - pos2.GetZ()));
}
GameScriptItem::GameScriptItem(short itemNumber)
:
NativeItemNumber(itemNumber),
NativeItem(&g_Level.Items[itemNumber])
{
}
short GameScriptItem::GetHP()
{
return NativeItem->hitPoints;
}
void GameScriptItem::SetHP(short hp)
{
if (hp < 0 || hp > Objects[NativeItem->objectNumber].hitPoints)
{
if (WarningsAsErrors)
throw std::runtime_error("invalid HP");
if (hp < 0)
{
hp = 0;
}
else if (hp > Objects[NativeItem->objectNumber].hitPoints)
{
hp = Objects[NativeItem->objectNumber].hitPoints;
}
}
NativeItem->hitPoints = hp;
}
short GameScriptItem::GetRoom()
{
return NativeItem->roomNumber;
}
void GameScriptItem::SetRoom(short room)
{
if (room < 0 || room >= g_Level.Rooms.size())
{
if (WarningsAsErrors)
throw std::runtime_error("invalid room number");
return;
}
NativeItem->roomNumber = room;
}
void GameScriptItem::EnableItem()
{
if (!NativeItem->active)
{
if (Objects[NativeItem->objectNumber].intelligent)
{
if (NativeItem->status == ITEM_DEACTIVATED)
{
NativeItem->touchBits = 0;
NativeItem->status = ITEM_ACTIVE;
AddActiveItem(NativeItemNumber);
EnableBaddieAI(NativeItemNumber, 1);
}
else if (NativeItem->status == ITEM_INVISIBLE)
{
NativeItem->touchBits = 0;
if (EnableBaddieAI(NativeItemNumber, 0))
NativeItem->status = ITEM_ACTIVE;
else
NativeItem->status = ITEM_INVISIBLE;
AddActiveItem(NativeItemNumber);
}
}
else
{
NativeItem->touchBits = 0;
AddActiveItem(NativeItemNumber);
NativeItem->status = ITEM_ACTIVE;
}
}
}
void GameScriptItem::DisableItem()
{
if (NativeItem->active)
{
if (Objects[NativeItem->objectNumber].intelligent)
{
if (NativeItem->status == ITEM_ACTIVE)
{
NativeItem->touchBits = 0;
NativeItem->status = ITEM_DEACTIVATED;
RemoveActiveItem(NativeItemNumber);
DisableBaddieAI(NativeItemNumber);
}
}
else
{
NativeItem->touchBits = 0;
RemoveActiveItem(NativeItemNumber);
NativeItem->status = ITEM_DEACTIVATED;
}
}
}
short GameScriptItem::GetCurrentState()
{
return NativeItem->currentAnimState;
}
void GameScriptItem::SetCurrentState(short state)
{
NativeItem->currentAnimState = state;
}
short GameScriptItem::GetGoalState()
{
return NativeItem->goalAnimState;
}
void GameScriptItem::SetGoalState(short state)
{
NativeItem->goalAnimState = state;
}
short GameScriptItem::GetRequiredState()
{
return NativeItem->requiredAnimState;
}
void GameScriptItem::SetRequiredState(short state)
{
NativeItem->requiredAnimState = state;
}
sol::object LuaVariables::GetVariable(std::string key)
{
if (variables.find(key) == variables.end())