From 5a1c6f78ac20099a5e83c5a330548259fd9afabb Mon Sep 17 00:00:00 2001 From: hispidence Date: Mon, 28 Jun 2021 18:23:26 +0100 Subject: [PATCH 1/3] Add GameScriptItemInfo class. This is the first pass at wrapping an ITEM_INFO in a struct and handing it over to Lua. Many improvements should follow - this is more of a test implementation. --- TR5Main/Scripting/GameScriptItemInfo.cpp | 61 ++++++++++++++++++++++++ TR5Main/Scripting/GameScriptItemInfo.h | 31 ++++++++++++ TR5Main/TR5Main.vcxproj | 2 + 3 files changed, 94 insertions(+) create mode 100644 TR5Main/Scripting/GameScriptItemInfo.cpp create mode 100644 TR5Main/Scripting/GameScriptItemInfo.h diff --git a/TR5Main/Scripting/GameScriptItemInfo.cpp b/TR5Main/Scripting/GameScriptItemInfo.cpp new file mode 100644 index 000000000..eb63e1adf --- /dev/null +++ b/TR5Main/Scripting/GameScriptItemInfo.cpp @@ -0,0 +1,61 @@ +#include "framework.h" +#include "GameScriptItemInfo.h" +#include "items.h" +#include "objectslist.h" +#include "level.h" + +void GameScriptItemInfo::Register(sol::state * state) +{ + state->new_usertype("ItemInfo", + "new", sol::factories(&GameScriptItemInfo::Create)); +} + +std::unique_ptr GameScriptItemInfo::Create( + short hp, + short currentAnim, + short requiredAnimState, + sol::as_table_t> pos, + sol::as_table_t> rot, + sol::as_table_t> itemFlags, + short ocb, + byte aiBits, + short status, + bool active, + bool hitStatus) +{ + short num = CreateItem(); + ITEM_INFO * item = &g_Level.Items[num]; + + auto p = pos.value(); + auto r = rot.value(); + item->pos = PHD_3DPOS( + p[0], + p[1], + p[2], + r[0], + r[1], + r[2] + ); + + //make it a big medipack by default for now + item->objectNumber = ID_BIGMEDI_ITEM; + InitialiseItem(num); + + item->hitPoints = hp; + item->currentAnimState = currentAnim; + item->requiredAnimState = requiredAnimState; + memcpy(item->itemFlags, itemFlags.value().data(), sizeof(item->itemFlags)); + item->triggerFlags = ocb; + item->aiBits = aiBits; + item->status = status; + item->active = active; + item->hitStatus = hitStatus; + + return std::make_unique(num); +} + +GameScriptItemInfo::GameScriptItemInfo(short num) : m_num{ num } {}; + +GameScriptItemInfo::~GameScriptItemInfo() { + KillItem(m_num); +} \ No newline at end of file diff --git a/TR5Main/Scripting/GameScriptItemInfo.h b/TR5Main/Scripting/GameScriptItemInfo.h new file mode 100644 index 000000000..09142bf5e --- /dev/null +++ b/TR5Main/Scripting/GameScriptItemInfo.h @@ -0,0 +1,31 @@ +#pragma once + +namespace sol { + class state; + template class as_table_t; +} + + +class GameScriptItemInfo +{ +private: + short m_num; +public: + GameScriptItemInfo(short num); + ~GameScriptItemInfo(); + GameScriptItemInfo& operator=(GameScriptItemInfo const& other) = delete; + GameScriptItemInfo(GameScriptItemInfo const& other) = delete; + static void Register(sol::state *); + static std::unique_ptr Create( + short hp, + short currentAnim, + short requiredAnimState, + sol::as_table_t> pos, + sol::as_table_t> rot, + sol::as_table_t> itemFlags, + short ocb, + byte aiBits, + short status, + bool active, + bool hitStatus); +}; diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 6b9a62fb6..d757f7686 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -164,6 +164,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\" + @@ -478,6 +479,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\" + From a9583065f64c52de245acd5951e07ae1b92832d7 Mon Sep 17 00:00:00 2001 From: hispidence Date: Mon, 28 Jun 2021 18:34:59 +0100 Subject: [PATCH 2/3] Run the level script inside DoLevel. For now, this just runs the script once. --- TR5Main/Game/control.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index a8572966b..c0d3a1aae 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -810,6 +810,11 @@ GAME_STATUS DoLevel(int index, std::string ambient, bool loadFromSavegame) InitialiseCamera(); SOUND_Stop(); + // Run the level script + GameScriptLevel* level = g_GameFlow->Levels[index]; + std::string err; + g_GameScript->ExecuteScript(level->ScriptFileName, err); + // Restore the game? if (loadFromSavegame) { From b2ace2c1bff28139e8b50cc30d0e9ba22d5d0d58 Mon Sep 17 00:00:00 2001 From: hispidence Date: Mon, 28 Jun 2021 18:35:16 +0100 Subject: [PATCH 3/3] Include and register GameScriptItemInfo. --- TR5Main/Scripting/GameLogicScript.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TR5Main/Scripting/GameLogicScript.cpp b/TR5Main/Scripting/GameLogicScript.cpp index f7b8895f2..8f32df5fa 100644 --- a/TR5Main/Scripting/GameLogicScript.cpp +++ b/TR5Main/Scripting/GameLogicScript.cpp @@ -8,6 +8,8 @@ #include "sound.h" #include "setup.h" #include "level.h" +#include "GameScriptItemInfo.h" + using namespace std; extern GameFlow* g_GameFlow; GameScript* g_GameScript; @@ -15,6 +17,7 @@ bool WarningsAsErrors = false; GameScript::GameScript(sol::state* lua) : LuaHandler{ lua } { + GameScriptItemInfo::Register(m_lua); m_lua->new_enum("Object", { {"LARA", ID_LARA} });