Move references to ::Objects and ::MaterialMap from C4AulLink to C4Game

This changes the order in which the various parts of the engine are updated
after a definition reload, but they should not interfere with each other.
objectmenu
Günther Brammer 2014-05-11 22:55:19 +02:00
parent a5f797f96b
commit e1a38ee010
5 changed files with 24 additions and 22 deletions

View File

@ -2021,9 +2021,9 @@ bool C4Game::ReloadFile(const char *szFile)
if ((pDef = ::Definitions.GetByPath(szRelativePath)))
return ReloadDef(pDef->id);
// script?
if (ScriptEngine.ReloadScript(szRelativePath, &::Definitions, Config.General.LanguageEx))
if (ScriptEngine.ReloadScript(szRelativePath, Config.General.LanguageEx))
{
return true;
ReLinkScriptEngine();
}
return true;
}
@ -2050,6 +2050,8 @@ bool C4Game::ReloadDef(C4ID id)
// Reload def
if (::Definitions.Reload(pDef,C4D_Load_RX,Config.General.LanguageEx,&Application.SoundSystem))
{
// update script engine - this will also do include callbacks and Freeze() pDef
ReLinkScriptEngine();
// Success, update all concerned object faces
// may have been done by graphics-update already - but not for objects using graphics of another def
// better update everything :)
@ -2422,6 +2424,9 @@ bool C4Game::LinkScriptEngine()
ScriptEngine.warnCnt, (ScriptEngine.warnCnt != 1 ? "s" : ""),
ScriptEngine.errCnt, (ScriptEngine.errCnt != 1 ? "s" : ""));
// update material pointers
::MaterialMap.UpdateScriptPointers();
// Set name list for globals
ScriptEngine.GlobalNamed.SetNameList(&ScriptEngine.GlobalNamedNames);
@ -2432,6 +2437,18 @@ bool C4Game::LinkScriptEngine()
return true;
}
bool C4Game::ReLinkScriptEngine()
{
::ScriptEngine.ReLink(&::Definitions);
// update effect pointers
::Objects.UpdateScriptPointers();
// update material pointers
::MaterialMap.UpdateScriptPointers();
return true;
}
bool C4Game::InitPlayers(C4ValueNumbers * numbers)
{

View File

@ -247,6 +247,7 @@ protected:
bool InitControl();
bool InitScriptEngine();
bool LinkScriptEngine();
bool ReLinkScriptEngine();
bool InitPlayers(C4ValueNumbers *);
bool OpenScenario();
bool InitDefs();

View File

@ -406,8 +406,6 @@ bool C4DefList::Reload(C4Def *pDef, DWORD dwLoadWhat, const char *szLanguage, C4
BuildTable();
// handle skeleton appends and includes
AppendAndIncludeSkeletons();
// update script engine - this will also do include callbacks and Freeze() this
::ScriptEngine.ReLink(this);
// restore graphics
GfxBackup.AssignUpdate();
// Success

View File

@ -371,10 +371,10 @@ public:
~C4AulScriptEngine(); // destructor
void Clear(); // clear data
void Link(C4DefList *rDefs); // link and parse all scripts
void ReLink(C4DefList *rDefs); // unlink + relink and parse all scripts
void ReLink(C4DefList *rDefs); // unlink, link and parse all scripts
virtual C4PropListStatic * GetPropList();
using C4AulScript::ReloadScript;
bool ReloadScript(const char *szScript, C4DefList *pDefs, const char *szLanguage); // search script and reload + relink, if found
bool ReloadScript(const char *szScript, const char *szLanguage); // search script and reload, if found
C4AulFunc * GetFirstFunc(C4String * Name)
{ return FuncLookUp.GetFirstFunc(Name); }
C4AulFunc * GetNextSNFunc(const C4AulFunc * After)

View File

@ -180,9 +180,6 @@ void C4AulScriptEngine::Link(C4DefList *rDefs)
// engine is always parsed (for global funcs)
State = ASS_PARSED;
// update material pointers
::MaterialMap.UpdateScriptPointers();
rDefs->CallEveryDefinition();
// Done modifying the proplists now
@ -214,25 +211,14 @@ void C4AulScriptEngine::ReLink(C4DefList *rDefs)
// display state
LogF("C4AulScriptEngine linked - %d line%s, %d warning%s, %d error%s",
lineCnt, (lineCnt != 1 ? "s" : ""), warnCnt, (warnCnt != 1 ? "s" : ""), errCnt, (errCnt != 1 ? "s" : ""));
// update effect pointers
::Objects.UpdateScriptPointers();
// update material pointers
::MaterialMap.UpdateScriptPointers();
}
bool C4AulScriptEngine::ReloadScript(const char *szScript, C4DefList *pDefs, const char *szLanguage)
bool C4AulScriptEngine::ReloadScript(const char *szScript, const char *szLanguage)
{
C4AulScript * s;
for (s = Child0; s; s = s->Next)
if (s->ReloadScript(szScript, szLanguage))
break;
if (!s)
return false;
// relink
ReLink(pDefs);
// ok
return true;
return !!s;
}