aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/saveload_eob.cpp
diff options
context:
space:
mode:
authorathrxx2011-08-15 01:43:26 +0200
committerJohannes Schickel2011-12-26 16:18:14 +0100
commitb288889c978990423b08dad8f838d891610f36b5 (patch)
tree888ac176612b06a7389e6b8f3f623d472cf10cdd /engines/kyra/saveload_eob.cpp
parent0d54aff6324b1f6c739df89ab072328cc5402873 (diff)
downloadscummvm-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.cpp51
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