From: Tom <rtp...@us...> - 2010-05-30 23:33:17
|
gemrb: Infinity Engine emulator The branch master has been updated via 9c6ba6a2dd3539d17b54286ea1a945619723acee (commit) via 4d0eb142f5f77719ada5c0ad1b8c29a4ed55c8e6 (commit) via 53046f83be0c00f7a124b021a6f2ab415db9f731 (commit) via b249ee7c9626cb682ca42fbb4b1705184eed21c9 (commit) Summary of changes: gemrb/core/GameScript.cpp | 106 +++++++++++++++++--------------------------- gemrb/core/GameScript.h | 69 ++++++----------------------- 2 files changed, 55 insertions(+), 120 deletions(-) from 75635261b15b22ebfabec00abde2c20784d5ba9c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=9c6ba6a2dd3539d17b54286ea1a945619723acee commit 9c6ba6a2dd3539d17b54286ea1a945619723acee Author: Tom Prince <tom...@ua...> Date: Sun May 30 14:53:44 2010 -0400 GameScript: Add another deque. diff --git a/gemrb/core/GameScript.cpp b/gemrb/core/GameScript.cpp index 78c2e9a..43d7595 100644 --- a/gemrb/core/GameScript.cpp +++ b/gemrb/core/GameScript.cpp @@ -1486,18 +1486,13 @@ Script* GameScript::CacheScript(ieResRef ResRef, bool AIScript) printf("Caching %s for the %d. time\n", ResRef, BcsCache.RefCount(ResRef) ); } - std::vector< ResponseBlock*> rBv; while (true) { ResponseBlock* rB = ReadResponseBlock( stream ); if (!rB) break; - rBv.push_back( rB ); + newScript->responseBlocks.push_back( rB ); stream->ReadLine( line, 10 ); } - newScript->AllocateBlocks( ( unsigned int ) rBv.size() ); - for (unsigned int i = 0; i < newScript->responseBlocksCount; i++) { - newScript->responseBlocks[i] = rBv.at( i ); - } delete( stream ); return newScript; } @@ -1652,7 +1647,7 @@ bool GameScript::Update(bool *continuing, bool *done) if (continuing) continueExecution = *continuing; RandomNumValue=rand(); - for (unsigned int a = 0; a < script->responseBlocksCount; a++) { + for (size_t a = 0; a < script->responseBlocks.size(); a++) { ResponseBlock* rB = script->responseBlocks[a]; if (rB->condition->Evaluate(MySelf)) { //if this isn't a continue-d block, we have to clear the queue @@ -1714,7 +1709,7 @@ void GameScript::EvaluateAllBlocks() //functionality, so i kept the gemrb specific code too. #ifdef GEMRB_CUTSCENES //this is the logical way of executing a cutscene - for (unsigned int a = 0; a < script->responseBlocksCount; a++) { + for (size_t a = 0; a < script->responseBlocks.size(); a++) { ResponseBlock* rB = script->responseBlocks[a]; if (rB->Condition->Evaluate(MySelf)) { rB->Execute(MySelf); @@ -1722,7 +1717,7 @@ void GameScript::EvaluateAllBlocks() } #else //this is the apparent IE behaviour - for (unsigned int a = 0; a < script->responseBlocksCount; a++) { + for (size_t a = 0; a < script->responseBlocks.size(); a++) { ResponseBlock* rB = script->responseBlocks[a]; ResponseSet * rS = rB->responseSet; if (rS->responses.size()) { diff --git a/gemrb/core/GameScript.h b/gemrb/core/GameScript.h index 6fd173e..5e9f6df 100644 --- a/gemrb/core/GameScript.h +++ b/gemrb/core/GameScript.h @@ -463,40 +463,18 @@ public: Script() { canary = (unsigned long) 0xdeadbeef; - responseBlocks = NULL; - responseBlocksCount = 0; } ~Script() { - FreeResponseBlocks(); - } - void AllocateBlocks(unsigned int count) - { - if (!count) { - FreeResponseBlocks(); - responseBlocks = NULL; - responseBlocksCount = 0; - } - responseBlocks = new ResponseBlock * [count]; - responseBlocksCount = count; - } -private: - void FreeResponseBlocks() - { - if (!responseBlocks) { - return; - } - for (unsigned int i = 0; i < responseBlocksCount; i++) { + for (unsigned int i = 0; i < responseBlocks.size(); i++) { if (responseBlocks[i]) { responseBlocks[i]->Release(); responseBlocks[i] = NULL; } } - delete[] responseBlocks; } public: - unsigned int responseBlocksCount; - ResponseBlock** responseBlocks; + std::deque<ResponseBlock*> responseBlocks; private: volatile unsigned long canary; public: http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=4d0eb142f5f77719ada5c0ad1b8c29a4ed55c8e6 commit 4d0eb142f5f77719ada5c0ad1b8c29a4ed55c8e6 Author: Tom Prince <tom...@ua...> Date: Sun May 30 14:46:46 2010 -0400 GameScript: Change Response and ResponseSet to vector/::Execute. Signed-off-by: Tom Prince <tom...@ua...> diff --git a/gemrb/core/GameScript.cpp b/gemrb/core/GameScript.cpp index 521af89..78c2e9a 100644 --- a/gemrb/core/GameScript.cpp +++ b/gemrb/core/GameScript.cpp @@ -1686,8 +1686,7 @@ bool GameScript::Update(bool *continuing, bool *done) } lastAction=a; } - continueExecution = ( ExecuteResponseSet( MySelf, - rB->responseSet ) != 0 ); + continueExecution = ( rB->responseSet->Execute(MySelf) != 0); if (continuing) *continuing = continueExecution; //clear triggers after response executed //MySelf->ClearTriggers(); @@ -1718,7 +1717,7 @@ void GameScript::EvaluateAllBlocks() for (unsigned int a = 0; a < script->responseBlocksCount; a++) { ResponseBlock* rB = script->responseBlocks[a]; if (rB->Condition->Evaluate(MySelf)) { - ExecuteResponseSet( MySelf, rB->responseSet ); + rB->Execute(MySelf); } } #else @@ -1726,8 +1725,8 @@ void GameScript::EvaluateAllBlocks() for (unsigned int a = 0; a < script->responseBlocksCount; a++) { ResponseBlock* rB = script->responseBlocks[a]; ResponseSet * rS = rB->responseSet; - if (rS->responsesCount) { - ExecuteResponse( MySelf, rS->responses[0] ); + if (rS->responses.size()) { + rS->responses[0]->Execute(MySelf); } } #endif @@ -1756,17 +1755,11 @@ ResponseSet* GameScript::ReadResponseSet(DataStream* stream) return NULL; } ResponseSet* rS = new ResponseSet(); - std::vector< Response*> rEv; while (true) { Response* rE = ReadResponse( stream ); if (!rE) break; - rEv.push_back( rE ); - } - rS->responsesCount = ( unsigned short ) rEv.size(); - rS->responses = new Response * [rS->responsesCount]; - for (int i = 0; i < rS->responsesCount; i++) { - rS->responses[i] = rEv.at( i ); + rS->responses.push_back( rE ); } return rS; } @@ -1786,7 +1779,6 @@ Response* GameScript::ReadResponse(DataStream* stream) int count = stream->ReadLine( line, 1024 ); char *poi; rE->weight = (unsigned char)strtoul(line,&poi,10); - std::vector< Action*> aCv; if (strncmp(poi,"AC",2)==0) while (true) { //not autofreed, because it is referenced by the Script @@ -1815,17 +1807,12 @@ Response* GameScript::ReadResponse(DataStream* stream) aC->int0Parameter = scriptlevel; } } - aCv.push_back( aC ); + rE->actions.push_back( aC ); stream->ReadLine( line, 1024 ); if (strncmp( line, "RE", 2 ) == 0) break; } free( line ); - rE->actionsCount = ( unsigned char ) aCv.size(); - rE->actions = new Action* [rE->actionsCount]; - for (int i = 0; i < rE->actionsCount; i++) { - rE->actions[i] = aCv.at( i ); - } return rE; } @@ -2993,22 +2980,22 @@ int Trigger::Evaluate(Scriptable* Sender) return ret; } -int GameScript::ExecuteResponseSet(Scriptable* Sender, ResponseSet* rS) +int ResponseSet::Execute(Scriptable* Sender) { - int i; + size_t i; - switch(rS->responsesCount) { + switch(responses.size()) { case 0: return 0; case 1: - return ExecuteResponse( Sender, rS->responses[0] ); + return responses[0]->Execute(Sender); } /*default*/ int randWeight; int maxWeight = 0; - for (i = 0; i < rS->responsesCount; i++) { - maxWeight+=rS->responses[i]->weight; + for (i = 0; i < responses.size(); i++) { + maxWeight += responses[i]->weight; } if (maxWeight) { randWeight = rand() % maxWeight; @@ -3017,10 +3004,10 @@ int GameScript::ExecuteResponseSet(Scriptable* Sender, ResponseSet* rS) randWeight = 0; } - for (i = 0; i < rS->responsesCount; i++) { - Response* rE = rS->responses[i]; + for (i = 0; i < responses.size(); i++) { + Response* rE = responses[i]; if (rE->weight > randWeight) { - return ExecuteResponse( Sender, rE ); + return rE->Execute(Sender); /* this break is only symbolic */ break; } @@ -3030,14 +3017,14 @@ int GameScript::ExecuteResponseSet(Scriptable* Sender, ResponseSet* rS) } //continue is effective only as the last action in the block -int GameScript::ExecuteResponse(Scriptable* Sender, Response* rE) +int Response::Execute(Scriptable* Sender) { int ret = 0; // continue or not - for (int i = 0; i < rE->actionsCount; i++) { - Action* aC = rE->actions[i]; + for (size_t i = 0; i < actions.size(); i++) { + Action* aC = actions[i]; switch (actionflags[aC->actionID] & AF_MASK) { case AF_INSTANT: - ExecuteAction( Sender, aC ); + GameScript::ExecuteAction( Sender, aC ); ret = 0; break; case AF_NONE: diff --git a/gemrb/core/GameScript.h b/gemrb/core/GameScript.h index 9597db2..6fd173e 100644 --- a/gemrb/core/GameScript.h +++ b/gemrb/core/GameScript.h @@ -368,17 +368,12 @@ class GEM_EXPORT Response { public: Response() { - actions = NULL; weight = 0; - actionsCount = 0; canary = (unsigned long) 0xdeadbeef; } ~Response() { - if (!actions) { - return; - } - for (int c = 0; c < actionsCount; c++) { + for (size_t c = 0; c < actions.size(); c++) { if (actions[c]) { if (actions[c]->GetRef()>2) { printf("Residue action %d with refcount %d\n", actions[c]->actionID, actions[c]->GetRef()); @@ -387,12 +382,11 @@ public: actions[c] = NULL; } } - delete[] actions; } + int Execute(Scriptable* Sender); public: unsigned char weight; - unsigned char actionsCount; - Action** actions; + std::vector<Action*> actions; private: volatile unsigned long canary; public: @@ -408,24 +402,18 @@ class GEM_EXPORT ResponseSet { public: ResponseSet() { - responses = NULL; - responsesCount = 0; canary = (unsigned long) 0xdeadbeef; } ~ResponseSet() { - if (!responses) { - return; - } - for (int b = 0; b < responsesCount; b++) { + for (size_t b = 0; b < responses.size(); b++) { responses[b]->Release(); responses[b] = NULL; } - delete[] responses; } + int Execute(Scriptable* Sender); public: - unsigned short responsesCount; - Response** responses; + std::vector<Response*> responses; private: volatile unsigned long canary; public: @@ -619,8 +607,6 @@ private: //Internal Functions ResponseSet* ReadResponseSet(DataStream* stream); Response* ReadResponse(DataStream* stream); Trigger* ReadTrigger(DataStream* stream); - int ExecuteResponseSet(Scriptable* Sender, ResponseSet* rS); - int ExecuteResponse(Scriptable* Sender, Response* rE); static int ParseInt(const char*& src); static void ParseString(const char*& src, char* tmp); private: //Internal variables http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=53046f83be0c00f7a124b021a6f2ab415db9f731 commit 53046f83be0c00f7a124b021a6f2ab415db9f731 Author: Tom Prince <tom...@ua...> Date: Sun May 30 13:15:18 2010 -0400 GameScript: Move Trigger/Condition evaluation into those classes. Signed-off-by: Tom Prince <tom...@ua...> diff --git a/gemrb/core/GameScript.cpp b/gemrb/core/GameScript.cpp index 6b7b8d9..521af89 100644 --- a/gemrb/core/GameScript.cpp +++ b/gemrb/core/GameScript.cpp @@ -1654,7 +1654,7 @@ bool GameScript::Update(bool *continuing, bool *done) RandomNumValue=rand(); for (unsigned int a = 0; a < script->responseBlocksCount; a++) { ResponseBlock* rB = script->responseBlocks[a]; - if (EvaluateCondition( MySelf, rB->condition )) { + if (rB->condition->Evaluate(MySelf)) { //if this isn't a continue-d block, we have to clear the queue //we cannot clear the queue and cannot execute the new block //if we already have stuff on the queue! @@ -1717,7 +1717,7 @@ void GameScript::EvaluateAllBlocks() //this is the logical way of executing a cutscene for (unsigned int a = 0; a < script->responseBlocksCount; a++) { ResponseBlock* rB = script->responseBlocks[a]; - if (EvaluateCondition( MySelf, rB->condition )) { + if (rB->Condition->Evaluate(MySelf)) { ExecuteResponseSet( MySelf, rB->responseSet ); } } @@ -2916,25 +2916,25 @@ int GameScript::EvaluateString(Scriptable* Sender, char* String) } Trigger* tri = GenerateTrigger( String ); if (tri) { - int ret = EvaluateTrigger( Sender, tri ); + int ret = tri->Evaluate(Sender); tri->Release(); return ret; } return 0; } -bool GameScript::EvaluateCondition(Scriptable* Sender, Condition* condition) +bool Condition::Evaluate(Scriptable* Sender) { int ORcount = 0; unsigned int result = 0; bool subresult = true; - for (size_t i = 0; i < condition->triggers.size(); i++) { - Trigger* tR = condition->triggers[i]; + for (size_t i = 0; i < triggers.size(); i++) { + Trigger* tR = triggers[i]; //do not evaluate triggers in an Or() block if one of them //was already True() if (!ORcount || !subresult) { - result = EvaluateTrigger( Sender, tR ); + result = tR->Evaluate(Sender); } if (result > 1) { //we started an Or() block @@ -2963,31 +2963,31 @@ bool GameScript::EvaluateCondition(Scriptable* Sender, Condition* condition) } /* this may return more than a boolean, in case of Or(x) */ -int GameScript::EvaluateTrigger(Scriptable* Sender, Trigger* trigger) +int Trigger::Evaluate(Scriptable* Sender) { - if (!trigger) { + if (!this) { printMessage( "GameScript","Trigger evaluation fails due to NULL trigger.\n",LIGHT_RED ); return 0; } - TriggerFunction func = triggers[trigger->triggerID]; - const char *tmpstr=triggersTable->GetValue(trigger->triggerID); + TriggerFunction func = triggers[triggerID]; + const char *tmpstr=triggersTable->GetValue(triggerID); if (!tmpstr) { - tmpstr=triggersTable->GetValue(trigger->triggerID|0x4000); + tmpstr=triggersTable->GetValue(triggerID|0x4000); } if (!func) { - triggers[trigger->triggerID] = False; + triggers[triggerID] = GameScript::False; printMessage("GameScript"," ",YELLOW); printf("Unhandled trigger code: 0x%04x %s\n", - trigger->triggerID, tmpstr ); + triggerID, tmpstr ); return 0; } if (InDebug&ID_TRIGGERS) { printMessage("GameScript"," ",YELLOW); printf( "Executing trigger code: 0x%04x %s\n", - trigger->triggerID, tmpstr ); + triggerID, tmpstr ); } - int ret = func( Sender, trigger ); - if (trigger->flags & NEGATE_TRIGGER) { + int ret = func( Sender, this ); + if (flags & NEGATE_TRIGGER) { return !ret; } return ret; diff --git a/gemrb/core/GameScript.h b/gemrb/core/GameScript.h index 6f4c72b..9597db2 100644 --- a/gemrb/core/GameScript.h +++ b/gemrb/core/GameScript.h @@ -205,6 +205,7 @@ public: objectParameter = NULL; } } + int Evaluate(Scriptable* Sender); public: unsigned short triggerID; int int0Parameter; @@ -257,6 +258,7 @@ public: } } } + bool Evaluate(Scriptable* Sender); public: std::vector<Trigger*> triggers; private: @@ -617,8 +619,6 @@ private: //Internal Functions ResponseSet* ReadResponseSet(DataStream* stream); Response* ReadResponse(DataStream* stream); Trigger* ReadTrigger(DataStream* stream); - bool EvaluateCondition(Scriptable* Sender, Condition* condition); - static int EvaluateTrigger(Scriptable* Sender, Trigger* trigger); int ExecuteResponseSet(Scriptable* Sender, ResponseSet* rS); int ExecuteResponse(Scriptable* Sender, Response* rE); static int ParseInt(const char*& src); http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=b249ee7c9626cb682ca42fbb4b1705184eed21c9 commit b249ee7c9626cb682ca42fbb4b1705184eed21c9 Author: Tom Prince <tom...@ua...> Date: Sun May 30 12:13:39 2010 -0400 GameScript: Store triggers in a vector. Signed-off-by: Tom Prince <tom...@ua...> diff --git a/gemrb/core/GameScript.cpp b/gemrb/core/GameScript.cpp index 78ea0c8..6b7b8d9 100644 --- a/gemrb/core/GameScript.cpp +++ b/gemrb/core/GameScript.cpp @@ -1615,17 +1615,11 @@ static Condition* ReadCondition(DataStream* stream) return NULL; } Condition* cO = new Condition(); - std::vector< Trigger*> tRv; while (true) { Trigger* tR = ReadTrigger( stream ); if (!tR) break; - tRv.push_back( tR ); - } - cO->triggersCount = ( unsigned short ) tRv.size(); - cO->triggers = new Trigger * [cO->triggersCount]; - for (int i = 0; i < cO->triggersCount; i++) { - cO->triggers[i] = tRv.at( i ); + cO->triggers.push_back( tR ); } return cO; } @@ -2935,7 +2929,7 @@ bool GameScript::EvaluateCondition(Scriptable* Sender, Condition* condition) unsigned int result = 0; bool subresult = true; - for (int i = 0; i < condition->triggersCount; i++) { + for (size_t i = 0; i < condition->triggers.size(); i++) { Trigger* tR = condition->triggers[i]; //do not evaluate triggers in an Or() block if one of them //was already True() diff --git a/gemrb/core/GameScript.h b/gemrb/core/GameScript.h index 502367d..6f4c72b 100644 --- a/gemrb/core/GameScript.h +++ b/gemrb/core/GameScript.h @@ -31,6 +31,8 @@ class Action; #include "SymbolMgr.h" #include "Actor.h" +#include <vector> + //escapearea flags #define EA_DESTROY 1 //destroy actor at the exit (otherwise move to new place) #define EA_NOSEE 2 //no need to see the exit @@ -244,26 +246,19 @@ class GEM_EXPORT Condition { public: Condition() { - triggers = NULL; - triggersCount = 0; canary = (unsigned long) 0xdeadbeef; } ~Condition() { - if (!triggers) { - return; - } - for (int c = 0; c < triggersCount; c++) { + for (size_t c = 0; c < triggers.size(); ++c) { if (triggers[c]) { triggers[c]->Release(); triggers[c] = NULL; } } - delete[] triggers; } public: - unsigned short triggersCount; - Trigger** triggers; + std::vector<Trigger*> triggers; private: volatile unsigned long canary; public: ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |