diff --git a/doomsday/plugins/hexen/include/acscript.h b/doomsday/plugins/hexen/include/acscript.h index ac1349fc0c..ec217ccb79 100644 --- a/doomsday/plugins/hexen/include/acscript.h +++ b/doomsday/plugins/hexen/include/acscript.h @@ -235,6 +235,16 @@ class ACScriptInterpreter int scriptNumber; ///< On the target map. byte args[4]; + /** + * @param mapUri Unique identifier of the target map. A copy is made. + * @param scriptNumber Script number to execute on the target map. + * @param args Script arguments. + */ + DeferredTask(Uri const &mapUri, int scriptNumber, byte const args[4]); + ~DeferredTask(); + + static DeferredTask *newFromReader(de::Reader &from); + void operator >> (de::Writer &to) const; void operator << (de::Reader &from); }; @@ -250,7 +260,7 @@ class ACScriptInterpreter Str *_strings; int _deferredTasksSize; - DeferredTask *_deferredTasks; + DeferredTask **_deferredTasks; }; /// @return The game's global ACScript interpreter. diff --git a/doomsday/plugins/hexen/src/acscript.cpp b/doomsday/plugins/hexen/src/acscript.cpp index e8f7bc8346..b1805ecf6c 100644 --- a/doomsday/plugins/hexen/src/acscript.cpp +++ b/doomsday/plugins/hexen/src/acscript.cpp @@ -64,6 +64,35 @@ struct BytecodeScriptInfo int waitValue; }; +ACScriptInterpreter::DeferredTask::DeferredTask(Uri const &mapUri, int scriptNumber, byte const args_[]) + : mapUri(Uri_Dup(&mapUri)) + , scriptNumber(scriptNumber) +{ + std::memcpy(args, args_, sizeof(args)); +} + +ACScriptInterpreter::DeferredTask::~DeferredTask() +{ + Uri_Delete(mapUri); +} + +ACScriptInterpreter::DeferredTask *ACScriptInterpreter::DeferredTask::newFromReader(de::Reader &from) //static +{ + de::String mapUriStr; + from >> mapUriStr; + Uri *mapUri = Uri_NewWithPath2(mapUriStr.toUtf8().constData(), RC_NULL); + int scriptNumber; ///< On the target map. + from >> scriptNumber; + byte args[4]; + for(int i = 0; i < 4; ++i) + { + from >> args[i]; + } + DeferredTask *task = new DeferredTask(*mapUri, scriptNumber, args); + Uri_Delete(mapUri); + return task; +} + void ACScriptInterpreter::DeferredTask::operator >> (de::Writer &to) const { to << de::String(Str_Text(Uri_Compose(mapUri))) @@ -113,7 +142,7 @@ ACScript *ACScriptInterpreter::newACScript(BytecodeScriptInfo &info, byte const for(int i = 0; i < info.argCount; ++i) { - DENG_ASSERT(args != 0); + DENG2_ASSERT(args != 0); script->vars[i] = args[i]; } @@ -129,7 +158,7 @@ bool ACScriptInterpreter::newDeferredTask(Uri const *mapUri, int scriptNumber, b // Don't allow duplicates. for(int i = 0; i < _deferredTasksSize; ++i) { - DeferredTask &task = _deferredTasks[i]; + DeferredTask &task = *_deferredTasks[i]; if(task.scriptNumber == scriptNumber && Uri_Equality(task.mapUri, mapUri)) { @@ -137,16 +166,8 @@ bool ACScriptInterpreter::newDeferredTask(Uri const *mapUri, int scriptNumber, b } } - _deferredTasks = (DeferredTask *) Z_Realloc(_deferredTasks, sizeof(*_deferredTasks) * ++_deferredTasksSize, PU_GAMESTATIC); - DeferredTask *task = &_deferredTasks[_deferredTasksSize - 1]; - - task->mapUri = Uri_Dup(mapUri); - task->scriptNumber = scriptNumber; - task->args[0] = args[0]; - task->args[1] = args[1]; - task->args[2] = args[2]; - task->args[3] = args[3]; - + _deferredTasks = (DeferredTask **) Z_Realloc(_deferredTasks, sizeof(*_deferredTasks) * ++_deferredTasksSize, PU_GAMESTATIC); + _deferredTasks[_deferredTasksSize - 1] = new DeferredTask(*mapUri, scriptNumber, args); return true; } @@ -164,7 +185,7 @@ void ACScriptInterpreter::loadBytecode(lumpnum_t lump) { #define OPEN_SCRIPTS_BASE 1000 - DENG_ASSERT(!IS_CLIENT); + DENG2_ASSERT(!IS_CLIENT); size_t const lumpLength = (lump >= 0? W_LumpLength(lump) : 0); @@ -212,7 +233,7 @@ void ACScriptInterpreter::loadBytecode(lumpnum_t lump) info->scriptNumber -= OPEN_SCRIPTS_BASE; } - DENG_ASSERT(info->argCount <= MAX_ACS_SCRIPT_VARS); + DENG2_ASSERT(info->argCount <= MAX_ACS_SCRIPT_VARS); } _stringCount = LONG(*readBuf++); @@ -232,7 +253,7 @@ int ACScriptInterpreter::scriptCount() const void ACScriptInterpreter::startOpenScripts() { - DENG_ASSERT(!IS_CLIENT); + DENG2_ASSERT(!IS_CLIENT); // Each is allotted 1 second for initialization. for(int i = 0; i < _scriptCount; ++i) @@ -242,8 +263,8 @@ void ACScriptInterpreter::startOpenScripts() if(info.flags & BytecodeScriptInfo::Open) { ACScript *script = newACScript(info, 0/*no args*/, TICSPERSEC); - DENG_ASSERT(script != 0); - DENG_UNUSED(script); + DENG2_ASSERT(script != 0); + DENG2_UNUSED(script); } } } @@ -251,7 +272,7 @@ void ACScriptInterpreter::startOpenScripts() bool ACScriptInterpreter::startScript(int scriptNumber, Uri const *mapUri, byte const args[], mobj_t *activator, Line *line, int side) { - DENG_ASSERT(!IS_CLIENT); + DENG2_ASSERT(!IS_CLIENT); if(mapUri) { @@ -365,7 +386,7 @@ BytecodeScriptInfo &ACScriptInterpreter::scriptInfo(int scriptNumber) Str const *ACScriptInterpreter::string(int stringNumber) const { - DENG_ASSERT(stringNumber >= 0 && stringNumber < _stringCount); + DENG2_ASSERT(stringNumber >= 0 && stringNumber < _stringCount); return &_strings[stringNumber]; } @@ -378,7 +399,7 @@ void ACScriptInterpreter::clearDeferredTasks() { for(int i = 0; i < _deferredTasksSize; ++i) { - Uri_Delete(_deferredTasks[i].mapUri); + delete _deferredTasks[i]; } Z_Free(_deferredTasks); _deferredTasks = 0; _deferredTasksSize = 0; @@ -398,7 +419,7 @@ void ACScriptInterpreter::runDeferredTasks(Uri const *mapUri) int i = 0; while(i < _deferredTasksSize) { - DeferredTask *task = &_deferredTasks[i]; + DeferredTask *task = _deferredTasks[i]; int scriptNumber = task->scriptNumber; if(!Uri_Equality(task->mapUri, mapUri)) @@ -424,7 +445,7 @@ void ACScriptInterpreter::runDeferredTasks(Uri const *mapUri) App_Log(DE2_SCR_WARNING, "ACS: Unknown script #%i", scriptNumber); } - Uri_Delete(_deferredTasks[i].mapUri); + delete _deferredTasks[i]; _deferredTasksSize -= 1; if(i == _deferredTasksSize) @@ -437,7 +458,7 @@ void ACScriptInterpreter::runDeferredTasks(Uri const *mapUri) { if(_deferredTasksSize) { - _deferredTasks = (DeferredTask *) Z_Realloc(_deferredTasks, sizeof(DeferredTask) * _deferredTasksSize, PU_GAMESTATIC); + _deferredTasks = (DeferredTask **) Z_Realloc(_deferredTasks, sizeof(DeferredTask) * _deferredTasksSize, PU_GAMESTATIC); } else { @@ -479,7 +500,7 @@ void ACScriptInterpreter::writeWorldState(de::Writer &to) const to << _deferredTasksSize; for(int i = 0; i < _deferredTasksSize; ++i) { - to << _deferredTasks[i]; + to << *_deferredTasks[i]; } } @@ -496,10 +517,10 @@ void ACScriptInterpreter::readWorldState(de::Reader &from) from >> _deferredTasksSize; if(_deferredTasksSize) { - _deferredTasks = (DeferredTask *) Z_Realloc(_deferredTasks, sizeof(*_deferredTasks) * _deferredTasksSize, PU_GAMESTATIC); + _deferredTasks = (DeferredTask **) Z_Realloc(_deferredTasks, sizeof(*_deferredTasks) * _deferredTasksSize, PU_GAMESTATIC); for(int i = 0; i < _deferredTasksSize; ++i) { - from >> _deferredTasks[i]; + _deferredTasks[i] = DeferredTask::newFromReader(from); } } }