diff options
Diffstat (limited to 'engines/mutationofjb/gamedata.cpp')
| -rw-r--r-- | engines/mutationofjb/gamedata.cpp | 144 | 
1 files changed, 129 insertions, 15 deletions
diff --git a/engines/mutationofjb/gamedata.cpp b/engines/mutationofjb/gamedata.cpp index a669fcffbb..71f58c317b 100644 --- a/engines/mutationofjb/gamedata.cpp +++ b/engines/mutationofjb/gamedata.cpp @@ -21,12 +21,14 @@   */  #include "mutationofjb/gamedata.h" + +#include "common/serializer.h"  #include "common/stream.h"  #include "common/util.h"  namespace MutationOfJB { -static bool readString(Common::ReadStream &stream, char *str) { +static bool readEntityNameString(Common::ReadStream &stream, char *str) {  	char buf[MAX_ENTITY_NAME_LENGTH];  	memset(str, 0, MAX_ENTITY_NAME_LENGTH + 1); @@ -39,12 +41,24 @@ static bool readString(Common::ReadStream &stream, char *str) {  	return true;  } +static void syncEntityNameString(char *cstr, Common::Serializer &sz) { +	if (sz.isLoading()) { +		Common::String str; +		sz.syncString(str); +		strncpy(cstr, str.c_str(), MAX_ENTITY_NAME_LENGTH); +		cstr[MAX_ENTITY_NAME_LENGTH] = 0; +	} else { +		Common::String str(cstr); +		sz.syncString(str); +	} +} +  bool Door::isActive() {  	return *_name != '\0';  } -bool Door::loadFromStream(Common::ReadStream &stream) { -	readString(stream, _name); +bool Door::loadInitialState(Common::ReadStream &stream) { +	readEntityNameString(stream, _name);  	_destSceneId = stream.readByte();  	_destX = stream.readUint16LE(); @@ -60,7 +74,21 @@ bool Door::loadFromStream(Common::ReadStream &stream) {  	return true;  } -bool Object::loadFromStream(Common::ReadStream &stream) { +void Door::saveLoadWithSerializer(Common::Serializer &sz) { +	syncEntityNameString(_name, sz); +	sz.syncAsByte(_destSceneId); +	sz.syncAsUint16LE(_destX); +	sz.syncAsUint16LE(_destY); +	sz.syncAsUint16LE(_x); +	sz.syncAsByte(_y); +	sz.syncAsUint16LE(_width); +	sz.syncAsByte(_height); +	sz.syncAsUint16LE(_walkToX); +	sz.syncAsByte(_walkToY); +	sz.syncAsByte(_SP); +} + +bool Object::loadInitialState(Common::ReadStream &stream) {  	_active = stream.readByte();  	_firstFrame = stream.readByte();  	_randomFrame = stream.readByte(); @@ -79,9 +107,26 @@ bool Object::loadFromStream(Common::ReadStream &stream) {  	return true;  } -bool Static::loadFromStream(Common::ReadStream &stream) { +void Object::saveLoadWithSerializer(Common::Serializer &sz) { +	sz.syncAsByte(_active); +	sz.syncAsByte(_firstFrame); +	sz.syncAsByte(_randomFrame); +	sz.syncAsByte(_numFrames); +	sz.syncAsByte(_roomFrameLSB); +	sz.syncAsByte(_jumpChance); +	sz.syncAsByte(_currentFrame); +	sz.syncAsUint16LE(_x); +	sz.syncAsByte(_y); +	sz.syncAsUint16LE(_width); +	sz.syncAsByte(_height); +	sz.syncAsUint16LE(_WX); +	sz.syncAsByte(_roomFrameMSB); +	sz.syncAsByte(_SP); +} + +bool Static::loadInitialState(Common::ReadStream &stream) {  	_active = stream.readByte(); -	readString(stream, _name); +	readEntityNameString(stream, _name);  	_x = stream.readUint16LE();  	_y = stream.readByte();  	_width = stream.readUint16LE(); @@ -93,7 +138,19 @@ bool Static::loadFromStream(Common::ReadStream &stream) {  	return true;  } -bool Bitmap::loadFromStream(Common::ReadStream &stream) { +void Static::saveLoadWithSerializer(Common::Serializer &sz) { +	sz.syncAsByte(_active); +	syncEntityNameString(_name, sz); +	sz.syncAsUint16LE(_x); +	sz.syncAsByte(_y); +	sz.syncAsUint16LE(_width); +	sz.syncAsByte(_height); +	sz.syncAsUint16LE(_walkToX); +	sz.syncAsByte(_walkToY); +	sz.syncAsByte(_walkToFrame); +} + +bool Bitmap::loadInitialState(Common::ReadStream &stream) {  	_roomFrame = stream.readByte();  	_isVisible = stream.readByte();  	_x1 = stream.readUint16LE(); @@ -104,7 +161,16 @@ bool Bitmap::loadFromStream(Common::ReadStream &stream) {  	return true;  } -bool Scene::loadFromStream(Common::ReadStream &stream) { +void Bitmap::saveLoadWithSerializer(Common::Serializer &sz) { +	sz.syncAsByte(_roomFrame); +	sz.syncAsByte(_isVisible); +	sz.syncAsUint16LE(_x1); +	sz.syncAsByte(_y1); +	sz.syncAsUint16LE(_x2); +	sz.syncAsByte(_y2); +} + +bool Scene::loadInitialState(Common::ReadStream &stream) {  	int i;  	_startup = stream.readByte(); @@ -116,23 +182,23 @@ bool Scene::loadFromStream(Common::ReadStream &stream) {  	_noDoors = stream.readByte();  	_noDoors = MIN(_noDoors, static_cast<uint8>(ARRAYSIZE(_doors)));  	for (i = 0; i < ARRAYSIZE(_doors); ++i) { -		_doors[i].loadFromStream(stream); +		_doors[i].loadInitialState(stream);  	}  	_noObjects = stream.readByte();  	_noObjects = MIN(_noObjects, static_cast<uint8>(ARRAYSIZE(_objects)));  	for (i = 0; i < ARRAYSIZE(_objects); ++i) { -		_objects[i].loadFromStream(stream); +		_objects[i].loadInitialState(stream);  	}  	_noStatics = stream.readByte();  	_noStatics = MIN(_noStatics, static_cast<uint8>(ARRAYSIZE(_statics)));  	for (i = 0; i < ARRAYSIZE(_statics); ++i) { -		_statics[i].loadFromStream(stream); +		_statics[i].loadInitialState(stream);  	}  	for (i = 0; i < ARRAYSIZE(_bitmaps); ++i) { -		_bitmaps[i].loadFromStream(stream); +		_bitmaps[i].loadInitialState(stream);  	}  	_obstacleY1 = stream.readUint16LE(); @@ -141,13 +207,50 @@ bool Scene::loadFromStream(Common::ReadStream &stream) {  	_palRotDelay = stream.readByte();  	_exhaustedConvItemNext = stream.readByte(); -	for (i = 0; i < 79; ++i) { +	for (i = 0; i < ARRAYSIZE(_exhaustedConvItems); ++i) {  		_exhaustedConvItems[i]._encodedData = stream.readByte();  	}  	return true;  } +void Scene::saveLoadWithSerializer(Common::Serializer &sz) { +	sz.syncAsByte(_startup); +	sz.syncAsByte(_unknown001); +	sz.syncAsByte(_unknown002); +	sz.syncAsByte(_unknown003); +	sz.syncAsByte(_delay); + +	sz.syncAsByte(_noDoors); +	for (int i = 0; i < ARRAYSIZE(_doors); ++i) { +		_doors[i].saveLoadWithSerializer(sz); +	} + +	sz.syncAsByte(_noObjects); +	for (int i = 0; i < ARRAYSIZE(_objects); ++i) { +		_objects[i].saveLoadWithSerializer(sz); +	} + +	sz.syncAsByte(_noStatics); +	for (int i = 0; i < ARRAYSIZE(_statics); ++i) { +		_statics[i].saveLoadWithSerializer(sz); +	} + +	for (int i = 0; i < ARRAYSIZE(_bitmaps); ++i) { +		_bitmaps[i].saveLoadWithSerializer(sz); +	} + +	sz.syncAsUint16LE(_obstacleY1); +	sz.syncAsByte(_palRotFirst); +	sz.syncAsByte(_palRotLast); +	sz.syncAsByte(_palRotDelay); +	sz.syncAsByte(_exhaustedConvItemNext); + +	for (int i = 0; i < ARRAYSIZE(_exhaustedConvItems); ++i) { +		sz.syncAsByte(_exhaustedConvItems[i]._encodedData); +	} +} +  Door *Scene::getDoor(uint8 doorId) {  	if (doorId == 0 || doorId > _noDoors) {  		warning("Door %d does not exist", doorId); @@ -270,12 +373,23 @@ Inventory &GameData::getInventory() {  	return _inventory;  } -bool GameData::loadFromStream(Common::ReadStream &stream) { +bool GameData::loadInitialState(Common::ReadStream &stream) {  	for (int i = 0; i < ARRAYSIZE(_scenes); ++i) { -		_scenes[i].loadFromStream(stream); +		_scenes[i].loadInitialState(stream);  	}  	return true;  } +void GameData::saveLoadWithSerializer(Common::Serializer &sz) { +	for (int i = 0; i < ARRAYSIZE(_scenes); ++i) { +		_scenes[i].saveLoadWithSerializer(sz); +	} + +	sz.syncAsByte(_currentScene); +	sz.syncAsByte(_partB); +	_inventory.saveLoadWithSerializer(sz); +	sz.syncString(_currentAPK); +} +  }  | 
