- Properly implemented o2_getCDTrackPos()
- Each save has now its own file (.s??). They also should be endian-safe now (Can be disabled for testing by uncommenting #define GOB_ORIGSAVES in gob.cpp) - General endianness-fixes svn-id: r24794
This commit is contained in:
parent
b2fb23a134
commit
9afb08341c
24 changed files with 633 additions and 170 deletions
|
@ -215,6 +215,10 @@ int32 CDROM::getTrackPos(void) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *CDROM::getCurTrack(void) {
|
||||||
|
return _curTrack;
|
||||||
|
}
|
||||||
|
|
||||||
void CDROM::stopPlaying(void) {
|
void CDROM::stopPlaying(void) {
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ public:
|
||||||
void playMultMusic();
|
void playMultMusic();
|
||||||
void play(uint32 from, uint32 to);
|
void play(uint32 from, uint32 to);
|
||||||
int32 getTrackPos(void);
|
int32 getTrackPos(void);
|
||||||
|
const char *getCurTrack(void);
|
||||||
void stopPlaying(void);
|
void stopPlaying(void);
|
||||||
void stop(void);
|
void stop(void);
|
||||||
void testCD(int trySubst, const char *label);
|
void testCD(int trySubst, const char *label);
|
||||||
|
|
|
@ -154,7 +154,7 @@ void Draw_v1::printText(void) {
|
||||||
} else if (cmd == 1) {
|
} else if (cmd == 1) {
|
||||||
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
||||||
|
|
||||||
strcpy(buf, _vm->_global->_inter_variables + val);
|
strcpy(buf, GET_VARO_STR(val));
|
||||||
} else {
|
} else {
|
||||||
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
||||||
|
|
||||||
|
|
|
@ -403,7 +403,7 @@ void Draw_v2::printText(void) {
|
||||||
sprintf(buf, "%d", VAR_OFFSET(val));
|
sprintf(buf, "%d", VAR_OFFSET(val));
|
||||||
} else if (cmd == 1) {
|
} else if (cmd == 1) {
|
||||||
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
||||||
strcpy(buf, _vm->_global->_inter_variables + val);
|
strcpy(buf, GET_VARO_STR(val));
|
||||||
} else {
|
} else {
|
||||||
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
val = READ_LE_UINT16(ptr2 + 18) * 4;
|
||||||
sprintf(buf, "%d", VAR_OFFSET(val));
|
sprintf(buf, "%d", VAR_OFFSET(val));
|
||||||
|
@ -714,7 +714,7 @@ void Draw_v2::spriteOperation(int16 operation) {
|
||||||
left = _destSpriteX;
|
left = _destSpriteX;
|
||||||
if ((_fontIndex >= 4) || (_fontToSprite[_fontIndex].sprite == -1)) {
|
if ((_fontIndex >= 4) || (_fontToSprite[_fontIndex].sprite == -1)) {
|
||||||
if (_fonts[_fontIndex]->extraData == 0) {
|
if (_fonts[_fontIndex]->extraData == 0) {
|
||||||
if (((signed) _textToPrint[0]) == -1) {
|
if (((signed int) _textToPrint[0]) == -1) {
|
||||||
dataBuf = _vm->_game->_totTextData->dataPtr + _textToPrint[1] + 1;
|
dataBuf = _vm->_game->_totTextData->dataPtr + _textToPrint[1] + 1;
|
||||||
len = *dataBuf++;
|
len = *dataBuf++;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
|
@ -895,12 +895,14 @@ void Draw_v2::animateCursor(int16 cursor) {
|
||||||
|
|
||||||
_showCursor |= 2;
|
_showCursor |= 2;
|
||||||
|
|
||||||
|
/*
|
||||||
if (((_backSurface->width - 9) < _vm->_global->_inter_mouseX) ||
|
if (((_backSurface->width - 9) < _vm->_global->_inter_mouseX) ||
|
||||||
((_backSurface->height - 4) < _vm->_global->_inter_mouseY)) {
|
((_backSurface->height - 4) < _vm->_global->_inter_mouseY)) {
|
||||||
_vm->_global->_inter_mouseX = MIN((int) _vm->_global->_inter_mouseX, _backSurface->width - 9);
|
_vm->_global->_inter_mouseX = MIN((int) _vm->_global->_inter_mouseX, _backSurface->width - 9);
|
||||||
_vm->_global->_inter_mouseY = MIN((int) _vm->_global->_inter_mouseY, _backSurface->height - 4);
|
_vm->_global->_inter_mouseY = MIN((int) _vm->_global->_inter_mouseY, _backSurface->height - 4);
|
||||||
_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
|
_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// .-- _draw_animateCursorSUB1 ---
|
// .-- _draw_animateCursorSUB1 ---
|
||||||
cursorIndex = cursor;
|
cursorIndex = cursor;
|
||||||
|
|
|
@ -472,6 +472,7 @@ void Game::totSub(int8 flags, char *newTotFile) {
|
||||||
_extHandleArray[_backupedCount] = _extHandle;
|
_extHandleArray[_backupedCount] = _extHandle;
|
||||||
_imFileDataArray[_backupedCount] = _imFileData;
|
_imFileDataArray[_backupedCount] = _imFileData;
|
||||||
_variablesArray[_backupedCount] = _vm->_global->_inter_variables;
|
_variablesArray[_backupedCount] = _vm->_global->_inter_variables;
|
||||||
|
_variablesSizesArray[_backupedCount] = _vm->_global->_inter_variablesSizes;
|
||||||
strcpy(_curTotFileArray[_backupedCount], _curTotFile);
|
strcpy(_curTotFileArray[_backupedCount], _curTotFile);
|
||||||
|
|
||||||
curBackupPos = _curBackupPos;
|
curBackupPos = _curBackupPos;
|
||||||
|
@ -481,8 +482,10 @@ void Game::totSub(int8 flags, char *newTotFile) {
|
||||||
_totTextData = 0;
|
_totTextData = 0;
|
||||||
_totFileData = 0;
|
_totFileData = 0;
|
||||||
_totResourceTable = 0;
|
_totResourceTable = 0;
|
||||||
if (flags & 1)
|
if (flags & 1) {
|
||||||
_vm->_global->_inter_variables = 0;
|
_vm->_global->_inter_variables = 0;
|
||||||
|
_vm->_global->_inter_variablesSizes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
strcpy(_curTotFile, newTotFile);
|
strcpy(_curTotFile, newTotFile);
|
||||||
strcat(_curTotFile, ".TOT");
|
strcat(_curTotFile, ".TOT");
|
||||||
|
@ -502,8 +505,10 @@ void Game::totSub(int8 flags, char *newTotFile) {
|
||||||
|
|
||||||
popCollisions();
|
popCollisions();
|
||||||
|
|
||||||
if ((flags & 1) && (_vm->_global->_inter_variables != 0))
|
if ((flags & 1) && (_vm->_global->_inter_variables != 0)) {
|
||||||
delete[] _vm->_global->_inter_variables;
|
delete[] _vm->_global->_inter_variables;
|
||||||
|
delete[] _vm->_global->_inter_variablesSizes;
|
||||||
|
}
|
||||||
|
|
||||||
_backupedCount--;
|
_backupedCount--;
|
||||||
_curBackupPos = curBackupPos;
|
_curBackupPos = curBackupPos;
|
||||||
|
@ -517,6 +522,7 @@ void Game::totSub(int8 flags, char *newTotFile) {
|
||||||
_extHandle = _extHandleArray[_backupedCount];
|
_extHandle = _extHandleArray[_backupedCount];
|
||||||
_imFileData = _imFileDataArray[_backupedCount];
|
_imFileData = _imFileDataArray[_backupedCount];
|
||||||
_vm->_global->_inter_variables = _variablesArray[_backupedCount];
|
_vm->_global->_inter_variables = _variablesArray[_backupedCount];
|
||||||
|
_vm->_global->_inter_variablesSizes = _variablesSizesArray[_backupedCount];
|
||||||
strcpy(_curTotFile, _curTotFileArray[_backupedCount]);
|
strcpy(_curTotFile, _curTotFileArray[_backupedCount]);
|
||||||
strcpy(_curExtFile, _curTotFile);
|
strcpy(_curExtFile, _curTotFile);
|
||||||
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
||||||
|
@ -542,6 +548,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) {
|
||||||
_extHandleArray[_backupedCount] = _extHandle;
|
_extHandleArray[_backupedCount] = _extHandle;
|
||||||
_imFileDataArray[_backupedCount] = _imFileData;
|
_imFileDataArray[_backupedCount] = _imFileData;
|
||||||
_variablesArray[_backupedCount] = _vm->_global->_inter_variables;
|
_variablesArray[_backupedCount] = _vm->_global->_inter_variables;
|
||||||
|
_variablesSizesArray[_backupedCount] = _vm->_global->_inter_variablesSizes;
|
||||||
strcpy(_curTotFileArray[_backupedCount], _curTotFile);
|
strcpy(_curTotFileArray[_backupedCount], _curTotFile);
|
||||||
_backupedCount++;
|
_backupedCount++;
|
||||||
}
|
}
|
||||||
|
@ -558,6 +565,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) {
|
||||||
_extTable = _extTableArray[_curBackupPos];
|
_extTable = _extTableArray[_curBackupPos];
|
||||||
_extHandle = _extHandleArray[_curBackupPos];
|
_extHandle = _extHandleArray[_curBackupPos];
|
||||||
_vm->_global->_inter_variables = _variablesArray[_curBackupPos];
|
_vm->_global->_inter_variables = _variablesArray[_curBackupPos];
|
||||||
|
_vm->_global->_inter_variablesSizes = _variablesSizesArray[_curBackupPos];
|
||||||
strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
|
strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
|
||||||
strcpy(_curExtFile, _curTotFile);
|
strcpy(_curExtFile, _curTotFile);
|
||||||
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
||||||
|
@ -585,6 +593,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) {
|
||||||
_extHandle = _extHandleArray[_curBackupPos];
|
_extHandle = _extHandleArray[_curBackupPos];
|
||||||
_imFileData = _imFileDataArray[_curBackupPos];
|
_imFileData = _imFileDataArray[_curBackupPos];
|
||||||
_vm->_global->_inter_variables = _variablesArray[_curBackupPos];
|
_vm->_global->_inter_variables = _variablesArray[_curBackupPos];
|
||||||
|
_vm->_global->_inter_variablesSizes = _variablesSizesArray[_curBackupPos];
|
||||||
strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
|
strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
|
||||||
strcpy(_curExtFile, _curTotFile);
|
strcpy(_curExtFile, _curTotFile);
|
||||||
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
_curExtFile[strlen(_curExtFile)-4] = '\0';
|
||||||
|
|
|
@ -169,6 +169,7 @@ public:
|
||||||
char *_imFileDataArray[5];
|
char *_imFileDataArray[5];
|
||||||
char *_variablesArray[5];
|
char *_variablesArray[5];
|
||||||
char _curTotFileArray[5][14];
|
char _curTotFileArray[5][14];
|
||||||
|
byte *_variablesSizesArray[5];
|
||||||
|
|
||||||
Imd *_imdFile;
|
Imd *_imdFile;
|
||||||
char _curImdFile[15];
|
char _curImdFile[15];
|
||||||
|
|
|
@ -55,9 +55,9 @@ void Game_v1::playTot(int16 skipPlay) {
|
||||||
int16 breakFrom;
|
int16 breakFrom;
|
||||||
int16 nestLevel;
|
int16 nestLevel;
|
||||||
int32 variablesCount;
|
int32 variablesCount;
|
||||||
|
int32 i;
|
||||||
char *filePtr;
|
char *filePtr;
|
||||||
char *savedIP;
|
char *savedIP;
|
||||||
int16 i;
|
|
||||||
|
|
||||||
if (skipPlay < 0)
|
if (skipPlay < 0)
|
||||||
skipPlay = 0;
|
skipPlay = 0;
|
||||||
|
@ -172,6 +172,7 @@ void Game_v1::playTot(int16 skipPlay) {
|
||||||
if (_vm->_global->_inter_variables == 0) {
|
if (_vm->_global->_inter_variables == 0) {
|
||||||
variablesCount = READ_LE_UINT32((char *)_totFileData + 0x2c);
|
variablesCount = READ_LE_UINT32((char *)_totFileData + 0x2c);
|
||||||
_vm->_global->_inter_variables = new char[variablesCount * 4];
|
_vm->_global->_inter_variables = new char[variablesCount * 4];
|
||||||
|
_vm->_global->_inter_variablesSizes = new byte[variablesCount * 4];
|
||||||
for (i = 0; i < variablesCount; i++)
|
for (i = 0; i < variablesCount; i++)
|
||||||
WRITE_VAR(i, 0);
|
WRITE_VAR(i, 0);
|
||||||
}
|
}
|
||||||
|
@ -1079,20 +1080,19 @@ void Game_v1::collisionsBlock(void) {
|
||||||
|
|
||||||
if ((_collisionAreas[i].flags & 0x0f) > 8) {
|
if ((_collisionAreas[i].flags & 0x0f) > 8) {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
strcpy(_tempStr,
|
strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
|
||||||
_vm->_global->_inter_variables + _collisionAreas[i].key);
|
|
||||||
while ((ptr = strchr(_tempStr, ' ')) != 0) {
|
while ((ptr = strchr(_tempStr, ' ')) != 0) {
|
||||||
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
|
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
|
||||||
ptr = strchr(_tempStr, ' ');
|
ptr = strchr(_tempStr, ' ');
|
||||||
}
|
}
|
||||||
strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
|
WRITE_VARO_STR(_collisionAreas[i].key, _tempStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
|
if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
|
||||||
(_collisionAreas[i].flags & 0x0f) <= 8) {
|
(_collisionAreas[i].flags & 0x0f) <= 8) {
|
||||||
str = descArray[var_24].ptr;
|
str = descArray[var_24].ptr;
|
||||||
|
|
||||||
strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
|
strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
|
||||||
|
|
||||||
if ((_collisionAreas[i].flags & 0x0f) < 7)
|
if ((_collisionAreas[i].flags & 0x0f) < 7)
|
||||||
_vm->_util->prepareStr(_tempStr);
|
_vm->_util->prepareStr(_tempStr);
|
||||||
|
@ -1171,7 +1171,7 @@ int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
if ((collArea->flags & 0x0f) > 10)
|
if ((collArea->flags & 0x0f) > 10)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
|
strcpy(_tempStr, GET_VARO_STR(collArea->key));
|
||||||
|
|
||||||
_vm->_draw->_destSpriteX = collArea->left;
|
_vm->_draw->_destSpriteX = collArea->left;
|
||||||
_vm->_draw->_destSpriteY = collArea->top;
|
_vm->_draw->_destSpriteY = collArea->top;
|
||||||
|
@ -1193,9 +1193,8 @@ int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
descInd++;
|
descInd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 40; i++) {
|
for (i = 0; i < 40; i++)
|
||||||
WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
|
WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
descInd = 0;
|
descInd = 0;
|
||||||
|
@ -1231,8 +1230,8 @@ int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
collArea->right - collArea->left + 1,
|
collArea->right - collArea->left + 1,
|
||||||
collArea->bottom - collArea->top + 1,
|
collArea->bottom - collArea->top + 1,
|
||||||
inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
|
inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
|
||||||
_vm->_global->_inter_variables + collArea->key,
|
GET_VARO_STR(collArea->key), inpDesc[*pCurPos].fontIndex,
|
||||||
inpDesc[*pCurPos].fontIndex, collArea->flags, &time, collResId, collIndex);
|
collArea->flags, &time, collResId, collIndex);
|
||||||
|
|
||||||
if (_vm->_inter->_terminate)
|
if (_vm->_inter->_terminate)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -55,9 +55,9 @@ void Game_v2::playTot(int16 skipPlay) {
|
||||||
int16 nestLevel;
|
int16 nestLevel;
|
||||||
int32 variablesCount;
|
int32 variablesCount;
|
||||||
int32 totSize;
|
int32 totSize;
|
||||||
|
int32 i;
|
||||||
char *filePtr;
|
char *filePtr;
|
||||||
char *savedIP;
|
char *savedIP;
|
||||||
int16 i;
|
|
||||||
|
|
||||||
oldNestLevel = _vm->_inter->_nestLevel;
|
oldNestLevel = _vm->_inter->_nestLevel;
|
||||||
oldBreakFrom = _vm->_inter->_breakFromLevel;
|
oldBreakFrom = _vm->_inter->_breakFromLevel;
|
||||||
|
@ -199,7 +199,9 @@ void Game_v2::playTot(int16 skipPlay) {
|
||||||
if (_vm->_global->_inter_variables == 0) {
|
if (_vm->_global->_inter_variables == 0) {
|
||||||
variablesCount = READ_LE_UINT32((char *)_totFileData + 0x2c);
|
variablesCount = READ_LE_UINT32((char *)_totFileData + 0x2c);
|
||||||
_vm->_global->_inter_variables = new char[variablesCount * 4];
|
_vm->_global->_inter_variables = new char[variablesCount * 4];
|
||||||
memset(_vm->_global->_inter_variables, 0, variablesCount * 4);
|
_vm->_global->_inter_variablesSizes = new byte[variablesCount * 4];
|
||||||
|
for (i = 0; i < variablesCount; i++)
|
||||||
|
WRITE_VAR(i, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
_vm->_global->_inter_execPtr = (char *)_totFileData;
|
_vm->_global->_inter_execPtr = (char *)_totFileData;
|
||||||
|
@ -479,6 +481,7 @@ int16 Game_v2::checkCollisions(char handleMouse, int16 deltaTime, int16 *pResId,
|
||||||
&_mouseButtons, handleMouse);
|
&_mouseButtons, handleMouse);
|
||||||
|
|
||||||
// TODO: What of this is needed?
|
// TODO: What of this is needed?
|
||||||
|
// Scrolling?
|
||||||
int16 width;
|
int16 width;
|
||||||
int16 height;
|
int16 height;
|
||||||
int16 sWidth;
|
int16 sWidth;
|
||||||
|
@ -1145,13 +1148,12 @@ void Game_v2::collisionsBlock(void) {
|
||||||
|
|
||||||
if ((_collisionAreas[i].flags & 0x0f) > 8) {
|
if ((_collisionAreas[i].flags & 0x0f) > 8) {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
strcpy(_tempStr,
|
strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
|
||||||
_vm->_global->_inter_variables + _collisionAreas[i].key);
|
|
||||||
while ((ptr = strchr(_tempStr, ' ')) != 0) {
|
while ((ptr = strchr(_tempStr, ' ')) != 0) {
|
||||||
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
|
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
|
||||||
ptr = strchr(_tempStr, ' ');
|
ptr = strchr(_tempStr, ' ');
|
||||||
}
|
}
|
||||||
strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
|
WRITE_VARO_STR(_collisionAreas[i].key, _tempStr);
|
||||||
if (_vm->_language == 2) { // loc_16080
|
if (_vm->_language == 2) { // loc_16080
|
||||||
warning("GOB2 Stub! Game_v2::collisionsBlock(), language == 2");
|
warning("GOB2 Stub! Game_v2::collisionsBlock(), language == 2");
|
||||||
}
|
}
|
||||||
|
@ -1161,7 +1163,7 @@ void Game_v2::collisionsBlock(void) {
|
||||||
(_collisionAreas[i].flags & 0x0f) <= 8) {
|
(_collisionAreas[i].flags & 0x0f) <= 8) {
|
||||||
str = descArray[var_24].ptr;
|
str = descArray[var_24].ptr;
|
||||||
|
|
||||||
strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
|
strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
|
||||||
|
|
||||||
if ((_collisionAreas[i].flags & 0x0f) < 7)
|
if ((_collisionAreas[i].flags & 0x0f) < 7)
|
||||||
_vm->_util->prepareStr(_tempStr);
|
_vm->_util->prepareStr(_tempStr);
|
||||||
|
@ -1250,7 +1252,7 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
if ((collArea->flags & 0x0F) > 10)
|
if ((collArea->flags & 0x0F) > 10)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
|
strcpy(_tempStr, GET_VARO_STR(collArea->key));
|
||||||
|
|
||||||
_vm->_draw->_destSpriteX = collArea->left;
|
_vm->_draw->_destSpriteX = collArea->left;
|
||||||
_vm->_draw->_destSpriteY = collArea->top;
|
_vm->_draw->_destSpriteY = collArea->top;
|
||||||
|
@ -1281,9 +1283,8 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
descInd++;
|
descInd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 40; i++) {
|
for (i = 0; i < 40; i++)
|
||||||
WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
|
WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
descInd = 0;
|
descInd = 0;
|
||||||
|
@ -1319,8 +1320,8 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * in
|
||||||
collArea->right - collArea->left + 1,
|
collArea->right - collArea->left + 1,
|
||||||
collArea->bottom - collArea->top + 1,
|
collArea->bottom - collArea->top + 1,
|
||||||
inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
|
inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
|
||||||
_vm->_global->_inter_variables + collArea->key,
|
GET_VARO_STR(collArea->key), inpDesc[*pCurPos].fontIndex,
|
||||||
inpDesc[*pCurPos].fontIndex, collArea->flags, &time, collResId, collIndex);
|
collArea->flags, &time, collResId, collIndex);
|
||||||
|
|
||||||
if (_vm->_inter->_terminate)
|
if (_vm->_inter->_terminate)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -141,6 +141,7 @@ Global::Global(GobEngine *vm) : _vm(vm) {
|
||||||
_inter_resStr[0] = 0;
|
_inter_resStr[0] = 0;
|
||||||
_inter_resVal = 0;
|
_inter_resVal = 0;
|
||||||
|
|
||||||
|
_inter_variablesSizes = 0;
|
||||||
_inter_variables = 0;
|
_inter_variables = 0;
|
||||||
_inter_execPtr = 0;
|
_inter_execPtr = 0;
|
||||||
_inter_animDataSize = 10;
|
_inter_animDataSize = 10;
|
||||||
|
|
|
@ -155,6 +155,7 @@ public:
|
||||||
char _inter_resStr[200];
|
char _inter_resStr[200];
|
||||||
int32 _inter_resVal;
|
int32 _inter_resVal;
|
||||||
|
|
||||||
|
byte *_inter_variablesSizes; // 0: single byte, 1: two bytes, 3: four bytes
|
||||||
char *_inter_variables;
|
char *_inter_variables;
|
||||||
char *_inter_execPtr;
|
char *_inter_execPtr;
|
||||||
int16 _inter_animDataSize;
|
int16 _inter_animDataSize;
|
||||||
|
@ -162,10 +163,63 @@ public:
|
||||||
int16 _inter_mouseX;
|
int16 _inter_mouseX;
|
||||||
int16 _inter_mouseY;
|
int16 _inter_mouseY;
|
||||||
|
|
||||||
|
inline void writeVarSizeStr(uint32 offset, uint32 len) {
|
||||||
|
uint32 i;
|
||||||
|
uint32 inVar;
|
||||||
|
uint32 varOff;
|
||||||
|
|
||||||
|
inVar = offset % 4;
|
||||||
|
varOff = (offset >> 2) << 2;
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
if (_inter_variablesSizes[varOff + i] == 3)
|
||||||
|
_inter_variablesSizes[varOff + i] = 0;
|
||||||
|
else if ((inVar == (i+1)) && (_inter_variablesSizes[varOff + i] == 1))
|
||||||
|
_inter_variablesSizes[varOff + i] = 0;
|
||||||
|
}
|
||||||
|
memset(_inter_variablesSizes + offset, 0, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void writeVar(uint32 offset, uint32 val) {
|
||||||
|
(*(uint32 *)(_inter_variables + offset)) = val;
|
||||||
|
writeVarSize(offset, 3);
|
||||||
|
}
|
||||||
|
inline void writeVar(uint32 offset, uint16 val) {
|
||||||
|
(*(uint16 *)(_inter_variables + offset)) = val;
|
||||||
|
writeVarSize(offset, 1);
|
||||||
|
}
|
||||||
|
inline void writeVar(uint32 offset, uint8 val) {
|
||||||
|
(*(uint8 *)(_inter_variables + offset)) = val;
|
||||||
|
writeVarSize(offset, 0);
|
||||||
|
}
|
||||||
|
inline void writeVar(uint32 offset, const char *str) {
|
||||||
|
writeVarSizeStr(offset, strlen(str));
|
||||||
|
strcpy(_inter_variables + offset, str);
|
||||||
|
}
|
||||||
|
|
||||||
Global(GobEngine *vm);
|
Global(GobEngine *vm);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
GobEngine *_vm;
|
GobEngine *_vm;
|
||||||
|
|
||||||
|
inline void writeVarSize(uint32 offset, byte n) {
|
||||||
|
uint32 i;
|
||||||
|
uint32 inVar;
|
||||||
|
uint32 varOff;
|
||||||
|
|
||||||
|
inVar = offset % 4;
|
||||||
|
varOff = (offset >> 2) << 2;
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
if (_inter_variablesSizes[varOff + i] == 3)
|
||||||
|
_inter_variablesSizes[varOff + i] = 0;
|
||||||
|
else if ((inVar == (i+1)) && (_inter_variablesSizes[varOff + i] == 1))
|
||||||
|
_inter_variablesSizes[varOff + i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_inter_variablesSizes[offset] = n;
|
||||||
|
for (; n > 0; n--)
|
||||||
|
_inter_variablesSizes[offset + n] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace Gob
|
} // End of namespace Gob
|
||||||
|
|
|
@ -50,6 +50,10 @@
|
||||||
|
|
||||||
#include "sound/mididrv.h"
|
#include "sound/mididrv.h"
|
||||||
|
|
||||||
|
// Use the original saves. Just for testing purposes, will be removed later
|
||||||
|
// The new method is more convenient, and, more importantly, endian-safe
|
||||||
|
//#define GOB_ORIGSAVES
|
||||||
|
|
||||||
namespace Gob {
|
namespace Gob {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -176,6 +180,10 @@ GobEngine::GobEngine(OSystem * syst, uint32 features, Common::Language lang,
|
||||||
sprintf(_saveFiles[0], "%s.cat", _targetName.c_str());
|
sprintf(_saveFiles[0], "%s.cat", _targetName.c_str());
|
||||||
sprintf(_saveFiles[1], "%s.sav", _targetName.c_str());
|
sprintf(_saveFiles[1], "%s.sav", _targetName.c_str());
|
||||||
sprintf(_saveFiles[2], "%s.blo", _targetName.c_str());
|
sprintf(_saveFiles[2], "%s.blo", _targetName.c_str());
|
||||||
|
_saveSlotFile = new char[_targetName.size() + 5];
|
||||||
|
sprintf(_saveSlotFile, "%s.s00", _targetName.c_str());
|
||||||
|
memset(_saveIndex, 0, 600);
|
||||||
|
memset(_saveIndexSizes, 0, 600);
|
||||||
|
|
||||||
Common::addSpecialDebugLevel(DEBUG_FUNCOP, "FuncOpcodes", "Script FuncOpcodes debug level");
|
Common::addSpecialDebugLevel(DEBUG_FUNCOP, "FuncOpcodes", "Script FuncOpcodes debug level");
|
||||||
Common::addSpecialDebugLevel(DEBUG_DRAWOP, "DrawOpcodes", "Script DrawOpcodes debug level");
|
Common::addSpecialDebugLevel(DEBUG_DRAWOP, "DrawOpcodes", "Script DrawOpcodes debug level");
|
||||||
|
@ -216,6 +224,7 @@ GobEngine::~GobEngine() {
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
delete[] _saveFiles[i];
|
delete[] _saveFiles[i];
|
||||||
delete[] _saveFiles;
|
delete[] _saveFiles;
|
||||||
|
delete[] _saveSlotFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GobEngine::go() {
|
int GobEngine::go() {
|
||||||
|
@ -228,11 +237,6 @@ void GobEngine::shutdown() {
|
||||||
_quitRequested = true;
|
_quitRequested = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GobEngine::writeVarDebug(uint32 offs, uint32 v) {
|
|
||||||
warning("Setting var %u(%u) to %u", offs, offs >> 2, v);
|
|
||||||
(*(uint32 *)(_global->_inter_variables + (offs))) = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Seeking with SEEK_END (and therefore also pos()) doesn't work with
|
// Seeking with SEEK_END (and therefore also pos()) doesn't work with
|
||||||
// gzip'd save files, so reading the whole thing in is necessary
|
// gzip'd save files, so reading the whole thing in is necessary
|
||||||
uint32 GobEngine::getSaveSize(Common::InSaveFile &in) {
|
uint32 GobEngine::getSaveSize(Common::InSaveFile &in) {
|
||||||
|
@ -255,22 +259,44 @@ int32 GobEngine::getSaveSize(enum SaveFiles sFile) {
|
||||||
int32 size;
|
int32 size;
|
||||||
Common::InSaveFile *in;
|
Common::InSaveFile *in;
|
||||||
|
|
||||||
|
size = -1;
|
||||||
|
#ifndef GOB_ORIGSAVES
|
||||||
|
int i;
|
||||||
|
if (sFile == SAVE_CAT) {
|
||||||
|
for (i = 14; i >= 0; i--)
|
||||||
|
if ((in = _saveFileMan->openForLoading(getSaveSlotFile(i)))) {
|
||||||
|
size = (i + 1) * READ_LE_UINT32(_game->_totFileData + 0x2C) * 4 + 600;
|
||||||
|
delete in;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
debugC(1, DEBUG_FILEIO, "Requested save games size: %d", size);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
#endif // GOB_ORIGSAVES
|
||||||
|
|
||||||
if ((in = _saveFileMan->openForLoading(_saveFiles[(int) sFile]))) {
|
if ((in = _saveFileMan->openForLoading(_saveFiles[(int) sFile]))) {
|
||||||
size = getSaveSize(*in);
|
size = getSaveSize(*in);
|
||||||
delete in;
|
delete in;
|
||||||
} else
|
}
|
||||||
size = -1;
|
|
||||||
|
|
||||||
debugC(1, DEBUG_FILEIO, "Requested size of file \"%s\": %d", _saveFiles[(int) sFile], size);
|
debugC(1, DEBUG_FILEIO, "Requested size of file \"%s\": %d", _saveFiles[(int) sFile], size);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset) {
|
const char *GobEngine::getSaveSlotFile(int slot) {
|
||||||
|
static char *slotBase = _saveSlotFile + strlen(_targetName.c_str()) + 2;
|
||||||
|
|
||||||
|
snprintf(slotBase, 3, "%02d", slot);
|
||||||
|
return _saveSlotFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GobEngine::saveGameData(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset) {
|
||||||
int32 retSize;
|
int32 retSize;
|
||||||
int16 index;
|
int16 index;
|
||||||
int16 top;
|
int16 top;
|
||||||
bool writePal;
|
bool writePal;
|
||||||
|
bool needEnforceEndian;
|
||||||
char *sName;
|
char *sName;
|
||||||
char *buf;
|
char *buf;
|
||||||
char *oBuf;
|
char *oBuf;
|
||||||
|
@ -287,9 +313,9 @@ void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
in = 0;
|
in = 0;
|
||||||
writePal = false;
|
writePal = false;
|
||||||
sName = _saveFiles[(int) sFile];
|
sName = _saveFiles[(int) sFile];
|
||||||
|
needEnforceEndian = false;
|
||||||
|
|
||||||
// WRITE_VAR(1, 1)
|
WRITE_VAR(1, 1);
|
||||||
*((uint32*)(_global->_inter_variables + 4)) = 1;
|
|
||||||
|
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
if (size < -1000) {
|
if (size < -1000) {
|
||||||
|
@ -302,12 +328,26 @@ void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
size = _draw->getSpriteRectSize(index);
|
size = _draw->getSpriteRectSize(index);
|
||||||
if ((_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
if ((_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
||||||
size = -size;
|
size = -size;
|
||||||
} else if (size == 0) {
|
} else {
|
||||||
dataVar = 0;
|
int32 varSize = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
||||||
size = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
|
||||||
buf = _global->_inter_variables;
|
if (size == 0) {
|
||||||
} else
|
dataVar = 0;
|
||||||
|
size = varSize;
|
||||||
|
}
|
||||||
buf = _global->_inter_variables + dataVar;
|
buf = _global->_inter_variables + dataVar;
|
||||||
|
#ifndef GOB_ORIGSAVES
|
||||||
|
if (sFile == SAVE_CAT) {
|
||||||
|
if(saveGame((offset - 600) / varSize, dataVar, size, offset))
|
||||||
|
WRITE_VAR(1, 0);
|
||||||
|
return;
|
||||||
|
} else if (offset != 0) {
|
||||||
|
warning("Can't write file \"%s\": Can't correctly enfore endianness with offset", sName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
needEnforceEndian = true;
|
||||||
|
#endif // GOB_ORIGSAVES
|
||||||
|
}
|
||||||
|
|
||||||
if ((in = _saveFileMan->openForLoading(sName)))
|
if ((in = _saveFileMan->openForLoading(sName)))
|
||||||
iSize = getSaveSize(*in);
|
iSize = getSaveSize(*in);
|
||||||
|
@ -325,7 +365,7 @@ void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(out = _saveFileMan->openForSaving(sName))) {
|
if(!(out = _saveFileMan->openForSaving(sName))) {
|
||||||
warning("Can't write file \"%s\"", sName);
|
warning("Can't open file \"%s\" for writing", sName);
|
||||||
delete[] oBuf;
|
delete[] oBuf;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -335,21 +375,25 @@ void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
oOff += 768;
|
oOff += 768;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < 0) {
|
if (!needEnforceEndian) {
|
||||||
srcDesc = _draw->_spritesArray[index];
|
if (size < 0) {
|
||||||
destDesc = _video->initSurfDesc(_global->_videoMode, srcDesc->width, 25, 0);
|
srcDesc = _draw->_spritesArray[index];
|
||||||
for (top = 0, retSize = 0; top < srcDesc->height; top += 25) {
|
destDesc = _video->initSurfDesc(_global->_videoMode, srcDesc->width, 25, 0);
|
||||||
int16 height = MIN(25, srcDesc->height - top);
|
for (top = 0, retSize = 0; top < srcDesc->height; top += 25) {
|
||||||
_video->drawSprite(srcDesc, destDesc, 0, top, srcDesc->width - 1,
|
int16 height = MIN(25, srcDesc->height - top);
|
||||||
top + height - 1, 0, 0, 0);
|
_video->drawSprite(srcDesc, destDesc, 0, top, srcDesc->width - 1,
|
||||||
memcpy(oBuf + oOff, (char *) destDesc->vidPtr, srcDesc->width * 25);
|
top + height - 1, 0, 0, 0);
|
||||||
oOff += srcDesc->width * 25;
|
memcpy(oBuf + oOff, (char *) destDesc->vidPtr, srcDesc->width * 25);
|
||||||
}
|
oOff += srcDesc->width * 25;
|
||||||
_video->freeSurfDesc(destDesc);
|
}
|
||||||
} else
|
_video->freeSurfDesc(destDesc);
|
||||||
memcpy(oBuf + oOff, buf, size);
|
} else
|
||||||
|
memcpy(oBuf + oOff, buf, size);
|
||||||
|
|
||||||
|
out->write(oBuf, oSize);
|
||||||
|
} else
|
||||||
|
writeDataEndian(*out, buf, _global->_inter_variablesSizes + dataVar, size);
|
||||||
|
|
||||||
out->write(oBuf, oSize);
|
|
||||||
out->flush();
|
out->flush();
|
||||||
|
|
||||||
if (out->ioFailed())
|
if (out->ioFailed())
|
||||||
|
@ -357,28 +401,115 @@ void GobEngine::saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
else {
|
else {
|
||||||
debugC(1, DEBUG_FILEIO, "Saved file \"%s\" (%d, %d bytes at %d)",
|
debugC(1, DEBUG_FILEIO, "Saved file \"%s\" (%d, %d bytes at %d)",
|
||||||
sName, dataVar, size, offset);
|
sName, dataVar, size, offset);
|
||||||
// WRITE_VAR(1, 0)
|
WRITE_VAR(1, 0);
|
||||||
*((uint32*)(_global->_inter_variables + 4)) = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete out;
|
delete out;
|
||||||
delete[] oBuf;
|
delete[] oBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GobEngine::loadGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset) {
|
bool GobEngine::saveGame(int saveSlot, int16 dataVar, int32 size, int32 offset) {
|
||||||
|
int32 varSize;
|
||||||
|
char *varBuf;
|
||||||
|
byte *sizeBuf;
|
||||||
|
Common::OutSaveFile *out;
|
||||||
|
|
||||||
|
varBuf = _global->_inter_variables + dataVar;
|
||||||
|
sizeBuf = _global->_inter_variablesSizes + dataVar;
|
||||||
|
varSize = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
||||||
|
if ((offset == 0) && (size == 600)) {
|
||||||
|
memcpy(_saveIndex, varBuf, size);
|
||||||
|
memcpy(_saveIndexSizes, sizeBuf, size);
|
||||||
|
return true;
|
||||||
|
} else if((((offset - 600) % varSize) == 0) && (size == varSize)) {
|
||||||
|
if (!(out = _saveFileMan->openForSaving(getSaveSlotFile(saveSlot)))) {
|
||||||
|
warning("Can't open file \"%s\" for writing", getSaveSlotFile(saveSlot));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
writeDataEndian(*out, _saveIndex + saveSlot * 40, _saveIndexSizes + saveSlot * 40, 40);
|
||||||
|
writeDataEndian(*out, varBuf, sizeBuf, size);
|
||||||
|
out->flush();
|
||||||
|
if (out->ioFailed()) {
|
||||||
|
warning("Can't save to slot %d", saveSlot);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
debugC(1, DEBUG_FILEIO, "Saved to slot %d", saveSlot);
|
||||||
|
delete out;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
warning("Invalid saving procedure");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GobEngine::writeDataEndian(Common::OutSaveFile &out, char *varBuf, byte *sizeBuf,
|
||||||
|
int32 size) {
|
||||||
|
|
||||||
|
#ifndef GOB_ORIGSAVES
|
||||||
|
|
||||||
|
uint32 written;
|
||||||
|
|
||||||
|
#ifdef SCUMM_BIG_ENDIAN
|
||||||
|
|
||||||
|
int i;
|
||||||
|
char tmp[4];
|
||||||
|
|
||||||
|
written = 0;
|
||||||
|
for (i = 0; i < size; i++, varBuf++) {
|
||||||
|
if (sizeBuf[i] == 3)
|
||||||
|
WRITE_LE_UINT32(tmp, *((uint32 *) varBuf));
|
||||||
|
else if (sizeBuf[i] == 1)
|
||||||
|
WRITE_LE_UINT16(tmp, *((uint16 *) varBuf));
|
||||||
|
else if (sizeBuf[i] == 0)
|
||||||
|
*tmp = *varBuf;
|
||||||
|
else {
|
||||||
|
warning("Can't write data, corrupted variables sizes");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
written += out.write(tmp, sizeBuf[i] + 1);
|
||||||
|
varBuf += sizeBuf[i];
|
||||||
|
i += sizeBuf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // SCUMM_BIG_ENDIAN
|
||||||
|
|
||||||
|
written = out.write(varBuf, size);
|
||||||
|
|
||||||
|
#endif // SCUMM_BIG_ENDIAN
|
||||||
|
|
||||||
|
out.write(sizeBuf, size);
|
||||||
|
|
||||||
|
return written;
|
||||||
|
|
||||||
|
|
||||||
|
#else // GOB_ORIGSAVES
|
||||||
|
|
||||||
|
return out.write(varBuf, size);
|
||||||
|
|
||||||
|
#endif // GOB_ORIGSAVES
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GobEngine::loadGameData(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset) {
|
||||||
int32 sSize;
|
int32 sSize;
|
||||||
int32 retSize;
|
int32 retSize;
|
||||||
int16 index = 0;
|
int16 index;
|
||||||
int16 y;
|
int16 y;
|
||||||
char *buf;
|
char *buf;
|
||||||
char *sName;
|
char *sName;
|
||||||
bool readPal;
|
bool readPal;
|
||||||
|
bool needEnforceEndian;
|
||||||
Video::SurfaceDesc *destDesc;
|
Video::SurfaceDesc *destDesc;
|
||||||
Video::SurfaceDesc *srcDesc;
|
Video::SurfaceDesc *srcDesc;
|
||||||
Common::InSaveFile *in;
|
Common::InSaveFile *in;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
readPal = false;
|
readPal = false;
|
||||||
sName = _saveFiles[(int) sFile];
|
sName = _saveFiles[(int) sFile];
|
||||||
|
needEnforceEndian = false;
|
||||||
|
|
||||||
|
WRITE_VAR(1, 1);
|
||||||
|
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
if (size < -1000) {
|
if (size < -1000) {
|
||||||
readPal = true;
|
readPal = true;
|
||||||
|
@ -390,25 +521,38 @@ void GobEngine::loadGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
size = _draw->getSpriteRectSize(index);
|
size = _draw->getSpriteRectSize(index);
|
||||||
if ((_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
if ((_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
||||||
size = -size;
|
size = -size;
|
||||||
} else if (size == 0) {
|
} else {
|
||||||
dataVar = 0;
|
int32 varSize;
|
||||||
size = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
varSize = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
||||||
buf = _global->_inter_variables;
|
if (size == 0) {
|
||||||
} else
|
dataVar = 0;
|
||||||
|
size = varSize;
|
||||||
|
}
|
||||||
buf = _global->_inter_variables + dataVar;
|
buf = _global->_inter_variables + dataVar;
|
||||||
|
#ifndef GOB_ORIGSAVES
|
||||||
|
if (sFile == SAVE_CAT) {
|
||||||
|
if(loadGame((offset - 600) / varSize, dataVar, size, offset))
|
||||||
|
WRITE_VAR(1, 0);
|
||||||
|
return;
|
||||||
|
} else if (offset != 0) {
|
||||||
|
warning("Can't read file \"%s\": Can't correctly enfore endianness with offset", sName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
needEnforceEndian = true;
|
||||||
|
#endif // GOB_ORIGSAVES
|
||||||
|
}
|
||||||
|
|
||||||
if (_global->_inter_resStr[0] == 0) {
|
if (_global->_inter_resStr[0] == 0) {
|
||||||
if (readPal)
|
if (readPal)
|
||||||
size += 768;
|
size += 768;
|
||||||
// WRITE_VAR(1, size)
|
WRITE_VAR(1, size);
|
||||||
*((uint32*)(_global->_inter_variables + 4)) = (uint32) size;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// WRITE_VAR(1, 1)
|
if(!(in = _saveFileMan->openForLoading(sName))) {
|
||||||
*((uint32*)(_global->_inter_variables + 4)) = 1;
|
warning("Can't open file \"%s\" for reading", sName);
|
||||||
if(!(in = _saveFileMan->openForLoading(sName)))
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
debugC(1, DEBUG_FILEIO, "Loading file \"%s\" (%d, %d bytes at %d)",
|
debugC(1, DEBUG_FILEIO, "Loading file \"%s\" (%d, %d bytes at %d)",
|
||||||
sName, dataVar, size, offset);
|
sName, dataVar, size, offset);
|
||||||
|
@ -425,26 +569,119 @@ void GobEngine::loadGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32
|
||||||
_draw->_applyPal = 1;
|
_draw->_applyPal = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < 0) {
|
if (!needEnforceEndian) {
|
||||||
destDesc = _draw->_spritesArray[index];
|
if (size < 0) {
|
||||||
srcDesc = _video->initSurfDesc(_global->_videoMode, destDesc->width, 25, 0);
|
destDesc = _draw->_spritesArray[index];
|
||||||
for (y = 0, retSize = 0; y < destDesc->height; y += 25) {
|
srcDesc = _video->initSurfDesc(_global->_videoMode, destDesc->width, 25, 0);
|
||||||
int16 height = MIN(25, destDesc->height - y);
|
for (y = 0, retSize = 0; y < destDesc->height; y += 25) {
|
||||||
retSize += in->read((char *) srcDesc->vidPtr, destDesc->width * 25);
|
int16 height = MIN(25, destDesc->height - y);
|
||||||
_video->drawSprite(srcDesc, destDesc, 0, 0, destDesc->width - 1, height - 1, 0, y, 0);
|
retSize += in->read((char *) srcDesc->vidPtr, destDesc->width * 25);
|
||||||
}
|
_video->drawSprite(srcDesc, destDesc, 0, 0, destDesc->width - 1, height - 1, 0, y, 0);
|
||||||
_video->freeSurfDesc(srcDesc);
|
}
|
||||||
|
_video->freeSurfDesc(srcDesc);
|
||||||
|
} else
|
||||||
|
retSize = in->read(buf, size);
|
||||||
} else
|
} else
|
||||||
retSize = in->read(buf, size);
|
retSize = readDataEndian(*in, buf, _global->_inter_variablesSizes + dataVar, size);
|
||||||
|
|
||||||
if (retSize == size)
|
if (retSize == size)
|
||||||
// WRITE_VAR(1, 0)
|
WRITE_VAR(1, 0);
|
||||||
*((uint32*)(_global->_inter_variables + 4)) = 0;
|
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GobEngine::loadGame(int saveSlot, int16 dataVar, int32 size, int32 offset) {
|
||||||
|
int i;
|
||||||
|
int32 varSize;
|
||||||
|
char *varBuf;
|
||||||
|
byte *sizeBuf;
|
||||||
|
Common::InSaveFile *in;
|
||||||
|
|
||||||
|
varBuf = _global->_inter_variables + dataVar;
|
||||||
|
sizeBuf = _global->_inter_variablesSizes + dataVar;
|
||||||
|
varSize = READ_LE_UINT32(_game->_totFileData + 0x2C) * 4;
|
||||||
|
if ((offset == 0) && (size == 600)) {
|
||||||
|
for (i = 0; i < 15; i++, varBuf += 40) {
|
||||||
|
if ((in = _saveFileMan->openForLoading(getSaveSlotFile(i)))) {
|
||||||
|
in->read(varBuf, 40);
|
||||||
|
delete in;
|
||||||
|
} else
|
||||||
|
memset(varBuf, 0, 40);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if((((offset - 600) % varSize) == 0) && (size == varSize)) {
|
||||||
|
if (!(in = _saveFileMan->openForLoading(getSaveSlotFile(saveSlot)))) {
|
||||||
|
warning("Can't load from slot %d", saveSlot);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (((getSaveSize(*in) / 2) - 40) != (uint32) varSize) {
|
||||||
|
warning("Can't load from slot %d: Wrong size", saveSlot);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
in->seek(80);
|
||||||
|
readDataEndian(*in, varBuf, sizeBuf, size);
|
||||||
|
delete in;
|
||||||
|
debugC(1, DEBUG_FILEIO, "Loading from slot %d", saveSlot);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
warning("Invalid loading procedure");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GobEngine::readDataEndian(Common::InSaveFile &in, char *varBuf, byte *sizeBuf,
|
||||||
|
int32 size) {
|
||||||
|
|
||||||
|
#ifndef GOB_ORIGSAVES
|
||||||
|
|
||||||
|
uint32 read;
|
||||||
|
char *vars;
|
||||||
|
char *sizes;
|
||||||
|
|
||||||
|
vars = new char[size];
|
||||||
|
sizes = new char[size];
|
||||||
|
|
||||||
|
read = in.read(vars, size);
|
||||||
|
if (in.read(sizes, size) != read) {
|
||||||
|
warning("Can't read data: Corrupted variables sizes");
|
||||||
|
delete[] vars;
|
||||||
|
delete[] sizes;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SCUMM_BIG_ENDIAN
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (sizes[i] == 3)
|
||||||
|
*((uint32 *) (vars + i)) = READ_LE_UINT32(vars + i);
|
||||||
|
else if (sizes[i] == 1)
|
||||||
|
*((uint16 *) (vars + i)) = READ_LE_UINT16(vars + i);
|
||||||
|
else if (sizes[i] != 0) {
|
||||||
|
warning("Can't read data: Corrupted variables sizes");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
i += sizes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SCUMM_BIG_ENDIAN
|
||||||
|
|
||||||
|
memcpy(varBuf, vars, size);
|
||||||
|
memcpy(sizeBuf, sizes, size);
|
||||||
|
delete[] vars;
|
||||||
|
delete[] sizes;
|
||||||
|
|
||||||
|
return read;
|
||||||
|
|
||||||
|
#else // GOB_ORIGSAVES
|
||||||
|
|
||||||
|
return in.read(varBuf, size);
|
||||||
|
|
||||||
|
#endif // GOB_ORIGSAVES
|
||||||
|
}
|
||||||
|
|
||||||
int GobEngine::init() {
|
int GobEngine::init() {
|
||||||
_snd = new Snd(this);
|
_snd = new Snd(this);
|
||||||
_global = new Global(this);
|
_global = new Global(this);
|
||||||
|
@ -487,6 +724,7 @@ int GobEngine::init() {
|
||||||
else
|
else
|
||||||
_music = new Music(this);
|
_music = new Music(this);
|
||||||
}
|
}
|
||||||
|
_vm = this;
|
||||||
|
|
||||||
_system->beginGFXTransaction();
|
_system->beginGFXTransaction();
|
||||||
initCommonGFX(false);
|
initCommonGFX(false);
|
||||||
|
|
|
@ -52,13 +52,38 @@ class GTimer;
|
||||||
class Util;
|
class Util;
|
||||||
class Music;
|
class Music;
|
||||||
|
|
||||||
|
/*
|
||||||
#define VAR_OFFSET(offs) (*(uint32 *)(_vm->_global->_inter_variables + (offs)))
|
#define VAR_OFFSET(offs) (*(uint32 *)(_vm->_global->_inter_variables + (offs)))
|
||||||
#define VAR(var) VAR_OFFSET((var) << 2)
|
#define VAR(var) VAR_OFFSET((var) << 2)
|
||||||
#define VAR_ADDRESS(var) (&VAR(var))
|
#define VAR_ADDRESS(var) (&VAR(var))
|
||||||
|
|
||||||
//#define WRITE_VAR_OFFSET(offs, val) _vm->writeVarDebug(offs, val)
|
|
||||||
#define WRITE_VAR_OFFSET(offs, val) (VAR_OFFSET(offs) = (val))
|
#define WRITE_VAR_OFFSET(offs, val) (VAR_OFFSET(offs) = (val))
|
||||||
#define WRITE_VAR(var, val) WRITE_VAR_OFFSET((var) << 2, (val))
|
#define WRITE_VAR(var, val) WRITE_VAR_OFFSET((var) << 2, (val))
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VARP(offs) (_vm->_global->_inter_variables + (offs))
|
||||||
|
#define WRITE_VARO_UINT32(offs, val) _vm->_global->writeVar(offs, (uint32) (val))
|
||||||
|
#define WRITE_VARO_UINT16(offs, val) _vm->_global->writeVar(offs, (uint16) (val))
|
||||||
|
#define WRITE_VARO_UINT8(offs, val) _vm->_global->writeVar(offs, (uint8) (val))
|
||||||
|
#define WRITE_VARO_STR(offs, str) _vm->_global->writeVar(offs, (const char *) (str))
|
||||||
|
#define WRITE_VAR_UINT32(var, val) WRITE_VARO_UINT32((var) << 2, (val))
|
||||||
|
#define WRITE_VAR_UINT16(var, val) WRITE_VARO_UINT16((var) << 2, (val))
|
||||||
|
#define WRITE_VAR_UINT8(var, val) WRITE_VARO_UINT8((var) << 2, (val))
|
||||||
|
#define WRITE_VAR_STR(var, str) WRITE_VARO_STR((var) << 2, (str))
|
||||||
|
#define READ_VARO_UINT32(offs) (*((uint32 *) VARP(offs)))
|
||||||
|
#define READ_VARO_UINT16(offs) (*((uint16 *) VARP(offs)))
|
||||||
|
#define READ_VARO_UINT8(offs) (*((uint8 *) VARP(offs)))
|
||||||
|
#define READ_VAR_UINT32(var) READ_VARO_UINT32((var) << 2)
|
||||||
|
#define READ_VAR_UINT16(var) READ_VARO_UINT16((var) << 2)
|
||||||
|
#define READ_VAR_UINT8(var) READ_VARO_UINT8((var) << 2)
|
||||||
|
#define GET_VARO_STR(offs) ((char *) VARP(offs))
|
||||||
|
#define GET_VAR_STR(var) GET_VARO_STR((var) << 2)
|
||||||
|
|
||||||
|
#define WRITE_VAR_OFFSET(offs, val) WRITE_VARO_UINT32((offs), (val))
|
||||||
|
#define WRITE_VAR(var, val) WRITE_VAR_UINT32((var), (val))
|
||||||
|
#define VAR_OFFSET(offs) READ_VARO_UINT32(offs)
|
||||||
|
#define VAR(var) READ_VAR_UINT32(var)
|
||||||
|
#define VAR_ADDRESS(var) ((uint32 *) VARP((var) << 2))
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GF_GOB1 = 1 << 0,
|
GF_GOB1 = 1 << 0,
|
||||||
|
@ -83,16 +108,28 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SaveFiles {
|
enum SaveFiles {
|
||||||
SAVE_CAT = 0,
|
SAVE_CAT = 0, // Saves
|
||||||
SAVE_SAV,
|
SAVE_SAV, // Draw::_backSurface (why?)
|
||||||
SAVE_BLO
|
SAVE_BLO // Notes
|
||||||
};
|
};
|
||||||
|
|
||||||
class GobEngine : public Engine {
|
class GobEngine : public Engine {
|
||||||
protected:
|
protected:
|
||||||
|
char **_saveFiles;
|
||||||
|
char *_saveSlotFile;
|
||||||
|
char _saveIndex[600];
|
||||||
|
byte _saveIndexSizes[600];
|
||||||
|
|
||||||
int go();
|
int go();
|
||||||
int init();
|
int init();
|
||||||
|
|
||||||
|
inline uint32 getSaveSize(Common::InSaveFile &in);
|
||||||
|
const char *getSaveSlotFile(int slot);
|
||||||
|
bool saveGame(int saveSlot, int16 dataVar, int32 size, int32 offset);
|
||||||
|
bool loadGame(int saveSlot, int16 dataVar, int32 size, int32 offset);
|
||||||
|
uint32 writeDataEndian(Common::OutSaveFile &out, char *varBuf, byte *sizeBuf, int32 size);
|
||||||
|
uint32 readDataEndian(Common::InSaveFile &in, char *varBuf, byte *sizeBuf, int32 size);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GobEngine(OSystem *syst, uint32 features, Common::Language lang, const char *startTotBase);
|
GobEngine(OSystem *syst, uint32 features, Common::Language lang, const char *startTotBase);
|
||||||
virtual ~GobEngine();
|
virtual ~GobEngine();
|
||||||
|
@ -105,7 +142,6 @@ public:
|
||||||
Common::Language _language;
|
Common::Language _language;
|
||||||
char *_startTot;
|
char *_startTot;
|
||||||
char *_startTot0;
|
char *_startTot0;
|
||||||
char **_saveFiles;
|
|
||||||
bool _copyProtection;
|
bool _copyProtection;
|
||||||
bool _quitRequested;
|
bool _quitRequested;
|
||||||
|
|
||||||
|
@ -129,12 +165,13 @@ public:
|
||||||
Util *_util;
|
Util *_util;
|
||||||
Inter *_inter;
|
Inter *_inter;
|
||||||
Music *_music;
|
Music *_music;
|
||||||
|
GobEngine *_vm;
|
||||||
|
|
||||||
void writeVarDebug(uint32 offs, uint32 v);
|
void writeVarDebug(uint32 offs, uint32 v);
|
||||||
inline uint32 getSaveSize(Common::InSaveFile &in);
|
|
||||||
int32 getSaveSize(enum SaveFiles sFile);
|
int32 getSaveSize(enum SaveFiles sFile);
|
||||||
void saveGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset);
|
void saveGameData(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset);
|
||||||
void loadGame(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset);
|
void loadGameData(enum SaveFiles sFile, int16 dataVar, int32 size, int32 offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace Gob
|
} // End of namespace Gob
|
||||||
|
|
|
@ -166,9 +166,10 @@ Goblin::~Goblin() {
|
||||||
if (_goblins[i]) {
|
if (_goblins[i]) {
|
||||||
if (_goblins[i]->stateMach) {
|
if (_goblins[i]->stateMach) {
|
||||||
for (state = 0; state < (i == 3 ? 70 : 40); state++)
|
for (state = 0; state < (i == 3 ? 70 : 40); state++)
|
||||||
for (col = 0; col < 6; col++)
|
if (_goblins[i]->stateMach[state])
|
||||||
if (_goblins[i]->stateMach[state][col])
|
for (col = 0; col < 6; col++)
|
||||||
delete _goblins[i]->stateMach[state][col];
|
if (_goblins[i]->stateMach[state][col])
|
||||||
|
delete _goblins[i]->stateMach[state][col];
|
||||||
delete []_goblins[i]->stateMach;
|
delete []_goblins[i]->stateMach;
|
||||||
}
|
}
|
||||||
delete _goblins[i];
|
delete _goblins[i];
|
||||||
|
@ -1892,10 +1893,10 @@ void Goblin::sub_19BD3(void) {
|
||||||
|
|
||||||
pass = _vm->_map->getPass(gob1X, gob1Y);
|
pass = _vm->_map->getPass(gob1X, gob1Y);
|
||||||
if ((pass > 17) && (pass < 21))
|
if ((pass > 17) && (pass < 21))
|
||||||
warning("GOB2 Stub! sub_19AB7(anim0);");
|
sub_19AB7(anim0);
|
||||||
pass = _vm->_map->getPass(gob2X, gob2Y);
|
pass = _vm->_map->getPass(gob2X, gob2Y);
|
||||||
if ((pass > 17) && (pass < 21))
|
if ((pass > 17) && (pass < 21))
|
||||||
warning("GOB2 Stub! sub_19B45(anim1);");
|
sub_19B45(anim1);
|
||||||
|
|
||||||
if ((di < 0) || (di > 39) || (si < 0) || (si > 39))
|
if ((di < 0) || (di > 39) || (si < 0) || (si > 39))
|
||||||
return;
|
return;
|
||||||
|
@ -2159,4 +2160,68 @@ void Goblin::sub_197A6(int16 destX, int16 destY, int16 objIndex) {
|
||||||
initiateMove(obj);
|
initiateMove(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Goblin::sub_19AB7(Mult::Mult_AnimData *animData) {
|
||||||
|
switch(animData->state) {
|
||||||
|
case 2:
|
||||||
|
animData->layer = 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
animData->layer = 9;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
animData->layer = 26;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 18:
|
||||||
|
animData->layer = 32;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 21:
|
||||||
|
animData->layer = 22;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 22:
|
||||||
|
animData->layer = 20;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 23:
|
||||||
|
animData->layer = 21;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Goblin::sub_19B45(Mult::Mult_AnimData *animData) {
|
||||||
|
switch(animData->state) {
|
||||||
|
case 2:
|
||||||
|
animData->layer = 10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
animData->layer = 11;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
animData->layer = 29;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 18:
|
||||||
|
animData->layer = 35;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 21:
|
||||||
|
animData->layer = 25;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 22:
|
||||||
|
animData->layer = 23;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 23:
|
||||||
|
animData->layer = 24;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // End of namespace Gob
|
} // End of namespace Gob
|
||||||
|
|
|
@ -221,6 +221,8 @@ public:
|
||||||
void sub_195C7(int16 index, int16 state);
|
void sub_195C7(int16 index, int16 state);
|
||||||
void sub_11984(Mult::Mult_Object *obj);
|
void sub_11984(Mult::Mult_Object *obj);
|
||||||
void sub_197A6(int16 destX, int16 destY, int16 objIndex);
|
void sub_197A6(int16 destX, int16 destY, int16 objIndex);
|
||||||
|
void sub_19AB7(Mult::Mult_AnimData *animData);
|
||||||
|
void sub_19B45(Mult::Mult_AnimData *animData);
|
||||||
|
|
||||||
virtual void placeObject(Gob_Object * objDesc, char animated,
|
virtual void placeObject(Gob_Object * objDesc, char animated,
|
||||||
int16 index, int16 x, int16 y, int16 state) = 0;
|
int16 index, int16 x, int16 y, int16 state) = 0;
|
||||||
|
|
|
@ -89,8 +89,8 @@ void Init::cleanup(void) {
|
||||||
|
|
||||||
void Init::initGame(char *totName) {
|
void Init::initGame(char *totName) {
|
||||||
int16 handle2;
|
int16 handle2;
|
||||||
int16 i;
|
|
||||||
int16 handle;
|
int16 handle;
|
||||||
|
int32 i;
|
||||||
char *infBuf;
|
char *infBuf;
|
||||||
char *infPtr;
|
char *infPtr;
|
||||||
char *infEnd;
|
char *infEnd;
|
||||||
|
@ -132,6 +132,7 @@ memBlocks = word ptr -2*/
|
||||||
_vm->_game->_totFileData = 0;
|
_vm->_game->_totFileData = 0;
|
||||||
_vm->_game->_totResourceTable = 0;
|
_vm->_game->_totResourceTable = 0;
|
||||||
_vm->_global->_inter_variables = 0;
|
_vm->_global->_inter_variables = 0;
|
||||||
|
_vm->_global->_inter_variablesSizes = 0;
|
||||||
_palDesc = new Video::PalDesc;
|
_palDesc = new Video::PalDesc;
|
||||||
|
|
||||||
if (_vm->_global->_videoMode != 0x13)
|
if (_vm->_global->_videoMode != 0x13)
|
||||||
|
@ -204,7 +205,9 @@ memBlocks = word ptr -2*/
|
||||||
_vm->_dataio->closeData(handle);
|
_vm->_dataio->closeData(handle);
|
||||||
|
|
||||||
_vm->_global->_inter_variables = new char[varsCount * 4];
|
_vm->_global->_inter_variables = new char[varsCount * 4];
|
||||||
memset(_vm->_global->_inter_variables, 0, varsCount * 4);
|
_vm->_global->_inter_variablesSizes = new byte[varsCount * 4];
|
||||||
|
for (i = 0; i < varsCount; i++)
|
||||||
|
WRITE_VAR(i, 0);
|
||||||
WRITE_VAR(58, 1);
|
WRITE_VAR(58, 1);
|
||||||
|
|
||||||
strcpy(_vm->_game->_curTotFile, buffer);
|
strcpy(_vm->_game->_curTotFile, buffer);
|
||||||
|
@ -217,6 +220,7 @@ memBlocks = word ptr -2*/
|
||||||
_vm->_cdrom->freeLICbuffer();
|
_vm->_cdrom->freeLICbuffer();
|
||||||
|
|
||||||
delete[] _vm->_global->_inter_variables;
|
delete[] _vm->_global->_inter_variables;
|
||||||
|
delete[] _vm->_global->_inter_variablesSizes;
|
||||||
delete[] _vm->_game->_totFileData;
|
delete[] _vm->_game->_totFileData;
|
||||||
if (_vm->_game->_totTextData) {
|
if (_vm->_game->_totTextData) {
|
||||||
if (_vm->_game->_totTextData->items)
|
if (_vm->_game->_totTextData->items)
|
||||||
|
|
|
@ -58,6 +58,7 @@ Inter::Inter(GobEngine *vm) : _vm(vm) {
|
||||||
_nestLevel = 0;
|
_nestLevel = 0;
|
||||||
|
|
||||||
memset(_pasteBuf, 0, 300);
|
memset(_pasteBuf, 0, 300);
|
||||||
|
memset(_pasteSizeBuf, 0, 300);
|
||||||
_pastePos = 0;
|
_pastePos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
int32 peek32(char *ptr);
|
int32 peek32(char *ptr);
|
||||||
|
|
||||||
char _pasteBuf[300];
|
char _pasteBuf[300];
|
||||||
|
byte _pasteSizeBuf[300];
|
||||||
int16 _pastePos;
|
int16 _pastePos;
|
||||||
|
|
||||||
char evalExpr(int16 *pRes);
|
char evalExpr(int16 *pRes);
|
||||||
|
@ -319,6 +320,7 @@ protected:
|
||||||
void o2_stub0x54(void);
|
void o2_stub0x54(void);
|
||||||
void o2_stub0x55(void);
|
void o2_stub0x55(void);
|
||||||
void o2_stub0x80(void);
|
void o2_stub0x80(void);
|
||||||
|
void o2_stub0x81(void);
|
||||||
void o2_stub0x82(void);
|
void o2_stub0x82(void);
|
||||||
void o2_stub0x85(void);
|
void o2_stub0x85(void);
|
||||||
bool o2_getFreeMem(char &cmdCount, int16 &counter, int16 &retFlag);
|
bool o2_getFreeMem(char &cmdCount, int16 &counter, int16 &retFlag);
|
||||||
|
|
|
@ -672,9 +672,9 @@ bool Inter_v1::o1_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag)
|
||||||
case 25:
|
case 25:
|
||||||
case 28:
|
case 28:
|
||||||
if (token == 20)
|
if (token == 20)
|
||||||
*(_vm->_global->_inter_variables + varOff) = result;
|
WRITE_VARO_UINT8(varOff, result);
|
||||||
else
|
else
|
||||||
strcpy(_vm->_global->_inter_variables + varOff, _vm->_global->_inter_resStr);
|
WRITE_VARO_STR(varOff, _vm->_global->_inter_resStr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -739,7 +739,7 @@ bool Inter_v1::o1_printText(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
case 28:
|
case 28:
|
||||||
sprintf(buf + i, "%s", _vm->_global->_inter_variables + _vm->_parse->parseVarIndex());
|
sprintf(buf + i, "%s", GET_VARO_STR(_vm->_parse->parseVarIndex()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
|
@ -1010,7 +1010,8 @@ bool Inter_v1::o1_prepareStr(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
int16 var;
|
int16 var;
|
||||||
|
|
||||||
var = _vm->_parse->parseVarIndex();
|
var = _vm->_parse->parseVarIndex();
|
||||||
_vm->_util->prepareStr(_vm->_global->_inter_variables + var);
|
_vm->_util->prepareStr(GET_VARO_STR(var));
|
||||||
|
_vm->_global->writeVarSizeStr(var, strlen(GET_VARO_STR(var)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1021,7 +1022,8 @@ bool Inter_v1::o1_insertStr(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
strVar = _vm->_parse->parseVarIndex();
|
strVar = _vm->_parse->parseVarIndex();
|
||||||
evalExpr(0);
|
evalExpr(0);
|
||||||
pos = _vm->_parse->parseValExpr();
|
pos = _vm->_parse->parseValExpr();
|
||||||
_vm->_util->insertStr(_vm->_global->_inter_resStr, _vm->_global->_inter_variables + strVar, pos);
|
_vm->_util->insertStr(_vm->_global->_inter_resStr, GET_VARO_STR(strVar), pos);
|
||||||
|
_vm->_global->writeVarSizeStr(strVar, strlen(GET_VARO_STR(strVar)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1033,7 +1035,7 @@ bool Inter_v1::o1_cutStr(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
var = _vm->_parse->parseVarIndex();
|
var = _vm->_parse->parseVarIndex();
|
||||||
pos = _vm->_parse->parseValExpr();
|
pos = _vm->_parse->parseValExpr();
|
||||||
size = _vm->_parse->parseValExpr();
|
size = _vm->_parse->parseValExpr();
|
||||||
_vm->_util->cutFromStr(_vm->_global->_inter_variables + var, pos, size);
|
_vm->_util->cutFromStr(GET_VARO_STR(var), pos, size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,8 +1048,8 @@ bool Inter_v1::o1_strstr(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
evalExpr(0);
|
evalExpr(0);
|
||||||
resVar = _vm->_parse->parseVarIndex();
|
resVar = _vm->_parse->parseVarIndex();
|
||||||
|
|
||||||
char *res = strstr(_vm->_global->_inter_variables + strVar, _vm->_global->_inter_resStr);
|
char *res = strstr(GET_VARO_STR(strVar), _vm->_global->_inter_resStr);
|
||||||
pos = res ? (res - (_vm->_global->_inter_variables + strVar)) : -1;
|
pos = res ? (res - (GET_VARO_STR(strVar))) : -1;
|
||||||
WRITE_VAR_OFFSET(resVar, pos);
|
WRITE_VAR_OFFSET(resVar, pos);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1062,7 +1064,7 @@ bool Inter_v1::o1_istrlen(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
int16 var;
|
int16 var;
|
||||||
|
|
||||||
var = _vm->_parse->parseVarIndex();
|
var = _vm->_parse->parseVarIndex();
|
||||||
len = strlen(_vm->_global->_inter_variables + var);
|
len = strlen(GET_VARO_STR(var));
|
||||||
var = _vm->_parse->parseVarIndex();
|
var = _vm->_parse->parseVarIndex();
|
||||||
|
|
||||||
WRITE_VAR_OFFSET(var, len);
|
WRITE_VAR_OFFSET(var, len);
|
||||||
|
@ -1076,7 +1078,7 @@ bool Inter_v1::o1_strToLong(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
int32 res;
|
int32 res;
|
||||||
|
|
||||||
strVar = _vm->_parse->parseVarIndex();
|
strVar = _vm->_parse->parseVarIndex();
|
||||||
strcpy(str, _vm->_global->_inter_variables + strVar);
|
strcpy(str, GET_VARO_STR(strVar));
|
||||||
res = atol(str);
|
res = atol(str);
|
||||||
|
|
||||||
destVar = _vm->_parse->parseVarIndex();
|
destVar = _vm->_parse->parseVarIndex();
|
||||||
|
|
|
@ -286,7 +286,7 @@ void Inter_v2::setupOpcodes(void) {
|
||||||
{NULL, ""},
|
{NULL, ""},
|
||||||
/* 80 */
|
/* 80 */
|
||||||
OPCODE(o2_stub0x80),
|
OPCODE(o2_stub0x80),
|
||||||
OPCODE(o2_drawStub),
|
OPCODE(o2_stub0x81),
|
||||||
OPCODE(o2_stub0x82),
|
OPCODE(o2_stub0x82),
|
||||||
OPCODE(o2_playImd),
|
OPCODE(o2_playImd),
|
||||||
/* 84 */
|
/* 84 */
|
||||||
|
@ -881,6 +881,23 @@ void Inter_v2::o2_stub0x80(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Inter_v2::o2_stub0x81(void) {
|
||||||
|
int16 var1;
|
||||||
|
int16 var2;
|
||||||
|
int16 var3;
|
||||||
|
int16 var4;
|
||||||
|
int16 var5;
|
||||||
|
int16 var6;
|
||||||
|
|
||||||
|
var1 = _vm->_parse->parseValExpr();
|
||||||
|
var2 = _vm->_parse->parseValExpr();
|
||||||
|
var3 = _vm->_parse->parseValExpr();
|
||||||
|
var4 = _vm->_parse->parseValExpr();
|
||||||
|
var5 = _vm->_parse->parseValExpr();
|
||||||
|
var6 = _vm->_parse->parseValExpr();
|
||||||
|
warning("GOB2 Stub! o2_stub0x81(%d, %d, %d, %d, %d, %d)", var1, var2, var3, var4, var5, var6);
|
||||||
|
}
|
||||||
|
|
||||||
void Inter_v2::o2_stub0x82(void) {
|
void Inter_v2::o2_stub0x82(void) {
|
||||||
int16 expr;
|
int16 expr;
|
||||||
|
|
||||||
|
@ -1026,14 +1043,19 @@ void Inter_v2::o2_copyVars(void) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff,
|
memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff,
|
||||||
_vm->_global->_inter_animDataSize * 4);
|
_vm->_global->_inter_animDataSize * 4);
|
||||||
|
memcpy(_pasteSizeBuf + _pastePos, _vm->_global->_inter_variablesSizes + varOff,
|
||||||
|
_vm->_global->_inter_animDataSize * 4);
|
||||||
_pastePos += _vm->_global->_inter_animDataSize * 4;
|
_pastePos += _vm->_global->_inter_animDataSize * 4;
|
||||||
_pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
|
_pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
|
||||||
|
_pasteSizeBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
|
||||||
} else {
|
} else {
|
||||||
if (evalExpr(&varOff) == 20)
|
if (evalExpr(&varOff) == 20)
|
||||||
_vm->_global->_inter_resVal = 0;
|
_vm->_global->_inter_resVal = 0;
|
||||||
memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
|
memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
|
||||||
|
memcpy(_pasteSizeBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
|
||||||
_pastePos += 4;
|
_pastePos += 4;
|
||||||
_pasteBuf[_pastePos] = 4;
|
_pasteBuf[_pastePos] = 4;
|
||||||
|
_pasteSizeBuf[_pastePos] = 4;
|
||||||
}
|
}
|
||||||
_pastePos++;
|
_pastePos++;
|
||||||
}
|
}
|
||||||
|
@ -1042,15 +1064,19 @@ void Inter_v2::o2_copyVars(void) {
|
||||||
void Inter_v2::o2_pasteVars(void) {
|
void Inter_v2::o2_pasteVars(void) {
|
||||||
byte count;
|
byte count;
|
||||||
int16 varOff;
|
int16 varOff;
|
||||||
int16 size;
|
int16 sizeV;
|
||||||
|
int16 sizeS;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
count = *_vm->_global->_inter_execPtr++;
|
count = *_vm->_global->_inter_execPtr++;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
varOff = _vm->_parse->parseVarIndex();
|
varOff = _vm->_parse->parseVarIndex();
|
||||||
size = _pasteBuf[--_pastePos];
|
sizeV = _pasteBuf[--_pastePos];
|
||||||
_pastePos -= size;
|
sizeS = _pasteSizeBuf[_pastePos];
|
||||||
memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, size);
|
assert(sizeV == sizeS);
|
||||||
|
_pastePos -= sizeV;
|
||||||
|
memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, sizeV);
|
||||||
|
memcpy(_vm->_global->_inter_variablesSizes + varOff, _pasteSizeBuf + _pastePos, sizeS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1332,13 +1358,15 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
int32 offset;
|
int32 offset;
|
||||||
int16 dataVar; // si
|
int16 dataVar; // si
|
||||||
int16 handle;
|
int16 handle;
|
||||||
int16 index = 0;
|
int16 index;
|
||||||
int16 y;
|
int16 y;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
char tmp[4];
|
||||||
bool readPal;
|
bool readPal;
|
||||||
Video::SurfaceDesc *destDesc;
|
Video::SurfaceDesc *destDesc;
|
||||||
Video::SurfaceDesc *srcDesc;
|
Video::SurfaceDesc *srcDesc;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
readPal = false;
|
readPal = false;
|
||||||
evalExpr(0);
|
evalExpr(0);
|
||||||
dataVar = _vm->_parse->parseVarIndex();
|
dataVar = _vm->_parse->parseVarIndex();
|
||||||
|
@ -1347,19 +1375,19 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
offset = _vm->_global->_inter_resVal;
|
offset = _vm->_global->_inter_resVal;
|
||||||
|
|
||||||
if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.inf")) {
|
if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.inf")) {
|
||||||
_vm->loadGame(SAVE_CAT, dataVar, size, offset);
|
_vm->loadGameData(SAVE_CAT, dataVar, size, offset);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.cat")) {
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.cat")) {
|
||||||
_vm->loadGame(SAVE_CAT, dataVar, size, offset);
|
_vm->loadGameData(SAVE_CAT, dataVar, size, offset);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "save.inf")) {
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "save.inf")) {
|
||||||
_vm->loadGame(SAVE_SAV, dataVar, size, offset);
|
_vm->loadGameData(SAVE_SAV, dataVar, size, offset);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "bloc.inf")) {
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "bloc.inf")) {
|
||||||
_vm->loadGame(SAVE_BLO, dataVar, size, offset);
|
_vm->loadGameData(SAVE_BLO, dataVar, size, offset);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1374,12 +1402,14 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
size = _vm->_draw->getSpriteRectSize(index);
|
size = _vm->_draw->getSpriteRectSize(index);
|
||||||
if ((_vm->_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
if ((_vm->_draw->_spritesArray[index]->vidMode & 0x80) == 0)
|
||||||
size = -size;
|
size = -size;
|
||||||
} else if (size == 0) {
|
} else {
|
||||||
dataVar = 0;
|
if (size == 0) {
|
||||||
size = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
|
dataVar = 0;
|
||||||
buf = _vm->_global->_inter_variables;
|
size = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
|
||||||
} else
|
}
|
||||||
buf = _vm->_global->_inter_variables + dataVar;
|
buf = _vm->_global->_inter_variables + dataVar;
|
||||||
|
memset(_vm->_global->_inter_variablesSizes + dataVar, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
if (_vm->_global->_inter_resStr[0] == 0) {
|
if (_vm->_global->_inter_resStr[0] == 0) {
|
||||||
if (readPal)
|
if (readPal)
|
||||||
|
@ -1414,6 +1444,9 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
_vm->_video->drawSprite(srcDesc, destDesc, 0, 0, destDesc->width - 1, height - 1, 0, y, 0);
|
_vm->_video->drawSprite(srcDesc, destDesc, 0, 0, destDesc->width - 1, height - 1, 0, y, 0);
|
||||||
}
|
}
|
||||||
_vm->_video->freeSurfDesc(srcDesc);
|
_vm->_video->freeSurfDesc(srcDesc);
|
||||||
|
} else if (((dataVar >> 2) == 59) && (size == 4)) {
|
||||||
|
retSize = _vm->_dataio->readData(handle, tmp, 4);
|
||||||
|
WRITE_VAR(59, READ_LE_UINT32(tmp));
|
||||||
} else
|
} else
|
||||||
retSize = _vm->_dataio->readData(handle, buf, size);
|
retSize = _vm->_dataio->readData(handle, buf, size);
|
||||||
|
|
||||||
|
@ -1436,13 +1469,13 @@ bool Inter_v2::o2_writeData(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
offset = _vm->_global->_inter_resVal;
|
offset = _vm->_global->_inter_resVal;
|
||||||
|
|
||||||
if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.inf"))
|
if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.inf"))
|
||||||
_vm->saveGame(SAVE_CAT, dataVar, size, offset);
|
_vm->saveGameData(SAVE_CAT, dataVar, size, offset);
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.cat"))
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "cat.cat"))
|
||||||
_vm->saveGame(SAVE_CAT, dataVar, size, offset);
|
_vm->saveGameData(SAVE_CAT, dataVar, size, offset);
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "save.inf"))
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "save.inf"))
|
||||||
_vm->saveGame(SAVE_SAV, dataVar, size, offset);
|
_vm->saveGameData(SAVE_SAV, dataVar, size, offset);
|
||||||
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "bloc.inf"))
|
else if (!scumm_stricmp(_vm->_global->_inter_resStr, "bloc.inf"))
|
||||||
_vm->saveGame(SAVE_BLO, dataVar, size, offset);
|
_vm->saveGameData(SAVE_BLO, dataVar, size, offset);
|
||||||
else
|
else
|
||||||
warning("Attempted to write to file \"%s\"", _vm->_global->_inter_resStr);
|
warning("Attempted to write to file \"%s\"", _vm->_global->_inter_resStr);
|
||||||
|
|
||||||
|
@ -1619,12 +1652,12 @@ bool Inter_v2::o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag)
|
||||||
switch (savedPos[0]) {
|
switch (savedPos[0]) {
|
||||||
case 16:
|
case 16:
|
||||||
case 18:
|
case 18:
|
||||||
*(_vm->_global->_inter_variables + varOff + i) = _vm->_global->_inter_resVal;
|
WRITE_VARO_UINT8(varOff + i, _vm->_global->_inter_resVal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
case 27:
|
case 27:
|
||||||
*(uint16*)(_vm->_global->_inter_variables + varOff + i * 2) = _vm->_global->_inter_resVal;
|
WRITE_VARO_UINT16(varOff + i * 2, _vm->_global->_inter_resVal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
|
@ -1633,15 +1666,15 @@ bool Inter_v2::o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
*(uint16*)(_vm->_global->_inter_variables + varOff + i * 4) = _vm->_global->_inter_resVal;
|
WRITE_VARO_UINT16(varOff + i * 4, _vm->_global->_inter_resVal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
case 28:
|
case 28:
|
||||||
if (token == 20)
|
if (token == 20)
|
||||||
*(_vm->_global->_inter_variables + varOff) = result;
|
WRITE_VARO_UINT8(varOff, result);
|
||||||
else
|
else
|
||||||
strcpy(_vm->_global->_inter_variables + varOff, _vm->_global->_inter_resStr);
|
WRITE_VARO_STR(varOff, _vm->_global->_inter_resStr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1927,6 +1960,8 @@ void Inter_v2::o2_initMult(void) {
|
||||||
_vm->_mult->_objects[i].pAnimData =
|
_vm->_mult->_objects[i].pAnimData =
|
||||||
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
|
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
|
||||||
i * 4 * _vm->_global->_inter_animDataSize);
|
i * 4 * _vm->_global->_inter_animDataSize);
|
||||||
|
memset(_vm->_global->_inter_variablesSizes + i * 4 * _vm->_global->_inter_animDataSize, 0,
|
||||||
|
_vm->_global->_inter_animDataSize);
|
||||||
|
|
||||||
_vm->_mult->_objects[i].pAnimData->isStatic = 1;
|
_vm->_mult->_objects[i].pAnimData->isStatic = 1;
|
||||||
_vm->_mult->_objects[i].tick = 0;
|
_vm->_mult->_objects[i].tick = 0;
|
||||||
|
@ -2056,22 +2091,16 @@ void Inter_v2::o2_freeLIC(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inter_v2::o2_getCDTrackPos(void) {
|
void Inter_v2::o2_getCDTrackPos(void) {
|
||||||
int16 trackpospos;
|
int16 varPos;
|
||||||
int16 tracknamepos;
|
int16 varName;
|
||||||
int32 trackpos;
|
|
||||||
|
|
||||||
_vm->_util->longDelay(1);
|
_vm->_util->longDelay(1);
|
||||||
|
|
||||||
trackpospos = _vm->_parse->parseVarIndex();
|
varPos = _vm->_parse->parseVarIndex();
|
||||||
// The currently playing trackname would be written there to
|
varName = _vm->_parse->parseVarIndex();
|
||||||
// notice trackbound overruns. Since we stop on trackend and
|
|
||||||
// CDROM::getTrackPos() returns -1 then anyway, we can ignore it.
|
|
||||||
tracknamepos = _vm->_parse->parseVarIndex();
|
|
||||||
trackpos = _vm->_cdrom->getTrackPos();
|
|
||||||
if (trackpos == -1)
|
|
||||||
trackpos = 32767;
|
|
||||||
|
|
||||||
WRITE_VAR(trackpospos >> 2, trackpos);
|
WRITE_VAR_OFFSET(varPos, _vm->_cdrom->getTrackPos());
|
||||||
|
WRITE_VARO_STR(varName, _vm->_cdrom->getCurTrack());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inter_v2::o2_playMult(void) {
|
void Inter_v2::o2_playMult(void) {
|
||||||
|
|
|
@ -114,12 +114,18 @@ void Map_v2::loadMapObjects(char *avjFile) {
|
||||||
dataPos1 = mapData.pos();
|
dataPos1 = mapData.pos();
|
||||||
mapData.seek(dataPos2);
|
mapData.seek(dataPos2);
|
||||||
if (variables != _vm->_global->_inter_variables) {
|
if (variables != _vm->_global->_inter_variables) {
|
||||||
|
byte *sizes;
|
||||||
|
|
||||||
_passMap = (int8 *) variables;
|
_passMap = (int8 *) variables;
|
||||||
mapHeight = 200 / _tilesHeight;
|
mapHeight = 200 / _tilesHeight;
|
||||||
mapWidth = _screenWidth / _tilesWidth;
|
mapWidth = _screenWidth / _tilesWidth;
|
||||||
for (i = 0; i < mapHeight; i++)
|
sizes = _vm->_global->_inter_variablesSizes +
|
||||||
|
(((char *) _passMap) - _vm->_global->_inter_variables);
|
||||||
|
for (i = 0; i < mapHeight; i++) {
|
||||||
for (j = 0; j < mapWidth; j++)
|
for (j = 0; j < mapWidth; j++)
|
||||||
setPass(j, i, mapData.readSByte());
|
setPass(j, i, mapData.readSByte());
|
||||||
|
memset(sizes + i * _passWidth, 0, mapWidth);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mapData.seek(dataPos1);
|
mapData.seek(dataPos1);
|
||||||
|
|
||||||
|
|
|
@ -330,9 +330,8 @@ void Mult_v1::playMult(int16 startFrame, int16 endFrame, char checkEscape,
|
||||||
_vm->_snd->stopSound(10);
|
_vm->_snd->stopSound(10);
|
||||||
|
|
||||||
WRITE_VAR(57, (uint32)-1);
|
WRITE_VAR(57, (uint32)-1);
|
||||||
} else {
|
} else
|
||||||
WRITE_VAR(57, _frame - 1 - _frameStart);
|
WRITE_VAR(57, _frame - 1 - _frameStart);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char Mult_v1::drawStatics(char stop) {
|
char Mult_v1::drawStatics(char stop) {
|
||||||
|
|
|
@ -586,9 +586,8 @@ void Mult_v2::playMult(int16 startFrame, int16 endFrame, char checkEscape,
|
||||||
_vm->_snd->stopSound(10);
|
_vm->_snd->stopSound(10);
|
||||||
|
|
||||||
WRITE_VAR(57, (uint32)-1);
|
WRITE_VAR(57, (uint32)-1);
|
||||||
} else {
|
} else
|
||||||
WRITE_VAR(57, _frame - 1 - _multData2->frameStart);
|
WRITE_VAR(57, _frame - 1 - _multData2->frameStart);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char Mult_v2::drawStatics(char stop) {
|
char Mult_v2::drawStatics(char stop) {
|
||||||
|
|
|
@ -138,7 +138,7 @@ int16 Parse_v1::parseValExpr(unsigned stopToken) {
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 26:
|
case 26:
|
||||||
|
@ -157,7 +157,7 @@ int16 Parse_v1::parseValExpr(unsigned stopToken) {
|
||||||
} else {
|
} else {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = READ_VARO_UINT8(temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -374,7 +374,7 @@ int16 Parse_v1::parseExpr(char stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ int16 Parse_v1::parseExpr(char stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = READ_VARO_UINT8(temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,7 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
int16 brackPos;
|
int16 brackPos;
|
||||||
static int16 flag = 0;
|
static int16 flag = 0;
|
||||||
int16 oldflag;
|
int16 oldflag;
|
||||||
|
int16 foo;
|
||||||
|
|
||||||
oldflag = flag;
|
oldflag = flag;
|
||||||
if (flag == 0) {
|
if (flag == 0) {
|
||||||
|
@ -148,29 +149,31 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == 16)
|
||||||
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
|
*valPtr = (int8) READ_VARO_UINT8(temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == 26)
|
||||||
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
*valPtr = (uint16) READ_VARO_UINT32(temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == 27)
|
||||||
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
*valPtr = READ_VARO_UINT16(temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == 28) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = READ_VARO_UINT8(temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
*valPtr = READ_VARO_UINT16(_vm->_inter->load16() * 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
|
*valPtr = (int8) READ_VARO_UINT8(_vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
*valPtr = _vm->_inter->load16();
|
/* *valPtr = _vm->_inter->load16();
|
||||||
_vm->_global->_inter_execPtr += 2;
|
_vm->_global->_inter_execPtr += 2;*/
|
||||||
|
*valPtr = (uint16) READ_LE_UINT32(_vm->_global->_inter_execPtr);
|
||||||
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case 20:
|
||||||
|
@ -182,15 +185,19 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
|
*valPtr = (uint16) VAR(_vm->_inter->load16());
|
||||||
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
|
foo = _vm->_inter->load16();
|
||||||
|
*valPtr = READ_VARO_UINT16(foo * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case 29:
|
||||||
|
@ -395,30 +402,30 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
offset = offset * arrDescPtr[dim] + temp2;
|
offset = offset * arrDescPtr[dim] + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == 16)
|
||||||
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
|
*valPtr = (int8) READ_VARO_UINT8(temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == 26)
|
||||||
*valPtr = *(uint32 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
*valPtr = READ_VARO_UINT32(temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == 27)
|
||||||
*valPtr = *(int16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
*valPtr = (int16) READ_VARO_UINT16(temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == 28) {
|
||||||
*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
|
*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = READ_VARO_UINT8(temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
*valPtr = (int16) READ_VARO_UINT16(_vm->_inter->load16() * 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
|
*valPtr = (int8) READ_VARO_UINT8(_vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
|
@ -450,7 +457,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
|
*valPtr = (int16) READ_VARO_UINT16(_vm->_inter->load16() * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
|
@ -461,7 +468,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue