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  | 
