From 8185d318bf858e9c5d91887597ba72629541e484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Brammer?= Date: Tue, 4 Oct 2011 22:12:45 +0200 Subject: [PATCH] Script: Add a proplist representing the global scope, named "Global" --- src/game/object/C4Def.cpp | 3 ++- src/script/C4Aul.cpp | 12 +++++++++++- src/script/C4Aul.h | 2 ++ src/script/C4AulLink.cpp | 3 +-- src/script/C4ScriptHost.cpp | 3 ++- src/script/C4Value.cpp | 9 +++++++++ 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/game/object/C4Def.cpp b/src/game/object/C4Def.cpp index a97808e21..b3bb0e78c 100644 --- a/src/game/object/C4Def.cpp +++ b/src/game/object/C4Def.cpp @@ -306,8 +306,9 @@ void C4Def::CompileFunc(StdCompiler *pComp) //-------------------------------- C4Def ------------------------------------------------------- -C4Def::C4Def(): Script(this) +C4Def::C4Def(): Script(this), C4PropList(ScriptEngine.GetPropList()) { + assert(ScriptEngine.GetPropList()); Graphics.pDef = this; Default(); } diff --git a/src/script/C4Aul.cpp b/src/script/C4Aul.cpp index 1c2dcbb28..87856bcc6 100644 --- a/src/script/C4Aul.cpp +++ b/src/script/C4Aul.cpp @@ -377,7 +377,7 @@ void C4AulScript::AddFunc(const char *pIdtf, C4ScriptFnDef* Def) /*--- C4AulScriptEngine ---*/ C4AulScriptEngine::C4AulScriptEngine(): - warnCnt(0), errCnt(0), nonStrictCnt(0), lineCnt(0) + GlobalPropList(0), warnCnt(0), errCnt(0), nonStrictCnt(0), lineCnt(0) { // /me r b engine Engine = this; @@ -392,6 +392,15 @@ C4AulScriptEngine::C4AulScriptEngine(): GlobalConsts.SetNameList(&GlobalConstNames); } +C4PropList * C4AulScriptEngine::GetPropList() +{ + if (!GlobalPropList) + { + GlobalPropList = C4PropList::NewScen(); + RegisterGlobalConstant("Global", C4VPropList(GlobalPropList)); + } + return GlobalPropList; +} C4AulScriptEngine::~C4AulScriptEngine() { Clear(); } @@ -404,6 +413,7 @@ void C4AulScriptEngine::Clear() // clear inherited C4AulScript::Clear(); // clear own stuff + GetPropList()->Clear(); // reset values warnCnt = errCnt = nonStrictCnt = lineCnt = 0; // resetting name lists will reset all data lists, too diff --git a/src/script/C4Aul.h b/src/script/C4Aul.h index 76bf0fe84..0aa620022 100644 --- a/src/script/C4Aul.h +++ b/src/script/C4Aul.h @@ -449,6 +449,7 @@ class C4AulScriptEngine : public C4AulScript { protected: C4AulFuncMap FuncLookUp; + C4PropList * GlobalPropList; public: int warnCnt, errCnt; // number of warnings/errors @@ -470,6 +471,7 @@ public: void Clear(); // clear data void Link(C4DefList *rDefs); // link and parse all scripts void ReLink(C4DefList *rDefs); // unlink + relink and parse all scripts + virtual C4PropList * GetPropList(); using C4AulScript::ReloadScript; bool ReloadScript(const char *szScript, C4DefList *pDefs, const char *szLanguage); // search script and reload + relink, if found C4AulFunc * GetFirstFunc(const char * Name) diff --git a/src/script/C4AulLink.cpp b/src/script/C4AulLink.cpp index 4b7596cf9..cd89c9602 100644 --- a/src/script/C4AulLink.cpp +++ b/src/script/C4AulLink.cpp @@ -209,8 +209,6 @@ bool C4AulScript::ReloadScript(const char *szPath, const char *szLanguage) void C4AulScriptEngine::Link(C4DefList *rDefs) { - - try { @@ -228,6 +226,7 @@ void C4AulScriptEngine::Link(C4DefList *rDefs) // get common funcs AfterLink(); + GlobalPropList->Freeze(); // non-strict scripts? if (nonStrictCnt) diff --git a/src/script/C4ScriptHost.cpp b/src/script/C4ScriptHost.cpp index c69209550..f6369a8ca 100644 --- a/src/script/C4ScriptHost.cpp +++ b/src/script/C4ScriptHost.cpp @@ -143,7 +143,8 @@ C4GameScriptHost::~C4GameScriptHost() { } bool C4GameScriptHost::LoadScenarioScripts(C4Group &hGroup, C4LangStringTable *pLocalTable) { // Script - ScenPrototype = C4PropList::NewScen(); + assert(ScriptEngine.GetPropList()); + ScenPrototype = C4PropList::NewScen(ScriptEngine.GetPropList()); ScenPropList = C4PropList::NewScen(ScenPrototype); ::ScriptEngine.RegisterGlobalConstant("Scenario", C4VPropList(ScenPropList)); Reg2List(&ScriptEngine, &ScriptEngine); diff --git a/src/script/C4Value.cpp b/src/script/C4Value.cpp index 9747deac8..cbfd1dc34 100644 --- a/src/script/C4Value.cpp +++ b/src/script/C4Value.cpp @@ -131,6 +131,8 @@ StdStrBuf C4Value::GetDataString(int depth) const return StdStrBuf(Data ? "true" : "false"); case C4V_PropList: { + if (Data.PropList == ScriptEngine.GetPropList()) + return StdStrBuf("Global"); StdStrBuf DataString; DataString = "{"; if (Data.PropList->GetObject()) @@ -267,6 +269,8 @@ void C4Value::CompileFunc(StdCompiler *pComp, C4ValueNumbers * numbers) cC4VID = 'c'; else if (getPropList() == GameScript.ScenPrototype) cC4VID = 't'; + else if (getPropList() == ScriptEngine.GetPropList()) + cC4VID = 'g'; else cC4VID = 'E'; break; @@ -360,6 +364,11 @@ void C4Value::CompileFunc(StdCompiler *pComp, C4ValueNumbers * numbers) SetPropList(GameScript.ScenPrototype); break; + case 'g': + if (fCompiler) + SetPropList(ScriptEngine.GetPropList()); + break; + case 'n': case 'A': // compat with OC 5.1 if (fCompiler)