diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index 83ced86aa..0cb3bd3c9 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) { diff --git a/TR5Main/Scripting/GameLogicScript.cpp b/TR5Main/Scripting/GameLogicScript.cpp index d687aef25..35cb5dc34 100644 --- a/TR5Main/Scripting/GameLogicScript.cpp +++ b/TR5Main/Scripting/GameLogicScript.cpp @@ -11,6 +11,7 @@ #include #include #include +#include "GameScriptItemInfo.h" extern GameFlow* g_GameFlow; GameScript* g_GameScript; @@ -18,6 +19,7 @@ bool WarningsAsErrors = false; GameScript::GameScript(sol::state* lua) : LuaHandler{ lua } { + GameScriptItemInfo::Register(m_lua); m_lua->new_enum("Object", { {"LARA", ID_LARA} }); 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\" +