[Scummvm-git-logs] scummvm master -> 86fd7665afd93f39e5c074c62abf72900e0daf69
neuromancer
noreply at scummvm.org
Sat Aug 19 11:36:56 UTC 2023
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3452715597 FREESCAPE: corrected incorrect parsing of group objects in dark
39f2deaa35 FREESCAPE: improved group animations
86fd7665af FREESCAPE: group-related fixes
Commit: 34527155976815a0978e6eee52f7636b62d38106
https://github.com/scummvm/scummvm/commit/34527155976815a0978e6eee52f7636b62d38106
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-08-19T13:28:38+02:00
Commit Message:
FREESCAPE: corrected incorrect parsing of group objects in dark
Changed paths:
engines/freescape/loaders/8bitBinaryLoader.cpp
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index cf97cbdf9fb..b02c6e059e7 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -130,6 +130,7 @@ Group *FreescapeEngine::load8bitGroupV1(Common::SeekableReadStream *file, byte r
else
value = readField(file, 8);
+ debugC(1, kFreescapeDebugParser, "Reading value: %x", value);
int opcode = value >> 8;
AnimationOpcode* operation = new AnimationOpcode(opcode);
byteSizeOfObject--;
@@ -148,7 +149,7 @@ Group *FreescapeEngine::load8bitGroupV1(Common::SeekableReadStream *file, byte r
byteSizeOfObject = byteSizeOfObject - lengthOfCondition;
} else {
if (byteSizeOfObject >= 1) {
- operation->position.x() = value >> 8;
+ operation->position.x() = value & 0xff;
operation->position.y() = file->readByte();
operation->position.z() = file->readByte();
debugC(1, kFreescapeDebugParser, "Group operation %d move to: %f %f %f", opcode, operation->position.x(), operation->position.y(), operation->position.z());
Commit: 39f2deaa3587cd615b845ca1ca0a9e4fb83d1836
https://github.com/scummvm/scummvm/commit/39f2deaa3587cd615b845ca1ca0a9e4fb83d1836
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-08-19T13:28:38+02:00
Commit Message:
FREESCAPE: improved group animations
Changed paths:
engines/freescape/objects/geometricobject.cpp
engines/freescape/objects/geometricobject.h
engines/freescape/objects/group.cpp
engines/freescape/objects/group.h
diff --git a/engines/freescape/objects/geometricobject.cpp b/engines/freescape/objects/geometricobject.cpp
index d29667d61c2..550874325bd 100644
--- a/engines/freescape/objects/geometricobject.cpp
+++ b/engines/freescape/objects/geometricobject.cpp
@@ -144,9 +144,12 @@ GeometricObject::GeometricObject(
_colours = colours_;
_ordinates = nullptr;
+ _initialOrdinates = nullptr;
- if (ordinates_)
+ if (ordinates_) {
_ordinates = ordinates_;
+ _initialOrdinates = new Common::Array<uint16>(*_ordinates);
+ }
_condition = conditionInstructions_;
_conditionSource = conditionSource_;
@@ -196,11 +199,23 @@ void GeometricObject::scale(int factor) {
for (uint i = 0; i < _ordinates->size(); i++) {
// This division is always exact because each ordinate was multipled by 32
(*_ordinates)[i] = (*_ordinates)[i] / factor;
+ if (_initialOrdinates)
+ (*_initialOrdinates)[i] = (*_initialOrdinates)[i] / factor;
}
}
computeBoundingBox();
}
+void GeometricObject::restoreOrdinates() {
+ if (!isPolygon(_type))
+ return;
+
+ for (uint i = 0; i < _ordinates->size(); i++)
+ (*_ordinates)[i] = (*_initialOrdinates)[i];
+
+ computeBoundingBox();
+}
+
Object *GeometricObject::duplicate() {
Common::Array<uint8> *coloursCopy = nullptr;
Common::Array<uint16> *ordinatesCopy = nullptr;
@@ -369,6 +384,7 @@ void GeometricObject::computeBoundingBox() {
GeometricObject::~GeometricObject() {
delete _colours;
delete _ordinates;
+ delete _initialOrdinates;
}
bool GeometricObject::isDrawable() { return true; }
diff --git a/engines/freescape/objects/geometricobject.h b/engines/freescape/objects/geometricobject.h
index 99c9ad6fa47..900c218c733 100644
--- a/engines/freescape/objects/geometricobject.h
+++ b/engines/freescape/objects/geometricobject.h
@@ -51,6 +51,7 @@ public:
virtual ~GeometricObject();
void setOrigin(Math::Vector3d origin) override;
void offsetOrigin(Math::Vector3d origin_);
+ void restoreOrdinates();
Object *duplicate() override;
void scale(int factor) override;
@@ -66,6 +67,7 @@ public:
private:
Common::Array<uint8> *_colours;
Common::Array<uint16> *_ordinates;
+ Common::Array<uint16> *_initialOrdinates;
};
} // End of namespace Freescape
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 4e6c51f29b4..74635449f24 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -74,14 +74,14 @@ void Group::linkObject(Object *obj) {
void Group::assemble(int index) {
GeometricObject *gobj = (GeometricObject *)_objects[index];
+ gobj->makeVisible();
Math::Vector3d position = _operations[_step]->position;
if (!GeometricObject::isPolygon(gobj->getType()))
position = 32 * position / _scale;
else
position = position / _scale;
-
- gobj->offsetOrigin(position);
+ gobj->offsetOrigin(position + _origins[index] - _origins[0]);
}
void Group::run() {
@@ -100,9 +100,7 @@ void Group::run(int index) {
int opcode = _operations[_step]->opcode;
if (opcode == 0x80 || opcode == 0xff) {
- _step = -1;
- _active = false;
- _finished = false;
+ reset();
} else if (opcode == 0x01) {
g_freescape->executeCode(_operations[_step]->condition, false, true, false, false);
} else {
@@ -115,6 +113,21 @@ void Group::run(int index) {
}
}
+void Group::reset() {
+ _step = -1;
+ _active = false;
+ _finished = false;
+ uint32 groupSize = _objects.size();
+ for (uint32 i = 0; i < groupSize ; i++) {
+ GeometricObject *gobj = (GeometricObject *)_objects[i];
+ if (GeometricObject::isPolygon(_objects[i]->getType())) {
+ gobj->setOrigin(_origins[i]);
+ gobj->restoreOrdinates();
+ gobj->makeInvisible();
+ }
+ }
+}
+
void Group::draw(Renderer *gfx) {
uint32 groupSize = _objects.size();
for (uint32 i = 0; i < groupSize ; i++) {
diff --git a/engines/freescape/objects/group.h b/engines/freescape/objects/group.h
index 9ab7244b146..158b7a11520 100644
--- a/engines/freescape/objects/group.h
+++ b/engines/freescape/objects/group.h
@@ -48,6 +48,7 @@ public:
void step();
void run();
void run(int index);
+ void reset();
Common::Array<Object *> _objects;
Common::Array<Math::Vector3d> _origins;
Commit: 86fd7665afd93f39e5c074c62abf72900e0daf69
https://github.com/scummvm/scummvm/commit/86fd7665afd93f39e5c074c62abf72900e0daf69
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-08-19T13:28:38+02:00
Commit Message:
FREESCAPE: group-related fixes
Changed paths:
engines/freescape/loaders/8bitBinaryLoader.cpp
engines/freescape/objects/geometricobject.cpp
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index b02c6e059e7..9f8fcb16284 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -692,12 +692,6 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
if (newObject) {
newObject->scale(scale);
- if (newObject->getType() == ObjectType::kGroupType) {
- Group *group = (Group *)newObject;
- for (ObjectMap::iterator it = objectsByID->begin(); it != objectsByID->end(); ++it)
- group->linkObject(it->_value);
- }
-
if (newObject->getType() == kEntranceType) {
if (entrancesByID->contains(newObject->getObjectID() & 0x7fff))
error("WARNING: replacing object id %d (%d)", newObject->getObjectID(), newObject->getObjectID() & 0x7fff);
@@ -711,6 +705,16 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
} else if (!(isDemo() && isCastle()))
error("Failed to read an object!");
}
+
+ // Link all groups
+ for (ObjectMap::iterator it = objectsByID->begin(); it != objectsByID->end(); ++it) {
+ if (it->_value->getType() == ObjectType::kGroupType) {
+ Group *group = (Group *)it->_value;
+ for (ObjectMap::iterator itt = objectsByID->begin(); itt != objectsByID->end(); ++itt)
+ group->linkObject(itt->_value);
+ }
+ }
+
int64 endLastObject = file->pos();
debugC(1, kFreescapeDebugParser, "Last position %lx", endLastObject);
if (isDark() && isAmiga())
diff --git a/engines/freescape/objects/geometricobject.cpp b/engines/freescape/objects/geometricobject.cpp
index 550874325bd..5045a409b4a 100644
--- a/engines/freescape/objects/geometricobject.cpp
+++ b/engines/freescape/objects/geometricobject.cpp
@@ -184,9 +184,21 @@ void GeometricObject::offsetOrigin(Math::Vector3d origin_) {
Math::Vector3d offset = origin_ - _origin;
offset = 32 * offset;
for (int i = 0; i < int(_ordinates->size()); i = i + 3) {
- (*_ordinates)[i ] += uint16(offset.x());
- (*_ordinates)[i + 1] += uint16(offset.y());
- (*_ordinates)[i + 2] += uint16(offset.z());
+ int16 ordinate = 0;
+ ordinate = (*_ordinates)[i];
+ ordinate += int16(offset.x());
+ assert(ordinate >= 0);
+ (*_ordinates)[i] = uint16(ordinate);
+
+ ordinate = (*_ordinates)[i + 1];
+ ordinate += int16(offset.y());
+ assert(ordinate >= 0);
+ (*_ordinates)[i + 1] = uint16(ordinate);
+
+ ordinate = (*_ordinates)[i + 2];
+ ordinate += int16(offset.z());
+ assert(ordinate >= 0);
+ (*_ordinates)[i + 2] = uint16(ordinate);
}
}
setOrigin(origin_);
More information about the Scummvm-git-logs
mailing list