[Scummvm-git-logs] scummvm master -> 52b61f1ffe2f77e085ab2b98726ba84b41bcbc29

neuromancer noreply at scummvm.org
Sat Nov 12 08:21:47 UTC 2022


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

Summary:
f7fc6e603d FREESCAPE: fix regresion when showing the area name in driller
8959112008 FREESCAPE: scale objects from areas and the player height if necessary
84c553c5ac FREESCAPE: refactor duplicate and scale object code
52b61f1ffe FREESCAPE: workaround to show the complete main menu dialog


Commit: f7fc6e603d9368004de914c9c450666281403497
    https://github.com/scummvm/scummvm/commit/f7fc6e603d9368004de914c9c450666281403497
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-12T09:22:46+01:00

Commit Message:
FREESCAPE: fix regresion when showing the area name in driller

Changed paths:
    engines/freescape/games/driller.cpp


diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 90b953d3e17..d55f1f9261a 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -363,7 +363,7 @@ void DrillerEngine::drawDOSUI(Graphics::Surface *surface) {
 	uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
 
 	int score = _gameStateVars[k8bitVariableScore];
-	drawStringInSurface(_currentArea->_name, 195, 177, yellow, black, surface);
+	drawStringInSurface(_currentArea->_name, 195, 185, yellow, black, surface);
 	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.x())), 150, 145, yellow, black, surface);
 	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.z())), 150, 153, yellow, black, surface);
 	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.y())), 150, 161, yellow, black, surface);


Commit: 8959112008b5d7c70b82fd60fad499b4e8c9ee63
    https://github.com/scummvm/scummvm/commit/8959112008b5d7c70b82fd60fad499b4e8c9ee63
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-12T09:22:46+01:00

Commit Message:
FREESCAPE: scale objects from areas and the player height if necessary

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/driller.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/movement.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 8d7998ca1e2..171b427a2e6 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -186,7 +186,7 @@ void FreescapeEngine::drawUI() {
 }
 
 void FreescapeEngine::drawFrame() {
-	_gfx->updateProjectionMatrix(60.0, _nearClipPlane, _farClipPlane);
+	_gfx->updateProjectionMatrix(70.0, _nearClipPlane, _farClipPlane);
 	_gfx->positionCamera(_position, _position + _cameraFront);
 	_currentArea->draw(_gfx);
 	drawBorder();
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index fd1485893d4..8c8642da874 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -140,7 +140,7 @@ public:
 	// 8-bit
 	void load8bitBinary(Common::SeekableReadStream *file, int offset, int ncolors);
 	Area *load8bitArea(Common::SeekableReadStream *file, uint16 ncolors);
-	Object *load8bitObject(Common::SeekableReadStream *file);
+	Object *load8bitObject(Common::SeekableReadStream *file, int scale);
 
 	// Areas
 	uint16 _startArea;
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index d55f1f9261a..fe8e4405c0e 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -103,7 +103,7 @@ void DrillerEngine::loadGlobalObjects(Common::SeekableReadStream *file, int offs
 	ObjectMap *globalObjectsByID = new ObjectMap;
 	file->seek(offset);
 	for (int i = 0; i < 8; i++) {
-		Object *gobj = load8bitObject(file);
+		Object *gobj = load8bitObject(file, 1);
 		assert(gobj);
 		assert(!globalObjectsByID->contains(gobj->getObjectID()));
 		debugC(1, kFreescapeDebugParser, "Adding global object: %d", gobj->getObjectID());
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index 7ff33fb47b4..690f62c7a48 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -70,7 +70,7 @@ Common::Array<uint8> FreescapeEngine::readArray(Common::SeekableReadStream *file
 	return array;
 }
 
-Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
+Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int scale) {
 
 	byte rawFlagsAndType = readField(file, 8);
 	debugC(1, kFreescapeDebugParser, "Raw object data flags and type: %d", rawFlagsAndType);
@@ -160,7 +160,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 			for (int ordinate = 0; ordinate < numberOfOrdinates; ordinate++) {
 				ord = readField(file, 8);
 				debugC(1, kFreescapeDebugParser, "ord: %x", ord);
-				ordinates->push_back(32 * ord);
+				ordinates->push_back(32 * ord / scale);
 				byteSizeOfObject--;
 			}
 		}
@@ -184,8 +184,8 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 			objectType,
 			objectID,
 			rawFlagsAndType, // flags
-			position,
-			32 * v, // size
+			position / scale,
+			32 * v / scale, // size
 			colours,
 			ordinates,
 			instructions,
@@ -206,7 +206,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		// create an entrance
 		return new Entrance(
 			objectID,
-			32 * position,
+			32 * position / scale,
 			5 * v); // rotation
 	} break;
 
@@ -224,7 +224,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		// create an entrance
 		return new Sensor(
 			objectID,
-			32 * position,
+			32 * position / scale,
 			5 * v); // rotation
 	} break;
 
@@ -233,7 +233,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		file->seek(byteSizeOfObject, SEEK_CUR);
 		return new Sensor(
 			objectID,
-			position,
+			position / scale,
 			v);
 		break;
 	}
@@ -343,7 +343,7 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 	ObjectMap *entrancesByID = new ObjectMap;
 	for (uint8 object = 0; object < numberOfObjects && areaNumber != 192; object++) {
 		debugC(1, kFreescapeDebugParser, "Reading object: %d", object);
-		Object *newObject = load8bitObject(file);
+		Object *newObject = load8bitObject(file, scale);
 
 		if (newObject) {
 			if (newObject->getType() == kEntranceType) {
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 20a59202a80..f1381b19108 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -44,8 +44,16 @@ void FreescapeEngine::traverseEntrance(uint16 entranceID) {
 		_yaw = rotation.y() + 90;
 	}
 	debugC(1, kFreescapeDebugMove, "entrace position: %f %f %f", _position.x(), _position.y(), _position.z());
-	debugC(1, kFreescapeDebugMove, "player height: %d", scale * _playerHeight);
-	_position.setValue(1, _position.y() + scale * _playerHeight);
+
+	int delta = 0;
+	if (scale == 2)
+		delta = 8;
+	else if (scale == 4)
+		delta = 12;
+
+	_playerHeight = _playerHeights[_playerHeightNumber] + delta;
+	debugC(1, kFreescapeDebugMove, "player height: %d", _playerHeight);
+	_position.setValue(1, _position.y() + _playerHeight);
 }
 
 void FreescapeEngine::shoot() {
@@ -73,9 +81,15 @@ void FreescapeEngine::shoot() {
 
 void FreescapeEngine::changePlayerHeight(int index) {
 	int scale = _currentArea->getScale();
-	_position.setValue(1, _position.y() - scale * _playerHeight);
-	_playerHeight = _playerHeights[index];
-	_position.setValue(1, _position.y() + scale * _playerHeight);
+	int delta = 0;
+	if (scale == 2)
+		delta = 8;
+	else if (scale == 4)
+		delta = 12;
+
+	_position.setValue(1, _position.y() - _playerHeight);
+	_playerHeight = _playerHeights[index] + delta;
+	_position.setValue(1, _position.y() + _playerHeight);
 }
 
 void FreescapeEngine::rise() {
@@ -139,7 +153,7 @@ void FreescapeEngine::move(CameraMovement direction, uint8 scale, float deltaTim
 	int previousAreaID = _currentArea->getAreaID();
 	int areaScale = _currentArea->getScale();
 
-	float velocity = _movementSpeed * deltaTime * areaScale;
+	float velocity = _movementSpeed * deltaTime /** areaScale*/;
 	float positionY = _position.y();
 	switch (direction) {
 	case kForwardMovement:
@@ -174,7 +188,7 @@ void FreescapeEngine::move(CameraMovement direction, uint8 scale, float deltaTim
 		if (!hasFloor && !_flyMode) {
 			int fallen;
 			for (fallen = 1; fallen < 65 + 1; fallen++) {
-				_position.set(_position.x(), positionY - fallen * areaScale, _position.z());
+				_position.set(_position.x(), positionY - fallen , _position.z());
 				if (tryStepDown(_position))
 					break;
 			}
@@ -184,7 +198,7 @@ void FreescapeEngine::move(CameraMovement direction, uint8 scale, float deltaTim
 				_position = _lastPosition; // error("NASTY FALL!");
 				return;
 			}
-			_position.set(_position.x(), positionY - fallen * areaScale, _position.z());
+			_position.set(_position.x(), positionY - fallen, _position.z());
 			playSound(3, true);
 		}
 		debugC(1, kFreescapeDebugCode, "Runing effects:");
@@ -213,17 +227,16 @@ void FreescapeEngine::move(CameraMovement direction, uint8 scale, float deltaTim
 
 	_lastPosition = _position;
 	debugC(1, kFreescapeDebugMove, "new player position: %f, %f, %f", _position.x(), _position.y(), _position.z());
-	debugC(1, kFreescapeDebugMove, "player height: %f", _position.y() - areaScale * _playerHeight);
+	//debugC(1, kFreescapeDebugMove, "player height: %f", _position.y() - areaScale * _playerHeight);
 	executeLocalGlobalConditions(false, true); // Only execute "on collision" room/global conditions
 }
 
 bool FreescapeEngine::checkFloor(Math::Vector3d currentPosition) {
 	debugC(1, kFreescapeDebugMove, "Checking floor under the player");
-	int areaScale = _currentArea->getScale();
 	bool collided = checkCollisions(false);
 	assert(!collided);
 
-	_position.set(_position.x(), _position.y() - 2 * areaScale, _position.z());
+	_position.set(_position.x(), _position.y() - 2, _position.z());
 	collided = checkCollisions(false);
 	_position = currentPosition;
 	return collided;
@@ -232,7 +245,7 @@ bool FreescapeEngine::checkFloor(Math::Vector3d currentPosition) {
 bool FreescapeEngine::tryStepUp(Math::Vector3d currentPosition) {
 	debugC(1, kFreescapeDebugMove, "Try to step up!");
 	int areaScale = _currentArea->getScale();
-	_position.set(_position.x(), _position.y() + 64 * areaScale, _position.z());
+	_position.set(_position.x(), _position.y() + 64, _position.z());
 	bool collided = checkCollisions(false);
 	if (collided) {
 		_position = currentPosition;
@@ -246,7 +259,7 @@ bool FreescapeEngine::tryStepUp(Math::Vector3d currentPosition) {
 bool FreescapeEngine::tryStepDown(Math::Vector3d currentPosition) {
 	debugC(1, kFreescapeDebugMove, "Try to step down!");
 	int areaScale = _currentArea->getScale();
-	_position.set(_position.x(), _position.y() - areaScale, _position.z());
+	_position.set(_position.x(), _position.y() - 1, _position.z());
 	if (checkFloor(_position)) {
 		return true;
 	} else {
@@ -261,8 +274,8 @@ bool FreescapeEngine::checkCollisions(bool executeCode) {
 	int areaScale = _currentArea->getScale();
 	Math::AABB boundingBox(_lastPosition, _lastPosition);
 
-	Math::Vector3d v1(_position.x() - areaScale, _position.y() - areaScale * _playerHeight, _position.z() - areaScale);
-	Math::Vector3d v2(_position.x() + areaScale, _position.y() + areaScale, _position.z() + areaScale);
+	Math::Vector3d v1(_position.x() - 1, _position.y() - _playerHeight, _position.z() - 1);
+	Math::Vector3d v2(_position.x() + 1, _position.y() + 1, _position.z() + 1);
 
 	boundingBox.expand(v1);
 	boundingBox.expand(v2);


Commit: 84c553c5ac9ec5f3456d8c933828490d8505381b
    https://github.com/scummvm/scummvm/commit/84c553c5ac9ec5f3456d8c933828490d8505381b
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-12T09:22:46+01:00

Commit Message:
FREESCAPE: refactor duplicate and scale object code

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/driller.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/objects/entrance.h
    engines/freescape/objects/geometricobject.cpp
    engines/freescape/objects/geometricobject.h
    engines/freescape/objects/global.h
    engines/freescape/objects/object.h
    engines/freescape/objects/sensor.h


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index c546eafa4dd..100db3d1320 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -223,13 +223,19 @@ void Area::addObjectFromArea(int16 id, Area *global) {
 	Object *obj = global->objectWithID(id);
 	if (!obj) {
 		assert(global->entranceWithID(id));
-		_addedObjects[id] = global->entranceWithID(id);
-		(*_entrancesByID)[id] = global->entranceWithID(id);
+		obj = global->entranceWithID(id);
+		obj = obj->duplicate();
+		obj->scale(_scale);
+		_addedObjects[id] = obj;
+		(*_entrancesByID)[id] = obj;
 	} else {
-		(*_objectsByID)[id] = global->objectWithID(id);
-		_addedObjects[id] = global->objectWithID(id);
-		if (obj->isDrawable())
+		obj = obj->duplicate();
+		obj->scale(_scale);
+		(*_objectsByID)[id] = obj;
+		_addedObjects[id] = obj;
+		if (obj->isDrawable()) {
 			_drawableObjects.insert_at(0, obj);
+		}
 	}
 }
 
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 171b427a2e6..f0610bea250 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -128,13 +128,9 @@ FreescapeEngine::~FreescapeEngine() {
 	delete _titleTexture;
 
 	for (auto &it : _areaMap) {
-		if (it._value->getAreaID() != 255)
-			delete it._value;
+		delete it._value;
 	}
 
-	if (_areaMap.contains(255))
-		delete _areaMap[255];
-
 	delete _gfx;
 	delete _dataBundle;
 }
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 8c8642da874..fd1485893d4 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -140,7 +140,7 @@ public:
 	// 8-bit
 	void load8bitBinary(Common::SeekableReadStream *file, int offset, int ncolors);
 	Area *load8bitArea(Common::SeekableReadStream *file, uint16 ncolors);
-	Object *load8bitObject(Common::SeekableReadStream *file, int scale);
+	Object *load8bitObject(Common::SeekableReadStream *file);
 
 	// Areas
 	uint16 _startArea;
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index fe8e4405c0e..bc38ab8ddce 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -103,7 +103,7 @@ void DrillerEngine::loadGlobalObjects(Common::SeekableReadStream *file, int offs
 	ObjectMap *globalObjectsByID = new ObjectMap;
 	file->seek(offset);
 	for (int i = 0; i < 8; i++) {
-		Object *gobj = load8bitObject(file, 1);
+		Object *gobj = load8bitObject(file);
 		assert(gobj);
 		assert(!globalObjectsByID->contains(gobj->getObjectID()));
 		debugC(1, kFreescapeDebugParser, "Adding global object: %d", gobj->getObjectID());
@@ -522,7 +522,7 @@ bool DrillerEngine::checkDrill(const Math::Vector3d position) {
 	id = 255;
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	obj->setOrigin(origin);
 	//if (!_currentArea->checkCollisions(obj->_boundingBox))
 	//	return false;
@@ -539,7 +539,7 @@ bool DrillerEngine::checkDrill(const Math::Vector3d position) {
 	origin.setValue(1, origin.y() + heightLastObject);
 	origin.setValue(2, origin.z() - obj->getSize().z() / 5);
 
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	obj->setOrigin(origin);
 	if (_currentArea->checkCollisions(obj->_boundingBox))
 		return false;
@@ -554,7 +554,7 @@ bool DrillerEngine::checkDrill(const Math::Vector3d position) {
 	debugC(1, kFreescapeDebugParser, "Adding object %d to room structure", id);
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 
 	origin.setValue(0, origin.x() + obj->getSize().x() / 5);
 	origin.setValue(1, origin.y() + heightLastObject);
@@ -574,7 +574,7 @@ bool DrillerEngine::checkDrill(const Math::Vector3d position) {
 	debugC(1, kFreescapeDebugParser, "Adding object %d to room structure", id);
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	origin.setValue(1, origin.y() + heightLastObject);
 	obj->setOrigin(origin);
 	assert(obj);
@@ -599,7 +599,7 @@ void DrillerEngine::addDrill(const Math::Vector3d position) {
 	debugC(1, kFreescapeDebugParser, "Adding object %d to room structure", id);
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	obj->setOrigin(origin);
 	// offset.setValue(1, offset.y() + obj->getSize().y());
 	obj->makeVisible();
@@ -616,7 +616,7 @@ void DrillerEngine::addDrill(const Math::Vector3d position) {
 	origin.setValue(1, origin.y() + heightLastObject);
 	origin.setValue(2, origin.z() - obj->getSize().z() / 5);
 
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	obj->setOrigin(origin);
 	obj->makeVisible();
 	_currentArea->addObject(obj);
@@ -630,7 +630,7 @@ void DrillerEngine::addDrill(const Math::Vector3d position) {
 	debugC(1, kFreescapeDebugParser, "Adding object %d to room structure", id);
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 
 	origin.setValue(0, origin.x() + obj->getSize().x() / 5);
 	origin.setValue(1, origin.y() + heightLastObject);
@@ -649,7 +649,7 @@ void DrillerEngine::addDrill(const Math::Vector3d position) {
 	debugC(1, kFreescapeDebugParser, "Adding object %d to room structure", id);
 	obj = (GeometricObject *)_areaMap[255]->objectWithID(id);
 	assert(obj);
-	obj = obj->duplicate();
+	obj = (GeometricObject *)obj->duplicate();
 	origin.setValue(1, origin.y() + heightLastObject);
 	obj->setOrigin(origin);
 	assert(obj);
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index 690f62c7a48..cf017203c86 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -70,7 +70,7 @@ Common::Array<uint8> FreescapeEngine::readArray(Common::SeekableReadStream *file
 	return array;
 }
 
-Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int scale) {
+Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 
 	byte rawFlagsAndType = readField(file, 8);
 	debugC(1, kFreescapeDebugParser, "Raw object data flags and type: %d", rawFlagsAndType);
@@ -160,7 +160,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int sc
 			for (int ordinate = 0; ordinate < numberOfOrdinates; ordinate++) {
 				ord = readField(file, 8);
 				debugC(1, kFreescapeDebugParser, "ord: %x", ord);
-				ordinates->push_back(32 * ord / scale);
+				ordinates->push_back(32 * ord);
 				byteSizeOfObject--;
 			}
 		}
@@ -184,8 +184,8 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int sc
 			objectType,
 			objectID,
 			rawFlagsAndType, // flags
-			position / scale,
-			32 * v / scale, // size
+			position,
+			32 * v, // size
 			colours,
 			ordinates,
 			instructions,
@@ -206,7 +206,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int sc
 		// create an entrance
 		return new Entrance(
 			objectID,
-			32 * position / scale,
+			32 * position,
 			5 * v); // rotation
 	} break;
 
@@ -224,7 +224,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int sc
 		// create an entrance
 		return new Sensor(
 			objectID,
-			32 * position / scale,
+			32 * position,
 			5 * v); // rotation
 	} break;
 
@@ -233,7 +233,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file, int sc
 		file->seek(byteSizeOfObject, SEEK_CUR);
 		return new Sensor(
 			objectID,
-			position / scale,
+			position,
 			v);
 		break;
 	}
@@ -343,7 +343,8 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 	ObjectMap *entrancesByID = new ObjectMap;
 	for (uint8 object = 0; object < numberOfObjects && areaNumber != 192; object++) {
 		debugC(1, kFreescapeDebugParser, "Reading object: %d", object);
-		Object *newObject = load8bitObject(file, scale);
+		Object *newObject = load8bitObject(file);
+		newObject->scale(scale);
 
 		if (newObject) {
 			if (newObject->getType() == kEntranceType) {
diff --git a/engines/freescape/objects/entrance.h b/engines/freescape/objects/entrance.h
index b11e93f7d28..eef6dba37cc 100644
--- a/engines/freescape/objects/entrance.h
+++ b/engines/freescape/objects/entrance.h
@@ -44,6 +44,9 @@ public:
 
 	bool isDrawable() override { return false; }
 	bool isPlanar() override { return true; }
+	void scale(int factor) override { _origin = _origin / factor; };
+	Object *duplicate() override { return (new Entrance(_objectID, _origin, _rotation)); };
+
 	ObjectType getType() override { return ObjectType::kEntranceType; };
 	Math::Vector3d getRotation() { return _rotation; }
 
diff --git a/engines/freescape/objects/geometricobject.cpp b/engines/freescape/objects/geometricobject.cpp
index 9c8f76120ce..fc0168b590d 100644
--- a/engines/freescape/objects/geometricobject.cpp
+++ b/engines/freescape/objects/geometricobject.cpp
@@ -168,7 +168,19 @@ void GeometricObject::setOrigin(Math::Vector3d origin_) {
 	computeBoundingBox();
 };
 
-GeometricObject *GeometricObject::duplicate() {
+void GeometricObject::scale(int factor) {
+	_origin = _origin / factor;
+	_size = _size / factor;
+	if (_ordinates) {
+		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;
+		}
+	}
+	computeBoundingBox();
+}
+
+Object *GeometricObject::duplicate() {
 	Common::Array<uint8> *colours_copy = nullptr;
 	Common::Array<uint16> *ordinates_copy = nullptr;
 
diff --git a/engines/freescape/objects/geometricobject.h b/engines/freescape/objects/geometricobject.h
index 0dfe8654054..a7a0ed90f17 100644
--- a/engines/freescape/objects/geometricobject.h
+++ b/engines/freescape/objects/geometricobject.h
@@ -50,7 +50,8 @@ public:
 	virtual ~GeometricObject();
 	void setOrigin(Math::Vector3d origin) override;
 
-	GeometricObject *duplicate();
+	Object *duplicate() override;
+	void scale(int factor) override;
 	void computeBoundingBox();
 	bool collides(const Math::AABB &boundingBox);
 	void draw(Freescape::Renderer *gfx) override;
diff --git a/engines/freescape/objects/global.h b/engines/freescape/objects/global.h
index 5d2dcf0ddaf..3183eeb024d 100644
--- a/engines/freescape/objects/global.h
+++ b/engines/freescape/objects/global.h
@@ -36,6 +36,8 @@ public:
 
 	ObjectType getType() override { return ObjectType::kEntranceType; };
 	void draw(Freescape::Renderer *gfx) override { error("cannot render GlobalStructure"); };
+	void scale(int factor) override { warning("cannot scale GlobalStructure"); };
+	Object *duplicate() override { error("cannot duplicate GlobalStructure"); };
 };
 
 } // End of namespace Freescape
diff --git a/engines/freescape/objects/object.h b/engines/freescape/objects/object.h
index 5ff6fdd1a19..54b5ce54f38 100644
--- a/engines/freescape/objects/object.h
+++ b/engines/freescape/objects/object.h
@@ -65,6 +65,7 @@ public:
 
 	virtual bool isDrawable() { return false; }
 	virtual bool isPlanar() { return false; }
+	virtual void scale(int factor) = 0;
 
 	bool isInvisible() { return _flags & 0x80; }
 	void makeInvisible() { _flags = _flags | 0x80; }
@@ -74,6 +75,7 @@ public:
 	void toggleVisibility() { _flags = _flags ^ 0x80; }
 
 	virtual ~Object() {}
+	virtual Object *duplicate() = 0;
 
 	virtual void draw(Freescape::Renderer *gfx) = 0;
 
diff --git a/engines/freescape/objects/sensor.h b/engines/freescape/objects/sensor.h
index 43b0a7335aa..75a71c3a762 100644
--- a/engines/freescape/objects/sensor.h
+++ b/engines/freescape/objects/sensor.h
@@ -44,6 +44,9 @@ public:
 	virtual ~Sensor() {}
 	bool isDrawable() override { return false; }
 	bool isPlanar() override { return true; }
+	void scale(int factor) override { _origin = _origin / factor; };
+	Object *duplicate() override { return (new Sensor(_objectID, _origin, _rotation)); };
+
 	ObjectType getType() override { return kSensorType; };
 	Math::Vector3d getRotation() { return _rotation; }
 


Commit: 52b61f1ffe2f77e085ab2b98726ba84b41bcbc29
    https://github.com/scummvm/scummvm/commit/52b61f1ffe2f77e085ab2b98726ba84b41bcbc29
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-12T09:22:46+01:00

Commit Message:
FREESCAPE: workaround to show the complete main menu dialog

Changed paths:
    engines/freescape/freescape.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index f0610bea250..0b7d4adfc7c 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -317,9 +317,11 @@ void FreescapeEngine::processInput() {
 				_flyMode = _noClipMode;
 				break;
 			case Common::KEYCODE_ESCAPE:
+				_gfx->setViewport(_fullscreenViewArea);
 				_system->lockMouse(false);
 				openMainMenuDialog();
 				_system->lockMouse(true);
+				_gfx->setViewport(_viewArea);
 				break;
 			case Common::KEYCODE_SPACE:
 				_shootMode = !_shootMode;




More information about the Scummvm-git-logs mailing list