[Scummvm-cvs-logs] SF.net SVN: scummvm:[41754] scummvm/trunk/engines/gob
drmccoy at users.sourceforge.net
drmccoy at users.sourceforge.net
Mon Jun 22 12:14:19 CEST 2009
Revision: 41754
http://scummvm.svn.sourceforge.net/scummvm/?rev=41754&view=rev
Author: drmccoy
Date: 2009-06-22 10:14:18 +0000 (Mon, 22 Jun 2009)
Log Message:
-----------
Implemented a call stack
Modified Paths:
--------------
scummvm/trunk/engines/gob/draw.cpp
scummvm/trunk/engines/gob/game.cpp
scummvm/trunk/engines/gob/game_v1.cpp
scummvm/trunk/engines/gob/game_v2.cpp
scummvm/trunk/engines/gob/inter_v1.cpp
scummvm/trunk/engines/gob/inter_v6.cpp
scummvm/trunk/engines/gob/script.cpp
scummvm/trunk/engines/gob/script.h
Modified: scummvm/trunk/engines/gob/draw.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/draw.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -391,9 +391,8 @@
adjustCoords(1, &right, &bottom);
if (READ_LE_UINT16(_vm->_game->_script->getData() + 0x7E) != 0) {
- uint32 startPos = _vm->_game->_script->pos();
+ _vm->_game->_script->call(READ_LE_UINT16(_vm->_game->_script->getData() + 0x7E));
- _vm->_game->_script->seek(READ_LE_UINT16(_vm->_game->_script->getData() + 0x7E));
WRITE_VAR(17, (uint32) id);
WRITE_VAR(18, (uint32) left);
WRITE_VAR(19, (uint32) top);
@@ -401,7 +400,7 @@
WRITE_VAR(21, (uint32) (bottom - top + 1));
_vm->_inter->funcBlock(0);
- _vm->_game->_script->seek(startPos);
+ _vm->_game->_script->pop();
}
if (str[0] == '\0')
Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/game.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -732,10 +732,8 @@
if (((collArea->id & 0xC000) != 0x8000) || (collArea->funcSub == 0))
continue;
- uint32 startPos = _script->pos();
+ _script->call(collArea->funcSub);
- _script->seek(collArea->funcSub);
-
left = _script->readValExpr();
top = _script->readValExpr();
width = _script->readValExpr();
@@ -759,17 +757,15 @@
collArea->right = left + width - 1;
collArea->bottom = top + height - 1;
- _script->seek(startPos);
+ _script->pop();
}
}
void Game::collSub(uint16 offset) {
int16 collStackSize;
- uint32 startPos = _script->pos();
+ _script->call(offset);
- _script->seek(offset);
-
_shouldPushColls = 1;
collStackSize = _collStackSize;
@@ -780,7 +776,8 @@
_shouldPushColls = 0;
- _script->seek(startPos);
+ _script->pop();
+
setCollisions();
}
Modified: scummvm/trunk/engines/gob/game_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v1.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/game_v1.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -55,7 +55,7 @@
int16 *oldBreakFrom = _vm->_inter->_breakFromLevel;
int16 *oldCaptureCounter = _vm->_scenery->_pCaptureCounter;
- uint32 startPos = _script->pos();
+ _script->push();
_vm->_inter->_nestLevel = &nestLevel;
_vm->_inter->_breakFromLevel = &breakFrom;
@@ -242,7 +242,7 @@
_vm->_inter->_breakFromLevel = oldBreakFrom;
_vm->_scenery->_pCaptureCounter = oldCaptureCounter;
- _script->seek(startPos);
+ _script->pop();
}
void Game_v1::clearCollisions() {
@@ -358,13 +358,9 @@
_lastCollKey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex);
if ((_lastCollKey != 0) && ((_lastCollId & 0x8000) != 0)) {
- uint32 startPos = _script->pos();
-
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcEnter);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcEnter);
_vm->_inter->funcBlock(0);
-
- _script->seek(startPos);
+ _script->pop();
}
}
@@ -426,13 +422,9 @@
if ((_lastCollKey != 0) &&
(_collisionAreas[_lastCollAreaIndex].funcLeave != 0)) {
- uint32 startPos = _script->pos();
-
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcLeave);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcLeave);
_vm->_inter->funcBlock(0);
-
- _script->seek(startPos);
+ _script->pop();
}
_lastCollKey = 0;
@@ -467,13 +459,11 @@
if ((_lastCollKey != 0) &&
(_collisionAreas[_lastCollAreaIndex].funcLeave != 0)) {
- uint32 startPos = _script->pos();
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcLeave);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcLeave);
_vm->_inter->funcBlock(0);
+ _script->pop();
- _script->seek(startPos);
}
_lastCollKey = 0;
return key;
@@ -481,26 +471,22 @@
if ((_lastCollKey != 0) &&
(_collisionAreas[_lastCollAreaIndex].funcLeave != 0)) {
- uint32 startPos = _script->pos();
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcLeave);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcLeave);
_vm->_inter->funcBlock(0);
+ _script->pop();
- _script->seek(startPos);
}
_lastCollKey =
checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex);
if ((_lastCollKey != 0) && ((_lastCollId & 0x8000) != 0)) {
- uint32 startPos = _script->pos();
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcEnter);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcEnter);
_vm->_inter->funcBlock(0);
+ _script->pop();
- _script->seek(startPos);
}
} else {
@@ -514,24 +500,20 @@
if (key != _lastCollKey) {
if ((_lastCollKey != 0) && ((oldId & 0x8000) != 0)) {
- uint32 startPos = _script->pos();
- _script->seek(_collisionAreas[oldIndex].funcLeave);
-
+ _script->call(_collisionAreas[oldIndex].funcLeave);
_vm->_inter->funcBlock(0);
+ _script->pop();
- _script->seek(startPos);
}
_lastCollKey = key;
if ((_lastCollKey != 0) && ((_lastCollId & 0x8000) != 0)) {
- uint32 startPos = _script->pos();
- _script->seek(_collisionAreas[_lastCollAreaIndex].funcEnter);
-
+ _script->call(_collisionAreas[_lastCollAreaIndex].funcEnter);
_vm->_inter->funcBlock(0);
+ _script->pop();
- _script->seek(startPos);
}
}
Modified: scummvm/trunk/engines/gob/game_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v2.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/game_v2.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -62,7 +62,7 @@
oldBreakFrom = _vm->_inter->_breakFromLevel;
oldCaptureCounter = _vm->_scenery->_pCaptureCounter;
- uint32 startPos = _script->pos();
+ _script->push();
_vm->_inter->_nestLevel = &nestLevel;
_vm->_inter->_breakFromLevel = &breakFrom;
@@ -293,7 +293,7 @@
_vm->_inter->_breakFromLevel = oldBreakFrom;
_vm->_scenery->_pCaptureCounter = oldCaptureCounter;
- _script->seek(startPos);
+ _script->pop();
}
void Game_v2::clearCollisions() {
Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/inter_v1.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -638,12 +638,8 @@
}
bool Inter_v1::o1_callSub(OpFuncParams ¶ms) {
- uint16 offset;
+ uint16 offset = _vm->_game->_script->readUint16();
- offset = _vm->_game->_script->readUint16();
-
- uint32 startPos = _vm->_game->_script->pos();
-
debugC(5, kDebugGameFlow, "tot = \"%s\", offset = %d",
_vm->_game->_curTotFile, offset);
@@ -666,14 +662,16 @@
return false;
}
- _vm->_game->_script->seek(offset);
+ _vm->_game->_script->call(offset);
- if ((params.counter == params.cmdCount) && (params.retFlag == 2))
+ if ((params.counter == params.cmdCount) && (params.retFlag == 2)) {
+ _vm->_game->_script->pop(false);
return true;
+ }
callSub(2);
- _vm->_game->_script->seek(startPos);
+ _vm->_game->_script->pop();
return false;
}
@@ -714,18 +712,20 @@
checkSwitchTable(offset);
- uint32 startPos = _vm->_game->_script->pos();
+ _vm->_game->_script->call(offset);
- _vm->_game->_script->seek(offset);
if (offset == 0)
_vm->_game->_script->setFinished(true);
- if ((params.counter == params.cmdCount) && (params.retFlag == 2))
+ if ((params.counter == params.cmdCount) && (params.retFlag == 2)) {
+ _vm->_game->_script->pop(false);
return true;
+ }
funcBlock(0);
- _vm->_game->_script->seek(startPos);
+ _vm->_game->_script->pop();
+
return false;
}
@@ -804,11 +804,10 @@
if ((params.counter == params.cmdCount) && (params.retFlag == 2))
return true;
- uint32 startPos = _vm->_game->_script->pos();
+ _vm->_game->_script->push();
funcBlock(0);
+ _vm->_game->_script->pop();
- _vm->_game->_script->seek(startPos);
-
_vm->_game->_script->skip(_vm->_game->_script->peekUint16(2) + 2);
debugC(5, kDebugGameFlow, "cmd = %d", (int16) _vm->_game->_script->peekByte());
@@ -830,12 +829,10 @@
if ((params.counter == params.cmdCount) && (params.retFlag == 2))
return true;
- uint32 startPos = _vm->_game->_script->pos();
-
+ _vm->_game->_script->push();
funcBlock(0);
+ _vm->_game->_script->pop();
- _vm->_game->_script->seek(startPos);
-
_vm->_game->_script->skip(_vm->_game->_script->peekUint16(2) + 2);
}
return false;
Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/inter_v6.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -263,14 +263,14 @@
if (size != 0) {
int16 src;
- uint32 startPos = _vm->_game->_script->pos();
+ _vm->_game->_script->push();
src = _vm->_game->_script->readVarIndex(&size, 0);
memcpy(_vm->_inter->_variables->getAddressOff8(dest),
_vm->_inter->_variables->getAddressOff8(src), size * 4);
- _vm->_game->_script->seek(startPos);
+ _vm->_game->_script->pop();
evalExpr(&src);
Modified: scummvm/trunk/engines/gob/script.cpp
===================================================================
--- scummvm/trunk/engines/gob/script.cpp 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/script.cpp 2009-06-22 10:14:18 UTC (rev 41754)
@@ -358,4 +358,33 @@
_totSize = totSize;
}
+void Script::push() {
+ CallEntry currentCall;
+
+ currentCall.totData = _totData;
+ currentCall.totPtr = _totPtr;
+ currentCall.totSize = _totSize;
+ currentCall.finished = _finished;
+
+ _callStack.push(currentCall);
+}
+
+void Script::pop(bool ret) {
+ assert(!_callStack.empty());
+
+ CallEntry lastCall = _callStack.pop();
+
+ if (ret) {
+ _totData = lastCall.totData;
+ _totPtr = lastCall.totPtr;
+ _totSize = lastCall.totSize;
+ _finished = lastCall.finished;
+ }
+}
+
+void Script::call(uint32 offset) {
+ push();
+ seek(offset);
+}
+
} // End of namespace Gob
Modified: scummvm/trunk/engines/gob/script.h
===================================================================
--- scummvm/trunk/engines/gob/script.h 2009-06-22 10:13:37 UTC (rev 41753)
+++ scummvm/trunk/engines/gob/script.h 2009-06-22 10:14:18 UTC (rev 41754)
@@ -27,6 +27,7 @@
#define GOB_SCRIPT_H
#include "common/str.h"
+#include "common/stack.h"
namespace Gob {
@@ -89,6 +90,10 @@
void cuckoo(byte *totData, uint32 totSize);
+ void push();
+ void pop(bool ret = true);
+ void call(uint32 offset);
+
/* byte *loadExtData(int16 dataId, int16 *pResWidth, int16 *pResHeight, uint32 *dataSize = 0);
byte *loadTotResource(int16 id, int16 *dataSize = 0, int16 *width = 0, int16 *height = 0);
@@ -100,6 +105,13 @@
int16 openLocTextFile(char *locTextFile, int language);*/
private:
+ struct CallEntry {
+ byte *totData;
+ byte *totPtr;
+ uint32 totSize;
+ bool finished;
+ };
+
GobEngine *_vm;
Parse *_parser;
@@ -115,6 +127,8 @@
int16 _lomHandle;
+ Common::Stack<CallEntry> _callStack;
+
bool loadTOT(const Common::String &fileName);
bool loadLOM(const Common::String &fileName);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list