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;
}