diff options
Diffstat (limited to 'engines/gob')
-rw-r--r-- | engines/gob/game.cpp | 85 | ||||
-rw-r--r-- | engines/gob/game.h | 15 | ||||
-rw-r--r-- | engines/gob/inter.h | 6 | ||||
-rw-r--r-- | engines/gob/inter_v1.cpp | 30 | ||||
-rw-r--r-- | engines/gob/inter_v2.cpp | 87 | ||||
-rw-r--r-- | engines/gob/mult.cpp | 26 | ||||
-rw-r--r-- | engines/gob/mult.h | 3 | ||||
-rw-r--r-- | engines/gob/mult_v2.cpp | 7 |
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; |