- 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:
Sven Hesse 2006-11-27 14:19:30 +00:00
parent b2fb23a134
commit 9afb08341c
24 changed files with 633 additions and 170 deletions

View file

@ -286,7 +286,7 @@ void Inter_v2::setupOpcodes(void) {
{NULL, ""},
/* 80 */
OPCODE(o2_stub0x80),
OPCODE(o2_drawStub),
OPCODE(o2_stub0x81),
OPCODE(o2_stub0x82),
OPCODE(o2_playImd),
/* 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) {
int16 expr;
@ -1026,14 +1043,19 @@ void Inter_v2::o2_copyVars(void) {
_vm->_global->_inter_execPtr++;
memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff,
_vm->_global->_inter_animDataSize * 4);
memcpy(_pasteSizeBuf + _pastePos, _vm->_global->_inter_variablesSizes + varOff,
_vm->_global->_inter_animDataSize * 4);
_pastePos += _vm->_global->_inter_animDataSize * 4;
_pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
_pasteSizeBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
} else {
if (evalExpr(&varOff) == 20)
_vm->_global->_inter_resVal = 0;
memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
memcpy(_pasteSizeBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
_pastePos += 4;
_pasteBuf[_pastePos] = 4;
_pasteSizeBuf[_pastePos] = 4;
}
_pastePos++;
}
@ -1042,15 +1064,19 @@ void Inter_v2::o2_copyVars(void) {
void Inter_v2::o2_pasteVars(void) {
byte count;
int16 varOff;
int16 size;
int16 sizeV;
int16 sizeS;
int i;
count = *_vm->_global->_inter_execPtr++;
for (i = 0; i < count; i++) {
varOff = _vm->_parse->parseVarIndex();
size = _pasteBuf[--_pastePos];
_pastePos -= size;
memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, size);
sizeV = _pasteBuf[--_pastePos];
sizeS = _pasteSizeBuf[_pastePos];
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;
int16 dataVar; // si
int16 handle;
int16 index = 0;
int16 index;
int16 y;
char *buf;
char tmp[4];
bool readPal;
Video::SurfaceDesc *destDesc;
Video::SurfaceDesc *srcDesc;
index = 0;
readPal = false;
evalExpr(0);
dataVar = _vm->_parse->parseVarIndex();
@ -1347,19 +1375,19 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
offset = _vm->_global->_inter_resVal;
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;
}
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;
}
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;
}
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;
}
@ -1374,12 +1402,14 @@ bool Inter_v2::o2_readData(char &cmdCount, int16 &counter, int16 &retFlag) {
size = _vm->_draw->getSpriteRectSize(index);
if ((_vm->_draw->_spritesArray[index]->vidMode & 0x80) == 0)
size = -size;
} else if (size == 0) {
dataVar = 0;
size = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
buf = _vm->_global->_inter_variables;
} else
} else {
if (size == 0) {
dataVar = 0;
size = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
}
buf = _vm->_global->_inter_variables + dataVar;
memset(_vm->_global->_inter_variablesSizes + dataVar, 0, size);
}
if (_vm->_global->_inter_resStr[0] == 0) {
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->freeSurfDesc(srcDesc);
} else if (((dataVar >> 2) == 59) && (size == 4)) {
retSize = _vm->_dataio->readData(handle, tmp, 4);
WRITE_VAR(59, READ_LE_UINT32(tmp));
} else
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;
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"))
_vm->saveGame(SAVE_CAT, dataVar, size, offset);
_vm->saveGameData(SAVE_CAT, dataVar, size, offset);
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"))
_vm->saveGame(SAVE_BLO, dataVar, size, offset);
_vm->saveGameData(SAVE_BLO, dataVar, size, offset);
else
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]) {
case 16:
case 18:
*(_vm->_global->_inter_variables + varOff + i) = _vm->_global->_inter_resVal;
WRITE_VARO_UINT8(varOff + i, _vm->_global->_inter_resVal);
break;
case 17:
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;
case 23:
@ -1633,15 +1666,15 @@ bool Inter_v2::o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag)
break;
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;
case 25:
case 28:
if (token == 20)
*(_vm->_global->_inter_variables + varOff) = result;
WRITE_VARO_UINT8(varOff, result);
else
strcpy(_vm->_global->_inter_variables + varOff, _vm->_global->_inter_resStr);
WRITE_VARO_STR(varOff, _vm->_global->_inter_resStr);
break;
}
}
@ -1927,6 +1960,8 @@ void Inter_v2::o2_initMult(void) {
_vm->_mult->_objects[i].pAnimData =
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
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].tick = 0;
@ -2056,22 +2091,16 @@ void Inter_v2::o2_freeLIC(void) {
}
void Inter_v2::o2_getCDTrackPos(void) {
int16 trackpospos;
int16 tracknamepos;
int32 trackpos;
int16 varPos;
int16 varName;
_vm->_util->longDelay(1);
trackpospos = _vm->_parse->parseVarIndex();
// The currently playing trackname would be written there to
// 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;
varPos = _vm->_parse->parseVarIndex();
varName = _vm->_parse->parseVarIndex();
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) {