[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