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>
337 lines
20 KiB
GDScript
337 lines
20 KiB
GDScript
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)
|