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

neuromancer noreply at scummvm.org
Tue Nov 8 20:22:06 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:
d6ab3af274 FREESCAPE: parse and implement countdown timer
eb3c810c4d FREESCAPE: display real time clock in driller


Commit: d6ab3af274867a55d81d91f411c95920e30413ec
    https://github.com/scummvm/scummvm/commit/d6ab3af274867a55d81d91f411c95920e30413ec
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-08T21:23:05+01:00

Commit Message:
FREESCAPE: parse and implement countdown timer

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


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 9f8224c9d45..08eb466ab5f 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -24,6 +24,7 @@
 #include "common/math.h"
 #include "common/unzip.h"
 #include "common/random.h"
+#include "common/timer.h"
 #include "graphics/cursorman.h"
 
 #include "freescape/freescape.h"
@@ -102,6 +103,9 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 	_viewArea = _fullscreenViewArea;
 	_rnd = new Common::RandomSource("freescape");
 	_gfx = nullptr;
+
+	_timerStarted = false;
+	_countdown = 0;
 }
 
 FreescapeEngine::~FreescapeEngine() {
@@ -643,4 +647,22 @@ Graphics::Surface *FreescapeEngine::loadAndConvertNeoImage(Common::SeekableReadS
 	return surface;
 }
 
+static void countdownCallback(void *refCon) {
+	FreescapeEngine* self = (FreescapeEngine *)refCon;
+	self->_countdown--;
+}
+
+bool FreescapeEngine::startCountdown(uint32 delay) {
+	_countdown = delay;
+	_timerStarted = true;
+	uint32 oneSecond = 1000000;
+	return g_system->getTimerManager()->installTimerProc(&countdownCallback, oneSecond, (void *)this, "countdown");
+}
+
+void FreescapeEngine::removeTimers() {
+	_timerStarted = false;
+	g_system->getTimerManager()->removeTimerProc(&countdownCallback);
+}
+
+
 } // namespace Freescape
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 608bb111d0c..95d5df325c6 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -282,6 +282,12 @@ public:
 	bool canSaveGameStateCurrently() override { return true; }
 	Common::Error loadGameStream(Common::SeekableReadStream *stream) override;
 	Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave = false) override;
+
+	// Timers
+	bool startCountdown(uint32 delay);
+	void removeTimers();
+	bool _timerStarted;
+	int _countdown;
 };
 
 enum DrillerReleaseFlags {
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index c82c8b3c623..f52afde0ed8 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -631,6 +631,8 @@ void DrillerEngine::initGameState() {
 
 	_gameStateVars[k8bitVariableEnergy] = _initialProveEnergy;
 	_gameStateVars[k8bitVariableShield] = _initialProveShield;
+	if (_countdown > 0)
+		startCountdown(_countdown);
 }
 
 bool DrillerEngine::checkIfGameEnded() {
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index ecdffbe8b51..7ff33fb47b4 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -472,6 +472,31 @@ void FreescapeEngine::load8bitBinary(Common::SeekableReadStream *file, int offse
 		debugC(1, kFreescapeDebugParser, "%s", conditionSource.c_str());
 	}
 
+	if (isDriller()) {
+		if (isAmiga() || isAtariST())
+			file->seek(offset + 0x168);
+		else
+			file->seek(offset + 0xb4);
+		Common::String n;
+		n += char(readField(file, 8));
+		n += char(readField(file, 8));
+		_countdown = _countdown + 3600 * atoi(n.c_str());
+		n.clear();
+		n += char(readField(file, 8));
+		assert(n == ":");
+		n.clear();
+		n += char(readField(file, 8));
+		n += char(readField(file, 8));
+		_countdown = _countdown + 60 * atoi(n.c_str());
+		n.clear();
+		n += char(readField(file, 8));
+		assert(n == ":");
+		n.clear();
+		n += char(readField(file, 8));
+		n += char(readField(file, 8));
+		_countdown = _countdown + atoi(n.c_str());
+	}
+
 	if (isAmiga() || isAtariST())
 		file->seek(offset + 0x190);
 	else


Commit: eb3c810c4d1fecb21e1320ca7e3a550e9adf2850
    https://github.com/scummvm/scummvm/commit/eb3c810c4d1fecb21e1320ca7e3a550e9adf2850
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-08T21:23:06+01:00

Commit Message:
FREESCAPE: display real time clock in driller

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


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 08eb466ab5f..a3593ffe6d7 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -109,6 +109,7 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 }
 
 FreescapeEngine::~FreescapeEngine() {
+	removeTimers();
 	delete _rnd;
 
 	if (_title && _title != _border) {
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index f52afde0ed8..3fc26b35d74 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -356,6 +356,13 @@ void DrillerEngine::drawUI() {
 		drawStringInSurface(Common::String::format("%04d", 2 * int(_position.y())), 150, 161, yellow, black, surface);
 		drawStringInSurface(Common::String::format("%d", _playerHeightNumber), 57, 161, yellow, black, surface);
 		drawStringInSurface(Common::String::format("%07d", score), 240, 129, yellow, black, surface);
+
+		int hours = _countdown / 3600;
+		drawStringInSurface(Common::String::format("%02d", hours), 208, 8, yellow, black, surface);
+		int minutes = (_countdown - hours * 3600) / 60;
+		drawStringInSurface(Common::String::format("%02d", minutes), 230, 8, yellow, black, surface);
+		int seconds = _countdown - hours * 3600 - minutes * 60;
+		drawStringInSurface(Common::String::format("%02d", seconds), 254, 8, yellow, black, surface);
 	}
 
 	int energy = _gameStateVars[k8bitVariableEnergy];




More information about the Scummvm-git-logs mailing list