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/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..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); @@ -616,6 +626,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); 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);