aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
authorSven Hesse2006-04-13 20:56:22 +0000
committerSven Hesse2006-04-13 20:56:22 +0000
commit3bed2d377e8431aa94334f7bc9c307875c229c54 (patch)
tree703cc095bd196ad7f386e36adb3abe601318ea70 /engines/gob
parente21f99c7baeb99f794ba70b7fead9b2588d93cc0 (diff)
downloadscummvm-rg350-3bed2d377e8431aa94334f7bc9c307875c229c54.tar.gz
scummvm-rg350-3bed2d377e8431aa94334f7bc9c307875c229c54.tar.bz2
scummvm-rg350-3bed2d377e8431aa94334f7bc9c307875c229c54.zip
Some more stubs and rearrangings
svn-id: r21847
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/game.cpp85
-rw-r--r--engines/gob/game.h15
-rw-r--r--engines/gob/inter.h6
-rw-r--r--engines/gob/inter_v1.cpp30
-rw-r--r--engines/gob/inter_v2.cpp87
-rw-r--r--engines/gob/mult.cpp26
-rw-r--r--engines/gob/mult.h3
-rw-r--r--engines/gob/mult_v2.cpp7
8 files changed, 203 insertions, 56 deletions
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 32d3d9bce6..c3c47be306 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -87,6 +87,22 @@ Game::Game(GobEngine *vm) : _vm(vm) {
_curImaFile[0] = 0;
_soundFromExt[0] = 0;
_collStr[0] = 0;
+
+ _backupedCount = 0;
+ _curBackupPos = 0;
+
+ for (i = 0; i < 5; i++) {
+ _cursorXDeltaArray[i] = 0;
+ _cursorYDeltaArray[i] = 0;
+ _totTextDataArray[i] = 0;
+ _totFileDataArray[i] = 0;
+ _totResourceTableArray[i] = 0;
+ _extTableArray[i] = 0;
+ _extHandleArray[i] = 0;
+ _imFileDataArray[i] = 0;
+ _variablesArray[i] = 0;
+ _curTotFileArray[i][0] = 0;
+ }
}
char *Game::loadExtData(int16 itemId, int16 *pResWidth, int16 *pResHeight) {
@@ -1929,4 +1945,73 @@ void Game::start(void) {
_vm->_video->freeSurfDesc(_vm->_draw->_backSurface);
}
+// flagbits: 0 = freeInterVariables, 1 = skipPlay
+void Game::totSub(int8 flags, char *newTotFile) {
+ int8 curBackupPos;
+
+ warning("totSub(%d, \"%s\");", flags, newTotFile);
+
+ if (_backupedCount >= 5)
+ return;
+
+ _cursorXDeltaArray[_backupedCount] = _vm->_draw->_cursorXDeltaVar;
+ _cursorYDeltaArray[_backupedCount] = _vm->_draw->_cursorYDeltaVar;
+ _totTextDataArray[_backupedCount] = _totTextData;
+ _totFileDataArray[_backupedCount] = _totFileData;
+ _totResourceTableArray[_backupedCount] = _totResourceTable;
+ _extTableArray[_backupedCount] = _extTable;
+ _extHandleArray[_backupedCount] = _extHandle;
+ _imFileDataArray[_backupedCount] = _imFileData;
+ _variablesArray[_backupedCount] = _vm->_global->_inter_variables;
+ strcpy(_curTotFileArray[_backupedCount], _curTotFile);
+
+ curBackupPos = _curBackupPos;
+ _backupedCount++;
+ _curBackupPos = _backupedCount;
+
+ _totTextData = 0;
+ _totFileData = 0;
+ _totResourceTable = 0;
+ if (flags & 1)
+ _vm->_global->_inter_variables = 0;
+
+ strcpy(_curTotFile, newTotFile);
+ strcat(_curTotFile, ".TOT");
+
+ if (_vm->_inter->_terminate != 0)
+ return;
+
+ pushCollisions(0);
+
+ if (flags & 2)
+ playTot(-1);
+ else
+ playTot(0);
+
+ if (_vm->_inter->_terminate != 2)
+ _vm->_inter->_terminate = 0;
+
+ warning("GOB2 Stub! sub_18072");
+
+ if ((flags & 1) && (_vm->_global->_inter_variables != 0))
+ delete[] _vm->_global->_inter_variables;
+
+ _backupedCount--;
+ _curBackupPos = curBackupPos;
+
+ _vm->_draw->_cursorXDeltaVar = _cursorXDeltaArray[_backupedCount];
+ _vm->_draw->_cursorYDeltaVar = _cursorYDeltaArray[_backupedCount];
+ _totTextData = _totTextDataArray[_backupedCount];
+ _totFileData = _totFileDataArray[_backupedCount];
+ _totResourceTable = _totResourceTableArray[_backupedCount];
+ _extTable = _extTableArray[_backupedCount];
+ _extHandle = _extHandleArray[_backupedCount];
+ _imFileData = _imFileDataArray[_backupedCount];
+ _vm->_global->_inter_variables = _variablesArray[_backupedCount];
+ strcpy(_curTotFile, _curTotFileArray[_backupedCount]);
+ strcpy(_curExtFile, _curTotFile);
+ _curExtFile[strlen(_curExtFile)-4] = '\0';
+ strcat(_curExtFile, ".EXT");
+}
+
} // End of namespace Gob
diff --git a/engines/gob/game.h b/engines/gob/game.h
index 3b81163853..2e13d229d2 100644
--- a/engines/gob/game.h
+++ b/engines/gob/game.h
@@ -117,6 +117,20 @@ public:
char _soundFromExt[20];
+ // For totSub()
+ int8 _backupedCount;
+ int8 _curBackupPos;
+ int16 _cursorXDeltaArray[5];
+ int16 _cursorYDeltaArray[5];
+ TotTextTable *_totTextDataArray[5];
+ char *_totFileDataArray[5];
+ TotResTable *_totResourceTableArray[5];
+ ExtTable *_extTableArray[5];
+ int16 _extHandleArray[5];
+ char *_imFileDataArray[5];
+ char *_variablesArray[5];
+ char _curTotFileArray[5][14];
+
Game(GobEngine *vm);
char *loadExtData(int16 dataId, int16 *pResWidth, int16 *pResHeight);
@@ -148,6 +162,7 @@ public:
void loadImFile(void);
void playTot(int16 skipPlay);
void start(void);
+ void totSub(int8 flags, char *newTotFile);
protected:
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 46730f140d..e28bfb5e41 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -76,6 +76,7 @@ protected:
virtual const char *getOpcodeDrawDesc(byte i) = 0;
virtual const char *getOpcodeFuncDesc(byte i, byte j) = 0;
virtual const char *getOpcodeGoblinDesc(int i) = 0;
+ virtual void loadMult(void) = 0;
};
class Inter_v1 : public Inter {
@@ -112,6 +113,7 @@ protected:
virtual const char *getOpcodeDrawDesc(byte i);
virtual const char *getOpcodeFuncDesc(byte i, byte j);
virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void loadMult(void);
void o1_loadMult(void);
void o1_playMult(void);
@@ -301,9 +303,11 @@ protected:
virtual const char *getOpcodeDrawDesc(byte i);
virtual const char *getOpcodeFuncDesc(byte i, byte j);
virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void loadMult(void);
void o2_drawStub(void) { warning("Gob2 stub"); }
- void o2_stub0x40(void);
+ void o2_totSub(void);
+ void o2_stub0x56(void);
void o2_stub0x80(void);
bool o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag);
bool o2_palLoad(char &cmdCount, int16 &counter, int16 &retFlag);
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 047de35350..5aa91ba7b2 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -1323,6 +1323,9 @@ bool Inter_v1::o1_keyFunc(char &cmdCount, int16 &counter, int16 &retFlag) {
int16 flag;
int16 key;
+ // Gob2 busy-waits here, so add a delay
+ _vm->_util->longDelay(1);
+
flag = load16();
animPalette();
_vm->_draw->blitInvalidated();
@@ -1562,7 +1565,7 @@ void Inter_v1::o1_animate(void) {
}
void Inter_v1::o1_multLoadMult(void) {
- _vm->_mult->interLoadMult();
+ loadMult();
}
void Inter_v1::o1_storeParams(void) {
@@ -2725,4 +2728,29 @@ int16 Inter_v1::loadSound(int16 slot) {
return 0;
}
+void Inter_v1::loadMult(void) {
+ int16 val;
+ int16 objIndex;
+ int16 i;
+ char *lmultData;
+
+ debugC(4, DEBUG_GAMEFLOW, "Inter_v1::loadMult(): Loading...");
+
+ evalExpr(&objIndex);
+ evalExpr(&val);
+ *_vm->_mult->_objects[objIndex].pPosX = val;
+ evalExpr(&val);
+ *_vm->_mult->_objects[objIndex].pPosY = val;
+
+ lmultData = (char *)_vm->_mult->_objects[objIndex].pAnimData;
+ for (i = 0; i < 11; i++) {
+ if ((char)READ_LE_UINT16(_vm->_global->_inter_execPtr) == (char)99) {
+ evalExpr(&val);
+ lmultData[i] = val;
+ } else {
+ _vm->_global->_inter_execPtr++;
+ }
+ }
+}
+
} // End of namespace Gob
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 2f5a084f22..5b2876d787 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -20,6 +20,10 @@
* $Id$
*
*/
+
+#include "common/stdafx.h"
+#include "common/endian.h"
+
#include "gob/gob.h"
#include "gob/global.h"
#include "gob/inter.h"
@@ -199,7 +203,7 @@ void Inter_v2::setupOpcodes(void) {
{NULL, ""},
{NULL, ""},
/* 40 */
- OPCODE(o2_stub0x40),
+ OPCODE(o2_totSub),
OPCODE(o2_drawStub),
OPCODE(o2_drawStub),
OPCODE(o2_drawStub),
@@ -226,7 +230,7 @@ void Inter_v2::setupOpcodes(void) {
/* 54 */
OPCODE(o2_drawStub),
OPCODE(o2_drawStub),
- OPCODE(o2_drawStub),
+ OPCODE(o2_stub0x56),
{NULL, ""},
/* 58 */
{NULL, ""},
@@ -706,29 +710,13 @@ const char *Inter_v2::getOpcodeGoblinDesc(int i) {
return "";
}
-void Inter_v2::o2_stub0x40(void) {
- char str[18];
- int i;
- int length;
-
- warning("STUB: Gob2 drawOperation 0x40");
-
- length = *_vm->_global->_inter_execPtr++;
- if (length > 17)
- error("Length in o2_stub0x40 is greater than 17 (%d)", length);
- if (length & 0x80) {
- evalExpr(0);
- strcpy(str, _vm->_global->_inter_resStr);
- } else { // loc_E8CE
- for (i = 0; i < length; i++) // loc_E8E3
- str[i] = *_vm->_global->_inter_execPtr++;
- str[i] = 0;
- }
-
- // loc_E910
+void Inter_v2::o2_stub0x56(void) {
+ int16 expr1 = _vm->_parse->parseValExpr();
+ int16 expr2 = _vm->_parse->parseValExpr();
+ int16 expr3 = _vm->_parse->parseValExpr();
+ int16 expr4 = _vm->_parse->parseValExpr();
- _vm->_global->_inter_execPtr++;
- warning("GOB2 Stub! sub_A6EB(%d, \"%s\");", *_vm->_global->_inter_execPtr, str);
+ warning("STUB: Gob2 drawOperation 0x56 (%d %d %d %d)", expr1, expr2, expr3, expr4);
}
void Inter_v2::o2_stub0x80(void) {
@@ -892,6 +880,32 @@ int16 Inter_v2::loadSound(int16 search) {
_vm->_game->loadSound(slot, dataPtr);*/
}
+void Inter_v2::loadMult(void) {
+ int16 val;
+ int16 objIndex;
+ int16 i;
+ char *lmultData;
+
+ debugC(4, DEBUG_GAMEFLOW, "Inter_v2::loadMult(): Loading...");
+
+ objIndex = _vm->_parse->parseValExpr();
+ val = _vm->_parse->parseValExpr();
+ *_vm->_mult->_objects[objIndex].pPosX = val;
+ val = _vm->_parse->parseValExpr();
+ *_vm->_mult->_objects[objIndex].pPosY = val;
+
+ lmultData = (char *)_vm->_mult->_objects[objIndex].pAnimData;
+ for (i = 0; i < 11; i++) {
+ if (*_vm->_global->_inter_execPtr != 99) {
+ val = _vm->_parse->parseValExpr();
+ lmultData[i] = val;
+ } else
+ _vm->_global->_inter_execPtr++;
+ }
+
+ warning("GOB2 Stub! Inter_v2::loadMult()");
+}
+
bool Inter_v2::o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag) {
char *savedPos;
int16 varOff;
@@ -1345,4 +1359,29 @@ void Inter_v2::o2_playMult(void) {
_vm->_mult->playMult(VAR(57), -1, checkEscape & 0x1, 0);
}
+void Inter_v2::o2_totSub(void) {
+ char totFile[14];
+ int flags;
+ int length;
+ int i;
+
+ length = *_vm->_global->_inter_execPtr++;
+ if (length > 13)
+ error("Length in o2_totSub is greater than 13 (%d)", length);
+ if (length & 0x80) {
+ evalExpr(0);
+ strcpy(totFile, _vm->_global->_inter_resStr);
+ } else { // loc_E8CE
+ for (i = 0; i < length; i++) // loc_E8E3
+ totFile[i] = *_vm->_global->_inter_execPtr++;
+ totFile[i] = 0;
+ }
+
+ // loc_E910
+
+ _vm->_global->_inter_execPtr++;
+ flags = *_vm->_global->_inter_execPtr;
+ _vm->_game->totSub(flags, totFile);
+}
+
} // End of namespace Gob
diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp
index 4f856377c0..ea043d5d1a 100644
--- a/engines/gob/mult.cpp
+++ b/engines/gob/mult.cpp
@@ -120,6 +120,7 @@ Mult::Mult(GobEngine *vm) : _vm(vm) {
}
_orderArray = 0;
+ _word_2CC88 = -1;
}
void Mult::interGetObjAnimSize(void) {
@@ -151,31 +152,6 @@ void Mult::freeMult(void) {
_vm->_anim->_animSurf = 0;
}
-void Mult::interLoadMult(void) {
- int16 val;
- int16 objIndex;
- int16 i;
- char *lmultData;
-
- debugC(4, DEBUG_GAMEFLOW, "interLoadMult: Loading...");
-
- _vm->_inter->evalExpr(&objIndex);
- _vm->_inter->evalExpr(&val);
- *_objects[objIndex].pPosX = val;
- _vm->_inter->evalExpr(&val);
- *_objects[objIndex].pPosY = val;
-
- lmultData = (char *)_objects[objIndex].pAnimData;
- for (i = 0; i < 11; i++) {
- if ((char)READ_LE_UINT16(_vm->_global->_inter_execPtr) == (char)99) {
- _vm->_inter->evalExpr(&val);
- lmultData[i] = val;
- } else {
- _vm->_global->_inter_execPtr++;
- }
- }
-}
-
void Mult::freeAll(void) {
int16 i;
diff --git a/engines/gob/mult.h b/engines/gob/mult.h
index d073248ce0..14df0d01c6 100644
--- a/engines/gob/mult.h
+++ b/engines/gob/mult.h
@@ -186,11 +186,12 @@ public:
int8 *_orderArray;
+ int16 _word_2CC88;
+
void zeroMultData(void);
void checkFreeMult(void);
void interGetObjAnimSize(void);
void freeMult(void);
- void interLoadMult(void);
void freeAll(void);
void initAll(void);
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 921ba59451..d78abaf3e3 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -864,7 +864,6 @@ void Mult_v2::animate(void) {
int numAnims = 0; // di
// .-----
int off_2CE67 = 1000;
- int word_2CC88 = 1;
// '-----
if (_objects == 0)
@@ -987,8 +986,8 @@ void Mult_v2::animate(void) {
}
}
- warning("GOB2 Stub! word_2CC88");
- if (word_2CC88 >= 0) {
+ warning("GOB2 Stub! _word_2CC88");
+ if (_word_2CC88 >= 0) {
for (i = 0; i < orderArrayPos; i++) {
animObj1 = _renderData2[orderArray[i]];
for (j = i+1; j < orderArrayPos; j++) {
@@ -1061,7 +1060,7 @@ void Mult_v2::animate(void) {
if (animData1->maxTick == animObj1->tick) {
animObj1->tick = 0;
- if ((animData1->animType < 100) || (word_2CC88 < 0)) {
+ if ((animData1->animType < 100) || (_word_2CC88 < 0)) {
if (animData1->animType == 4) {
animData1->frame = 0;
animData1->isPaused = 1;