[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