diff --git a/src/C4Config.cpp b/src/C4Config.cpp index 179cbb234..221d71792 100644 --- a/src/C4Config.cpp +++ b/src/C4Config.cpp @@ -23,6 +23,7 @@ #include "C4Version.h" #ifdef C4ENGINE #include +#include "C4AulScriptStrict.h" #include #include #include @@ -110,6 +111,12 @@ void C4ConfigGeneral::CompileFunc(StdCompiler *pComp) void C4ConfigDeveloper::CompileFunc(StdCompiler *pComp) { pComp->Value(mkNamingAdapt(AutoFileReload, "AutoFileReload", true, false, true)); + pComp->Value(mkNamingAdapt(DirectExecStrictness, "DirectExecStrictness", static_cast(C4AulScriptStrict::STRICT3))); + + if (pComp->isCompiler()) + { + DirectExecStrictness = std::clamp(DirectExecStrictness, static_cast(C4AulScriptStrict::NONSTRICT), static_cast(C4AulScriptStrict::MAXSTRICT)); + } } void C4ConfigGraphics::CompileFunc(StdCompiler *pComp) diff --git a/src/C4Config.h b/src/C4Config.h index a2b1d8610..451d3b52b 100644 --- a/src/C4Config.h +++ b/src/C4Config.h @@ -24,6 +24,7 @@ #include "StdConfig.h" #ifdef C4ENGINE +#include "C4AulScriptStrict.h" #include "StdWindow.h" #endif @@ -98,6 +99,8 @@ class C4ConfigDeveloper { public: bool AutoFileReload; + std::uint8_t DirectExecStrictness; + void CompileFunc(StdCompiler *pComp); }; diff --git a/src/C4Console.cpp b/src/C4Console.cpp index b403d1cf8..f07adf296 100644 --- a/src/C4Console.cpp +++ b/src/C4Console.cpp @@ -18,6 +18,7 @@ #include #include +#include "C4AulScriptStrict.h" #include #include @@ -608,7 +609,7 @@ bool C4Console::In(const char *szText) // editing enabled? if (!EditCursor.EditingOK()) return false; // pass through network queue - Game.Control.DoInput(CID_Script, new C4ControlScript(szText, C4ControlScript::SCOPE_Console), CDT_Decide); + Game.Control.DoInput(CID_Script, new C4ControlScript(szText, C4ControlScript::SCOPE_Console, Config.Developer.DirectExecStrictness), CDT_Decide); return true; } diff --git a/src/C4Control.cpp b/src/C4Control.cpp index 45c7c9edf..85b520fab 100644 --- a/src/C4Control.cpp +++ b/src/C4Control.cpp @@ -287,7 +287,7 @@ void C4ControlScript::Execute() const else // default: Fallback to global context pScript = &Game.ScriptEngine; - C4Value rVal(pScript->DirectExec(pObj, szScript, "console script")); + C4Value rVal(pScript->DirectExec(pObj, szScript, "console script", false, Strict)); // show messages // print script if (pObj) @@ -850,9 +850,9 @@ void C4ControlJoinPlayer::CompileFunc(StdCompiler *pComp) // *** C4ControlEMMoveObject C4ControlEMMoveObject::C4ControlEMMoveObject(C4ControlEMObjectAction eAction, int32_t tx, int32_t ty, C4Object *pTargetObj, - int32_t iObjectNum, int32_t *pObjects, const char *szScript) + int32_t iObjectNum, int32_t *pObjects, const char *szScript, const C4AulScriptStrict strict) : eAction(eAction), tx(tx), ty(ty), iTargetObj(Game.Objects.ObjectNumber(pTargetObj)), - iObjectNum(iObjectNum), pObjects(pObjects), Script(szScript, true) {} + iObjectNum(iObjectNum), Strict{strict}, pObjects(pObjects), Script(szScript, true) {} C4ControlEMMoveObject::~C4ControlEMMoveObject() { @@ -918,7 +918,7 @@ void C4ControlEMMoveObject::Execute() const { if (!pObjects) return; // execute script ... - C4ControlScript ScriptCtrl(Script.getData(), C4ControlScript::SCOPE_Global); + C4ControlScript ScriptCtrl(Script.getData(), C4ControlScript::SCOPE_Global, Strict); ScriptCtrl.SetByClient(iByClient); // ... for each object in selection for (int i = 0; i < iObjectNum; ++i) diff --git a/src/C4Control.h b/src/C4Control.h index fbc6afb38..56059f843 100644 --- a/src/C4Control.h +++ b/src/C4Control.h @@ -18,6 +18,7 @@ #pragma once +#include "C4AulScriptStrict.h" #include "C4ForwardDeclarations.h" #include "C4Id.h" #include "C4PacketBase.h" @@ -133,11 +134,14 @@ class C4ControlScript : public C4ControlPacket // sync C4ControlScript() : iTargetObj(-1) {} - C4ControlScript(const char *szScript, int32_t iTargetObj = SCOPE_Global) - : iTargetObj(iTargetObj), Script(szScript, true) {} + C4ControlScript(const char *szScript, int32_t iTargetObj = SCOPE_Global, C4AulScriptStrict strict = C4AulScriptStrict::MAXSTRICT) + : iTargetObj(iTargetObj), Strict{strict}, Script(szScript, true) {} + C4ControlScript(const char *const script, std::int32_t targetObj, std::int32_t strict) + : C4ControlScript{script, targetObj, static_cast(strict)} {} protected: int32_t iTargetObj; + C4AulScriptStrict Strict; StdStrBuf Script; public: @@ -341,7 +345,7 @@ class C4ControlEMMoveObject : public C4ControlPacket // sync public: C4ControlEMMoveObject() : pObjects(nullptr) {} C4ControlEMMoveObject(C4ControlEMObjectAction eAction, int32_t tx, int32_t ty, C4Object *pTargetObj, - int32_t iObjectNum = 0, int32_t *pObjects = nullptr, const char *szScript = nullptr); + int32_t iObjectNum = 0, int32_t *pObjects = nullptr, const char *szScript = nullptr, C4AulScriptStrict strict = C4AulScriptStrict::MAXSTRICT); ~C4ControlEMMoveObject(); protected: @@ -349,6 +353,7 @@ class C4ControlEMMoveObject : public C4ControlPacket // sync int32_t tx, ty; // target position int32_t iTargetObj; // enumerated ptr to target object int32_t iObjectNum; // number of objects moved + C4AulScriptStrict Strict; // strictness for the script to execute int32_t *pObjects; // pointer on array of objects moved StdStrBuf Script; // script to execute diff --git a/src/C4EditCursor.cpp b/src/C4EditCursor.cpp index 7886e52d7..39785466b 100644 --- a/src/C4EditCursor.cpp +++ b/src/C4EditCursor.cpp @@ -16,6 +16,7 @@ /* Handles viewport editing in console mode */ +#include "C4AulScriptStrict.h" #include #include @@ -733,7 +734,7 @@ void C4EditCursor::EMMoveObject(C4ControlEMObjectAction eAction, int32_t tx, int } // execute control - EMControl(CID_EMMoveObj, new C4ControlEMMoveObject(eAction, tx, ty, pTargetObj, iObjCnt, pObjIDs, szScript)); + EMControl(CID_EMMoveObj, new C4ControlEMMoveObject(eAction, tx, ty, pTargetObj, iObjCnt, pObjIDs, szScript, static_cast(Config.Developer.DirectExecStrictness))); } void C4EditCursor::EMControl(C4PacketType eCtrlType, C4ControlPacket *pCtrl) diff --git a/src/C4MessageInput.cpp b/src/C4MessageInput.cpp index cfd57d1c3..a8f64e318 100644 --- a/src/C4MessageInput.cpp +++ b/src/C4MessageInput.cpp @@ -17,6 +17,7 @@ // handles input dialogs, last-message-buffer, MessageBoard-commands +#include "C4AulScriptStrict.h" #include "C4GuiEdit.h" #include "C4GuiResource.h" #include @@ -469,7 +470,7 @@ bool C4MessageInput::ProcessCommand(const char *szCommand) if (!Game.DebugMode) return false; if (Game.Network.isEnabled() && !Game.Network.isHost()) return false; - Game.Control.DoInput(CID_Script, new C4ControlScript(pCmdPar, C4ControlScript::SCOPE_Console), CDT_Decide); + Game.Control.DoInput(CID_Script, new C4ControlScript(pCmdPar, C4ControlScript::SCOPE_Console, Config.Developer.DirectExecStrictness), CDT_Decide); return true; } // set runtimte properties