[Scummvm-git-logs] scummvm master -> b376feb14c71b3022d65de2fe71fdbf44c720c4a

neuromancer noreply at scummvm.org
Sun Nov 13 19:43:33 UTC 2022


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

Summary:
342fadc77a FREESCAPE: correctly save and load _playerHeightNumber field
b376feb14c FREESCAPE: keep track of drill state across areas and correctly restore them in driller


Commit: 342fadc77a891fac07d727d511fb11f05b7e8988
    https://github.com/scummvm/scummvm/commit/342fadc77a891fac07d727d511fb11f05b7e8988
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-13T20:44:35+01:00

Commit Message:
FREESCAPE: correctly save and load _playerHeightNumber field

Changed paths:
    engines/freescape/freescape.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 9fdd5ea6eb9..04bf0c70285 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -614,7 +614,7 @@ Common::Error FreescapeEngine::loadGameStream(Common::SeekableReadStream *stream
 	}
 
 	_flyMode = stream->readByte();
-	_playerHeightNumber = stream->readByte();
+	_playerHeightNumber = stream->readUint32LE();
 	if (!_currentArea || _currentArea->getAreaID() != areaID)
 		gotoArea(areaID, -1); // Do not change position nor rotation
 	return loadGameStreamExtended(stream);
@@ -652,7 +652,7 @@ Common::Error FreescapeEngine::saveGameStream(Common::WriteStream *stream, bool
 	}
 
 	stream->writeByte(_flyMode);
-	stream->writeByte(_playerHeightNumber);
+	stream->writeUint32LE(_playerHeightNumber);
 	return saveGameStreamExtended(stream, isAutosave);
 }
 


Commit: b376feb14c71b3022d65de2fe71fdbf44c720c4a
    https://github.com/scummvm/scummvm/commit/b376feb14c71b3022d65de2fe71fdbf44c720c4a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-13T20:44:35+01:00

Commit Message:
FREESCAPE: keep track of drill state across areas and correctly restore them in driller

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


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 4c7aa631735..616f504f0a0 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -321,8 +321,6 @@ public:
 	uint32 _initialTankEnergy;
 	uint32 _initialTankShield;
 
-	StateBits _completeAreas;
-
 	void initGameState() override;
 	bool checkIfGameEnded() override;
 
@@ -337,10 +335,11 @@ public:
 
 private:
 	void loadGlobalObjects(Common::SeekableReadStream *file, int offset);
-	bool drillDeployed();
+	bool drillDeployed(Area *area);
 	void addDrill(const Math::Vector3d position);
 	bool checkDrill(const Math::Vector3d position);
-	void removeDrill();
+	void removeDrill(Area *area);
+	StateBits _drilledAreas;
 
 	void loadAssetsDemo();
 	void loadAssetsFullGame();
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index b728b32b7a4..2c6ddb9e37b 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -27,6 +27,12 @@
 
 namespace Freescape {
 
+enum {
+	kDrillerNoRig = 0,
+	kDrillerRigInPlace = 1,
+	kDrillerRigOutOfPlace = 2,
+};
+
 DrillerEngine::DrillerEngine(OSystem *syst, const ADGameDescription *gd) : FreescapeEngine(syst, gd) {
 	// if (isAmiga())
 	//	_viewArea = Common::Rect(72, 66, 567, 269);
@@ -392,7 +398,7 @@ void DrillerEngine::drawDOSUI(Graphics::Surface *surface) {
 	} else {
 		if (_currentArea->_gasPocketRadius == 0)
 			message = _messagesList[2];
-		else if (_completeAreas[_currentArea->getAreaID()])
+		else if (_drilledAreas[_currentArea->getAreaID()])
 			message = _messagesList[0];
 		else
 			message = _messagesList[1];
@@ -436,7 +442,7 @@ void DrillerEngine::pressedKey(const int keycode) {
 			return;
 		}
 
-		if (drillDeployed()) {
+		if (drillDeployed(_currentArea)) {
 			insertTemporaryMessage(_messagesList[12], _countdown - 2);
 			return;
 		}
@@ -475,9 +481,10 @@ void DrillerEngine::pressedKey(const int keycode) {
 		successMessage.replace(0, 4, Common::String::format("%d", int(success)));
 		insertTemporaryMessage(successMessage, _countdown - 6);
 		if (success >= 50.0) {
-			_completeAreas[_currentArea->getAreaID()] = true;
+			_drilledAreas[_currentArea->getAreaID()] = kDrillerRigInPlace;
 			_gameStateVars[32]++;
-		}
+		} else
+			_drilledAreas[_currentArea->getAreaID()] = kDrillerRigOutOfPlace;
 	} else if (keycode == Common::KEYCODE_c) {
 		uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
 		if (gasPocketRadius == 0)
@@ -488,7 +495,7 @@ void DrillerEngine::pressedKey(const int keycode) {
 			return;
 		}
 
-		if (!drillDeployed()) {
+		if (!drillDeployed(_currentArea)) {
 			insertTemporaryMessage(_messagesList[13], _countdown - 2);
 			return;
 		}
@@ -500,17 +507,19 @@ void DrillerEngine::pressedKey(const int keycode) {
 
 		_gameStateVars[k8bitVariableEnergy] = _gameStateVars[k8bitVariableEnergy] - 5;
 
-		if (_completeAreas[_currentArea->getAreaID()]) {
-			_completeAreas[_currentArea->getAreaID()] = false;
-			_gameStateVars[32]--;
+		uint16 areaID = _currentArea->getAreaID();
+		if (_drilledAreas[areaID] > 0) {
+			if (_drilledAreas[areaID] == kDrillerRigInPlace)
+				_gameStateVars[32]--;
+			_drilledAreas[areaID] = kDrillerNoRig;
 		}
-		removeDrill();
+		removeDrill(_currentArea);
 		insertTemporaryMessage(_messagesList[10], _countdown - 2);
 	}
 }
 
-bool DrillerEngine::drillDeployed() {
-	return (_currentArea->objectWithID(252) != nullptr);
+bool DrillerEngine::drillDeployed(Area *area) {
+	return (area->objectWithID(252) != nullptr);
 }
 
 bool DrillerEngine::checkDrill(const Math::Vector3d position) {
@@ -658,9 +667,9 @@ void DrillerEngine::addDrill(const Math::Vector3d position) {
 	_currentArea->addObject(obj);
 }
 
-void DrillerEngine::removeDrill() {
+void DrillerEngine::removeDrill(Area *area) {
 	for (int16 id = 252; id < 256; id++) {
-		_currentArea->removeObject(id);
+		area->removeObject(id);
 	}
 }
 
@@ -670,7 +679,7 @@ void DrillerEngine::initGameState() {
 
 	for (auto &it : _areaMap) {
 		_gameStateBits[it._key] = 0;
-		_completeAreas[it._key] = 0;
+		_drilledAreas[it._key] = kDrillerNoRig;
 	}
 
 	_gameStateVars[k8bitVariableEnergy] = _initialTankEnergy;
@@ -702,7 +711,7 @@ bool DrillerEngine::checkIfGameEnded() {
 Common::Error DrillerEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
 	for (auto &it : _areaMap) {
 		stream->writeUint16LE(it._key);
-		stream->writeUint32LE(_completeAreas[it._key]);
+		stream->writeUint32LE(_drilledAreas[it._key]);
 	}
 
 	return Common::kNoError;
@@ -712,7 +721,10 @@ Common::Error DrillerEngine::loadGameStreamExtended(Common::SeekableReadStream *
 	for (uint i = 0; i < _areaMap.size(); i++) {
 		uint16 key = stream->readUint16LE();
 		assert(_areaMap.contains(key));
-		_completeAreas[key] = stream->readUint32LE();
+		_drilledAreas[key] = stream->readUint32LE();
+		if (_drilledAreas[key] == kDrillerNoRig)
+			if (drillDeployed(_areaMap[key]))
+				removeDrill(_areaMap[key]);
 	}
 
 	return Common::kNoError;




More information about the Scummvm-git-logs mailing list