From a2abbf919df8a07df872d69f75d372579bbe271a Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sun, 5 Nov 2006 06:26:45 +0000 Subject: [PATCH] Add inital load/save code changes for earlier games and cleanup svn-id: r24622 --- engines/agos/agos.cpp | 35 ++- engines/agos/agos.h | 8 +- engines/agos/saveload.cpp | 526 ++++++++++++++++++++++++++----------- engines/agos/script_e1.cpp | 10 +- engines/agos/script_e2.cpp | 10 +- engines/agos/script_ff.cpp | 2 +- engines/agos/script_pp.cpp | 2 +- engines/agos/script_ww.cpp | 2 +- engines/agos/vga.cpp | 30 +-- engines/agos/window.cpp | 6 +- 10 files changed, 439 insertions(+), 192 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 7db49b9ca60..ed5f2a8a38f 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -84,6 +84,21 @@ AGOSEngine::AGOSEngine(OSystem *syst) _gameFile = 0; + _itemMemSize = 0; + _tableMemSize = 0; + _vgaMemSize = 0; + + _musicIndexBase = 0; + _soundIndexBase = 0; + _tableIndexBase = 0; + _textIndexBase = 0; + + _numItemStore = 0; + _numTextBoxes = 0; + _numVars = 0; + _numVideoOpcodes = 0; + _vgaBaseDelay = 0; + _strippedTxtMem = 0; _textMem = 0; _textSize = 0; @@ -232,8 +247,6 @@ AGOSEngine::AGOSEngine(OSystem *syst) _printCharPixelCount = 0; _numLettersToPrint = 0; - _numTextBoxes = 0; - _clockStopped = 0; _gameStoppedClock = 0; _gameTime = 0; @@ -597,7 +610,6 @@ static const uint16 initialVideoWindows_Common[20] = { void AGOSEngine::setupGame() { if (getGameType() == GType_PP) { gss = PTR(puzzlepack_settings); - _numTextBoxes = 40; _numVideoOpcodes = 85; #ifndef PALMOS_68K _vgaMemSize = 7500000; @@ -608,10 +620,11 @@ void AGOSEngine::setupGame() { _tableMemSize = 200000; _frameRate = 1; _vgaBaseDelay = 5; + _numItemStore = 10; + _numTextBoxes = 40; _numVars = 2048; } else if (getGameType() == GType_FF) { gss = PTR(feeblefiles_settings); - _numTextBoxes = 40; _numVideoOpcodes = 85; #ifndef PALMOS_68K _vgaMemSize = 7500000; @@ -622,12 +635,13 @@ void AGOSEngine::setupGame() { _tableMemSize = 200000; _frameRate = 1; _vgaBaseDelay = 5; + _numItemStore = 10; + _numTextBoxes = 40; _numVars = 255; } else if (getGameType() == GType_SIMON2) { gss = PTR(simon2_settings); _tableIndexBase = 1580 / 4; _textIndexBase = 1500 / 4; - _numTextBoxes = 20; _numVideoOpcodes = 75; #ifndef PALMOS_68K _vgaMemSize = 2000000; @@ -644,12 +658,13 @@ void AGOSEngine::setupGame() { _soundIndexBase = 1660 / 4; _frameRate = 1; _vgaBaseDelay = 1; + _numItemStore = 10; + _numTextBoxes = 20; _numVars = 255; } else if (getGameType() == GType_SIMON1) { gss = PTR(simon1_settings); _tableIndexBase = 1576 / 4; _textIndexBase = 1460 / 4; - _numTextBoxes = 20; _numVideoOpcodes = 64; #ifndef PALMOS_68K _vgaMemSize = 1000000; @@ -662,10 +677,11 @@ void AGOSEngine::setupGame() { _soundIndexBase = 0; _frameRate = 1; _vgaBaseDelay = 1; + _numItemStore = 10; + _numTextBoxes = 20; _numVars = 255; } else if (getGameType() == GType_WW) { gss = PTR(simon1_settings); - _numTextBoxes = 20; _numVideoOpcodes = 64; #ifndef PALMOS_68K _vgaMemSize = 1000000; @@ -676,10 +692,11 @@ void AGOSEngine::setupGame() { _tableMemSize = 50000; _frameRate = 4; _vgaBaseDelay = 1; + _numItemStore = 50; + _numTextBoxes = 10; _numVars = 255; } else if (getGameType() == GType_ELVIRA2) { gss = PTR(simon1_settings); - _numTextBoxes = 20; _numVideoOpcodes = 60; #ifndef PALMOS_68K _vgaMemSize = 1000000; @@ -690,10 +707,10 @@ void AGOSEngine::setupGame() { _tableMemSize = 100000; _frameRate = 4; _vgaBaseDelay = 1; + _numItemStore = 50; _numVars = 255; } else if (getGameType() == GType_ELVIRA1) { gss = PTR(simon1_settings); - _numTextBoxes = 20; _numVideoOpcodes = 57; #ifndef PALMOS_68K _vgaMemSize = 1000000; diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 84c8145e6d4..3f7d450719b 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -197,7 +197,7 @@ protected: uint32 *_gameOffsetsPtr; - uint _numVars; + uint _numItemStore, _numVars; uint _vgaBaseDelay; uint _musicIndexBase; @@ -1138,6 +1138,7 @@ public: void oe2_moveDirn(); void oe2_doClass(); void oe2_pObj(); + void oe2_loadGame(); void oe2_drawItem(); void oe2_doTable(); void oe2_setDoorOpen(); @@ -1379,8 +1380,11 @@ protected: Item *getNextItemPtrStrange(); + bool loadGame_e1(const char *filename); + bool saveGame_e1(const char *filename); + + bool loadGame(const char *filename); bool saveGame(uint slot, const char *caption); - bool loadGame(uint slot); void openTextWindow(); void tidyIconArray(uint i); diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp index 854ca8dd69d..8f7ec7a2039 100644 --- a/engines/agos/saveload.cpp +++ b/engines/agos/saveload.cpp @@ -145,7 +145,7 @@ void AGOSEngine::quickLoadOrSave() { char *filename = genSaveName(_saveLoadSlot); if (_saveLoadType == 2) { Subroutine *sub; - success = loadGame(_saveLoadSlot); + success = loadGame(genSaveName(_saveLoadSlot)); if (!success) { sprintf(buf, "Failed to load game state to file:\n\n%s", filename); } else { @@ -369,7 +369,7 @@ restart:; if (!saveGame(_saveLoadRowCurPos + result, buf + result * 18)) fileError(_windowArray[5], true); } else { - if (!loadGame(_saveLoadRowCurPos + i)) + if (!loadGame(genSaveName(_saveLoadRowCurPos + i))) fileError(_windowArray[5], false); } @@ -410,7 +410,6 @@ int AGOSEngine::userGameGetKey(bool *b, char *buf) { } while (_lastHitArea3 == 0); ha = _lastHitArea; - if (ha == NULL || ha->id < 205) { } else if (ha->id == 205) { return ha->id; @@ -581,6 +580,344 @@ loop:; undefineBox(0x7FFF); } +bool AGOSEngine::loadGame_e1(const char *filename) { + Common::SeekableReadStream *f = NULL; + uint num, item_index, i; + + _lockWord |= 0x100; + + // Load restart state + Common::File *file = new Common::File(); + file->open(filename, Common::File::kFileReadMode); + if (!file->isOpen()) { + delete file; + f = _saveFileMan->openForLoading(filename); + } else { + f = file; + } + + if (f == NULL) { + _lockWord &= ~0x100; + return false; + } + + num = f->readUint32BE(); + + if (f->readUint32BE() != 0xFFFFFFFF || num != _itemArrayInited - 1) { + delete f; + _lockWord &= ~0x100; + return false; + } + + f->readUint32BE(); + f->readUint32BE(); + _noParentNotify = true; + + // add all timers + killAllTimers(); + for (num = f->readUint32BE(); num; num--) { + uint32 timeout = f->readUint32BE(); + uint16 func_to_call = f->readUint16BE(); + addTimeEvent(timeout, func_to_call); + } + + item_index = 1; + for (num = _itemArrayInited - 1; num; num--) { + Item *item = _itemArrayPtr[item_index++], *parent_item; + + uint16 parent = f->readUint32BE(); + if (parent == 0xFFFF) + parent_item = 0; + else + parent_item = derefItem(parent); + + setItemParent(item, parent_item); + + item->state = f->readUint16BE(); + item->classFlags = f->readUint16BE(); + + SubObject *o = (SubObject *)findChildOfType(item, 2); + if (o) { + o->objectSize = f->readUint16BE(); + o->objectWeight = f->readUint16BE(); + } + + SubPlayer *p = (SubPlayer *)findChildOfType(item, 3); + if (p) { + p->score = f->readUint32BE(); + p->level = f->readUint16BE(); + p->size = f->readUint16BE(); + p->weight = f->readUint16BE(); + p->strength = f->readUint16BE(); + } + + SubUserFlag *u = (SubUserFlag *) findChildOfType(item, 9); + if (u) { + for (i = 0; i != 8; i++) { + u->userFlags[i] = f->readUint16BE(); + } + + uint16 val = f->readUint32BE(); + if (val == 0xFFFF) + u->userItems[0] = 0; + else + u->userItems[0] = val; + } + } + + // read the variables + for (i = 0; i != _numVars; i++) { + writeVariable(i, f->readUint16BE()); + } + + debug(0, "Pos %d Size %d\n", f->pos(), f->size()); + if (f->ioFailed()) { + error("load failed"); + } + + delete f; + + _noParentNotify = false; + + _lockWord &= ~0x100; + + return true; +} + +bool AGOSEngine::saveGame_e1(const char *filename) { + Common::WriteStream *f; + uint item_index, num_item, i; + TimeEvent *te; + uint32 curTime = 0; + uint32 gsc = _gameStoppedClock; + + _lockWord |= 0x100; + + f = _saveFileMan->openForSaving(filename); + if (f == NULL) { + warning("saveGame: Failed to save %s", filename); + _lockWord &= ~0x100; + return false; + } + + f->writeUint32BE(_itemArrayInited - 1); + f->writeUint32BE(0xFFFFFFFF); + f->writeUint32BE(0); + f->writeUint32BE(0); + + i = 0; + for (te = _firstTimeStruct; te; te = te->next) + i++; + f->writeUint32BE(i); + + for (te = _firstTimeStruct; te; te = te->next) { + f->writeUint32BE(te->time - curTime + gsc); + f->writeUint16BE(te->subroutine_id); + } + + item_index = 1; + for (num_item = _itemArrayInited - 1; num_item; num_item--) { + Item *item = _itemArrayPtr[item_index++]; + + if (item->parent == 0) + f->writeUint32BE(0xFFFFFFFF); + else + f->writeUint32BE(item->parent); + + f->writeUint16BE(item->state); + f->writeUint16BE(item->classFlags); + + SubObject *o = (SubObject *)findChildOfType(item, 2); + if (o) { + f->writeUint16BE(o->objectSize); + f->writeUint16BE(o->objectWeight); + } + + SubPlayer *p = (SubPlayer *)findChildOfType(item, 3); + if (p) { + f->writeUint32BE(p->score); + f->writeUint16BE(p->level); + f->writeUint16BE(p->size); + f->writeUint16BE(p->weight); + f->writeUint16BE(p->strength); + } + + SubUserFlag *u = (SubUserFlag *) findChildOfType(item, 9); + if (u) { + for (i = 0; i != 8; i++) { + f->writeUint16BE(u->userFlags[i]); + } + + if (u->userItems[0] == 0) + f->writeUint32BE(0xFFFFFFFF); + else + f->writeUint32BE(u->userItems[0]); + } + } + + // write the variables + for (i = 0; i != _numVars; i++) { + f->writeUint16BE(readVariable(i)); + } + + f->flush(); + bool result = !f->ioFailed(); + + delete f; + _lockWord &= ~0x100; + + return result; +} + +bool AGOSEngine::loadGame(const char *filename) { + char ident[100]; + Common::SeekableReadStream *f = NULL; + uint num, item_index, i, j; + + _lockWord |= 0x100; + + // Load restart state + Common::File *file = new Common::File(); + file->open(filename, Common::File::kFileReadMode); + if (!file->isOpen()) { + delete file; + f = _saveFileMan->openForLoading(filename); + } else { + f = file; + } + + if (f == NULL) { + warning("loadGame: Failed to load %s", filename); + _lockWord &= ~0x100; + return false; + } + + if (getGameType() == GType_FF) { + f->read(ident, 100); + } else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { + f->read(ident, 18); + } + + num = f->readUint32BE(); + + if (f->readUint32BE() != 0xFFFFFFFF || num != _itemArrayInited - 1) { + delete f; + _lockWord &= ~0x100; + return false; + } + + f->readUint32BE(); + f->readUint32BE(); + _noParentNotify = true; + + // add all timers + killAllTimers(); + for (num = f->readUint32BE(); num; num--) { + uint32 timeout = f->readUint32BE(); + uint16 func_to_call = f->readUint16BE(); + addTimeEvent(timeout, func_to_call); + } + + item_index = 1; + for (num = _itemArrayInited - 1; num; num--) { + Item *item = _itemArrayPtr[item_index++], *parent_item; + + uint parent = f->readUint16BE(); + uint next = f->readUint16BE(); + + parent_item = derefItem(parent); + + setItemParent(item, parent_item); + + if (parent_item == NULL) { + item->parent = parent; + item->next = next; + } + + item->state = f->readUint16BE(); + item->classFlags = f->readUint16BE(); + + SubRoom *r = (SubRoom *)findChildOfType(item, 1); + if (r) { + r->roomExitStates = f->readUint16BE(); + } + + SubSuperRoom *sr = (SubSuperRoom *)findChildOfType(item, 4); + if (sr) { + uint16 n = sr->roomX * sr->roomY * sr->roomZ; + uint16 *c = sr->roomExitStates; + while(n--) + *c++ = f->readUint16BE(); + } + + SubObject *o = (SubObject *)findChildOfType(item, 2); + if (o) { + o->objectFlags = f->readUint32BE(); + i = o->objectFlags & 1; + + for (j = 1; j < 16; j++) { + if (o->objectFlags & (1 << j)) { + o->objectFlagValue[i++] = f->readUint16BE(); + } + } + } + + SubUserFlag *u = (SubUserFlag *) findChildOfType(item, 9); + if (u) { + for (i = 0; i != 4; i++) { + u->userFlags[i] = f->readUint16BE(); + } + } + } + + + // read the variables + for (i = 0; i != _numVars; i++) { + writeVariable(i, f->readUint16BE()); + } + + // read the items in item store + for (i = 0; i != _numItemStore; i++) { + _itemStore[i] = derefItem(f->readUint16BE()); + } + + if (getGameType() == GType_PP) { + // Read the bits in array 1 + for (i = 0; i != 128; i++) + _bitArray[i] = f->readUint16BE(); + } else { + // Read the bits in array 1 + for (i = 0; i != 16; i++) + _bitArray[i] = f->readUint16BE(); + + // Read the bits in array 2 + for (i = 0; i != 16; i++) + _bitArrayTwo[i] = f->readUint16BE(); + } + + // Read the bits in array 3 + if (getGameType() == GType_FF) { + for (i = 0; i != 16; i++) + _bitArrayThree[i] = f->readUint16BE(); + } + + if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) { + _superRoomNumber = f->readUint16BE(); + } + + if (f->ioFailed()) { + error("load failed"); + } + + delete f; + + _noParentNotify = false; + + _lockWord &= ~0x100; + + return true; +} + bool AGOSEngine::saveGame(uint slot, const char *caption) { Common::WriteStream *f; uint item_index, num_item, i, j; @@ -600,7 +937,7 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) { if (getGameType() == GType_FF) { f->write(caption, 100); curTime = time(NULL); - } else if (getGameType() != GType_PP) { + } else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { f->write(caption, 18); } @@ -630,27 +967,35 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) { f->writeUint16BE(item->state); f->writeUint16BE(item->classFlags); - SubRoom *subRoom = (SubRoom *)findChildOfType(item, 1); - if (subRoom) { - f->writeUint16BE(subRoom->roomExitStates); + SubRoom *r = (SubRoom *)findChildOfType(item, 1); + if (r) { + f->writeUint16BE(r->roomExitStates); } - SubObject *subObject = (SubObject *)findChildOfType(item, 2); - if (subObject) { - f->writeUint32BE(subObject->objectFlags); - i = subObject->objectFlags & 1; + SubSuperRoom *sr = (SubSuperRoom *)findChildOfType(item, 4); + if (sr) { + uint16 n = sr->roomX * sr->roomY * sr->roomZ; + uint16 *c = sr->roomExitStates; + while(n--) + f->writeUint16BE(*c++); + } + + SubObject *o = (SubObject *)findChildOfType(item, 2); + if (o) { + f->writeUint32BE(o->objectFlags); + i = o->objectFlags & 1; for (j = 1; j < 16; j++) { - if (subObject->objectFlags & (1 << j)) { - f->writeUint16BE(subObject->objectFlagValue[i++]); + if (o->objectFlags & (1 << j)) { + f->writeUint16BE(o->objectFlagValue[i++]); } } } - SubUserFlag *subUserFlag = (SubUserFlag *)findChildOfType(item, 9); - if (subUserFlag) { + SubUserFlag *u = (SubUserFlag *)findChildOfType(item, 9); + if (u) { for (i = 0; i != 4; i++) { - f->writeUint16BE(subUserFlag->userFlags[i]); + f->writeUint16BE(u->userFlags[i]); } } } @@ -660,8 +1005,8 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) { f->writeUint16BE(readVariable(i)); } - // write the items in array 6 - for (i = 0; i != 10; i++) { + // write the items in item store + for (i = 0; i != _numItemStore; i++) { f->writeUint16BE(itemPtrToID(_itemStore[i])); } @@ -685,6 +1030,10 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) { f->writeUint16BE(_bitArrayThree[i]); } + if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) { + f->writeUint16BE(_superRoomNumber); + } + f->flush(); bool result = !f->ioFailed(); @@ -694,145 +1043,4 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) { return result; } -bool AGOSEngine::loadGame(uint slot) { - char ident[100]; - Common::SeekableReadStream *f = NULL; - uint num, item_index, i, j; - - _lockWord |= 0x100; - - if (getGameType() == GType_FF && slot == 999) { - // Load restart state - Common::File *file = new Common::File(); - file->open(genSaveName(slot), Common::File::kFileReadMode); - if (!file->isOpen()) { - delete file; - } else { - f = file; - } - } else { - f = _saveFileMan->openForLoading(genSaveName(slot)); - } - - if (f == NULL) { - warning("loadGame: Failed to load slot %d", slot); - _lockWord &= ~0x100; - return false; - } - - if (getGameType() == GType_FF) { - f->read(ident, 100); - } else if (getGameType() != GType_PP) { - f->read(ident, 18); - } - - num = f->readUint32BE(); - - if (f->readUint32BE() != 0xFFFFFFFF || num != _itemArrayInited - 1) { - delete f; - _lockWord &= ~0x100; - return false; - } - - f->readUint32BE(); - f->readUint32BE(); - _noParentNotify = true; - - - // add all timers - killAllTimers(); - for (num = f->readUint32BE(); num; num--) { - uint32 timeout = f->readUint32BE(); - uint16 func_to_call = f->readUint16BE(); - addTimeEvent(timeout, func_to_call); - } - - item_index = 1; - for (num = _itemArrayInited - 1; num; num--) { - Item *item = _itemArrayPtr[item_index++], *parent_item; - - uint parent = f->readUint16BE(); - uint next = f->readUint16BE(); - - parent_item = derefItem(parent); - - setItemParent(item, parent_item); - - if (parent_item == NULL) { - item->parent = parent; - item->next = next; - } - - item->state = f->readUint16BE(); - item->classFlags = f->readUint16BE(); - - SubRoom *subRoom = (SubRoom *)findChildOfType(item, 1); - if (subRoom != NULL) { - subRoom->roomExitStates = f->readUint16BE(); - } - - SubObject *subObject = (SubObject *)findChildOfType(item, 2); - if (subObject != NULL) { - subObject->objectFlags = f->readUint32BE(); - i = subObject->objectFlags & 1; - - for (j = 1; j < 16; j++) { - if (subObject->objectFlags & (1 << j)) { - subObject->objectFlagValue[i++] = f->readUint16BE(); - } - } - } - - SubUserFlag *subUserFlag = (SubUserFlag *) findChildOfType(item, 9); - if (subUserFlag) { - for (i = 0; i != 4; i++) { - subUserFlag->userFlags[i] = f->readUint16BE(); - } - } - } - - - // read the variables - for (i = 0; i != _numVars; i++) { - writeVariable(i, f->readUint16BE()); - } - - // read the items in array 6 - for (i = 0; i != 10; i++) { - _itemStore[i] = derefItem(f->readUint16BE()); - } - - if (getGameType() == GType_PP) { - // Read the bits in array 1 - for (i = 0; i != 128; i++) - _bitArray[i] = f->readUint16BE(); - } else { - // Read the bits in array 1 - for (i = 0; i != 16; i++) - _bitArray[i] = f->readUint16BE(); - - // Read the bits in array 2 - for (i = 0; i != 16; i++) - _bitArrayTwo[i] = f->readUint16BE(); - } - - // Read the bits in array 3 - if (getGameType() == GType_FF) { - for (i = 0; i != 16; i++) - _bitArrayThree[i] = f->readUint16BE(); - } - - if (f->ioFailed()) { - error("load failed"); - } - - delete f; - - _noParentNotify = false; - - _lockWord &= ~0x100; - - return true; -} - } // End of namespace AGOS diff --git a/engines/agos/script_e1.cpp b/engines/agos/script_e1.cpp index 9acac2339f5..4e95bc6555d 100644 --- a/engines/agos/script_e1.cpp +++ b/engines/agos/script_e1.cpp @@ -467,12 +467,18 @@ void AGOSEngine::oe1_doorExit() { void AGOSEngine::oe1_saveGame() { // 201: save game - debug(0, "oe1_saveGame: stub (%s)", getStringPtrByID(getNextStringID())); + uint16 stringId = getNextStringID(); + + debug(0, "oe1_saveGame: stub (%s)", getStringPtrByID(stringId)); + saveGame_e1((const char *)getStringPtrByID(stringId)); } void AGOSEngine::oe1_loadGame() { // 202: load game - debug(0, "oe1_loadGame: stub (%s)", getStringPtrByID(getNextStringID())); + uint16 stringId = getNextStringID(); + + debug(0, "oe1_loadGame: stub (%s)", (const char *)getStringPtrByID(stringId)); + loadGame_e1((const char *)getStringPtrByID(stringId)); } void AGOSEngine::oe1_clearUserItem() { diff --git a/engines/agos/script_e2.cpp b/engines/agos/script_e2.cpp index ee73c0f771a..64df361a569 100644 --- a/engines/agos/script_e2.cpp +++ b/engines/agos/script_e2.cpp @@ -48,7 +48,7 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) { op[75] = &AGOSEngine::oe1_pcName; op[79] = &AGOSEngine::oe1_isCalled; op[83] = &AGOSEngine::oe1_rescan; - op[89] = &AGOSEngine::oe1_loadGame; + op[89] = &AGOSEngine::oe2_loadGame; op[94] = &AGOSEngine::oe1_findMaster; op[95] = &AGOSEngine::oe1_nextMaster; op[98] = &AGOSEngine::oe1_animate; @@ -127,6 +127,14 @@ void AGOSEngine::oe2_pObj() { showMessageFormat((const char *)getStringPtrByID(subObject->objectFlagValue[0])); } +void AGOSEngine::oe2_loadGame() { + // 89: load game + uint16 stringId = getNextStringID(); + + debug(0, "oe1_loadGame: stub (%s)", (const char *)getStringPtrByID(stringId)); + loadGame((const char *)getStringPtrByID(stringId)); +} + void AGOSEngine::oe2_drawItem() { // 113: draw item Item *i = getNextItemPtr(); diff --git a/engines/agos/script_ff.cpp b/engines/agos/script_ff.cpp index bcfc25852fe..9af80c7c19f 100644 --- a/engines/agos/script_ff.cpp +++ b/engines/agos/script_ff.cpp @@ -216,7 +216,7 @@ void AGOSEngine::off_saveUserGame() { void AGOSEngine::off_loadUserGame() { // 133: load game - loadGame(readVariable(55)); + loadGame(genSaveName(readVariable(55))); } void AGOSEngine::off_listSaveGames() { diff --git a/engines/agos/script_pp.cpp b/engines/agos/script_pp.cpp index 10dd82af087..ef865a58add 100644 --- a/engines/agos/script_pp.cpp +++ b/engines/agos/script_pp.cpp @@ -193,7 +193,7 @@ void AGOSEngine::opp_loadUserGame() { } // XXX - loadGame(1); + loadGame(genSaveName(1)); } void AGOSEngine::opp_saveOopsPosition() { diff --git a/engines/agos/script_ww.cpp b/engines/agos/script_ww.cpp index 5907163ac58..deac3870415 100644 --- a/engines/agos/script_ww.cpp +++ b/engines/agos/script_ww.cpp @@ -51,7 +51,7 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) { op[70] = &AGOSEngine::oww_printLongText; op[83] = &AGOSEngine::oe1_rescan; op[85] = &AGOSEngine::oww_whereTo; - op[89] = &AGOSEngine::oe1_loadGame; + op[89] = &AGOSEngine::oe2_loadGame; op[94] = &AGOSEngine::oe1_findMaster; op[95] = &AGOSEngine::oe1_nextMaster; op[98] = &AGOSEngine::oe1_animate; diff --git a/engines/agos/vga.cpp b/engines/agos/vga.cpp index 2da9c96e783..d895eb341b7 100644 --- a/engines/agos/vga.cpp +++ b/engines/agos/vga.cpp @@ -210,21 +210,6 @@ bool AGOSEngine::itemIsParentOf(uint16 a, uint16 b) { return derefItem(item_a->parent) == item_b; } -bool AGOSEngine::isSpriteLoaded(uint16 id, uint16 zoneNum) { - VgaSprite *vsp = _vgaSprites; - while (vsp->id) { - if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP) { - if (vsp->id == id && vsp->zoneNum == zoneNum) - return true; - } else { - if (vsp->id == id) - return true; - } - vsp++; - } - return false; -} - bool AGOSEngine::vc_maybe_skip_proc_1(uint16 a, int16 b) { Item *item; @@ -251,6 +236,21 @@ VgaSprite *AGOSEngine::findCurSprite() { return vsp; } +bool AGOSEngine::isSpriteLoaded(uint16 id, uint16 zoneNum) { + VgaSprite *vsp = _vgaSprites; + while (vsp->id) { + if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP) { + if (vsp->id == id && vsp->zoneNum == zoneNum) + return true; + } else { + if (vsp->id == id) + return true; + } + vsp++; + } + return false; +} + bool AGOSEngine::getBitFlag(uint bit) { uint16 *bits = &_bitArray[bit / 16]; return (*bits & (1 << (bit & 15))) != 0; diff --git a/engines/agos/window.cpp b/engines/agos/window.cpp index 61921b5a940..60089730831 100644 --- a/engines/agos/window.cpp +++ b/engines/agos/window.cpp @@ -127,8 +127,12 @@ void AGOSEngine::colorWindow(WindowBlock *window) { h = window->height * 8; w = window->width * 8; + uint8 color = window->fill_color; + if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) + color += dst[0] & 0xF0; + do { - memset(dst, window->fill_color, w); + memset(dst, color, w); dst += _dxSurfacePitch; } while (--h); }