[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