diff options
Diffstat (limited to 'engines/bladerunner/set.cpp')
-rw-r--r-- | engines/bladerunner/set.cpp | 93 |
1 files changed, 84 insertions, 9 deletions
diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp index fe10c189b6..ac026a4d76 100644 --- a/engines/bladerunner/set.cpp +++ b/engines/bladerunner/set.cpp @@ -25,6 +25,7 @@ #include "bladerunner/bladerunner.h" #include "bladerunner/game_constants.h" #include "bladerunner/lights.h" +#include "bladerunner/savefile.h" #include "bladerunner/scene_objects.h" #include "bladerunner/set_effects.h" #include "bladerunner/slice_renderer.h" @@ -67,8 +68,10 @@ bool Set::open(const Common::String &name) { _objectCount = s->readUint32LE(); assert(_objectCount <= 85); + char buf[20]; for (int i = 0; i < _objectCount; ++i) { - s->read(_objects[i].name, 20); + s->read(buf, sizeof(buf)); + _objects[i].name = buf; float x0, y0, z0, x1, y1, z1; x0 = s->readFloatLE(); @@ -82,6 +85,7 @@ bool Set::open(const Common::String &name) { _objects[i].isObstacle = s->readByte(); _objects[i].isClickable = s->readByte(); _objects[i].isHotMouse = 0; + _objects[i].unknown1 = 0; _objects[i].isTarget = 0; s->skip(4); @@ -94,7 +98,9 @@ bool Set::open(const Common::String &name) { for (int i = 0; i < _walkboxCount; ++i) { float x, z; - s->read(_walkboxes[i].name, 20); + s->read(buf, sizeof(buf)); + _walkboxes[i].name = buf; + _walkboxes[i].altitude = s->readFloatLE(); _walkboxes[i].vertexCount = s->readUint32LE(); @@ -129,7 +135,7 @@ bool Set::open(const Common::String &name) { void Set::addObjectsToScene(SceneObjects *sceneObjects) const { for (int i = 0; i < _objectCount; i++) { - sceneObjects->addObject(i + kSceneObjectOffsetObjects, &_objects[i].bbox, _objects[i].isClickable, _objects[i].isObstacle, _objects[i].unknown1, _objects[i].isTarget); + sceneObjects->addObject(i + kSceneObjectOffsetObjects, _objects[i].bbox, _objects[i].isClickable, _objects[i].isObstacle, _objects[i].unknown1, _objects[i].isTarget); } } @@ -207,15 +213,14 @@ int Set::findWalkbox(float x, float z) const { return result; } -int Set::findObject(const char *objectName) const { - int i; - for (i = 0; i < (int)_objectCount; i++) { - if (scumm_stricmp(objectName, _objects[i].name) == 0) { +int Set::findObject(const Common::String &objectName) const { + for (int i = 0; i < _objectCount; ++i) { + if (objectName.compareToIgnoreCase(_objects[i].name) == 0) { return i; } } - debug("Set::findObject didn't find \"%s\"", objectName); + debug("Set::findObject didn't find \"%s\"", objectName.c_str()); return -1; } @@ -256,7 +261,7 @@ void Set::objectSetIsTarget(int objectId, bool isTarget) { _objects[objectId].isTarget = isTarget; } -const char *Set::objectGetName(int objectId) const { +const Common::String &Set::objectGetName(int objectId) const { return _objects[objectId].name; } @@ -327,4 +332,74 @@ int Set::getWalkboxSoundRunLeft(int walkboxId) const { int Set::getWalkboxSoundRunRight(int walkboxId) const { return getWalkboxSoundWalkRight(walkboxId); } + +void Set::save(SaveFileWriteStream &f) { + f.writeBool(_loaded); + f.writeInt(_objectCount); + f.writeInt(_walkboxCount); + + for (int i = 0; i != _objectCount; ++i) { + f.writeStringSz(_objects[i].name, 20); + f.writeBoundingBox(_objects[i].bbox); + f.writeBool(_objects[i].isObstacle); + f.writeBool(_objects[i].isClickable); + f.writeBool(_objects[i].isHotMouse); + f.writeInt(_objects[i].unknown1); + f.writeBool(_objects[i].isTarget); + } + + for (int i = 0; i != _walkboxCount; ++i) { + f.writeStringSz(_walkboxes[i].name, 20); + f.writeFloat(_walkboxes[i].altitude); + f.writeInt(_walkboxes[i].vertexCount); + for (int j = 0; j != 8; ++j) { + f.writeVector3(_walkboxes[i].vertices[j]); + + // In BLADE.EXE vertices are a vec5 + f.writeInt(0); + f.writeInt(0); + } + } + + for (int i = 0; i != 85; ++i) { + f.writeInt(_walkboxStepSound[i]); + } + + f.writeInt(_footstepSoundOverride); +} + +void Set::load(SaveFileReadStream &f) { + _loaded = f.readBool(); + _objectCount = f.readInt(); + _walkboxCount = f.readInt(); + + for (int i = 0; i != _objectCount; ++i) { + _objects[i].name = f.readStringSz(20); + _objects[i].bbox = f.readBoundingBox(); + _objects[i].isObstacle = f.readBool(); + _objects[i].isClickable = f.readBool(); + _objects[i].isHotMouse = f.readBool(); + _objects[i].unknown1 = f.readInt(); + _objects[i].isTarget = f.readBool(); + } + + for (int i = 0; i != _walkboxCount; ++i) { + _walkboxes[i].name = f.readStringSz(20); + _walkboxes[i].altitude = f.readFloat(); + _walkboxes[i].vertexCount = f.readInt(); + for (int j = 0; j != 8; ++j) { + _walkboxes[i].vertices[j] = f.readVector3(); + + // In BLADE.EXE vertices are a vec5 + f.skip(8); + } + } + + for (int i = 0; i != 85; ++i) { + _walkboxStepSound[i] = f.readInt(); + } + + _footstepSoundOverride = f.readInt(); +} + } // End of namespace BladeRunner |