From bc1857a6ae0cf88b1b61824544e5439682debfa9 Mon Sep 17 00:00:00 2001 From: Samuel Bouchet Date: Sun, 15 Mar 2026 17:50:02 +0100 Subject: [PATCH] Fix interaction context and adventure character name translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Interaction messages now show which item triggered them (e.g., "You use Golden Key — the key fits!") instead of appearing without context. - Adventure character names are resolved from their Loreline script name field before localization lookup, fixing IDs like "knight" showing instead of translated names like "Sire Boîtalot". --- content/strings/en.json | 2 +- content/strings/fr.json | 2 +- src/OpenTheBox/Adventures/AdventureEngine.cs | 8 +++++--- src/OpenTheBox/Program.cs | 7 +++++-- src/OpenTheBox/Simulation/Events/GameEvent.cs | 2 +- src/OpenTheBox/Simulation/InteractionEngine.cs | 2 +- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/content/strings/en.json b/content/strings/en.json index f11faf4..66463f1 100644 --- a/content/strings/en.json +++ b/content/strings/en.json @@ -343,7 +343,7 @@ "adventure.item_removed": "Lost: {0}", "adventure.resource_added": "{0} +{1}", - "interaction.key_chest": "The key fits! The chest opens automatically!", + "interaction.key_chest": "You use {0} — the key fits! The chest opens automatically!", "interaction.key_no_match": "This key seems to fit something... but you don't have it yet. Perhaps a future box will provide.", "interaction.treasure_located": "The map and compass align! Treasure located!", "interaction.map_coordinates": "The map reveals mysterious coordinates...", diff --git a/content/strings/fr.json b/content/strings/fr.json index ce6bab5..758febc 100644 --- a/content/strings/fr.json +++ b/content/strings/fr.json @@ -343,7 +343,7 @@ "adventure.item_removed": "Perdu : {0}", "adventure.resource_added": "{0} +{1}", - "interaction.key_chest": "La clé rentre ! Le coffre s'ouvre automatiquement !", + "interaction.key_chest": "Tu utilises {0} — la clé rentre ! Le coffre s'ouvre automatiquement !", "interaction.key_no_match": "Cette clé semble ouvrir quelque chose... mais tu ne l'as pas encore. Peut-être qu'une future boîte le fournira.", "interaction.treasure_located": "La carte et la boussole s'alignent ! Trésor localisé !", "interaction.map_coordinates": "La carte révèle des coordonnées mystérieuses...", diff --git a/src/OpenTheBox/Adventures/AdventureEngine.cs b/src/OpenTheBox/Adventures/AdventureEngine.cs index 1280327..2107059 100644 --- a/src/OpenTheBox/Adventures/AdventureEngine.cs +++ b/src/OpenTheBox/Adventures/AdventureEngine.cs @@ -194,10 +194,12 @@ public sealed class AdventureEngine string? displayName = dialogue.Character; if (displayName is not null) { - string key = $"character.{displayName.ToLowerInvariant().Replace(" ", "_").Replace("'", "")}"; + // Resolve the character's full name from the script (e.g., "knight" → "Sir Boxalot") + string characterName = dialogue.Interpreter.GetCharacterField(displayName, "name") as string + ?? displayName; + string key = $"character.{characterName.ToLowerInvariant().Replace(" ", "_").Replace("'", "")}"; string localized = _loc.Get(key); - if (!localized.StartsWith("[MISSING:")) - displayName = localized; + displayName = !localized.StartsWith("[MISSING:") ? localized : characterName; } _renderer.ShowAdventureDialogue(displayName, dialogue.Text); _renderer.WaitForKeyPress(); diff --git a/src/OpenTheBox/Program.cs b/src/OpenTheBox/Program.cs index 33b32b1..25fe3ae 100644 --- a/src/OpenTheBox/Program.cs +++ b/src/OpenTheBox/Program.cs @@ -521,8 +521,11 @@ public static class Program break; case InteractionTriggeredEvent interEvt: - // Defer interaction display until after loot reveal - deferredInteractions.Add(_loc.Get(interEvt.DescriptionKey)); + // Defer interaction display until after loot reveal, with trigger item context + var interMsg = interEvt.TriggerItemId is not null + ? _loc.Get(interEvt.DescriptionKey, GetLocalizedName(interEvt.TriggerItemId)) + : _loc.Get(interEvt.DescriptionKey); + deferredInteractions.Add(interMsg); break; case ResourceChangedEvent resEvt: diff --git a/src/OpenTheBox/Simulation/Events/GameEvent.cs b/src/OpenTheBox/Simulation/Events/GameEvent.cs index bc9ef5e..d8bfc3e 100644 --- a/src/OpenTheBox/Simulation/Events/GameEvent.cs +++ b/src/OpenTheBox/Simulation/Events/GameEvent.cs @@ -29,7 +29,7 @@ public sealed record ItemConsumedEvent(Guid InstanceId) : GameEvent; /// /// An interaction rule was triggered. /// -public sealed record InteractionTriggeredEvent(string RuleId, string DescriptionKey) : GameEvent; +public sealed record InteractionTriggeredEvent(string RuleId, string DescriptionKey, string? TriggerItemId = null) : GameEvent; /// /// A UI feature was unlocked via a meta item. diff --git a/src/OpenTheBox/Simulation/InteractionEngine.cs b/src/OpenTheBox/Simulation/InteractionEngine.cs index cbe44c1..e499784 100644 --- a/src/OpenTheBox/Simulation/InteractionEngine.cs +++ b/src/OpenTheBox/Simulation/InteractionEngine.cs @@ -148,7 +148,7 @@ public class InteractionEngine(ContentRegistry registry) } } - events.Add(new InteractionTriggeredEvent(rule.Id, rule.DescriptionKey)); + events.Add(new InteractionTriggeredEvent(rule.Id, rule.DescriptionKey, triggerItem.DefinitionId)); return events; }