[Scummvm-git-logs] scummvm master -> 79cc368fee2636f4bb68abcdf1796a32324eca88

neuromancer noreply at scummvm.org
Sat Jul 29 15:35:17 UTC 2023


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

Summary:
f82d0fb2dd FREESCAPE: update the list of sensors when changing the area in dark
ab9a114366 FREESCAPE: working implementation of renderSensorShot for driller and dark
aa64648dd6 FREESCAPE: refactored max shield and max energy variables
cc566ac4f0 FREESCAPE: explored area and ECD score implemented in dark
101e1e6c68 FREESCAPE: detect alternative dark release for dos
6abfd2d91b FREESCAPE: show active ecds in dark
f2e512c8c9 FREESCAPE: added missing header file
79cc368fee FREESCAPE: handle falling while far from the floor using the jetpack in dark


Commit: f82d0fb2ddd3f07a7de46cae7e2fbdda43d1330c
    https://github.com/scummvm/scummvm/commit/f82d0fb2ddd3f07a7de46cae7e2fbdda43d1330c
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: update the list of sensors when changing the area in dark

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


diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index afd1371194b..b1df56948a8 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -284,6 +284,7 @@ void DarkEngine::gotoArea(uint16 areaID, int entranceID) {
 			_position.setValue(0, newPos);
 		}
 		assert(newPos != -1);
+		_sensors = _currentArea->getSensors();
 	}
 
 	_lastPosition = _position;


Commit: ab9a1143660500d3321096e0224e7b1e3f15722c
    https://github.com/scummvm/scummvm/commit/ab9a1143660500d3321096e0224e7b1e3f15722c
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: working implementation of renderSensorShot for driller and dark

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/driller/driller.cpp
    engines/freescape/gfx_opengl.cpp
    engines/freescape/gfx_opengl_shaders.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 56d30e25e90..5227f454d0d 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -248,10 +248,7 @@ void FreescapeEngine::checkSensors() {
 	}
 }
 
-void FreescapeEngine::drawSensorShoot(Sensor *sensor) {
-	assert(sensor);
-	_gfx->renderSensorShoot(1, sensor->getOrigin(), _position, _viewArea);
-}
+void FreescapeEngine::drawSensorShoot(Sensor *sensor) {}
 
 void FreescapeEngine::flashScreen(int backgroundColor) {
 	if (backgroundColor >= 16)
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 4bdf1713fbd..975eab3bd48 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -382,7 +382,7 @@ public:
 	bool _playerWasCrushed;
 	ObjectArray _sensors;
 	void checkSensors();
-	void drawSensorShoot(Sensor *sensor);
+	virtual void drawSensorShoot(Sensor *sensor);
 	void takeDamageFromSensor();
 
 	bool hasFeature(EngineFeature f) const override;
@@ -456,6 +456,7 @@ public:
 	void gotoArea(uint16 areaID, int entranceID) override;
 
 	void drawInfoMenu() override;
+	void drawSensorShoot(Sensor *sensor) override;
 
 	void pressedKey(const int keycode) override;
 	Common::Error saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave = false) override;
@@ -540,6 +541,7 @@ public:
 	int _lastTenSeconds;
 	void updateTimeVariables() override;
 
+	void drawSensorShoot(Sensor *sensor) override;
 	void drawDOSUI(Graphics::Surface *surface) override;
 	void drawZXUI(Graphics::Surface *surface) override;
 
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index b1df56948a8..f8a88365558 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -451,6 +451,24 @@ void DarkEngine::drawFullscreenMessageAndWait(Common::String message) {
 	delete surface;
 }
 
+void DarkEngine::drawSensorShoot(Sensor *sensor) {
+	Math::Vector3d target;
+	target = _position;
+	target.y() = target.y() - _playerHeight;
+	target.x() = target.x() - 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+
+	target = _position;
+	target.y() = target.y() - _playerHeight;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+
+	target = _position;
+	target.y() = target.y() - _playerHeight;
+	target.x() = target.x() + 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+}
+
+
 Common::Error DarkEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
 	return Common::kNoError;
 }
diff --git a/engines/freescape/games/driller/driller.cpp b/engines/freescape/games/driller/driller.cpp
index 1fa52e627b4..7f9d13b8a90 100644
--- a/engines/freescape/games/driller/driller.cpp
+++ b/engines/freescape/games/driller/driller.cpp
@@ -846,6 +846,28 @@ bool DrillerEngine::onScreenControls(Common::Point mouse) {
 	return false;
 }
 
+void DrillerEngine::drawSensorShoot(Sensor *sensor) {
+	Math::Vector3d target;
+	target = _position;
+	target.y() = target.y() - _playerHeight;
+	target.x() = target.x() - 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+
+	target = _position;
+	target.y() = target.y() - _playerHeight;
+	target.x() = target.x() + 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+
+	target = _position;
+	target.y() = target.y() + _playerHeight;
+	target.x() = target.x() - 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+
+	target = _position;
+	target.y() = target.y() + _playerHeight;
+	target.x() = target.x() + 5;
+	_gfx->renderSensorShoot(1, sensor->getOrigin(), target, _viewArea);
+}
 
 Common::Error DrillerEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
 	for (auto &it : _areaMap) { // All but skip area 255
diff --git a/engines/freescape/gfx_opengl.cpp b/engines/freescape/gfx_opengl.cpp
index ce610007652..41609da0f57 100644
--- a/engines/freescape/gfx_opengl.cpp
+++ b/engines/freescape/gfx_opengl.cpp
@@ -177,18 +177,22 @@ void OpenGLRenderer::positionCamera(const Math::Vector3d &pos, const Math::Vecto
 	glTranslatef(-pos.x(), -pos.y(), -pos.z());
 }
 
-void OpenGLRenderer::renderSensorShoot(byte color, const Math::Vector3d sensor, const Math::Vector3d player, const Common::Rect viewArea) {
+void OpenGLRenderer::renderSensorShoot(byte color, const Math::Vector3d sensor, const Math::Vector3d target, const Common::Rect viewArea) {
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
 	glColor3ub(255, 255, 255);
+
 	glLineWidth(20);
-	polygonOffset(true);
 	glEnableClientState(GL_VERTEX_ARRAY);
 	copyToVertexArray(0, sensor);
-	copyToVertexArray(1, player);
+	copyToVertexArray(1, target);
 	glVertexPointer(3, GL_FLOAT, 0, _verts);
 	glDrawArrays(GL_LINES, 0, 2);
 	glDisableClientState(GL_VERTEX_ARRAY);
-	polygonOffset(false);
 	glLineWidth(1);
+
+	glDisable(GL_BLEND);
+	glDepthMask(GL_TRUE);
 }
 
 void OpenGLRenderer::renderPlayerShoot(byte color, const Common::Point position, const Common::Rect viewArea) {
diff --git a/engines/freescape/gfx_opengl_shaders.cpp b/engines/freescape/gfx_opengl_shaders.cpp
index e030326958b..8f2db32c47a 100644
--- a/engines/freescape/gfx_opengl_shaders.cpp
+++ b/engines/freescape/gfx_opengl_shaders.cpp
@@ -162,19 +162,27 @@ void OpenGLShaderRenderer::positionCamera(const Math::Vector3d &pos, const Math:
 	_mvpMatrix = proj * model;
 	_mvpMatrix.transpose();
 }
+void OpenGLShaderRenderer::renderSensorShoot(byte color, const Math::Vector3d sensor, const Math::Vector3d target, const Common::Rect viewArea) {
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
+	glColor3ub(255, 255, 255);
 
-void OpenGLShaderRenderer::renderSensorShoot(byte color, const Math::Vector3d sensor, const Math::Vector3d player, const Common::Rect viewArea) {
-	/*glColor3ub(255, 255, 255);
 	glLineWidth(20);
-	polygonOffset(true);
 	glEnableClientState(GL_VERTEX_ARRAY);
 	copyToVertexArray(0, sensor);
-	copyToVertexArray(1, player);
+	copyToVertexArray(1, target);
+
+	glBindBuffer(GL_ARRAY_BUFFER, _triangleVBO);
+	glBufferData(GL_ARRAY_BUFFER, 8 * 3 * sizeof(float), _verts, GL_DYNAMIC_DRAW);
+	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
+
 	glVertexPointer(3, GL_FLOAT, 0, _verts);
 	glDrawArrays(GL_LINES, 0, 2);
 	glDisableClientState(GL_VERTEX_ARRAY);
-	polygonOffset(false);
-	glLineWidth(1);*/
+	glLineWidth(1);
+
+	glDisable(GL_BLEND);
+	glDepthMask(GL_TRUE);
 }
 
 // TODO: move inside the shader?


Commit: aa64648dd6619d6dd54ed26249d4e2797e809a54
    https://github.com/scummvm/scummvm/commit/aa64648dd6619d6dd54ed26249d4e2797e809a54
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: refactored max shield and max energy variables

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/dos.cpp
    engines/freescape/games/dark/zx.cpp
    engines/freescape/games/driller/amiga.cpp
    engines/freescape/games/driller/driller.cpp
    engines/freescape/language/8bitDetokeniser.cpp
    engines/freescape/language/8bitDetokeniser.h
    engines/freescape/language/instruction.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 5227f454d0d..7c49535d9d3 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -152,6 +152,9 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 
 	_underFireFrames = 0;
 	_shootingFrames = 0;
+
+	_maxShield = 63;
+	_maxEnergy = 63;
 }
 
 FreescapeEngine::~FreescapeEngine() {
@@ -280,6 +283,8 @@ void FreescapeEngine::drawFrame() {
 
 		if (isDriller() && (isDOS() || isAmiga() || isAtariST()))
 			underFireColor = 1;
+		else if (isDark() && (isDOS() || isAmiga() || isAtariST()))
+			underFireColor = 4;
 
 		_currentArea->remapColor(_currentArea->_usualBackgroundColor, underFireColor);
 		_currentArea->remapColor(_currentArea->_skyColor, underFireColor);
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 975eab3bd48..fd48a19e170 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -237,6 +237,8 @@ public:
 	bool tryStepUp(Math::Vector3d currentPosition);
 	bool tryStepDown(Math::Vector3d currentPosition);
 	bool _hasFallen;
+	int _maxShield;
+	int _maxEnergy;
 
 	void rotate(float xoffset, float yoffset);
 	// Input state
@@ -518,7 +520,7 @@ class DarkEngine : public FreescapeEngine {
 public:
 	DarkEngine(OSystem *syst, const ADGameDescription *gd);
 
-	uint32 _initialFuel;
+	uint32 _initialEnergy;
 	uint32 _initialShield;
 
 	void initGameState() override;
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index f8a88365558..c70e27c013c 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -60,7 +60,7 @@ DarkEngine::DarkEngine(OSystem *syst, const ADGameDescription *gd) : FreescapeEn
 	_angleRotations.push_back(45);
 	_angleRotations.push_back(90);
 
-	_initialFuel = 11;
+	_initialEnergy = 11;
 	_initialShield = 15;
 }
 
@@ -161,7 +161,7 @@ void DarkEngine::initGameState() {
 		_gameStateBits[it._key] = 0;
 	}
 
-	_gameStateVars[k8bitVariableEnergy] = _initialFuel;
+	_gameStateVars[k8bitVariableEnergy] = _initialEnergy;
 	_gameStateVars[k8bitVariableShield] = _initialShield;
 
 	_playerHeightNumber = 1;
diff --git a/engines/freescape/games/dark/dos.cpp b/engines/freescape/games/dark/dos.cpp
index b4b8214bc2c..99f3eb549c4 100644
--- a/engines/freescape/games/dark/dos.cpp
+++ b/engines/freescape/games/dark/dos.cpp
@@ -33,6 +33,9 @@ void DarkEngine::initDOS() {
 		_viewArea = Common::Rect(40, 24, 279, 124);
 	else
 		error("Invalid or unknown render mode");
+
+	_maxEnergy = 79;
+	_maxShield = 79;
 }
 
 void DarkEngine::loadAssetsDOSDemo() {
@@ -155,19 +158,19 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 
 	if (shield >= 0) {
 		Common::Rect shieldBar;
-		shieldBar = Common::Rect(72, 139, 151 - (k8bitMaxShield - shield), 146);
+		shieldBar = Common::Rect(72, 139, 151 - (_maxShield - shield), 146);
 		surface->fillRect(shieldBar, front);
 
-		shieldBar = Common::Rect(72, 140, 151 - (k8bitMaxShield - shield), 145);
+		shieldBar = Common::Rect(72, 140, 151 - (_maxShield - shield), 145);
 		surface->fillRect(shieldBar, blue);
 	}
 
 	if (energy >= 0) {
 		Common::Rect energyBar;
-		energyBar = Common::Rect(72, 147, 151 - (k8bitMaxEnergy - energy), 154);
+		energyBar = Common::Rect(72, 147, 151 - (_maxEnergy - energy), 154);
 		surface->fillRect(energyBar, front);
 
-		energyBar = Common::Rect(72, 148, 151 - (k8bitMaxEnergy - energy), 153);
+		energyBar = Common::Rect(72, 148, 151 - (_maxEnergy - energy), 153);
 		surface->fillRect(energyBar, blue);
 	}
 }
diff --git a/engines/freescape/games/dark/zx.cpp b/engines/freescape/games/dark/zx.cpp
index b5c74f98457..735707b30b2 100644
--- a/engines/freescape/games/dark/zx.cpp
+++ b/engines/freescape/games/dark/zx.cpp
@@ -28,6 +28,8 @@ namespace Freescape {
 
 void DarkEngine::initZX() {
 	_viewArea = Common::Rect(56, 28, 265, 132);
+	_maxEnergy = 63;
+	_maxShield = 63;
 }
 
 void DarkEngine::loadAssetsZXDemo() {
@@ -106,19 +108,19 @@ void DarkEngine::drawZXUI(Graphics::Surface *surface) {
 
 	if (shield >= 0) {
 		Common::Rect shieldBar;
-		shieldBar = Common::Rect(80, 141, 151 - (k8bitMaxShield - shield), 147);
+		shieldBar = Common::Rect(80, 141, 143 - (_maxShield - shield), 147);
 		surface->fillRect(shieldBar, back);
 
-		shieldBar = Common::Rect(80, 142, 151 - (k8bitMaxShield - shield), 146);
+		shieldBar = Common::Rect(80, 142, 143 - (_maxShield - shield), 146);
 		surface->fillRect(shieldBar, front);
 	}
 
 	if (energy >= 0) {
 		Common::Rect energyBar;
-		energyBar = Common::Rect(72, 147, 151 - (k8bitMaxEnergy - energy), 154);
+		energyBar = Common::Rect(80, 147, 143 - (_maxEnergy - energy), 154);
 		surface->fillRect(energyBar, back);
 
-		energyBar = Common::Rect(72, 148, 151 - (k8bitMaxEnergy - energy), 153);
+		energyBar = Common::Rect(80, 148, 143 - (_maxEnergy - energy), 153);
 		surface->fillRect(energyBar, front);
 	}
 }
diff --git a/engines/freescape/games/driller/amiga.cpp b/engines/freescape/games/driller/amiga.cpp
index 7402459aa18..7d52c17d6fe 100644
--- a/engines/freescape/games/driller/amiga.cpp
+++ b/engines/freescape/games/driller/amiga.cpp
@@ -194,25 +194,25 @@ void DrillerEngine::drawAmigaAtariSTUI(Graphics::Surface *surface) {
 
 	if (shield >= 0) {
 		Common::Rect shieldBar;
-		shieldBar = Common::Rect(11, 178, 76 - (k8bitMaxShield - shield), 184);
+		shieldBar = Common::Rect(11, 178, 76 - (_maxShield - shield), 184);
 		surface->fillRect(shieldBar, brown);
 
-		shieldBar = Common::Rect(11, 179, 76 - (k8bitMaxShield - shield), 183);
+		shieldBar = Common::Rect(11, 179, 76 - (_maxShield - shield), 183);
 		surface->fillRect(shieldBar, brownish);
 
-		shieldBar = Common::Rect(11, 180, 76 - (k8bitMaxShield - shield), 182);
+		shieldBar = Common::Rect(11, 180, 76 - (_maxShield - shield), 182);
 		surface->fillRect(shieldBar, yellow);
 	}
 
 	if (energy >= 0) {
 		Common::Rect energyBar;
-		energyBar = Common::Rect(11, 186, 75 - (k8bitMaxEnergy - energy), 192);
+		energyBar = Common::Rect(11, 186, 75 - (_maxEnergy - energy), 192);
 		surface->fillRect(energyBar, brown);
 
-		energyBar = Common::Rect(11, 187, 75 - (k8bitMaxEnergy - energy), 191);
+		energyBar = Common::Rect(11, 187, 75 - (_maxEnergy - energy), 191);
 		surface->fillRect(energyBar, brownish);
 
-		energyBar = Common::Rect(11, 188, 75 - (k8bitMaxEnergy - energy), 190);
+		energyBar = Common::Rect(11, 188, 75 - (_maxEnergy - energy), 190);
 		surface->fillRect(energyBar, yellow);
 	}
 }
diff --git a/engines/freescape/games/driller/driller.cpp b/engines/freescape/games/driller/driller.cpp
index 7f9d13b8a90..9efc659b5e2 100644
--- a/engines/freescape/games/driller/driller.cpp
+++ b/engines/freescape/games/driller/driller.cpp
@@ -74,6 +74,9 @@ DrillerEngine::DrillerEngine(OSystem *syst, const ADGameDescription *gd) : Frees
 	_initialJetEnergy = 29;
 	_initialJetShield = 34;
 
+	_maxEnergy = 63;
+	_maxShield = 63;
+
 	Math::Vector3d drillBaseOrigin = Math::Vector3d(0, 0, 0);
 	Math::Vector3d drillBaseSize = Math::Vector3d(3, 2, 3);
 	_drillBase = new GeometricObject(kCubeType, 0, 0, drillBaseOrigin, drillBaseSize, nullptr, nullptr, FCLInstructionVector(), "");
diff --git a/engines/freescape/language/8bitDetokeniser.cpp b/engines/freescape/language/8bitDetokeniser.cpp
index 9b14205e1a1..747ce3e9101 100644
--- a/engines/freescape/language/8bitDetokeniser.cpp
+++ b/engines/freescape/language/8bitDetokeniser.cpp
@@ -30,8 +30,6 @@
 namespace Freescape {
 
 uint8 k8bitMaxVariable = 64;
-uint8 k8bitMaxShield = 64;
-uint8 k8bitMaxEnergy = 64;
 
 Common::String detokenise8bitCondition(Common::Array<uint16> &tokenisedCondition, FCLInstructionVector &instructions, bool isAmigaAtari) {
 	Common::String detokenisedStream;
diff --git a/engines/freescape/language/8bitDetokeniser.h b/engines/freescape/language/8bitDetokeniser.h
index 09df12a11e3..246deae6727 100644
--- a/engines/freescape/language/8bitDetokeniser.h
+++ b/engines/freescape/language/8bitDetokeniser.h
@@ -44,8 +44,6 @@ enum {
 };
 
 extern uint8 k8bitMaxVariable;
-extern uint8 k8bitMaxShield;
-extern uint8 k8bitMaxEnergy;
 
 Common::String detokenise8bitCondition(Common::Array<uint16> &tokenisedCondition, FCLInstructionVector &instructions, bool enableActivated);
 
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 914340d6f09..907b1ff0540 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -417,15 +417,15 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
 		debugC(1, kFreescapeDebugCode, "Score incremented by %d up to %d", increment, _gameStateVars[variable]);
 		break;
 	case k8bitVariableEnergy:
-		if (_gameStateVars[variable] > k8bitMaxEnergy)
-			_gameStateVars[variable] = k8bitMaxEnergy;
+		if (_gameStateVars[variable] > _maxEnergy)
+			_gameStateVars[variable] = _maxEnergy;
 		else if (_gameStateVars[variable] < 0)
 			_gameStateVars[variable] = 0;
 		debugC(1, kFreescapeDebugCode, "Energy incremented by %d up to %d", increment, _gameStateVars[variable]);
 		break;
 	case k8bitVariableShield:
-		if (_gameStateVars[variable] > k8bitMaxShield)
-			_gameStateVars[variable] = k8bitMaxShield;
+		if (_gameStateVars[variable] > _maxShield)
+			_gameStateVars[variable] = _maxShield;
 		else if (_gameStateVars[variable] < 0)
 			_gameStateVars[variable] = 0;
 


Commit: cc566ac4f0b2d3fb3ef8637527609855eeafa277
    https://github.com/scummvm/scummvm/commit/cc566ac4f0b2d3fb3ef8637527609855eeafa277
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: explored area and ECD score implemented in dark

Changed paths:
    engines/freescape/freescape.h
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/zx.cpp


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index fd48a19e170..9ff9be4eda7 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -560,6 +560,7 @@ private:
 	bool checkECD(int index);
 	void addWalls(Area *area);
 	Common::SeekableReadStream *decryptFile(const Common::String filename);
+	Common::HashMap<uint16, bool> _exploredAreas;
 };
 
 class EclipseEngine : public FreescapeEngine {
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index c70e27c013c..80bfb9c1f4d 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -171,6 +171,8 @@ void DarkEngine::initGameState() {
 	_lastMinute = 0;
 	_demoIndex = 0;
 	_demoEvents.clear();
+	_exploredAreas.clear();
+	_exploredAreas[_startArea] = true;
 }
 
 bool DarkEngine::checkECD(int index) {
@@ -187,9 +189,10 @@ bool DarkEngine::checkECD(int index) {
 bool DarkEngine::checkIfGameEnded() {
 	if (_gameStateVars[kVariableDarkECD] > 0) {
 		bool destroyed = checkECD(_gameStateVars[kVariableDarkECD] - 1);
-		if (destroyed)
+		if (destroyed) {
+			_gameStateVars[k8bitVariableScore] += 52750;
 			insertTemporaryMessage(_messagesList[2], _countdown - 2);
-		else
+		} else
 			insertTemporaryMessage(_messagesList[1], _countdown - 2);
 		_gameStateVars[kVariableDarkECD] = 0;
 	}
@@ -249,6 +252,11 @@ void DarkEngine::gotoArea(uint16 areaID, int entranceID) {
 	if (!_gameStateBits.contains(areaID))
 		_gameStateBits[areaID] = 0;
 
+	if (!_exploredAreas.contains(areaID)) {
+		_gameStateVars[k8bitVariableScore] += 17500;
+		_exploredAreas[areaID] = true;
+	}
+
 	if (isDemo()) {
 		if (!_areaMap.contains(areaID)) {
 			drawFullscreenMessageAndWait(_messagesList[30]);
@@ -470,10 +478,18 @@ void DarkEngine::drawSensorShoot(Sensor *sensor) {
 
 
 Common::Error DarkEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
+	for (auto &it : _areaMap) {
+		stream->writeUint16LE(it._key);
+		stream->writeUint32LE(_exploredAreas[it._key]);
+	}
 	return Common::kNoError;
 }
 
 Common::Error DarkEngine::loadGameStreamExtended(Common::SeekableReadStream *stream) {
+	for (uint i = 0; i < _areaMap.size(); i++) {
+		uint16 key = stream->readUint16LE();
+		_exploredAreas[key] = stream->readUint32LE();
+	}
 	return Common::kNoError;
 }
 
diff --git a/engines/freescape/games/dark/zx.cpp b/engines/freescape/games/dark/zx.cpp
index 735707b30b2..7d540bb7dc8 100644
--- a/engines/freescape/games/dark/zx.cpp
+++ b/engines/freescape/games/dark/zx.cpp
@@ -108,19 +108,19 @@ void DarkEngine::drawZXUI(Graphics::Surface *surface) {
 
 	if (shield >= 0) {
 		Common::Rect shieldBar;
-		shieldBar = Common::Rect(80, 141, 143 - (_maxShield - shield), 147);
+		shieldBar = Common::Rect(80, 140, 143 - (_maxShield - shield), 148);
 		surface->fillRect(shieldBar, back);
 
-		shieldBar = Common::Rect(80, 142, 143 - (_maxShield - shield), 146);
+		shieldBar = Common::Rect(80, 141, 143 - (_maxShield - shield), 147);
 		surface->fillRect(shieldBar, front);
 	}
 
 	if (energy >= 0) {
 		Common::Rect energyBar;
-		energyBar = Common::Rect(80, 147, 143 - (_maxEnergy - energy), 154);
+		energyBar = Common::Rect(80, 147, 143 - (_maxEnergy - energy), 155);
 		surface->fillRect(energyBar, back);
 
-		energyBar = Common::Rect(80, 148, 143 - (_maxEnergy - energy), 153);
+		energyBar = Common::Rect(80, 148, 143 - (_maxEnergy - energy), 154);
 		surface->fillRect(energyBar, front);
 	}
 }


Commit: 101e1e6c685e676b67d0b3d9d42bec314b427202
    https://github.com/scummvm/scummvm/commit/101e1e6c685e676b67d0b3d9d42bec314b427202
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: detect alternative dark release for dos

Changed paths:
    engines/freescape/detection.cpp


diff --git a/engines/freescape/detection.cpp b/engines/freescape/detection.cpp
index ad2a419ff0c..cdc3a29e403 100644
--- a/engines/freescape/detection.cpp
+++ b/engines/freescape/detection.cpp
@@ -304,6 +304,21 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
+	{
+		"darkside",
+		"",
+		{
+			{"DARKSIDE.EXE", 0, "477c8249665c00e001a84f94911b5960", 21325},
+			{"DSIDEC.EXE", 0, "d4d443777411d6141e94bbf464914251", 49504},
+			{"DSIDEE.EXE", 0, "9d9ba99a8b7c1ae49f9cc328bfa862dd", 56800},
+			{"DSIDEH.EXE", 0, "7764dadc5a0baf0960e9323a8629e321", 53232},
+			AD_LISTEND
+		},
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+	},
 	{
 		"darkside",
 		"Demo",


Commit: 6abfd2d91b6cae52302740b494925dedfe880b70
    https://github.com/scummvm/scummvm/commit/6abfd2d91b6cae52302740b494925dedfe880b70
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: show active ecds in dark

Changed paths:
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/dos.cpp


diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index 80bfb9c1f4d..edceb25af3b 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -22,22 +22,13 @@
 #include "common/file.h"
 
 #include "freescape/freescape.h"
+#include "freescape/games/dark/dark.h"
 #include "freescape/language/8bitDetokeniser.h"
 #include "freescape/objects/global.h"
 #include "freescape/objects/connections.h"
 
 namespace Freescape {
 
-enum {
-	kVariableDarkEnding = 28,
-	kVariableDarkECD = 29,
-};
-
-enum {
-	kDarkEndingEvathDestroyed = 1,
-	kDarkEndingECDsDestroyed = 2,
-};
-
 DarkEngine::DarkEngine(OSystem *syst, const ADGameDescription *gd) : FreescapeEngine(syst, gd) {
 	if (isDOS())
 		initDOS();
@@ -163,6 +154,7 @@ void DarkEngine::initGameState() {
 
 	_gameStateVars[k8bitVariableEnergy] = _initialEnergy;
 	_gameStateVars[k8bitVariableShield] = _initialShield;
+	_gameStateVars[kVariableActiveECDs] = 100;
 
 	_playerHeightNumber = 1;
 	_playerHeight = _playerHeights[_playerHeightNumber];
@@ -190,6 +182,7 @@ bool DarkEngine::checkIfGameEnded() {
 	if (_gameStateVars[kVariableDarkECD] > 0) {
 		bool destroyed = checkECD(_gameStateVars[kVariableDarkECD] - 1);
 		if (destroyed) {
+			_gameStateVars[kVariableActiveECDs] -= 4;
 			_gameStateVars[k8bitVariableScore] += 52750;
 			insertTemporaryMessage(_messagesList[2], _countdown - 2);
 		} else
diff --git a/engines/freescape/games/dark/dos.cpp b/engines/freescape/games/dark/dos.cpp
index 99f3eb549c4..8c6ca0a64ad 100644
--- a/engines/freescape/games/dark/dos.cpp
+++ b/engines/freescape/games/dark/dos.cpp
@@ -22,6 +22,7 @@
 #include "common/file.h"
 
 #include "freescape/freescape.h"
+#include "freescape/games/dark/dark.h"
 #include "freescape/language/8bitDetokeniser.h"
 
 namespace Freescape {
@@ -128,6 +129,7 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 	uint32 back = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
 
 	int score = _gameStateVars[k8bitVariableScore];
+	int ecds = _gameStateVars[kVariableActiveECDs];
 	drawStringInSurface(Common::String::format("%04d", int(2 * _position.x())), 199, 137, front, back, surface);
 	drawStringInSurface(Common::String::format("%04d", int(2 * _position.z())), 199, 145, front, back, surface);
 	drawStringInSurface(Common::String::format("%04d", int(2 * _position.y())), 199, 153, front, back, surface);
@@ -135,6 +137,7 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 	drawStringInSurface(Common::String::format("%02d", int(_angleRotations[_angleRotationIndex])), 71, 168, front, back, surface);
 	drawStringInSurface(Common::String::format("%3d", _playerSteps[_playerStepIndex]), 71, 177, front, back, surface);
 	drawStringInSurface(Common::String::format("%07d", score), 95, 8, front, back, surface);
+	drawStringInSurface(Common::String::format("%3d%%", ecds), 192, 8, front, back, surface);
 
 	int seconds, minutes, hours;
 	getTimeFromCountdown(seconds, minutes, hours);


Commit: f2e512c8c97da9f5e30fe1430ccf757ba871f1dd
    https://github.com/scummvm/scummvm/commit/f2e512c8c97da9f5e30fe1430ccf757ba871f1dd
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T16:05:38+02:00

Commit Message:
FREESCAPE: added missing header file

Changed paths:
  A engines/freescape/games/dark/dark.h


diff --git a/engines/freescape/games/dark/dark.h b/engines/freescape/games/dark/dark.h
new file mode 100644
index 00000000000..f8a1b9bfcf4
--- /dev/null
+++ b/engines/freescape/games/dark/dark.h
@@ -0,0 +1,35 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Freescape {
+
+enum {
+	kVariableDarkEnding = 28,
+	kVariableDarkECD = 29,
+	kVariableActiveECDs = 60,
+};
+
+enum {
+	kDarkEndingEvathDestroyed = 1,
+	kDarkEndingECDsDestroyed = 2,
+};
+
+}
\ No newline at end of file


Commit: 79cc368fee2636f4bb68abcdf1796a32324eca88
    https://github.com/scummvm/scummvm/commit/79cc368fee2636f4bb68abcdf1796a32324eca88
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-07-29T17:37:00+02:00

Commit Message:
FREESCAPE: handle falling while far from the floor using the jetpack in dark

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


diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index edceb25af3b..72c5cce8bd8 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -190,7 +190,19 @@ bool DarkEngine::checkIfGameEnded() {
 		_gameStateVars[kVariableDarkECD] = 0;
 	}
 
-	if (_playerWasCrushed) {
+	if (_hasFallen) {
+		_hasFallen = false;
+		_gameStateVars[kVariableDarkEnding] = kDarkEndingEvathDestroyed;
+		playSound(14, false);
+		insertTemporaryMessage(_messagesList[17], _countdown - 4);
+		drawBackground();
+		drawBorder();
+		drawUI();
+		_gfx->flipBuffer();
+		g_system->updateScreen();
+		g_system->delayMillis(1000);
+		gotoArea(1, 26);
+	} else if (_playerWasCrushed) {
 		insertTemporaryMessage(_messagesList[10], _countdown - 2);
 		_gameStateVars[kVariableDarkEnding] = kDarkEndingEvathDestroyed;
 		drawFrame();
@@ -313,7 +325,14 @@ void DarkEngine::gotoArea(uint16 areaID, int entranceID) {
 void DarkEngine::pressedKey(const int keycode) {
 	if (keycode == Common::KEYCODE_j) {
 		_flyMode = !_flyMode;
-		insertTemporaryMessage(_messagesList[_flyMode ? 11 : 12], _countdown - 2);
+
+		if (_flyMode)
+			insertTemporaryMessage(_messagesList[11], _countdown - 2);
+		else {
+			resolveCollisions(_position);
+			if (!_hasFallen)
+				insertTemporaryMessage(_messagesList[12], _countdown - 2);
+		}
 	}
 }
 




More information about the Scummvm-git-logs mailing list