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

alexbevi noreply at scummvm.org
Wed Sep 2 09:45:04 UTC 2026


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

Summary:
190b2a857d HARVESTER: Fix Sparky's opening conversation
eeb9ed48c7 HARVESTER: Fix Dad's opening conversation


Commit: 190b2a857d58d40159ec686fce7340967644ed3b
    https://github.com/scummvm/scummvm/commit/190b2a857d58d40159ec686fce7340967644ed3b
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-02T05:44:47-04:00

Commit Message:
HARVESTER: Fix Sparky's opening conversation

Assisted-by: Codex:gpt-5.6-sol

Changed paths:
    engines/harvester/npc/sparky_dialogue.cpp


diff --git a/engines/harvester/npc/sparky_dialogue.cpp b/engines/harvester/npc/sparky_dialogue.cpp
index 0ff70b3d841..dccef6ce545 100644
--- a/engines/harvester/npc/sparky_dialogue.cpp
+++ b/engines/harvester/npc/sparky_dialogue.cpp
@@ -31,6 +31,7 @@ namespace {
 static const char *const kDialogueC135FstPath = "GRAPHIC/FST/C135.FST";
 static const char *const kDialogueC096FstPath = "GRAPHIC/FST/C096.FST";
 static const char *const kDialogueC096AFstPath = "GRAPHIC/FST/C096A.FST";
+static const char *const kDialogueC097FstPath = "GRAPHIC/FST/C097.FST";
 static const char *const kDialogueC098FstPath = "GRAPHIC/FST/C098.FST";
 static const char *const kDialogueNudetatuFstPath = "GRAPHIC/FST/NUDETATU.FST";
 
@@ -103,18 +104,32 @@ Common::Error SparkyDialogueHandler::handleDialogue(DialogueRuntime &runtime,
 
 		if (responseIndex == 1) {
 			sharedState.dialogueStateD2f04 = true;
-			return playSparkyLine(0x319, 1);
+			const DialogueLineEntry responseLines[] = {
+				{ 0x319, "SPARKY", 1 },
+				{ 0x322, "PC", 0 },
+				{ 0x326, "SPARKY", 4 },
+				{ 0x330, "PC", 0 }
+			};
+			lineError = runtime.playDialogueEntrySequence(responseLines, ARRAYSIZE(responseLines));
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		} else if (responseIndex == 2) {
+			lineError = playSparkyLine(0x334, 0);
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
 		}
-		if (responseIndex == 2)
-			return playSparkyLine(0x334, 0);
 
 		lineError = runtime.playDialogueFst(kDialogueC096FstPath);
 		if (lineError.getCode() != Common::kNoError)
 			return lineError;
-		return playSparkyLine(0x33f, 0);
-	}
-
-	if (state.returnVisitPending) {
+		lineError = playSparkyLine(0x33f, 0);
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
+		lineError = runtime.playDialogueFst(kDialogueC097FstPath);
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
+		assignSparkyTopicBuffer(0x2c1);
+	} else if (state.returnVisitPending) {
 		Common::Error lineError = Common::kNoError;
 		if (runtime.startupScript().getCurrentStoryDayIndex() == state.returnVisitDayIndex) {
 			lineError = playSparkyLine(0x3bb, 1);


Commit: eeb9ed48c721acbd80b85054b9787a6b964fe686
    https://github.com/scummvm/scummvm/commit/eeb9ed48c721acbd80b85054b9787a6b964fe686
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-02T05:44:47-04:00

Commit Message:
HARVESTER: Fix Dad's opening conversation

This also accounts for the French version which doesn't hardcode the values,
but instead pulls them from DIALOG.RSP

Assisted-by: Codex:gpt-5.6-sol

Changed paths:
    engines/harvester/harvester.cpp
    engines/harvester/harvester.h
    engines/harvester/npc/dad_dialogue.cpp


diff --git a/engines/harvester/harvester.cpp b/engines/harvester/harvester.cpp
index 67fc022ac91..d8373fad21b 100644
--- a/engines/harvester/harvester.cpp
+++ b/engines/harvester/harvester.cpp
@@ -60,6 +60,10 @@ Common::String HarvesterEngine::getGameId() const {
 	return _gameDescription->gameId;
 }
 
+Common::Language HarvesterEngine::getLanguage() const {
+	return _gameDescription->language;
+}
+
 bool HarvesterEngine::isDemo() const {
 	return (_gameDescription->flags & ADGF_DEMO) != 0;
 }
diff --git a/engines/harvester/harvester.h b/engines/harvester/harvester.h
index 979a186873d..7ffd3941cdc 100644
--- a/engines/harvester/harvester.h
+++ b/engines/harvester/harvester.h
@@ -56,6 +56,7 @@ public:
 	 * Returns the game Id
 	 */
 	Common::String getGameId() const;
+	Common::Language getLanguage() const;
 	bool isDemo() const;
 
 	/**
diff --git a/engines/harvester/npc/dad_dialogue.cpp b/engines/harvester/npc/dad_dialogue.cpp
index 21ef8829e53..aead72a156c 100644
--- a/engines/harvester/npc/dad_dialogue.cpp
+++ b/engines/harvester/npc/dad_dialogue.cpp
@@ -22,7 +22,9 @@
 
 #include "harvester/npc/dad_dialogue.h"
 
+#include "harvester/harvester.h"
 #include "harvester/npc/dialogue_runtime.h"
+#include "harvester/text.h"
 
 namespace Harvester {
 
@@ -31,8 +33,11 @@ namespace {
 static const char *const kDadNpc = "DAD";
 static const char *const kPcSpeaker = "PC";
 static const char *const kInventoryOwnerName = "INVENTORY";
+static const char *const kEnglishDadIntroResponseMenu = "1. I'd like that./2. I'd rather not.";
+static const int kFrenchDadIntroResponseMenuLineIndex = 0x328;
 static const char *const kDialogueC011FstPath = "GRAPHIC/FST/C011.FST";
 static const char *const kDialogueC112S4FstPath = "GRAPHIC/FST/C112S4.FST";
+static const char *const kDialogueC112S7FstPath = "GRAPHIC/FST/C112S7.FST";
 
 static const DialogueLineEntry kDadIntroLines[] = {
 	{ 0x39a5, kDadNpc, 0 },
@@ -41,6 +46,34 @@ static const DialogueLineEntry kDadIntroLines[] = {
 	{ 0x39b1, kPcSpeaker, 2 }
 };
 
+static const DialogueLineEntry kDadIntroContinuationLines[] = {
+	{ 0x39b5, kDadNpc, 0 },
+	{ 0x39ba, kPcSpeaker, 3 }
+};
+
+static const DialogueLineEntry kDadOfferPromptLines[] = {
+	{ 0x39c2, kPcSpeaker, 2 },
+	{ 0x39c6, kDadNpc, 0 }
+};
+
+static const DialogueLineEntry kDadOfferAcceptedLines[] = {
+	{ 0x39d3, kDadNpc, 0 },
+	{ 0x39d4, kDadNpc, 0 },
+	{ 0x39d5, kDadNpc, 0 },
+	{ 0x39d6, kDadNpc, 0 },
+	{ 0x39d7, kDadNpc, 0 }
+};
+
+static const DialogueLineEntry kDadOfferClosingLines[] = {
+	{ 0x39e6, kPcSpeaker, 0 },
+	{ 0x39eb, kDadNpc, 0 }
+};
+
+static const DialogueLineEntry kDadMeatPermissionUnavailableLines[] = {
+	{ 0x39fe, kPcSpeaker, 0 },
+	{ 0x3a02, kDadNpc, 0 }
+};
+
 static const DialogueLineEntry kDadWhaleyPhotoLines[] = {
 	{ 0x3a41, kDadNpc, 0 },
 	{ 0x3a46, kPcSpeaker, 0 },
@@ -64,6 +97,24 @@ static const DialogueLineEntry kDadLodgeTopicLines[] = {
 	{ 0x3a88, kDadNpc, 0 }
 };
 
+static Common::String getDadIntroResponseMenu(DialogueRuntime &runtime) {
+	if (runtime.engine().getLanguage() == Common::FR_FRA) {
+		const Common::Array<Common::String> &responseLines =
+			runtime.startupText().getDialogueResponseLines();
+		if (responseLines.empty())
+			return kEnglishDadIntroResponseMenu;
+
+		if (responseLines.size() > (uint)kFrenchDadIntroResponseMenuLineIndex)
+			return responseLines[kFrenchDadIntroResponseMenuLineIndex];
+
+		// The French executable requests DIALOG.RSP[0x328], but failed reads past
+		// its 807-line file leave the final line in the native reader's buffer.
+		return responseLines[responseLines.size() - 1];
+	}
+
+	return kEnglishDadIntroResponseMenu;
+}
+
 } // End of namespace
 
 bool DadDialogueHandler::matchesNpc(const Common::String &npcName) const {
@@ -144,26 +195,79 @@ Common::Error DadDialogueHandler::handleDialogue(DialogueRuntime &runtime,
 		return playDadLine(0x3a32);
 	}
 
+	Common::Error lineError = Common::kNoError;
 	if (state.introPending) {
 		sharedState.dialogueStateD2ed0 = true;
 		state.introPending = false;
 
-		Common::Error lineError = playSequence(kDadIntroLines, ARRAYSIZE(kDadIntroLines));
+		lineError = playSequence(kDadIntroLines, ARRAYSIZE(kDadIntroLines));
 		if (lineError.getCode() != Common::kNoError)
 			return lineError;
 
 		sharedState.dialogueStateD2f04 = true;
-		return playDadLine(0x39b5);
-	}
+		lineError = playSequence(kDadIntroContinuationLines,
+			ARRAYSIZE(kDadIntroContinuationLines));
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
+
+		lineError = runtime.playDialogueFst(kDialogueC112S7FstPath);
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
+
+		lineError = playSequence(kDadOfferPromptLines, ARRAYSIZE(kDadOfferPromptLines));
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
 
-	Common::Error lineError = playDadLine(0x3a17);
-	if (lineError.getCode() != Common::kNoError)
-		return lineError;
+		int responseIndex = 0;
+		const Common::String responseMenu = getDadIntroResponseMenu(runtime);
+		Common::Error responseError = runtime.runResponseMenuText(
+			responseMenu, responseIndex);
+		if (responseError.getCode() != Common::kNoError)
+			return responseError;
+
+		if (responseIndex == 1) {
+			lineError = playSequence(kDadOfferAcceptedLines,
+				ARRAYSIZE(kDadOfferAcceptedLines));
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		} else if (responseIndex == 2) {
+			lineError = playDadLine(0x39e0);
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		}
+
+		lineError = playSequence(kDadOfferClosingLines, ARRAYSIZE(kDadOfferClosingLines));
+		if (lineError.getCode() != Common::kNoError)
+			return lineError;
 
-	if (sharedState.dadMeatPermissionState != 0) {
-		lineError = playDadMeatPermissionConversion();
+		if (sharedState.dadMeatPermissionState != 0) {
+			lineError = playDadMeatPermissionConversion();
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		} else {
+			lineError = playSequence(kDadMeatPermissionUnavailableLines,
+				ARRAYSIZE(kDadMeatPermissionUnavailableLines));
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+
+			lineError = runtime.playDialogueFst(kDialogueC011FstPath);
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+
+			lineError = playDadLine(0x3a0f);
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		}
+	} else {
+		lineError = playDadLine(0x3a17);
 		if (lineError.getCode() != Common::kNoError)
 			return lineError;
+
+		if (sharedState.dadMeatPermissionState != 0) {
+			lineError = playDadMeatPermissionConversion();
+			if (lineError.getCode() != Common::kNoError)
+				return lineError;
+		}
 	}
 
 	const Common::String emptyKeywordList;




More information about the Scummvm-git-logs mailing list