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 19 — smelted ingots &"item.iron_ingot": "Iron ingot", &"item.gold_ingot": "Gold ingot", # 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 hyenas 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": "Hyenas at the Edge", &"event.wolves_at_the_edge.body": "Hyenas howl in the distance. They will be here by nightfall.", &"event.lone_wolf.title": "Lone Hyena", &"event.lone_wolf.body": "A starving hyena 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", &"ui.build_drawer.section.farm": "Farm", &"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": "Hyenas on map", &"ui.day_summary.tension": "Tension", &"ui.day_summary.tension_fmt": "{t} / 100", # Weather labels (weather.) &"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 (hyenas, 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 hyenas 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", # Crop zone paint tools (no seed cost — pawns sow when free). &"tool.paint_crop_wheat": "Wheat field", &"tool.paint_crop_potato": "Potato field", &"tool.paint_crop_corn": "Corn field", &"tool.paint_crop_strawberry": "Berry patch", &"tooltip.tool.paint_crop_wheat": "Paint a wheat field. Pawns will sow when free.", &"tooltip.tool.paint_crop_potato": "Paint a potato field. Pawns will sow when free.", &"tooltip.tool.paint_crop_corn": "Paint a corn field. Pawns will sow when free.", &"tooltip.tool.paint_crop_strawberry": "Paint a strawberry patch. Pawns will sow when free.", } func t(key: StringName) -> String: if TABLE.has(key): return TABLE[key] push_warning("Strings.t(): missing key %s" % key) return String(key)