From 80aced05594d8a71254804e0938a4e5d2bbcbf7f Mon Sep 17 00:00:00 2001 From: Jereth Date: Wed, 29 Oct 2025 16:51:12 +1100 Subject: [PATCH 1/2] Add player sector getter --- TheForceEngine/TFE_DarkForces/Scripting/gs_player.cpp | 10 ++++++++++ .../TFE_DarkForces/Scripting/scriptObject.cpp | 1 + 2 files changed, 11 insertions(+) diff --git a/TheForceEngine/TFE_DarkForces/Scripting/gs_player.cpp b/TheForceEngine/TFE_DarkForces/Scripting/gs_player.cpp index 9350ce0bd..b5b585a2b 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/gs_player.cpp +++ b/TheForceEngine/TFE_DarkForces/Scripting/gs_player.cpp @@ -1,9 +1,11 @@ #include "gs_player.h" +#include "scriptSector.h" #include "assert.h" #include #include #include #include +#include #include #include #include @@ -49,6 +51,13 @@ namespace TFE_DarkForces s_reviveTick = s_curTick + 436; } + ScriptSector getPlayerSector() + { + RSector* sec = s_playerObject->sector; + ScriptSector sector(sec->index); + return sector; + } + vec3_float getPlayerPosition() { return @@ -652,6 +661,7 @@ namespace TFE_DarkForces ScriptObjFunc("void setCamera()", setCamera); // Position and velocity + ScriptPropertyGetFunc("Sector get_sector()", getPlayerSector); ScriptPropertyGetFunc("float3 get_position()", getPlayerPosition); ScriptPropertySetFunc("void set_position(float3)", setPlayerPosition); ScriptPropertyGetFunc("float get_yaw()", getPlayerYaw); diff --git a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp index 00d0529ea..61eb1dac2 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp +++ b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp @@ -616,6 +616,7 @@ namespace TFE_DarkForces // Getters ScriptObjFunc("Sector getSector()", getSector); + ScriptPropertyGetFunc("Sector get_sector()", getSector); ScriptPropertyGetFunc("float3 get_position()", getPosition); ScriptPropertyGetFunc("float get_yaw()", getYaw); ScriptPropertyGetFunc("float get_radius()", getWorldWidth); From 4dda2291c86b9cf28054b1196593d680944e5061 Mon Sep 17 00:00:00 2001 From: Jereth Date: Thu, 30 Oct 2025 12:47:50 +1100 Subject: [PATCH 2/2] Add a Forcescript function to get all objects in a sector ScriptObject.registerFunctions() has been split off from registerType() This is so that ScriptObject.registerType() can be called before ScriptSector.registerType() and ScriptObject.registerFunctions() can be called afterwards ScriptSector functions need to know about the ScriptObject type and vice versa --- .../TFE_DarkForces/Scripting/gs_level.cpp | 3 ++- .../TFE_DarkForces/Scripting/scriptObject.cpp | 10 ++++++++ .../TFE_DarkForces/Scripting/scriptObject.h | 1 + .../TFE_DarkForces/Scripting/scriptSector.cpp | 23 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/TheForceEngine/TFE_DarkForces/Scripting/gs_level.cpp b/TheForceEngine/TFE_DarkForces/Scripting/gs_level.cpp index 2ec8cea4a..f59c7a983 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/gs_level.cpp +++ b/TheForceEngine/TFE_DarkForces/Scripting/gs_level.cpp @@ -251,8 +251,9 @@ namespace TFE_DarkForces scriptElev.registerType(); scriptTex.registerType(); scriptWall.registerType(); - scriptSector.registerType(); scriptObject.registerType(); + scriptSector.registerType(); + scriptObject.registerFunctions(); ScriptClassBegin("Level", "level", api); { diff --git a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp index 61eb1dac2..30db04e19 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp +++ b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.cpp @@ -608,6 +608,16 @@ namespace TFE_DarkForces ScriptEnumStr(PROJ_HOMING_MISSILE); ScriptEnumStr(PROJ_PROBE_PROJ); ScriptEnum("PROJ_BOBAFETT_BALL", PROJ_BOBAFET_BALL); + } + + // Function registration has been separated from Type registration + // The ScriptObject type needs to be registered before registering ScriptSector functions + // ScriptObject functions need to be registered after registering ScriptSector + void ScriptObject::registerFunctions() + { + s32 res = 0; + asIScriptEngine* engine = (asIScriptEngine*)TFE_ForceScript::getEngine(); + s_typeName = "Object"; // Checks ScriptObjFunc("bool isValid()", isScriptObjectValid); diff --git a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.h b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.h index 7d1dcf3a8..93b22853c 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.h +++ b/TheForceEngine/TFE_DarkForces/Scripting/scriptObject.h @@ -11,6 +11,7 @@ namespace TFE_DarkForces ScriptObject() : m_id(-1) {}; ScriptObject(s32 id) : m_id(id) {}; void registerType(); + void registerFunctions(); public: s32 m_id; diff --git a/TheForceEngine/TFE_DarkForces/Scripting/scriptSector.cpp b/TheForceEngine/TFE_DarkForces/Scripting/scriptSector.cpp index 7b3994024..6eedab540 100644 --- a/TheForceEngine/TFE_DarkForces/Scripting/scriptSector.cpp +++ b/TheForceEngine/TFE_DarkForces/Scripting/scriptSector.cpp @@ -1,10 +1,13 @@ #include "scriptSector.h" #include "scriptWall.h" #include "scriptTexture.h" +#include "scriptObject.h" #include +#include #include #include #include +#include #include #include @@ -197,6 +200,25 @@ namespace TFE_DarkForces sendMessageToSector(messageType, evt, 0, sSector); } + void getSectorObjects(CScriptArray& results, ScriptSector* sSector) + { + results.Resize(0); + if (!isScriptSectorValid(sSector)) { return; } + + RSector* sector = &s_levelState.sectors[sSector->m_id]; + SecObject** objList = sector->objectList; + for (s32 i = 0, idx = 0; i < sector->objectCount && idx < sector->objectCapacity; idx++) + { + SecObject* obj = objList[idx]; + if (obj) + { + s32 objIndex = obj_getRefIndex(obj); + ScriptObject sObj(objIndex); + results.InsertLast(&sObj); + } + } + } + void ScriptSector::registerType() { s32 res = 0; @@ -213,6 +235,7 @@ namespace TFE_DarkForces ScriptObjFunc("void setFlag(int, uint)", setSectorFlag); ScriptObjFunc("float2 getCenterXZ()", getCenterXZ); ScriptObjFunc("Wall getWall(int)", getWall); + ScriptObjFunc("void getObjects(array&)", getSectorObjects); ScriptObjFunc("void sendMessage(int)", sendMessageToSector1); ScriptObjFunc("void sendMessage(int, uint)", sendMessageToSector2);