[Scummvm-git-logs] scummvm master -> 1606ca27cd306f8bac1f15564c09f78c6b445fae

neuromancer noreply at scummvm.org
Tue Nov 4 13:55:02 UTC 2025


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
85b8377979 FREESCAPE: avoid initialization/casting issue for group objects
1606ca27cd FREESCAPE: avoid undefined behavior


Commit: 85b8377979677950d5980d1c1ee3f0886b6fa825
    https://github.com/scummvm/scummvm/commit/85b8377979677950d5980d1c1ee3f0886b6fa825
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-11-04T14:38:20+01:00

Commit Message:
FREESCAPE: avoid initialization/casting issue for group objects

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/objects/group.cpp
    engines/freescape/objects/object.h


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index f24ca8d5492..83f98946b63 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -452,7 +452,7 @@ Math::Vector3d Area::separateFromWall(const Math::Vector3d &_position) {
 	Math::Vector3d position = _position;
 	float sep = 8 / _scale;
 	for (auto &obj : _drawableObjects) {
-		if (!obj->isDestroyed() && !obj->isInvisible()) {
+		if (!obj->isDestroyed() && !obj->isInvisible() && obj->isGeometric()) {
 			GeometricObject *gobj = (GeometricObject *)obj;
 			Math::Vector3d distance = gobj->_boundingBox.distance(position);
 			if (distance.length() > 0.0001)
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 9a1509a2a39..47cfb9db1a2 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -30,6 +30,7 @@ const Common::Array<uint16> objectIds_,
 const Math::Vector3d offset1_,
 const Math::Vector3d offset2_,
 const Common::Array<AnimationOpcode *> operations_) {
+	_type = kGroupType;
 	_objectID = objectID_;
 	_flags = flags_;
 	_scale = 0;
diff --git a/engines/freescape/objects/object.h b/engines/freescape/objects/object.h
index bdf82e53128..6bcc6abced1 100644
--- a/engines/freescape/objects/object.h
+++ b/engines/freescape/objects/object.h
@@ -58,6 +58,9 @@ public:
 	virtual ObjectType getType() { return _type; }
 	uint16 getObjectID() { return _objectID; }
 	uint16 getObjectFlags() { return _flags; }
+	bool isGeometric() {
+		return _type != kEntranceType && _type != kGroupType && _type != kSensorType;
+	}
 	void setObjectFlags(uint32 flags_) { _flags = flags_; }
 	Math::Vector3d getOrigin() { return _origin; }
 	virtual void setOrigin(Math::Vector3d origin_) { _origin = origin_; };


Commit: 1606ca27cd306f8bac1f15564c09f78c6b445fae
    https://github.com/scummvm/scummvm/commit/1606ca27cd306f8bac1f15564c09f78c6b445fae
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-11-04T14:54:46+01:00

Commit Message:
FREESCAPE: avoid undefined behavior

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/objects/sensor.cpp
    engines/freescape/sound.cpp


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index 83f98946b63..d3e675a288f 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -402,7 +402,7 @@ Object *Area::checkCollisionRay(const Math::Ray &ray, int raySize) {
 			if (((GeometricObject *)obj)->isLineButNotStraight())
 				continue;
 
-		if (!obj->isDestroyed() && !obj->isInvisible()) {
+		if (!obj->isDestroyed() && !obj->isInvisible() && obj->isGeometric()) {
 			GeometricObject *gobj = (GeometricObject *)obj;
 			Math::Vector3d collidedNormal;
 			float collidedDistance = sweepAABB(boundingBox, gobj->_boundingBox, raySize * ray.getDirection(), collidedNormal);
@@ -426,7 +426,7 @@ Object *Area::checkCollisionRay(const Math::Ray &ray, int raySize) {
 ObjectArray Area::checkCollisions(const Math::AABB &boundingBox) {
 	ObjectArray collided;
 	for (auto &obj : _drawableObjects) {
-		if (!obj->isDestroyed() && !obj->isInvisible()) {
+		if (!obj->isDestroyed() && !obj->isInvisible() && obj->isGeometric()) {
 			GeometricObject *gobj = (GeometricObject *)obj;
 			if (gobj->collides(boundingBox)) {
 				collided.push_back(gobj);
@@ -508,7 +508,7 @@ Math::Vector3d Area::resolveCollisions(const Math::Vector3d &lastPosition_, cons
 		Math::Vector3d direction = position - lastPosition;
 
 		for (auto &obj : _drawableObjects) {
-			if (!obj->isDestroyed() && !obj->isInvisible()) {
+			if (!obj->isDestroyed() && !obj->isInvisible() && obj->isGeometric()) {
 				GeometricObject *gobj = (GeometricObject *)obj;
 				Math::Vector3d collidedNormal;
 				float collidedDistance = sweepAABB(boundingBox, gobj->_boundingBox, direction, collidedNormal);
diff --git a/engines/freescape/objects/sensor.cpp b/engines/freescape/objects/sensor.cpp
index ec23f365537..165018717d0 100644
--- a/engines/freescape/objects/sensor.cpp
+++ b/engines/freescape/objects/sensor.cpp
@@ -34,6 +34,7 @@ Sensor::Sensor(
 	uint8 flags_,
 	FCLInstructionVector condition_,
 	Common::String conditionSource_) {
+	_type = kSensorType;
 	_objectID = objectID_;
 	_origin = origin_;
 	_rotation = rotation_;
diff --git a/engines/freescape/sound.cpp b/engines/freescape/sound.cpp
index 875e7fdb7ff..f7f9bf24083 100644
--- a/engines/freescape/sound.cpp
+++ b/engines/freescape/sound.cpp
@@ -485,9 +485,11 @@ uint16 FreescapeEngine::playSoundDOSSpeaker(uint16 frequencyStart, soundSpeakerF
 	int waveDuration = waveDurationMultipler * (frequencyDuration + 1);
 
 	while (true) {
-		float hzFreq = 1193180.0 / freq;
-		debugC(1, kFreescapeDebugMedia, "raw %d, hz: %f, duration: %d", freq, hzFreq, waveDuration);
-		_speaker->playQueue(Audio::PCSpeaker::kWaveFormSquare, hzFreq, waveDuration);
+		if (freq > 0) {
+			float hzFreq = 1193180.0 / freq;
+			debugC(1, kFreescapeDebugMedia, "raw %d, hz: %f, duration: %d", freq, hzFreq, waveDuration);
+			_speaker->playQueue(Audio::PCSpeaker::kWaveFormSquare, hzFreq, waveDuration);
+		}
 		if (frequencyStepsNumber > 0) {
 			// Ascending initial portions of cycle
 			freq += frequencyStep;




More information about the Scummvm-git-logs mailing list