rimlike/autoload/strings.gd
megaproxy 59ca6ba9c5 Phase 19 — onboarding: hint tour + Help modal + tooltip pass
Three-agent fan-out (gdscript-refactor x3) ships the chosen Phase 19
approach: contextual hints during first session + a Help reference,
plus a sweep of hover tooltips for desktop discoverability.

- HintSystem (autoload) + HintOverlay (layer 22 top-center banner):
  7-step tour gated on player events — welcome (boot+2s), pawn select,
  build drawer open, stockpile painted, work matrix open, day_ended,
  tour_complete. Per-hint dismissals persist as Array[String] in
  GameState.settings['dismissed_hints']. Max-3 FIFO queue if hints
  chain. Reduce-motion path snaps in/out instead of tweening.
  Reset_tour() public API for the Help modal.

- HelpModal (layer 20): 5-tab static reference (Controls / Verbs /
  Priorities / Storyteller / Tips). Opens via EventBus.help_requested,
  dimmed backdrop, X/Esc/backdrop-tap dismiss. SettingsMenu gains an
  'Onboarding' section: Show-hints checkbox, Help button (emits
  help_requested), Reset hints button (calls HintSystem.reset_tour with
  has_method guard). Pre-existing 'W' keybind reference fixed to 'P'.

- Tooltip pass: tooltip_text via Strings.t on every TopBar button
  (10 buttons incl. speed shortcuts), BuildDrawer FAB, and every tool
  button in BuildDrawer (21 tools). _add_tool_btn extended with optional
  tooltip param. ~34 new tooltip.* string keys.

Contracts pre-written (Opus): EventBus.help_requested, hint_dismissed,
ui_panel_opened signals; GameState show_hints + dismissed_hints
defaults; BuildDrawer.open + WorkPriorityMatrix.open emit
ui_panel_opened so HintSystem can subscribe via one signal.

Also recorded [MED] known bug in memory.md: drag-paint with active
paint tool is eaten by camera drag-pan.

MCP runtime verified: welcome banner fires 2s after boot, dismiss
queues build_drawer hint on next ui_panel_opened, dismissed_hints
persisted as ['welcome'], HelpModal opens via help_requested with
tab switching working (Controls → Tips verified visually).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:36:18 +01:00

337 lines
20 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node
## i18n string table — player-visible strings ONLY. Code keys, EN values.
##
## Locked from day one (per CLAUDE.md): no hardcoded display copy in scenes or
## scripts. If you have player-facing text, add a key here and call Strings.t(key).
##
## Locale switching is post-MVP; the indirection lands now so we don't have to
## retrofit the whole game later. When the table grows, move it to a .tres or
## external CSV import; the public API (`Strings.t(key)`) stays the same.
const TABLE: Dictionary = {
# Phase 0 placeholder — populate as features land.
&"app.title": "Rimlike",
&"smoke.hello": "Phase 0 — autoloads online.",
# Speed controls (top bar)
&"speed.pause": "",
&"speed.normal": "1×",
&"speed.fast": "5×",
&"speed.ultra": "12×",
# HUD
&"hud.tick": "Tick: {n}",
# Phase 11 — in-game clock display ("{d}" = day, "{t}" = "HH:MM")
&"clock.format": "Day {d}, {t}",
# Phase 12 — season indicator ("{s}" = season name, "{d}" = 1-indexed day, "{total}" = days per season)
&"season.spring": "Spring",
&"season.summer": "Summer",
&"season.autumn": "Autumn",
&"season.winter": "Winter",
&"season.format": "{s} {d}/12",
# Pawn state labels
&"pawn.state.idle": "idle",
&"pawn.state.walking": "walking",
# Item types (player-visible this phase)
&"item.wood": "Wood",
&"item.stone": "Stone",
&"item.iron_ore": "Iron ore",
# Item stack count badge ("{n}" is substituted at call site via .format())
&"item.stack_count": "×{n}",
# Phase 6 — new item types (carpenter bench + smelter outputs)
&"item.plank": "Plank",
&"item.stone_block": "Stone block",
# Phase 7 — food loop and cooking chain item types
&"item.flour": "Flour",
&"item.bread": "Bread",
&"item.meal": "Meal",
# Phase 7 — cooking workbench labels
&"workbench.hearth": "Hearth",
&"workbench.millstone": "Millstone",
# Phase 7 — pawn hunger states
&"pawn.state.eating": "eating",
&"pawn.state.hungry": "hungry",
# Phase 11 — mood thoughts (player-visible in pawn-detail, Phase 17)
&"thought.in_darkness": "In darkness",
# Phase 6 — quality tier labels
&"quality.shoddy": "Shoddy",
&"quality.normal": "Normal",
&"quality.excellent": "Excellent",
&"quality.masterwork": "Masterwork",
&"quality.legendary": "Legendary",
# Phase 15 — Storyteller UI buttons
&"ui.go_there": "Go there",
&"ui.dismiss": "Dismiss",
# Phase 16 — Save/Load UI
&"ui.save": "Save",
&"ui.load": "Load",
&"ui.saved": "Saved",
&"ui.saving": "Saving…",
&"ui.no_saves": "No saves yet.",
&"ui.continue": "Continue",
&"ui.cancel": "Cancel",
&"ui.manual_save": "Manual save",
&"ui.autosave": "Autosave",
&"ui.version_mismatch": "This save is from an older version (v{v}) — loading may fail. Continue?",
&"ui.welcome_back": "Welcome back — away {n}",
&"ui.welcome_back_min": "{n} minute",
&"ui.welcome_back_mins": "{n} minutes",
&"ui.welcome_back_hour": "{n} hour",
&"ui.welcome_back_hours": "{n} hours",
&"ui.load_failed": "Load failed (corrupt or version mismatch).",
# Phase 15 — Storyteller event titles + bodies (25-event corpus).
# EventDef factories in EventCatalog carry the English string directly;
# these keys exist so Strings.t() is the indirection point for future locale
# switching. When a locale ships, swap EventDef.title/body from these keys
# instead of touching EventCatalog factories. (%pawn% is substituted by UI.)
&"event.first_beds.title": "First Beds",
&"event.first_beds.body": "Your settlers slept on the cold ground again. They are starting to ache.",
&"event.empty_larder.title": "Empty Larder",
&"event.empty_larder.body": "The larder is bare. Spring won't last forever.",
&"event.no_fire.title": "No Fire",
&"event.no_fire.body": "Without a hearth, the cold will bite by night.",
&"event.walls.title": "Walls?",
&"event.walls.body": "Sleeping under stars is romantic until the wolves arrive.",
&"event.spring_awakens.title": "Spring Awakens",
&"event.spring_awakens.body": "The thaw runs in every stream. Crops will grow fast now.",
&"event.summers_heat.title": "Summer's Heat",
&"event.summers_heat.body": "The sun beats down. Unsheltered work will tire faster.",
&"event.autumns_harvest.title": "Autumn's Harvest",
&"event.autumns_harvest.body": "The fields are heavy with the last of the year's bounty.",
&"event.winters_edge.title": "Winter's Edge",
&"event.winters_edge.body": "Frost has come. The road is closed; you are alone.",
&"event.a_traveler.title": "A Traveler",
&"event.a_traveler.body": "A weary traveler stumbles toward your gate. They look hungry. Will you welcome them?",
&"event.the_refugee_family.title": "The Refugee Family",
&"event.the_refugee_family.body": "A family fleeing bandits arrives. They have nothing, but they would work hard.",
&"event.the_old_soldier.title": "The Old Soldier",
&"event.the_old_soldier.body": "A retired soldier offers his blade for a place by your fire. Combat 8, but old and tired.",
&"event.the_wandering_healer.title": "The Wandering Healer",
&"event.the_wandering_healer.body": "A traveling healer asks for shelter. She brings knowledge of medicine.",
&"event.wolves_at_the_edge.title": "Wolves at the Edge",
&"event.wolves_at_the_edge.body": "Wolves howl in the distance. They will be here by nightfall.",
&"event.lone_wolf.title": "Lone Wolf",
&"event.lone_wolf.body": "A starving wolf circles your livestock.",
&"event.pack_hunt.title": "Pack Hunt",
&"event.pack_hunt.body": "A hunting pack moves through the forest. They smell your colony.",
&"event.bandit_scouts.title": "Bandit Scouts",
&"event.bandit_scouts.body": "Strange figures watched from the treeline at dusk. Bandits, perhaps.",
&"event.fever.title": "Fever",
&"event.fever.body": "%pawn% woke with a fever. The sickness may spread.",
&"event.a_bad_cut.title": "A Bad Cut",
&"event.a_bad_cut.body": "%pawn% gashed their hand chopping wood. The wound looks deep.",
&"event.the_sleeplessness.title": "The Sleeplessness",
&"event.the_sleeplessness.body": "%pawn% has barely slept. Something weighs on them.",
&"event.bountiful_harvest.title": "Bountiful Harvest",
&"event.bountiful_harvest.body": "Your fields exceeded the season. The granary swells.",
&"event.lumberjacks_luck.title": "Lumberjack's Luck",
&"event.lumberjacks_luck.body": "%pawn% found a copse of unusually thick trees.",
&"event.veins_of_iron.title": "Veins of Iron",
&"event.veins_of_iron.body": "A miner reports a rich vein, deeper than expected.",
&"event.strange_stones.title": "Strange Stones",
&"event.strange_stones.body": "Settlers report finding carved stones in the wood — older than any memory.",
&"event.an_old_map.title": "An Old Map",
&"event.an_old_map.body": "%pawn% found a tattered map. Roads to the north, half-faded.",
&"event.one_year_survived.title": "One Year Survived",
&"event.one_year_survived.body": "A full year. The first frost feels different now — yours is a real settlement.",
# Phase 17 — PawnDetailPanel
&"ui.detail.close": "X",
&"ui.detail.hp": "HP",
&"ui.detail.hunger": "Hunger",
&"ui.detail.sleep": "Sleep",
&"ui.detail.mood": "Mood",
&"ui.detail.job": "Job",
&"ui.detail.idle": "Idle",
&"ui.detail.sulking": "Sulking",
&"ui.detail.thoughts": "Thoughts",
&"ui.detail.statuses": "Statuses",
&"ui.detail.skills": "Skills",
&"ui.detail.priorities": "Work priorities",
&"ui.detail.skill.manual_labor": "Manual",
&"ui.detail.skill.crafting": "Crafting",
&"ui.detail.skill.cooking": "Cooking",
&"ui.detail.skill.medicine": "Medicine",
&"ui.detail.skill.combat": "Combat",
&"ui.detail.sev": "sev={s}/{m}",
# Phase 17 — SettingsMenu
&"ui.settings.title": "Settings",
&"ui.settings.speeds": "Speeds",
&"ui.settings.shortcuts": "Pause=Space 1×=1 5×=2 12×=3",
&"ui.settings.auto_pause": "Auto-pause",
&"ui.settings.pause_threat": "On Threat",
&"ui.settings.pause_wanderer": "On Wanderer",
&"ui.settings.pause_pawn_down": "On Pawn-Down",
&"ui.settings.pause_modal": "On Modal",
&"ui.settings.audio": "Audio",
&"ui.settings.master": "Master",
&"ui.settings.music": "Music",
&"ui.settings.sfx": "SFX",
&"ui.settings.ambient": "Ambient",
&"ui.settings.accessibility": "Accessibility",
&"ui.settings.larger_text": "Larger Text",
&"ui.settings.reduce_motion": "Reduce Motion",
&"ui.settings.save": "Save",
&"ui.settings.cancel": "Cancel",
&"ui.settings.btn": "Settings",
# Phase 17 — BuildDrawer bottom-sheet.
&"ui.build": "Build",
&"ui.build_drawer.designate": "Designate",
&"ui.build_drawer.build": "Build",
&"ui.build_drawer.stockpile": "Stockpile",
&"ui.build_drawer.cancel": "Cancel",
&"ui.build_drawer.section.structures": "Structures",
&"ui.build_drawer.section.furniture": "Furniture",
&"ui.build_drawer.section.production": "Production",
&"tool.chop": "Chop trees",
&"tool.mine": "Mine rocks",
&"tool.dig_grave": "Dig grave",
&"tool.no_roof": "No roof",
&"tool.build_wall_stone": "Stone wall",
&"tool.build_wall_wood": "Wood wall",
&"tool.build_floor_wood": "Wood floor",
&"tool.build_floor_stone": "Stone floor",
&"tool.build_door": "Door",
&"tool.build_crate": "Crate",
&"tool.build_bed": "Bed",
&"tool.build_torch": "Torch",
&"tool.workbench_carpenter": "Carpenter",
&"tool.workbench_smelter": "Smelter",
&"tool.workbench_millstone": "Millstone",
&"tool.workbench_hearth": "Hearth",
&"tool.workbench_cremation_pyre": "Cremation Pyre",
&"tool.paint_quarry": "Quarry",
&"tool.stockpile_general": "Stockpile",
&"tool.graveyard": "Graveyard",
&"tool.plant_tree": "Plant tree",
# Tree growth stage names (shown in inspect tooltip).
&"tree.stage.sapling": "Sapling",
&"tree.stage.young": "Young tree",
&"tree.stage.growing": "Growing tree",
&"tree.stage.mature": "Mature tree",
&"ui.bill.mode_forever": "Forever",
&"ui.bill.mode_count": "Do X times",
&"ui.bill.mode_until_n": "Do until X",
&"ui.bill.target": "Target",
&"ui.bill.until_count": "Until count",
&"ui.bill.completed": "Done",
&"ui.bill.pause": "Pause",
&"ui.bill.remove": "Remove",
&"ui.bill.add_button": "Add bill",
&"ui.bill.no_bills_hint": "No bills. Add one to start crafting.",
&"ui.workbench.current_bill": "Current",
&"ui.workbench.idle": "Idle",
# Phase 17 — DaySummaryCard end-of-day modal.
&"ui.day_summary.title": "Day {day} — {season}",
&"ui.day_summary.continue": "Continue",
&"ui.day_summary.pawns_alive": "Pawns alive",
&"ui.day_summary.wolves_on_map": "Wolves on map",
&"ui.day_summary.tension": "Tension",
&"ui.day_summary.tension_fmt": "{t} / 100",
# Weather labels (weather.<name>)
&"weather.clear": "Clear",
&"weather.rain": "Rain",
&"weather.storm": "Storm",
&"weather.cold_snap": "Cold Snap",
&"weather.unknown": "Unknown",
# Settings checkbox label
&"ui.settings.show_day_summary": "Show end-of-day summary",
# Phase 17 — Stockpile filter chips (StockpilePanel).
&"ui.stockpile.title": "Stockpile",
&"ui.stockpile.priority": "Priority:",
&"ui.stockpile.prio.critical": "Crit",
&"ui.stockpile.prio.high": "High",
&"ui.stockpile.prio.normal": "Norm",
&"ui.stockpile.prio.low": "Low",
&"ui.stockpile.prio.off": "Off",
&"ui.stockpile.accepts": "Accepts:",
&"ui.stockpile.accepts_all_hint": "All",
&"ui.stockpile.select_all": "All",
&"ui.stockpile.clear_all": "None",
# Item type chip labels missing from existing table (copper_ore through ash).
# (item.wood, .stone, .iron_ore, .plank, .stone_block, .flour, .bread, .meal
# are already defined above — only the ones below are new.)
&"item.copper_ore": "Copper",
&"item.silver": "Silver",
&"item.gold": "Gold",
&"item.cloth": "Cloth",
&"item.vegetable": "Vegetable",
&"item.meat": "Meat",
&"item.grain": "Grain",
&"item.medicine": "Medicine",
&"item.tool": "Tool",
&"item.weapon": "Weapon",
&"item.armor": "Armor",
&"item.corpse": "Corpse",
&"item.ash": "Ash",
# Phase 19 — Onboarding hint tour.
&"hint.welcome": "Welcome to your settlement. Drag to pan the camera, scroll or pinch to zoom.",
&"hint.pawn_select": "Tap a pawn to open their detail panel — HP, hunger, mood, skills, and work priorities.",
&"hint.build_drawer": "The Build drawer has four tabs: Designate orders, Build structures, paint Stockpiles, or Cancel a tool.",
&"hint.stockpile_painted": "Tap your new stockpile to set its accepted items and priority. Pawns will haul matching items here.",
&"hint.work_matrix": "Work priorities go 0 (off) to 4 (urgent). Pawns pick the highest-priority work they're capable of.",
&"hint.day_ended": "Day ends at dusk. Sleep, mood, and weather all carry into the next day. Plan ahead.",
&"hint.tour_complete": "Tour complete. Find more in Settings → Help anytime.",
&"hint.got_it": "Got it",
# Phase 19 — Help modal content.
&"ui.help.title": "Help",
&"ui.help.close": "X",
&"ui.help.tab.controls": "Controls",
&"ui.help.tab.verbs": "Verbs",
&"ui.help.tab.priorities": "Priorities",
&"ui.help.tab.storyteller": "Storyteller",
&"ui.help.tab.tips": "Tips",
&"help.controls.heading": "Camera & Selection",
&"help.controls.body": "Drag with mouse or finger to pan the camera.\nScroll wheel or pinch to zoom.\n\nWASD or arrow keys also pan; + / - zoom; Home or C re-centers.\n\nTap a pawn, workbench, or stockpile to open its detail panel.\nRight-click or Escape deselects.\n\nB toggles the Build drawer.\nP opens the Work priority matrix.\nL opens the Alerts log.\n, opens Settings.",
&"help.verbs.heading": "Player Verbs",
&"help.verbs.body": "Designate - orders pawns to chop trees, mine rocks, dig graves, prevent roofing, or plant new trees.\n\nBuild - queues construction: walls, floors, doors, beds, torches, crates, workbenches, and quarries.\n\nStockpile - paints a zone where items get hauled. Each zone has a filter (which item types) and a priority.\n\nCancel - clears a tool selection or pending designation.",
&"help.priorities.heading": "Work Priorities",
&"help.priorities.body": "Each pawn has priorities (0-4) per work category. The Work matrix grid lets you tune them.\n\n0 = Off. Pawn won't do this work.\n1 = Background. Only if nothing else fits.\n2 = Low.\n3 = Normal (default).\n4 = Urgent. Drops other work to take this.\n\nNeeds (rest, eat, sleep) always run regardless - you can't starve a pawn by setting priorities.",
&"help.storyteller.heading": "Storyteller Events",
&"help.storyteller.body": "Each in-game day at 6 AM the Storyteller may roll an event. Categories include nudges (gentle hints), threats (wolves, raids), wanderers (recruit offers), seasonal beats, disease, resource booms, lore, and milestones.\n\nThreat events auto-pause the sim and show a modal with a choice. Other events show a banner that fades in a few seconds.\n\nThe Storyteller's tension rises and falls based on what happens to your colony - calmer when nothing has happened recently, escalating after kills, damage, or near-misses.",
&"help.tips.heading": "Early-game Tips",
&"help.tips.body": "Build at least one bed and one wall before nightfall - pawns sleep on the ground and grow tired, and wolves come at night.\n\nKeep beds indoors (under a roof). Rain and cold ruin sleep quality.\n\nPaint a stockpile early - items left on the ground decay (corpses, food) or just clutter the map.\n\nWatch tension. If it climbs, slow down and reinforce. The Storyteller is reactive - give it nothing to react to and it stays quiet.\n\nFood priority order: Meal > Bread > Vegetable / Grain / Strawberry > raw Wheat. Cook before eating raw.",
# Phase 19 — Onboarding section in SettingsMenu.
&"ui.settings.section.onboarding": "Onboarding",
&"ui.settings.show_hints": "Show hints (first session)",
&"ui.settings.help": "Help",
&"ui.settings.reset_hints": "Reset hints",
&"ui.settings.hints_reset": "Hint tour reset. Welcome banner will reappear shortly.",
# Phase 19 — Hover tooltips for desktop discoverability.
&"tooltip.pause": "Pause sim (Space)",
&"tooltip.speed_normal": "Normal speed (1)",
&"tooltip.speed_fast": "Fast speed (2)",
&"tooltip.speed_ultra": "Ultra speed (3)",
&"tooltip.save": "Save game",
&"tooltip.load": "Load game",
&"tooltip.settings": "Open Settings (,)",
&"tooltip.build": "Open Build drawer (B)",
&"tooltip.work": "Open Work priorities (P)",
&"tooltip.log": "Open Alerts log (L)",
&"tooltip.fab_build": "Toggle Build drawer (B)",
&"tooltip.tool.chop": "Order pawns to chop selected trees for wood",
&"tooltip.tool.mine": "Order pawns to mine selected rocks for stone / ore",
&"tooltip.tool.dig_grave": "Mark a tile for grave digging",
&"tooltip.tool.no_roof": "Prevent auto-roofing on selected tiles",
&"tooltip.tool.plant_tree": "Plant a sapling (1 wood)",
&"tooltip.tool.build_wall_stone": "Build stone wall",
&"tooltip.tool.build_wall_wood": "Build wood wall",
&"tooltip.tool.build_floor_wood": "Build wood floor",
&"tooltip.tool.build_floor_stone": "Build stone floor",
&"tooltip.tool.build_door": "Build a door",
&"tooltip.tool.build_crate": "Build a storage crate",
&"tooltip.tool.build_bed": "Build a bed",
&"tooltip.tool.build_torch": "Build a torch",
&"tooltip.tool.build_workbench_carpenter": "Build a carpenter's bench",
&"tooltip.tool.build_workbench_smelter": "Build a smelter",
&"tooltip.tool.build_workbench_millstone": "Build a millstone",
&"tooltip.tool.build_workbench_hearth": "Build a hearth",
&"tooltip.tool.build_workbench_cremation_pyre": "Build a cremation pyre",
&"tooltip.tool.paint_quarry": "Paint a quarry on a stone outcrop",
&"tooltip.tool.paint_stockpile": "Paint a stockpile zone",
&"tooltip.tool.graveyard": "Paint a graveyard zone",
}
func t(key: StringName) -> String:
if TABLE.has(key):
return TABLE[key]
push_warning("Strings.t(): missing key %s" % key)
return String(key)