diff options
author | athrxx | 2011-08-21 20:26:07 +0200 |
---|---|---|
committer | Johannes Schickel | 2011-12-26 16:18:14 +0100 |
commit | 2448d885e4e331a22e1e468277142155a5ddda87 (patch) | |
tree | 98584a9a40a940da8cfd2b21bbc68e9b24d2a925 | |
parent | c35de374dfe545ffc5044a00a247c5814e3b250e (diff) | |
download | scummvm-rg350-2448d885e4e331a22e1e468277142155a5ddda87.tar.gz scummvm-rg350-2448d885e4e331a22e1e468277142155a5ddda87.tar.bz2 scummvm-rg350-2448d885e4e331a22e1e468277142155a5ddda87.zip |
KYRA: (EOB) - complete EOBII playability
- fixed temp data generation, block data loading, some spell issues, etc.
- both EOB I and II should now be completable
- one big issue remaining (AdLib driver gets swamped with monster sounds which causes heavy lags in some levels)
-rw-r--r-- | engines/kyra/detection.cpp | 4 | ||||
-rw-r--r-- | engines/kyra/eob1.cpp | 3 | ||||
-rw-r--r-- | engines/kyra/eob2.cpp | 11 | ||||
-rw-r--r-- | engines/kyra/eobcommon.cpp | 5 | ||||
-rw-r--r-- | engines/kyra/eobcommon.h | 25 | ||||
-rw-r--r-- | engines/kyra/gui_eob.cpp | 8 | ||||
-rw-r--r-- | engines/kyra/items_eob.cpp | 7 | ||||
-rw-r--r-- | engines/kyra/lol.h | 1 | ||||
-rw-r--r-- | engines/kyra/loleobbase.h | 4 | ||||
-rw-r--r-- | engines/kyra/magic_eob.cpp | 22 | ||||
-rw-r--r-- | engines/kyra/saveload_eob.cpp | 50 | ||||
-rw-r--r-- | engines/kyra/scene_eob.cpp | 27 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 5 | ||||
-rw-r--r-- | engines/kyra/screen_eob.cpp | 10 | ||||
-rw-r--r-- | engines/kyra/script_eob.cpp | 11 | ||||
-rw-r--r-- | engines/kyra/script_eob.h | 7 | ||||
-rw-r--r-- | engines/kyra/sequences_eob2.cpp | 8 | ||||
-rw-r--r-- | engines/kyra/sprites_eob.cpp | 3 | ||||
-rw-r--r-- | engines/kyra/staticres_eob.cpp | 16 | ||||
-rw-r--r-- | engines/kyra/text_eob.cpp | 1 | ||||
-rw-r--r-- | engines/kyra/timer_eob.cpp | 1 |
21 files changed, 137 insertions, 92 deletions
diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index adfb1c612a..dd67c3e715 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -160,6 +160,10 @@ SaveStateList KyraMetaEngine::listSaves(const char *target) const { SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + // Skip automatic final saves made by EOB for the purpose of party transfer + if (!scumm_stricmp(file->c_str() + file->size() - 3, "fin")) + continue; + // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); diff --git a/engines/kyra/eob1.cpp b/engines/kyra/eob1.cpp index 8ce41d6b5b..d67cda529d 100644 --- a/engines/kyra/eob1.cpp +++ b/engines/kyra/eob1.cpp @@ -78,9 +78,6 @@ Common::Error EobEngine::init() { _scriptTimersCount = 1; - //_wllWallFlags[132] = 1; - //_wllWallFlags[133] = 1; - return Common::kNoError; } diff --git a/engines/kyra/eob2.cpp b/engines/kyra/eob2.cpp index 0ffca10093..d9aad0ce3d 100644 --- a/engines/kyra/eob2.cpp +++ b/engines/kyra/eob2.cpp @@ -77,10 +77,6 @@ Common::Error DarkMoonEngine::init() { _color13 = 177; _color14 = 182; - // Necessary wall hacks (where the original code makes out of bounds accesses) - _wllWallFlags[183] = 0x50; - _wllVmpMap[183] = 1; - return Common::kNoError; } @@ -226,8 +222,8 @@ void DarkMoonEngine::loadMonsterDecoration(const char *file, int16 monsterIndex) SpriteDecoration *m = &_monsterDecorations[i * 6 + ii + monsterIndex]; m->shp = _screen->encodeShape(dc[0], dc[1], dc[2], dc[3]); - m->x = dc[4]; - m->y = dc[5]; + m->x = (int8)dc[4]; + m->y = (int8)dc[5]; } } @@ -281,6 +277,7 @@ bool DarkMoonEngine::killMonsterExtra(EobMonsterInPlay *m) { if (m->type) { _playFinale = true; _runFlag = false; + delay(850); } else { m->hitPointsCur = 150; m->curRemoteWeapon = 0; @@ -306,7 +303,7 @@ const uint8 *DarkMoonEngine::loadDoorShapes(const char *filename, int doorIndex, shapeDefs += 8; _doorSwitches[doorIndex * 3 + i].x = *shapeDefs; shapeDefs += 2; - _doorSwitches[doorIndex * 3 + i]. y= *shapeDefs; + _doorSwitches[doorIndex * 3 + i].y= *shapeDefs; shapeDefs += 2; } _screen->_curPage = 0; diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp index 67609520fa..fbd8ef62e1 100644 --- a/engines/kyra/eobcommon.cpp +++ b/engines/kyra/eobcommon.cpp @@ -398,8 +398,11 @@ Common::Error EobCoreEngine::go() { if (!shouldQuit() && action > -3) { runLoop(); - if (_playFinale) + if (_playFinale) { + // make final save for party transfer + saveGameStateIntern(-1, 0, 0); seq_playFinale(); + } } return Common::kNoError; diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index 5f1bf8b709..7ab933390e 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -151,8 +151,8 @@ struct EobItemType { struct SpriteDecoration { uint8 *shp; - uint8 x; - uint8 y; + int16 x; + int16 y; }; struct EobMonsterProperty { @@ -574,11 +574,13 @@ protected: const int8 *_monsterDirChangeTable; // Level - void loadLevel(int level, int func); - Common::String initLevelData(int func); + void loadLevel(int level, int sub); + Common::String initLevelData(int sub); void addLevelItems(); void loadVcnData(const char *file, const char */*nextFile*/); void loadBlockProperties(const char *mazFile); + const uint8 *getBlockFileData(int levelIndex); + const uint8 *getBlockFileData(const char *mazFile); void loadDecorations(const char *cpsFile, const char *decFile); void assignWallsAndDecorations(int wallIndex, int vmpIndex, int decDataIndex, int specialType, int flags); void releaseDecorations(); @@ -613,6 +615,7 @@ protected: int8 _currentSub; Common::String _curGfxFile; + Common::String _curBlockFile; uint32 _drawSceneTimer; uint32 _flashShapeTimer; @@ -1006,13 +1009,13 @@ protected: void spellCallback_start_heal(); void spellCallback_start_layOnHands(); void spellCallback_start_turnUndead(); - bool spellCallback_end_lightningBoltPassive(void *obj); - bool spellCallback_end_unk1Passive(void *obj); - bool spellCallback_end_unk2Passive(void *obj); - bool spellCallback_end_deathSpellPassive(void *obj); - bool spellCallback_end_disintegratePassive(void *obj); - bool spellCallback_end_causeCriticalWoundsPassive(void *obj); - bool spellCallback_end_fleshToStonePassive(void *obj); + bool spellCallback_end_monster_lightningBolt(void *obj); + bool spellCallback_end_monster_fireball1(void *obj); + bool spellCallback_end_monster_fireball2(void *obj); + bool spellCallback_end_monster_deathSpell(void *obj); + bool spellCallback_end_monster_disintegrate(void *obj); + bool spellCallback_end_monster_causeCriticalWounds(void *obj); + bool spellCallback_end_monster_fleshToStone(void *obj); int8 _openBookSpellLevel; int8 _openBookSpellSelectedItem; diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp index a5f06c551e..d333528ab2 100644 --- a/engines/kyra/gui_eob.cpp +++ b/engines/kyra/gui_eob.cpp @@ -853,12 +853,12 @@ int EobCoreEngine::clickedCamp(Button *button) { gui_drawCharPortraitWithStats(i); } - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 14, Screen::CR_NO_P_CHECK); _screen->copyPage(0, 7); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); _gui->runCampMenu(); - _screen->copyRegion(0, 0, 0, 120, 176, 24, 14, 2, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 0, 0, 120, 176, 24, 12, 2, Screen::CR_NO_P_CHECK); _screen->setScreenDim(cd); drawScene(0); @@ -2250,7 +2250,7 @@ void GUI_Eob::runCampMenu() { _vm->dropCharacter(selectCharacterDialogue(53)); _vm->gui_drawPlayField(false); res = true; - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 14, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); _screen->setFont(Screen::FID_6_FNT); _vm->gui_drawAllCharPortraitsWithStats(); _screen->setFont(Screen::FID_8_FNT); @@ -2282,6 +2282,8 @@ void GUI_Eob::runCampMenu() { default: break; } + + lastMenu = -1; } else { Common::Point p = _vm->getMousePos(); diff --git a/engines/kyra/items_eob.cpp b/engines/kyra/items_eob.cpp index a83207b565..e3309f830d 100644 --- a/engines/kyra/items_eob.cpp +++ b/engines/kyra/items_eob.cpp @@ -208,8 +208,8 @@ int EobCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl int itm = _characters[charIndex].inventory[slot]; int ex = _itemTypes[_items[itm].type].extraProperties & 0x7f; - if (slot < 2 && (_items[itm].flags & 0x20) && ex > 0 && ex < 4) { - if (_flags.gameID == GI_EOB2) + if (_items[itm].flags & 0x20 && (_flags.gameID == GI_EOB1 || slot < 2)) { + if (_flags.gameID == GI_EOB2 && ex > 0 && ex < 4) _txt->printMessage(_validateCursedString[0], -1, _characters[charIndex].name); return 0; } @@ -692,6 +692,9 @@ void EobCoreEngine::endObjectFlight(EobFlyingObject *fo) { } void EobCoreEngine::checkFlyingObjects() { + if (!_runFlag) + return; + for (int i = 0; i < 10; i++) { EobFlyingObject *fo = &_flyingObjects[i]; if (!fo->enable) diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 8ddba8607c..e75d621cc3 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -917,6 +917,7 @@ private: uint8 *getLevelDecorationShapes(int index); void restoreTempDataAdjustMonsterStrength(int index); void loadBlockProperties(const char *cmzFile); + const uint8 *getBlockFileData(int levelIndex); void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag); void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile); diff --git a/engines/kyra/loleobbase.h b/engines/kyra/loleobbase.h index 02b236d44f..cb7f920cb8 100644 --- a/engines/kyra/loleobbase.h +++ b/engines/kyra/loleobbase.h @@ -147,6 +147,7 @@ protected: virtual void drawSceneShapes(int start) = 0; virtual void drawDecorations(int index) = 0; + virtual const uint8 *getBlockFileData(int levelIndex) = 0; void setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim); void scaleLevelShapesDim(int index, int16 &y1, int16 &y2, int dim); void drawLevelModifyScreenDim(int dim, int16 x1, int16 y1, int16 x2, int16 y2); @@ -233,6 +234,7 @@ protected: const uint8 *_dscTileIndex; const uint8 *_dscDoorShpIndex; + int _dscDoorShpIndexSize; const uint8 *_dscDoorY2; // Script @@ -308,7 +310,7 @@ protected: virtual Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) = 0; void generateTempData(); - void restoreBlockTempData(int levelIndex); + virtual void restoreBlockTempData(int levelIndex); void releaseTempData(); virtual void *generateMonsterTempData(LevelTempData *tmp) = 0; virtual void restoreMonsterTempData(LevelTempData *tmp) = 0; diff --git a/engines/kyra/magic_eob.cpp b/engines/kyra/magic_eob.cpp index 0424558b04..9063d512f0 100644 --- a/engines/kyra/magic_eob.cpp +++ b/engines/kyra/magic_eob.cpp @@ -236,8 +236,14 @@ void EobCoreEngine::removeCharacterEffect(int spell, int charIndex, int showWarn EobCharacter *c = &_characters[charIndex]; EobSpell *s = &_spells[spell]; - if (showWarning) + if (showWarning) { + int od = _screen->curDimIndex(); + Screen::FontId of = _screen->setFont(Screen::FID_6_FNT); + _screen->setScreenDim(7); printWarning(Common::String::format(_magicStrings3[_flags.gameID == GI_EOB1 ? 3 : 2], c->name, s->name).c_str()); + _screen->setScreenDim(od); + _screen->setFont(of); + } if (s->endCallback) (this->*s->endCallback)(c); @@ -1281,12 +1287,12 @@ void EobCoreEngine::spellCallback_start_turnUndead() { _preventMonsterFlash = false; } -bool EobCoreEngine::spellCallback_end_lightningBoltPassive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_lightningBolt(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; return magicObjectDamageHit(fo, 0, 0, 12, 1); } -bool EobCoreEngine::spellCallback_end_unk1Passive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_fireball1(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; bool res = false; if (_partyEffectFlags & 0x20000) { @@ -1301,12 +1307,12 @@ bool EobCoreEngine::spellCallback_end_unk1Passive(void *obj) { return res; } -bool EobCoreEngine::spellCallback_end_unk2Passive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_fireball2(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; return magicObjectDamageHit(fo, 0, 0, 18, 0); } -bool EobCoreEngine::spellCallback_end_deathSpellPassive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_deathSpell(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; if (fo->curBlock != _currentBlock) return false; @@ -1323,7 +1329,7 @@ bool EobCoreEngine::spellCallback_end_deathSpellPassive(void *obj) { return true; } -bool EobCoreEngine::spellCallback_end_disintegratePassive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_disintegrate(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; if (fo->curBlock != _currentBlock) return false; @@ -1339,7 +1345,7 @@ bool EobCoreEngine::spellCallback_end_disintegratePassive(void *obj) { return true; } -bool EobCoreEngine::spellCallback_end_causeCriticalWoundsPassive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_causeCriticalWounds(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; if (fo->curBlock != _currentBlock) return false; @@ -1353,7 +1359,7 @@ bool EobCoreEngine::spellCallback_end_causeCriticalWoundsPassive(void *obj) { return true; } -bool EobCoreEngine::spellCallback_end_fleshToStonePassive(void *obj) { +bool EobCoreEngine::spellCallback_end_monster_fleshToStone(void *obj) { EobFlyingObject *fo = (EobFlyingObject*)obj; if (fo->curBlock != _currentBlock) return false; diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp index 01fbd75cfe..49c6668abf 100644 --- a/engines/kyra/saveload_eob.cpp +++ b/engines/kyra/saveload_eob.cpp @@ -47,15 +47,7 @@ void LolEobBaseEngine::generateTempData() { _lvlTempData[l]->wallsXorData = new uint8[4096]; _lvlTempData[l]->flags = new uint16[1024]; - const uint8 *p = 0; - const uint8 *p2 = 0; - if (_flags.gameID == GI_LOL) { - screen()->loadBitmap(Common::String::format("LEVEL%d.CMZ", _currentLevel).c_str(), 15, 15, 0); - p = screen()->getCPagePtr(14); - } else { - p2 = p = _res->fileData(Common::String::format("LEVEL%d.MAZ", _currentLevel).c_str(), 0); - } - + const uint8 *p = getBlockFileData(_currentLevel); uint16 len = READ_LE_UINT16(p + 4); p += 6; @@ -75,20 +67,11 @@ void LolEobBaseEngine::generateTempData() { _lvlTempData[l]->wallsOfForce = generateWallOfForceTempData(_lvlTempData[l]); _hasTempDataFlags |= (1 << l); - delete[] p2; } void LolEobBaseEngine::restoreBlockTempData(int levelIndex) { int l = levelIndex - 1; - const uint8 *p = 0; - const uint8 *p2 = 0; - if (_flags.gameID == GI_LOL) { - screen()->loadBitmap(Common::String::format("LEVEL%d.CMZ", levelIndex).c_str(), 3, 3, 0); - p = screen()->getCPagePtr(2); - } else { - p2 = p = _res->fileData(Common::String::format("LEVEL%d.MAZ", levelIndex).c_str(), 0); - } - + const uint8 *p = getBlockFileData(levelIndex); uint16 len = READ_LE_UINT16(p + 4); p += 6; @@ -106,8 +89,6 @@ void LolEobBaseEngine::restoreBlockTempData(int levelIndex) { restoreMonsterTempData(_lvlTempData[l]); restoreFlyingObjectTempData(_lvlTempData[l]); restoreWallOfForceTempData(_lvlTempData[l]); - - delete[] p2; } void LolEobBaseEngine::releaseTempData() { @@ -144,7 +125,14 @@ void LolEobBaseEngine::releaseFlyingObjectTempData(LevelTempData *tmp) { #ifdef ENABLE_EOB Common::Error EobCoreEngine::loadGameState(int slot) { - const char *fileName = getSavegameFilename(slot); + const char *fileName = 0; + + if (slot == -1) { + _savegameFilename = /*_targetName + */Common::String("eob.fin"); + fileName = _savegameFilename.c_str(); + } else { + fileName = getSavegameFilename(slot); + } SaveHeader header; Common::InSaveFile *saveFile = openSaveForReading(fileName, header); @@ -388,7 +376,7 @@ Common::Error EobCoreEngine::loadGameState(int slot) { useMagicBookOrSymbol(_openBookChar, _openBookType); } - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 14, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); gui_toggleButtons(); setHandItem(_itemInHand); @@ -404,8 +392,18 @@ Common::Error EobCoreEngine::loadGameState(int slot) { } Common::Error EobCoreEngine::saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) { - const Common::String finSuffix(".FIN"); - const char *fileName = (slot != -1) ? getSavegameFilename(slot) : (_targetName + finSuffix).c_str(); + Common::String saveNameTmp; + const char *fileName = 0; + + if (slot == -1) { + _savegameFilename = _targetName + Common::String(".fin"); + fileName = _savegameFilename.c_str(); + saveNameTmp = _targetName + Common::String(" final"); + saveNameTmp.toUppercase(); + saveName = saveNameTmp.c_str(); + } else { + fileName = getSavegameFilename(slot); + } Common::OutSaveFile *out = openSaveForWriting(fileName, saveName, thumbnail); if (!out) @@ -525,7 +523,7 @@ Common::Error EobCoreEngine::saveGameStateIntern(int slot, const char *saveName, LevelTempData *l = _lvlTempData[i]; if (!l || !(_hasTempDataFlags & (1 << i))) continue; - + out->write(l->wallsXorData, 4096); for (int ii = 0; ii < 1024; ii++) out->writeByte(l->flags[ii] & 0xff); diff --git a/engines/kyra/scene_eob.cpp b/engines/kyra/scene_eob.cpp index 98cd60dcd9..5f06139f3f 100644 --- a/engines/kyra/scene_eob.cpp +++ b/engines/kyra/scene_eob.cpp @@ -863,23 +863,31 @@ void EobCoreEngine::loadVcnData(const char *file, const char*/*nextFile*/) { void EobCoreEngine::loadBlockProperties(const char *mazFile) { memset(_levelBlockProperties, 0, 1024 * sizeof(LevelBlockProperty)); - Common::SeekableReadStream *s = _res->createReadStream(mazFile); - _screen->loadFileDataToPage(s, 2, 4096); - delete s; + const uint8 *p = getBlockFileData(mazFile) + 6; if (_hasTempDataFlags & (1 << (_currentLevel - 1))) { restoreBlockTempData(_currentLevel); return; } - const uint8 *p = _screen->getCPagePtr(2) + 6; - for (int i = 0; i < 1024; i++) { for (int ii = 0; ii < 4; ii++) _levelBlockProperties[i].walls[ii] = *p++; } } +const uint8 *EobCoreEngine::getBlockFileData(int) { + Common::SeekableReadStream *s = _res->createReadStream(_curBlockFile); + _screen->loadFileDataToPage(s, 15, s->size()); + delete s; + return _screen->getCPagePtr(14); +} + +const uint8 *EobCoreEngine::getBlockFileData(const char *mazFile) { + _curBlockFile = mazFile; + return getBlockFileData(0); +} + void EobCoreEngine::loadDecorations(const char *cpsFile, const char *decFile) { _screen->loadShapeSetBitmap(cpsFile, 3, 3); Common::SeekableReadStream *s = _res->createReadStream(decFile); @@ -919,6 +927,12 @@ void EobCoreEngine::loadDecorations(const char *cpsFile, const char *decFile) { void EobCoreEngine::assignWallsAndDecorations(int wallIndex, int vmpIndex, int decIndex, int specialType, int flags) { _wllVmpMap[wallIndex] = vmpIndex; + for (int i = 0; i < 6; i++) { + for (int ii = 0; ii < 10; ii++) { + if (_characters[i].events[ii] == -57) + spellCallback_start_trueSeeing(); + } + } _wllShapeMap[wallIndex] = _mappedDecorationsCount + 1; _specialWallTypes[wallIndex] = specialType; _wllWallFlags[wallIndex] = flags ^ 4; @@ -1145,8 +1159,7 @@ int EobCoreEngine::calcNewBlockPositionAndTestPassability(uint16 curBlock, uint1 int w = _levelBlockProperties[b].walls[direction ^ 2]; int f = _wllWallFlags[w]; - //if (!f) - assert((_flags.gameID == GI_EOB1 && w < 70) || (_flags.gameID == GI_EOB2 && w < 80)); + assert((_flags.gameID == GI_EOB1 && w < 70) || (_flags.gameID == GI_EOB2 && w < 80)); if (_flags.gameID == GI_EOB2 && w == 74 && _currentBlock == curBlock) { for (int i = 0; i < 5; i++) { diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 998fb73364..d28477b148 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -252,6 +252,11 @@ void LoLEngine::loadBlockProperties(const char *cmzFile) { } } +const uint8 *LoLEngine::getBlockFileData(int levelIndex) { + _screen->loadBitmap(Common::String::format("LEVEL%d.CMZ", levelIndex).c_str(), 15, 15, 0); + return screen()->getCPagePtr(14); +} + void LoLEngine::loadLevelShpDat(const char *shpFile, const char *datFile, bool flag) { memset(_tempBuffer5120, 0, 5120); diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp index 9c67750ba8..4161c757d8 100644 --- a/engines/kyra/screen_eob.cpp +++ b/engines/kyra/screen_eob.cpp @@ -769,7 +769,6 @@ void Screen_Eob::drawExplosion(int scale, int radius, int numElements, int stepS for (int l = 2; l;) { if (l != 2) { for (int i = numElements - 1; i >= 0; i--) { - uint32 end = _system->getMillis() + 1; int16 px = ((ptr2[i] >> 6) >> scale) + gx2; int16 py = ((ptr3[i] >> 6) >> scale) + gy2; if (py > ymax) @@ -902,7 +901,6 @@ void Screen_Eob::drawVortex(int numElements, int radius, int stepSize, int, int int d = 0; for (int i = 2; i; ) { if (i != 2) { - uint32 nextDelay = _system->getMillis() + 1; for (int ii = numElements - 1; ii >= 0; ii--) { int16 px = CLIP((xCoords[ii] >> 6) + cx, 0, SCREEN_W - 1); int16 py = CLIP((yCoords[ii] >> 6) + cy, 0, SCREEN_H - 1); @@ -912,7 +910,7 @@ void Screen_Eob::drawVortex(int numElements, int radius, int stepSize, int, int i = 0; int r = (stepSize >> 1) + (stepSize >> 2) + (stepSize >> 3); - uint32 nextDelay2 = _system->getMillis() + 1; + uint32 nextDelay = _system->getMillis() + 1; for (int ii = 0; ii < numElements; ii++) { if (pixDelay[ii] == 0) { @@ -951,9 +949,9 @@ void Screen_Eob::drawVortex(int numElements, int radius, int stepSize, int, int if (ii % 15 == 0) { updateScreen(); uint32 cur = _system->getMillis(); - if (nextDelay2 > cur) - _system->delayMillis(nextDelay2 - cur); - nextDelay2 += 1; + if (nextDelay > cur) + _system->delayMillis(nextDelay - cur); + nextDelay += 1; } } } else { diff --git a/engines/kyra/script_eob.cpp b/engines/kyra/script_eob.cpp index 1dbb02414f..6522731751 100644 --- a/engines/kyra/script_eob.cpp +++ b/engines/kyra/script_eob.cpp @@ -89,8 +89,8 @@ void EobCoreEngine::updateScriptTimers() { EobInfProcessor::EobInfProcessor(EobCoreEngine *engine, Screen_Eob *screen) : _vm(engine), _screen(screen), _commandMin(engine->game() == GI_EOB1 ? -27 : -31) { -#define Opcode(x) _opcodes.push_back(new InfProc(this, &EobInfProcessor::x)) -#define OpcodeAlt(x) if (_vm->game() == GI_EOB1) Opcode(x##_v1); else Opcode(x##_v2); +#define Opcode(x) _opcodes.push_back(new InfOpcode(new InfProc(this, &EobInfProcessor::x), #x)) +#define OpcodeAlt(x) if (_vm->game() == GI_EOB1) { Opcode(x##_v1); } else { Opcode(x##_v2); } Opcode(oeob_setWallType); Opcode(oeob_toggleWallState); Opcode(oeob_openDoor); @@ -157,8 +157,10 @@ EobInfProcessor::~EobInfProcessor() { delete[] _flagTable; delete[] _stack; delete[] _scriptData; - for (Common::Array<const InfProc*>::const_iterator a = _opcodes.begin(); a != _opcodes.end(); ++a) + for (Common::Array<const InfOpcode*>::const_iterator a = _opcodes.begin(); a != _opcodes.end(); ++a) { + delete (*a)->proc; delete *a; + } _opcodes.clear(); } @@ -196,7 +198,8 @@ void EobInfProcessor::run(int func, int sub) { int8 cmd = *pos++; if (cmd <= _commandMin || cmd >= 0) continue; - pos += (*_opcodes[-(cmd + 1)])(pos); + debugC(5, kDebugLevelScript, "[0x%.08X] EobInfProcessor::%s()", (uint32)(pos - _scriptData), _opcodes[-(cmd + 1)]->desc.c_str()); + pos += (*_opcodes[-(cmd + 1)]->proc)(pos); } while (!_abortScript && !_abortAfterSubroutine); } diff --git a/engines/kyra/script_eob.h b/engines/kyra/script_eob.h index 8f44c7f6f9..f7e5f09379 100644 --- a/engines/kyra/script_eob.h +++ b/engines/kyra/script_eob.h @@ -91,7 +91,12 @@ private: Screen_Eob *_screen; typedef Common::Functor1Mem<int8*, int, EobInfProcessor> InfProc; - Common::Array<const InfProc*> _opcodes; + struct InfOpcode { + InfOpcode(InfProc *p, const char *d) : proc(p), desc(d) {} + InfProc *proc; + Common::String desc; + }; + Common::Array<const InfOpcode*> _opcodes; int8 *_scriptData; uint16 _scriptSize; diff --git a/engines/kyra/sequences_eob2.cpp b/engines/kyra/sequences_eob2.cpp index dcf293bd52..37aca45237 100644 --- a/engines/kyra/sequences_eob2.cpp +++ b/engines/kyra/sequences_eob2.cpp @@ -466,6 +466,7 @@ void DarkMoonEngine::seq_playFinale() { DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kFinale, _finaleStrings, _cpsFilesFinale, _palFilesFinale, _shapesFinale, _seqFinale); _screen->setCurPage(0); + _screen->setFont(Screen::FID_8_FNT); _sound->loadSoundFile("FINALE1"); _sound->playTrack(0); @@ -936,10 +937,11 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine * _fadePalRate = 0; _screen->setScreenPalette(*_palettes[0]); + _screen->setFont(Screen::FID_8_FNT); _screen->hideMouse(); - _system->delayMillis(150); - _vm->resetSkipFlag(true); + _vm->delay(150); + _vm->_eventList.clear(); _vm->_allowSkip = true; } @@ -1274,7 +1276,7 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim void DarkMoonEngine::seq_nightmare() { Screen::FontId of = _screen->setFont(Screen::FID_6_FNT); - _screen->copyRegion(0, 0, 0, 120, 176, 24, 14, 2, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 0, 0, 120, 176, 24, 12, 2, Screen::CR_NO_P_CHECK); initDialogueSequence(); gui_drawDialogueBox(); diff --git a/engines/kyra/sprites_eob.cpp b/engines/kyra/sprites_eob.cpp index bd5ab27ead..eca053017c 100644 --- a/engines/kyra/sprites_eob.cpp +++ b/engines/kyra/sprites_eob.cpp @@ -471,7 +471,8 @@ void EobCoreEngine::drawDoor(int index) { if (_flags.gameID == GI_EOB1 && s == 0x85) s = 0; - assert((_flags.gameID == GI_EOB1 && s < 32) || (_flags.gameID == GI_EOB2 && s < 53)); + if (s >= _dscDoorShpIndexSize) + return; int type = _dscDoorShpIndex[s]; int d = _dscDimMap[index]; diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp index 274feba4fa..4ff879c69c 100644 --- a/engines/kyra/staticres_eob.cpp +++ b/engines/kyra/staticres_eob.cpp @@ -254,7 +254,7 @@ void LolEobBaseEngine::initStaticResource() { _dscBlockMap = _staticres->loadRawData(kLolEobCommonDscBlockMap, temp); _dscBlockIndex = (const int8 *)_staticres->loadRawData(kLolEobCommonDscBlockIndex, temp); _dscDimMap = _staticres->loadRawData(kLolEobCommonDscDimMap, temp); - _dscDoorShpIndex = _staticres->loadRawData(kLolEobCommonDscDoorShapeIndex, temp); + _dscDoorShpIndex = _staticres->loadRawData(kLolEobCommonDscDoorShapeIndex, _dscDoorShpIndexSize); _dscDoorY2 = _staticres->loadRawData(kLolEobCommonDscDoorY2, temp); _moreStrings = _staticres->loadStrings(kLolEobCommonMoreStrings, temp); } @@ -1010,14 +1010,14 @@ void EobCoreEngine::initSpells() { ec2(empty); ec(empty); ec2(empty); - ec1(lightningBoltPassive); - ec2(unk1Passive); + ec1(monster_lightningBolt); + ec2(monster_fireball1); ec2(empty); - ec2(unk2Passive); - ec(deathSpellPassive); - ec(disintegratePassive); - ec2(causeCriticalWoundsPassive); - ec2(fleshToStonePassive); + ec2(monster_fireball2); + ec(monster_deathSpell); + ec(monster_disintegrate); + ec2(monster_causeCriticalWounds); + ec2(monster_fleshToStone); _spells = new EobSpell[_numSpells]; memset(_spells, 0, _numSpells * sizeof(EobSpell)); diff --git a/engines/kyra/text_eob.cpp b/engines/kyra/text_eob.cpp index a2cc5c6e00..0fe01df770 100644 --- a/engines/kyra/text_eob.cpp +++ b/engines/kyra/text_eob.cpp @@ -619,6 +619,7 @@ void TextDisplayer_Eob::textPageBreak() { screen()->fillRect(x, y, x + w - 1, y + 8, _textDimData[screen()->curDimIndex()].color2); clearCurDim(); + _screen->updateScreen(); if (vm()->game() == GI_LOL) vm()->_timer->pauseSingleTimer(11, false); diff --git a/engines/kyra/timer_eob.cpp b/engines/kyra/timer_eob.cpp index f36688df39..277e04e769 100644 --- a/engines/kyra/timer_eob.cpp +++ b/engines/kyra/timer_eob.cpp @@ -390,6 +390,7 @@ void EobCoreEngine::timerUpdateTeleporters(int timerNum) { void EobCoreEngine::timerUpdateFoodStatus(int timerNum) { for (int i = 0; i < 6; i++) { + // Ring of Sustenance check if (checkInventoryForRings(i, 2)) continue; EobCharacter *c = &_characters[i]; |