diff options
author | athrxx | 2011-08-15 01:43:26 +0200 |
---|---|---|
committer | Johannes Schickel | 2011-12-26 16:18:14 +0100 |
commit | b288889c978990423b08dad8f838d891610f36b5 (patch) | |
tree | 888ac176612b06a7389e6b8f3f623d472cf10cdd /engines/kyra/saveload_eob.cpp | |
parent | 0d54aff6324b1f6c739df89ab072328cc5402873 (diff) | |
download | scummvm-rg350-b288889c978990423b08dad8f838d891610f36b5.tar.gz scummvm-rg350-b288889c978990423b08dad8f838d891610f36b5.tar.bz2 scummvm-rg350-b288889c978990423b08dad8f838d891610f36b5.zip |
KYRA: (EOB) - implement wall of force spell
Diffstat (limited to 'engines/kyra/saveload_eob.cpp')
-rw-r--r-- | engines/kyra/saveload_eob.cpp | 51 |
1 files changed, 44 insertions, 7 deletions
diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp index 05eea820bb..24a10133d0 100644 --- a/engines/kyra/saveload_eob.cpp +++ b/engines/kyra/saveload_eob.cpp @@ -72,6 +72,7 @@ void LolEobBaseEngine::generateTempData() { _lvlTempData[l]->monsters = generateMonsterTempData(_lvlTempData[l]); _lvlTempData[l]->flyingObjects = generateFlyingObjectTempData(_lvlTempData[l]); + _lvlTempData[l]->wallsOfForce = generateWallOfForceTempData(_lvlTempData[l]); _hasTempDataFlags |= (1 << l); delete[] p2; @@ -104,6 +105,7 @@ void LolEobBaseEngine::restoreBlockTempData(int levelIndex) { restoreMonsterTempData(_lvlTempData[l]); restoreFlyingObjectTempData(_lvlTempData[l]); + restoreWallOfForceTempData(_lvlTempData[l]); delete[] p2; } @@ -115,6 +117,7 @@ void LolEobBaseEngine::releaseTempData() { delete[] _lvlTempData[i]->flags; releaseMonsterTempData(_lvlTempData[i]); releaseFlyingObjectTempData(_lvlTempData[i]); + releaseWallOfForceTempData(_lvlTempData[i]); delete _lvlTempData[i]; _lvlTempData[i] = 0; } @@ -293,13 +296,15 @@ Common::Error EobCoreEngine::loadGameState(int slot) { } _lvlTempData[i] = new LevelTempData; - _lvlTempData[i]->wallsXorData = new uint8[4096]; - _lvlTempData[i]->flags = new uint16[1024]; + LevelTempData *l = _lvlTempData[i]; + l->wallsXorData = new uint8[4096]; + l->flags = new uint16[1024]; EobMonsterInPlay *lm = new EobMonsterInPlay[30]; - _lvlTempData[i]->monsters = lm; + l->monsters = lm; EobFlyingObject *lf = new EobFlyingObject[_numFlyingObjects]; - _lvlTempData[i]->flyingObjects = lf; - LevelTempData *l = _lvlTempData[i]; + l->flyingObjects = lf; + WallOfForce *lw = new WallOfForce[5]; + l->wallsOfForce = lw; in.read(l->wallsXorData, 4096); for (int ii = 0; ii < 1024; ii++) @@ -349,10 +354,14 @@ Common::Error EobCoreEngine::loadGameState(int slot) { m->flags = in.readByte(); m->unused = in.readByte(); } + + for (int ii = 0; ii < 5; ii++) { + WallOfForce *w = &lw[ii]; + w->block = in.readUint16BE(); + w->duration = in.readUint32BE(); + } } - if (_flags.gameID == GI_EOB1) - _screen->loadPalette("EOBPAL.COL", _screen->getPalette(0)); loadLevel(_currentLevel, _currentSub); _sceneUpdateRequired = true; _screen->setFont(Screen::FID_6_FNT); @@ -515,6 +524,7 @@ Common::Error EobCoreEngine::saveGameStateIntern(int slot, const char *saveName, EobMonsterInPlay *lm = (EobMonsterInPlay*)_lvlTempData[i]->monsters; EobFlyingObject *lf = (EobFlyingObject*)_lvlTempData[i]->flyingObjects; + WallOfForce *lw = (WallOfForce*)_lvlTempData[i]->wallsOfForce; for (int ii = 0; ii < 30; ii++) { EobMonsterInPlay *m = &lm[ii]; @@ -560,6 +570,12 @@ Common::Error EobCoreEngine::saveGameStateIntern(int slot, const char *saveName, out->writeByte(m->flags); out->writeByte(m->unused); } + + for (int ii = 0; ii < 5; ii++) { + WallOfForce *w = &lw[ii]; + out->writeUint16BE(w->block); + out->writeUint32BE(w->duration); + } } out->finalize(); @@ -591,6 +607,27 @@ void EobCoreEngine::releaseMonsterTempData(LevelTempData *tmp) { delete[] p; } +void *EobCoreEngine::generateWallOfForceTempData(LevelTempData *tmp) { + WallOfForce *w = new WallOfForce[5]; + memcpy(w, _wallsOfForce, sizeof(WallOfForce) * 5); + uint32 ct = _system->getMillis(); + for (int i = 0; i < 5; i++) + w[i].duration = (w[i].duration > ct) ? w[i].duration - ct : _tickLength; + return w; +} + +void EobCoreEngine::restoreWallOfForceTempData(LevelTempData *tmp) { + memcpy(_wallsOfForce, tmp->wallsOfForce, sizeof(WallOfForce) * 5); + uint32 ct = _system->getMillis(); + for (int i = 0; i < 5; i++) + _wallsOfForce[i].duration += ct; +} + +void EobCoreEngine::releaseWallOfForceTempData(LevelTempData *tmp) { + WallOfForce *p = (WallOfForce*)tmp->wallsOfForce; + delete[] p; +} + #endif // ENABLE_EOB } // End of namespace Kyra |