[Scummvm-git-logs] scummvm master -> 7e6434ff93de2690b90a4aca8b8b5e2721c534d8

yuv422 noreply at scummvm.org
Sun Mar 9 01:20:48 UTC 2025


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:
5e8c646d09 DARKSEED: Add support for playable demo
7e6434ff93 DARKSEED: Add object fixes for room 45 in dos demo version.


Commit: 5e8c646d090031be2d6d2517ec0eaa3fabb47226
    https://github.com/scummvm/scummvm/commit/5e8c646d090031be2d6d2517ec0eaa3fabb47226
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-03-09T12:18:07+11:00

Commit Message:
DARKSEED: Add support for playable demo

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/cutscene.cpp
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/detection_tables.h
    engines/darkseed/inventory.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/tostext.cpp
    engines/darkseed/tostext.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index da2f76decfd..91687eb343c 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -58,6 +58,9 @@ Console::~Console() {
 }
 
 void Console::printTosText(int tosIndex, bool shouldAddToCurrentLine) {
+	if (g_engine->isDosDemo()) {
+		debug("TosIndex: %d", tosIndex);
+	}
 	const Common::U32String &text = _tosText->getText(tosIndex);
 
 	if (!_isCJKLanguage) {
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 759ecf272f5..986055974a1 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -68,7 +68,9 @@ void Cutscene::update() {
 		break;
 	case 'H' :
 	case 'Z' :
-		_movieStep = 9999;
+		if (!g_engine->fadeStep()) {
+			_movieStep = 9999;
+		}
 		break;
 	default:
 		break;
@@ -81,7 +83,11 @@ void Cutscene::update() {
 			g_engine->_previousRoomNumber = 38;
 			g_engine->changeToRoom(7);
 		} else if (_cutsceneId == 'Z') {
-			g_engine->restartGame();
+			if (g_engine->isDosDemo()) {
+				g_engine->quitGame();
+			} else {
+				g_engine->restartGame();
+			}
 		} else if (_cutsceneId == 'I') {
 			play('J');
 		} else if (_cutsceneId == 'J') {
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 0ddab8ec244..02301364e83 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -102,11 +102,13 @@ Common::Error DarkseedEngine::run() {
 	_player->_direction = 1;
 	_player->_frameIdx = 0;
 
-	_room = new Room(0);
+	_room = new Room(isDosDemo() ? 4 : 0);
 
 	// If a savegame was selected from the launcher, load it
 	int saveSlot = ConfMan.getInt("save_slot");
-	if (saveSlot != -1) {
+	if (isDosDemo()) {
+		newGame();
+	} else if (saveSlot != -1) {
 		(void)loadGameState(saveSlot);
 	} else {
 		_cutscene.play('I');
@@ -237,10 +239,12 @@ void DarkseedEngine::gameLoop() {
 			if (_currentTimeInSeconds * 2 != _fttime) {
 				_fttime = _currentTimeInSeconds * 2;
 			}
-			if (!_room->isGiger()) {
-				_fttime += 4;
-			} else {
-				_fttime += 9;
+			if (!isDosDemo()) {
+				if (!_room->isGiger()) {
+					_fttime += 4;
+				} else {
+					_fttime += 9;
+				}
 			}
 			_currentTimeInSeconds = _fttime / 2;
 			if ((_currentTimeInSeconds == 46800 || _currentTimeInSeconds == 46801) && _currentDay == 2 && _room->_roomNumber != 34) {
@@ -373,6 +377,9 @@ void DarkseedEngine::updateEvents() {
 			break;
 		case Common::EVENT_KEYDOWN:
 			_lastKeyPressed = event.kbd.keycode;
+			if (isDosDemo() && _lastKeyPressed == Common::KEYCODE_q) {
+				quitGame();
+			}
 			break;
 		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
 			if (event.customType == kDarkseedActionSelect) {
@@ -380,7 +387,9 @@ void DarkseedEngine::updateEvents() {
 			} else if (event.customType == kDarkseedActionChangeCommand) {
 				_isRightMouseClicked = true;
 			} else if (event.customType == kDarkseedActionTimeAdvance) {
-				_timeAdvanceEventSelected = true;
+				if (!isDosDemo()) {
+					_timeAdvanceEventSelected = true;
+				}
 			} else if (event.customType == kDarkseedActionQuit) {
 				quitGame();
 			}
@@ -1084,6 +1093,15 @@ void DarkseedEngine::loadRoom(int roomNumber) {
 }
 
 void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AKA LoadNewRoom
+	if (isDosDemo()) {
+		if (newRoomNumber == 0) {
+			newRoomNumber = 43;
+			_previousRoomNumber = 44;
+		} else if (newRoomNumber == 44) {
+			newRoomNumber = 4;
+			_previousRoomNumber = 0;
+		}
+	}
 	MusicId newMusicId = Room::getMusicIdForRoom(newRoomNumber);
 	if (g_engine->_sound->isPlayingMusic() && Room::getMusicIdForRoom(_room->_roomNumber) != newMusicId) {
 		g_engine->_sound->startFadeOut();
@@ -1915,7 +1933,7 @@ void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 103) {
 		printTime();
 	}
-	if (_cursor.getY() > 39 && objNum != 77) {
+	if (_cursor.getY() > 39 && objNum != 77 && !isDosDemo()) {
 		int eyeTosIdx = _objectVar.getEyeDescriptionTosIdx(objNum);
 		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
 			_console->printTosText(eyeTosIdx);
@@ -2589,22 +2607,35 @@ void DarkseedEngine::waitxticks(int ticks) {
 
 void DarkseedEngine::doCircles() {
 	debug("DarkseedEngine::doCircles");
-	_player->loadAnimations("bedsleep.nsp");
-	_player->_position.x = 0x87;
-	_player->_position.y = 0x5b;
-	_player->_frameIdx = 0;
-	_player->_direction = 1;
-	_animation->setupOtherNspAnimation(0, 1);
+	if (isDosDemo()) {
+		_player->_position.x = 320;
+		_player->_position.y = 220;
+		_player->_walkTarget = _player->_position;
+		_player->_frameIdx = 28;
+		_player->_direction = 2;
+		_frame.draw();
+		_room->draw();
+		_console->draw(true);
+		updateDisplay();
+		_sprites.drawSprites();
+	} else {
+		_player->loadAnimations("bedsleep.nsp");
+		_player->_position.x = 0x87;
+		_player->_position.y = 0x5b;
+		_player->_frameIdx = 0;
+		_player->_direction = 1;
+		_animation->setupOtherNspAnimation(0, 1);
 
-	_frame.draw();
-	_room->draw();
-	_console->draw(true);
+		_frame.draw();
+		_room->draw();
+		_console->draw(true);
 
-	// setup & draw Mike in bed.
-	_sprites.clearSpriteDrawList();
-	const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-	_sprites.addSpriteToDrawList(0x75, 0x71, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
-	_sprites.drawSprites();
+		// setup & draw Mike in bed.
+		_sprites.clearSpriteDrawList();
+		const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+		_sprites.addSpriteToDrawList(0x75, 0x71, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
+		_sprites.drawSprites();
+	}
 
 	// Capture screen.
 
@@ -2674,9 +2705,9 @@ void DarkseedEngine::newGame() {
 	_inventory.reset();
 	_sound->resetSpeech();
 	_objectVar.reset();
-	_room->_roomNumber = 0;
+	_room->_roomNumber = isDosDemo() ? 4 : 0;
 	_currentDay = 1;
-	changeToRoom(0);
+	changeToRoom(_room->_roomNumber);
 
 	doCircles();
 
@@ -2688,7 +2719,9 @@ void DarkseedEngine::newGame() {
 	waitForSpeech();
 	_systemTimerCounter = 4;
 	_cursor.showCursor(true);
-	_canSaveGame = true;
+	if (!isDosDemo()) {
+		_canSaveGame = true;
+	}
 }
 
 void DarkseedEngine::waitForSpeech() {
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 991391de11f..8b11c20e677 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -202,6 +202,10 @@ public:
 		return isDosVersion() && !isCdVersion();
 	}
 
+	bool isDosDemo() const {
+		return isDosVersion() && getFeatures() & ADGF_DEMO;
+	}
+
 	bool hasFeature(EngineFeature f) const override {
 		return
 		    (f == kSupportsLoadingDuringRuntime) ||
@@ -210,7 +214,7 @@ public:
 	};
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override {
-		return !_animation->_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_heroWaiting && !_cutscene.isPlaying();
+		return !isDosDemo() && !_animation->_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_heroWaiting && !_cutscene.isPlaying();
 	}
 
 	bool canSaveGameStateCurrently(Common::U32String *msg) override {
diff --git a/engines/darkseed/detection_tables.h b/engines/darkseed/detection_tables.h
index b95b8afa4c0..f6f3d08b17e 100644
--- a/engines/darkseed/detection_tables.h
+++ b/engines/darkseed/detection_tables.h
@@ -126,7 +126,15 @@ const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE | ADGF_CD,
 		GUIO1(GUIO_NONE)
 	},
-
+{
+		"darkseed",
+		"DEMO",
+		AD_ENTRY1s("TOS.EXE", "43014b73a2cc549bd13d65b18a6aefe4", 161184),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_TESTING | ADGF_DEMO,
+		GUIO1(GUIO_NONE)
+	},
 	AD_TABLE_END_MARKER
 };
 
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 29c1b60937b..c1f7e5d5986 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -116,7 +116,7 @@ void Inventory::draw() {
 	for (int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
 		if (icon != 42 && icon != 43) {
-			icon += 42;
+			icon += g_engine->isDosDemo() ? 36 : 42;
 		}
 
 		if (g_engine->_actionMode == _iconList[i] && g_engine->_actionMode > 4) {
@@ -142,7 +142,11 @@ void Inventory::handleClick() {
 	} else if (icon == 43) {
 		rightArrowClicked();
 	} else if (icon == 4) {
-		g_engine->_menu->loadMenu();
+		if (g_engine->isDosDemo()) {
+			g_engine->_console->addTextLine(Common::U32String("You can't load or save games in demo mode, press 'q' to exit."));
+		} else {
+			g_engine->_menu->loadMenu();
+		}
 	} else if (icon == 21) {
 		g_engine->_console->printTosText(935);
 		g_engine->_objectVar[21] = 1;
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index e15f9f71a66..03003eb1de5 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -175,7 +175,9 @@ bool Nsp::load(const Common::Path &filename) {
 		Common::String filePathStr = filePath.toString();
 		debug("Loaded %s", filePathStr.c_str());
 		Common::Path obtFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".obt");
-		ret = loadObt(obtFilename);
+		if (!loadObt(obtFilename)) {
+			debug("failed to load %s", obtFilename.toString().c_str());
+		}
 	}
 	return ret;
 }
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index 7a3bda42f74..78b9d7d7199 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -26,6 +26,10 @@
 namespace Darkseed {
 
 bool TosText::load() {
+	if (g_engine->isDosDemo()) {
+		loadDemoTosEntries();
+		return true;
+	}
 	Common::File tostextFile;
 	if (!tostextFile.open("tostext.bin")) {
 		return false;
@@ -39,6 +43,18 @@ bool TosText::load() {
 	return true;
 }
 
+void TosText::loadDemoTosEntries() {
+	_numEntries = 973;
+	_textArray.resize(_numEntries);
+	_textArray[10] = "My head is killing me.";
+	_textArray[11] = "My head feels like it is going to explode.";
+	_textArray[12] = "It seems like I've had this headache since I moved here.";
+	_textArray[13] = "I need an asprin or something.";
+
+	_textArray[798] = "You can't touch the horizon!";
+	_textArray[972] = "Holding ";
+}
+
 const Common::U32String &TosText::getText(uint16 textIndex) {
 	assert(textIndex < _numEntries);
 	return _textArray[textIndex];
diff --git a/engines/darkseed/tostext.h b/engines/darkseed/tostext.h
index d1bd60d017d..a87f9e5c288 100644
--- a/engines/darkseed/tostext.h
+++ b/engines/darkseed/tostext.h
@@ -40,6 +40,7 @@ public:
 
 private:
 	Common::U32String loadString(Common::File &file, uint16 index) const;
+	void loadDemoTosEntries();
 };
 
 } // namespace Darkseed


Commit: 7e6434ff93de2690b90a4aca8b8b5e2721c534d8
    https://github.com/scummvm/scummvm/commit/7e6434ff93de2690b90a4aca8b8b5e2721c534d8
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-03-09T12:18:07+11:00

Commit Message:
DARKSEED: Add object fixes for room 45 in dos demo version.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/tostext.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 02301364e83..371ddbb4c2f 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1933,7 +1933,7 @@ void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 103) {
 		printTime();
 	}
-	if (_cursor.getY() > 39 && objNum != 77 && !isDosDemo()) {
+	if (_cursor.getY() > 39 && objNum != 77 && (!isDosDemo() || objNum == 120)) {
 		int eyeTosIdx = _objectVar.getEyeDescriptionTosIdx(objNum);
 		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
 			_console->printTosText(eyeTosIdx);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index ef1900fe495..b0988e2e951 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -233,6 +233,9 @@ bool Room::load() {
 		return false;
 	}
 
+	if (g_engine->isDosDemo()) {
+		dosDemoFixupRoomObjects();
+	}
 	for (auto &roomObj : _roomObj) {
 		if (roomObj.objNum < 42 && g_engine->_objectVar.getMoveObjectRoom(roomObj.objNum) != 255) {
 			removeObjectFromRoom(roomObj.objNum);
@@ -281,6 +284,16 @@ bool Room::load() {
 	return true;
 }
 
+void Room::dosDemoFixupRoomObjects() {
+	if (_roomNumber == 45) {
+		// The dos demo is missing the object entries for the life leech victims and the force field
+		_roomObj[8] = {0, 120, 245, 100, 25, 25, 0, 0};
+		_roomObj[9] = {0, 120, 342, 100, 36, 27, 0, 0};
+		_roomObj[10] = {0, 119, 298, 160, 63, 31, 0, 0};
+	}
+}
+
+
 Common::String Room::stripSpaces(const Common::String &source) {
 	Common::String out;
 	const char *src = source.c_str();
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 064ca42738e..85dc3275e40 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -117,6 +117,7 @@ private:
 	static Common::String stripSpaces(const Common::String &source);
 	void drawTrunk();
 	void advanceLocAnimFrame(int roomObjIdx);
+	void dosDemoFixupRoomObjects();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index 78b9d7d7199..98ea6a13e8a 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -52,6 +52,9 @@ void TosText::loadDemoTosEntries() {
 	_textArray[13] = "I need an asprin or something.";
 
 	_textArray[798] = "You can't touch the horizon!";
+
+	_textArray[802] = "You see the unfortunate victims of the life leech.";
+
 	_textArray[972] = "Holding ";
 }
 




More information about the Scummvm-git-logs mailing list