STARK: Add state serializers for a number of entities

This commit is contained in:
Bastien Bouclet 2017-05-31 21:35:26 +02:00
parent 0ee5d78473
commit 2e8766fbbf
14 changed files with 127 additions and 5 deletions

View File

@ -972,6 +972,14 @@ Anim *ModelItem::getIdleActionAnim() const {
return nullptr;
}
void ModelItem::saveLoadCurrent(ResourceSerializer *serializer) {
FloorPositionedItem::saveLoadCurrent(serializer);
serializer->syncAsSint32LE(_meshIndex);
serializer->syncAsSint32LE(_textureNormalIndex);
serializer->syncAsSint32LE(_textureFaceIndex);
}
void ModelItem::printData() {
FloorPositionedItem::printData();

View File

@ -412,6 +412,7 @@ public:
void onAllLoaded() override;
void onEnterLocation() override;
void onExitLocation() override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
// Item API
Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset) override;

View File

@ -28,6 +28,8 @@
#include "engines/stark/resources/item.h"
#include "engines/stark/resources/light.h"
#include "engines/stark/services/stateprovider.h"
#include "common/debug.h"
namespace Stark {
@ -98,6 +100,15 @@ Gfx::LightEntryArray Layer::listLightEntries() {
return lightEntries;
}
void Layer::saveLoad(ResourceSerializer *serializer) {
serializer->syncAsSint32LE(_enabled);
}
void Layer::saveLoadCurrent(ResourceSerializer *serializer) {
serializer->syncAsSint32LE(_scroll.x);
serializer->syncAsSint32LE(_scroll.y);
}
Layer2D::~Layer2D() {
}

View File

@ -61,6 +61,8 @@ public:
// Resource API
virtual void readData(Formats::XRCReadStream *stream) override;
virtual void saveLoad(ResourceSerializer *serializer) override;
virtual void saveLoadCurrent(ResourceSerializer *serializer) override;
/** Obtain the render entry for the background item */
virtual Gfx::RenderEntry *getBackgroundRenderEntry() = 0;

View File

@ -38,6 +38,7 @@
#include "engines/stark/scene.h"
#include "engines/stark/services/global.h"
#include "engines/stark/services/services.h"
#include "engines/stark/services/stateprovider.h"
#include "common/random.h"
@ -492,5 +493,31 @@ void Location::floatScene(int32 periodMs, float amplitude, float offset) {
_floatPosition = offset;
}
void Location::saveLoadCurrent(ResourceSerializer *serializer) {
serializer->syncAsSint32LE(_scroll.x);
serializer->syncAsSint32LE(_scroll.y);
if (serializer->isLoading()) {
setScrollPosition(_scroll);
}
serializer->syncAsResourceReference(&_currentLayer);
serializer->syncAsSint32LE(_floatPeriodMs);
serializer->syncAsFloat(_floatAmplitude);
serializer->syncAsFloat(_floatPosition);
serializer->syncAsSint32LE(_swayPeriodMs);
serializer->syncAsFloat(_swayAmplitude);
serializer->syncAsFloat(_swayOffset);
serializer->syncAsFloat(_swayPosition);
float swayAngle = _swayAngle.getDegrees();
serializer->syncAsFloat(swayAngle);
if (serializer->isLoading()) {
_swayAngle = swayAngle;
}
}
} // End of namespace Resources
} // End of namespace Stark

View File

@ -59,6 +59,7 @@ public:
// Resource API
void onAllLoaded() override;
void onGameLoop() override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
/** Does the location have a 3D layer ? */
bool has3DLayer();

View File

@ -414,5 +414,27 @@ void Script::saveLoad(ResourceSerializer *serializer) {
serializer->syncAsSint32LE(_enabled);
}
void Script::saveLoadCurrent(ResourceSerializer *serializer) {
bool isStarted = !isOnBegin();
serializer->syncAsUint32LE(isStarted);
if (isStarted) {
serializer->syncAsResourceReference(&_nextCommand);
uint32 returnObjectCount = _returnObjects.size();
serializer->syncAsUint32LE(returnObjectCount);
if (serializer->isLoading()) {
_returnObjects.resize(returnObjectCount);
}
for (uint i = 0; i < _returnObjects.size(); i++) {
serializer->syncAsResourceReference(&_returnObjects[i]);
}
serializer->syncAsSint32LE(_pauseTimeLeft);
serializer->syncAsResourceReference(&_suspendingResource);
serializer->syncAsSint32LE(_resumeStatus);
}
}
} // End of namespace Resources
} // End of namespace Stark

View File

@ -95,6 +95,7 @@ public:
// Resource API
void readData(Formats::XRCReadStream *stream) override;
void saveLoad(ResourceSerializer *serializer) override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
void onAllLoaded() override;
void onGameLoop() override;

View File

@ -23,8 +23,8 @@
#include "engines/stark/resources/scroll.h"
#include "engines/stark/formats/xrc.h"
#include "engines/stark/resources/location.h"
#include "engines/stark/services/stateprovider.h"
namespace Stark {
namespace Resources {
@ -76,12 +76,19 @@ void Scroll::onGameLoop() {
}
void Scroll::readData(Formats::XRCReadStream *stream) {
_coordinate = stream->readUint32LE();
_field_30 = stream->readUint32LE();
_field_34 = stream->readUint32LE();
_bookmarkIndex = stream->readUint32LE();
_coordinate = stream->readUint32LE();
_field_30 = stream->readUint32LE();
_field_34 = stream->readUint32LE();
_bookmarkIndex = stream->readUint32LE();
}
void Scroll::saveLoadCurrent(ResourceSerializer *serializer) {
serializer->syncAsUint32LE(_active);
if (serializer->isLoading() && _active) {
start();
}
}
void Scroll::printData() {
debug("coordinate: %d", _coordinate);

View File

@ -48,6 +48,7 @@ public:
// Resource API
void readData(Formats::XRCReadStream *stream) override;
void onGameLoop() override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
/** Start scrolling the location to this position */
void start();

View File

@ -31,6 +31,7 @@
#include "engines/stark/services/archiveloader.h"
#include "engines/stark/services/global.h"
#include "engines/stark/services/services.h"
#include "engines/stark/services/stateprovider.h"
namespace Stark {
namespace Resources {
@ -230,5 +231,25 @@ void Sound::changeVolumePan(int32 volume, int32 pan, int32 duration) {
}
}
void Sound::saveLoadCurrent(ResourceSerializer *serializer) {
bool playing = isPlaying();
serializer->syncAsUint32LE(playing);
if (_subType != kSoundSub3 && playing) {
uint32 elapsed = g_system->getMixer()->getSoundElapsedTime(_handle);
serializer->syncAsUint32LE(elapsed);
serializer->syncAsFloat(_volume);
serializer->syncAsFloat(_pan);
serializer->syncAsUint32LE(_fadeDurationRemaining);
serializer->syncAsFloat(_fadeTargetVolume);
serializer->syncAsFloat(_fadeTargetPan);
if (serializer->isLoading()) {
play();
// TODO: Seek to the "elapsed" position
}
}
}
} // End of namespace Resources
} // End of namespace Stark

View File

@ -49,6 +49,7 @@ public:
static const Type::ResourceType TYPE = Type::kSoundItem;
enum SubType {
kSoundSub3 = 3,
kSoundStock = 5
};
@ -65,6 +66,7 @@ public:
void readData(Formats::XRCReadStream *stream) override;
void onPreDestroy() override;
void onGameLoop() override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
/** Start playing the sound */
void play();

View File

@ -25,7 +25,9 @@
#include "engines/stark/formats/xrc.h"
#include "engines/stark/services/services.h"
#include "engines/stark/services/dialogplayer.h"
#include "engines/stark/services/global.h"
#include "engines/stark/services/stateprovider.h"
#include "engines/stark/resources/anim.h"
#include "engines/stark/resources/item.h"
@ -186,5 +188,20 @@ void Speech::stopOtherSpeechesFromSameCharacter() {
}
}
void Speech::saveLoadCurrent(ResourceSerializer *serializer) {
bool playing = isPlaying();
serializer->syncAsUint32LE(playing);
if (playing) {
serializer->syncAsUint32LE(_removeTalkAnimWhenComplete);
serializer->syncAsResourceReference(&_soundResource);
serializer->syncAsResourceReference(&_lipSync);
if (serializer->isLoading()) {
StarkDialogPlayer->playSingle(this);
}
}
}
} // End of namespace Resources
} // End of namespace Stark

View File

@ -58,6 +58,7 @@ public:
void onGameLoop() override;
void onExitLocation() override;
void onPreDestroy() override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
/** Obtain the text associated to the speech line */
Common::String getPhrase() const;