@khorsheed/dsh-game 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.en.md +53 -0
  3. package/README.i18n.yaml +6 -0
  4. package/README.md +52 -2
  5. package/cordis.patch.yml +23 -0
  6. package/lib/client.js +30348 -0
  7. package/lib/index.js +4154 -0
  8. package/lib/typert.host.d.ts +3 -0
  9. package/lib/typert.host.js +3769 -0
  10. package/lib/typert.remote-client.d.ts +101 -0
  11. package/lib/typert.remote-client.js +2082 -0
  12. package/lib/types/agent.d.ts +20 -0
  13. package/lib/types/agent.js +42 -0
  14. package/lib/types/checks.d.ts +44 -0
  15. package/lib/types/checks.js +267 -0
  16. package/lib/types/client/DesignView.d.ts +22 -0
  17. package/lib/types/client/DesignView.js +134 -0
  18. package/lib/types/client/ElementsView.d.ts +21 -0
  19. package/lib/types/client/ElementsView.js +187 -0
  20. package/lib/types/client/GameTab.d.ts +14 -0
  21. package/lib/types/client/GameTab.js +256 -0
  22. package/lib/types/client/PlayFrame.d.ts +54 -0
  23. package/lib/types/client/PlayFrame.js +129 -0
  24. package/lib/types/client/PlayView.d.ts +19 -0
  25. package/lib/types/client/PlayView.js +161 -0
  26. package/lib/types/client/Preview3D.d.ts +50 -0
  27. package/lib/types/client/Preview3D.js +176 -0
  28. package/lib/types/client/ProjectSwitcher.d.ts +20 -0
  29. package/lib/types/client/ProjectSwitcher.js +75 -0
  30. package/lib/types/client/Recipe3DEditor.d.ts +19 -0
  31. package/lib/types/client/Recipe3DEditor.js +44 -0
  32. package/lib/types/client/StyleGallery.d.ts +18 -0
  33. package/lib/types/client/StyleGallery.js +27 -0
  34. package/lib/types/client/TurnCard.d.ts +62 -0
  35. package/lib/types/client/TurnCard.js +100 -0
  36. package/lib/types/client/VersionsView.d.ts +17 -0
  37. package/lib/types/client/VersionsView.js +68 -0
  38. package/lib/types/client/chat-node.d.ts +42 -0
  39. package/lib/types/client/chat-node.js +77 -0
  40. package/lib/types/client/contract.d.ts +125 -0
  41. package/lib/types/client/contract.js +6 -0
  42. package/lib/types/client/definition.d.ts +22 -0
  43. package/lib/types/client/definition.js +28 -0
  44. package/lib/types/client/index.d.ts +21 -0
  45. package/lib/types/client/index.js +229 -0
  46. package/lib/types/client/locales.d.ts +376 -0
  47. package/lib/types/client/locales.js +727 -0
  48. package/lib/types/client/looks.d.ts +36 -0
  49. package/lib/types/client/looks.js +105 -0
  50. package/lib/types/client/markdown.d.ts +11 -0
  51. package/lib/types/client/markdown.js +52 -0
  52. package/lib/types/client/preset-visibility.d.ts +94 -0
  53. package/lib/types/client/preset-visibility.js +115 -0
  54. package/lib/types/client/preview-entry.d.ts +24 -0
  55. package/lib/types/client/preview-entry.js +107 -0
  56. package/lib/types/client/refs.d.ts +36 -0
  57. package/lib/types/client/refs.js +44 -0
  58. package/lib/types/client/style-samples.d.ts +5 -0
  59. package/lib/types/client/style-samples.js +196 -0
  60. package/lib/types/fsutil.d.ts +26 -0
  61. package/lib/types/fsutil.js +104 -0
  62. package/lib/types/hooks.d.ts +83 -0
  63. package/lib/types/hooks.js +108 -0
  64. package/lib/types/index.d.ts +30 -0
  65. package/lib/types/index.js +22 -0
  66. package/lib/types/kits/canvas2d.d.ts +6 -0
  67. package/lib/types/kits/canvas2d.js +60 -0
  68. package/lib/types/kits/ids.d.ts +11 -0
  69. package/lib/types/kits/ids.js +6 -0
  70. package/lib/types/kits/index.d.ts +26 -0
  71. package/lib/types/kits/index.js +28 -0
  72. package/lib/types/kits/three3d.d.ts +12 -0
  73. package/lib/types/kits/three3d.js +188 -0
  74. package/lib/types/kits/types.d.ts +52 -0
  75. package/lib/types/kits/types.js +6 -0
  76. package/lib/types/look3d.d.ts +20 -0
  77. package/lib/types/look3d.js +175 -0
  78. package/lib/types/panel-session.d.ts +21 -0
  79. package/lib/types/panel-session.js +16 -0
  80. package/lib/types/project.d.ts +132 -0
  81. package/lib/types/project.js +494 -0
  82. package/lib/types/remote.d.ts +182 -0
  83. package/lib/types/remote.js +256 -0
  84. package/lib/types/skills.d.ts +13 -0
  85. package/lib/types/skills.js +140 -0
  86. package/lib/types/store.d.ts +325 -0
  87. package/lib/types/store.js +1285 -0
  88. package/lib/types/tools.d.ts +12 -0
  89. package/lib/types/tools.js +301 -0
  90. package/lib/types/trash.d.ts +5 -0
  91. package/lib/types/trash.js +64 -0
  92. package/lib/types/types.d.ts +522 -0
  93. package/lib/types/types.js +85 -0
  94. package/lib/types/vfs.d.ts +92 -0
  95. package/lib/types/vfs.js +217 -0
  96. package/locale/en.json +6 -0
  97. package/locale/zh.json +6 -0
  98. package/package.json +132 -3
  99. package/runtime/dsh3d.js +1279 -0
@@ -0,0 +1,727 @@
1
+ /** `game` namespace dictionaries. */
2
+ /** Simplified Chinese dictionary (the key-set source of truth). */
3
+ export const zh = {
4
+ 'tab.title': '游戏',
5
+ 'guide.title': '游戏开发',
6
+ 'guide.description': '游戏策划操作台:试玩调参、改元素外观、分章节策划、版本与检查',
7
+ 'more': '更多',
8
+ 'refresh': '刷新',
9
+ 'switch': '切换项目',
10
+ 'loading': '加载中…',
11
+ 'error': '读不到游戏状态:{error}',
12
+ 'common.back': '返回',
13
+ 'common.cancel': '取消',
14
+ 'common.save': '保存',
15
+ 'common.close': '关闭',
16
+ 'home.title': '游戏开发',
17
+ 'home.eyebrow': '从一个想法开始',
18
+ 'home.headline': '在左边对话里说说你想做什么游戏',
19
+ 'home.step1': '一页纸',
20
+ 'home.step1d': 'agent 陪你定一句话玩法、几类元素和设计支柱',
21
+ 'home.step2': '选风格',
22
+ 'home.step2d': '在下面看示例挑一种美术风格',
23
+ 'home.step3': '先玩起来',
24
+ 'home.step3d': '最小可玩版本每轮自动检查,过了就出现在「试玩」',
25
+ 'home.start': '帮我起个头',
26
+ 'pick.title': '切换项目',
27
+ 'pick.current': '本会话:{title}',
28
+ 'pick.all': '所有项目({count})',
29
+ 'switcher.new': '新建项目',
30
+ 'switcher.newHint': '在对话里和 agent 定玩法、元素和风格后创建',
31
+ 'switcher.here': '本会话',
32
+ 'switcher.noVersion': '还没有可玩版本',
33
+ 'switcher.elements': '{count} 个元素',
34
+ 'switcher.justNow': '刚刚改过',
35
+ 'switcher.minutes': '{count} 分钟前',
36
+ 'switcher.hours': '{count} 小时前',
37
+ 'switcher.days': '{count} 天前',
38
+ 'draft.newProject': '我想新做一个游戏,先和我定一页纸:问我几个问题,给我几种玩法方向选。',
39
+ 'toast.switched': '已切换项目',
40
+ 'toast.newDrafted': '开场白已写进对话框,发送后 agent 会陪你定一页纸',
41
+ 'pick.existing': '已有项目',
42
+ 'pick.unbind': '本会话不绑定项目',
43
+ 'autoConfirm.label': '自动上线',
44
+ 'autoConfirm.onHint': '通过检查的版本直接进试玩区;关掉后要你点确认',
45
+ 'autoConfirm.offHint': '通过检查的版本先当候选,等你确认或退回',
46
+ 'tabs.label': '游戏面板',
47
+ 'tabs.play': '试玩',
48
+ 'tabs.elements': '元素',
49
+ 'tabs.design': '策划',
50
+ 'tabs.versions': '版本',
51
+ 'meta.version': '线上 v{version}',
52
+ 'meta.noVersion': '还没有可玩版本',
53
+ 'play.live': '线上',
54
+ 'play.candidateShort': '候选',
55
+ 'play.candidateTitle': 'v{version} 等你确认',
56
+ 'play.candidate': '通过了检查,确认后才进试玩区',
57
+ 'play.tryCandidate': '先试玩候选',
58
+ 'play.backToCurrent': '回到线上版',
59
+ 'play.reject': '退回',
60
+ 'play.rejectReason': '哪里不对?(可不填,会一起告诉 agent)',
61
+ 'play.rejectGo': '确定退回',
62
+ 'play.confirm': '确认上线',
63
+ 'play.checkFailed': '最近一轮检查没过,试玩区停在上一版',
64
+ 'play.checkGaveUp': '自动修了 2 次还没过,已停下等你和 agent 商量',
65
+ 'play.seeChecks': '看检查 →',
66
+ 'play.restyling': '换风格已提交:agent 重画后的版本会作为候选等你确认',
67
+ 'play.none': '还没有通过检查的版本。agent 写好 index.html 和测试并发版(或这一轮结束)、检查通过后,就会出现在这里。',
68
+ 'play.noEntry': 'agent 还没写入口 index.html。先在对话里把玩法聊清楚。',
69
+ 'play.loadFailed': '版本文件读不到:{error}',
70
+ 'play.focus': '点一下画面再用键盘',
71
+ 'play.pick': '点选',
72
+ 'play.pickHint': '点画面里的东西,看它是哪个元素',
73
+ 'play.pickNothing': '这里没有元素',
74
+ 'play.pickUnsupported': '这个版本还不支持点选(游戏没提供 dshGame.pick)',
75
+ 'play.openElement': '打开元素',
76
+ 'play.refElement': '引用到对话',
77
+ 'play.restart': '重开',
78
+ 'play.errors': '报错 {count}',
79
+ 'play.clearSaves': '清空这个游戏在本浏览器里的存档',
80
+ 'params.title': '参数',
81
+ 'params.hint': '拖动即时生效',
82
+ 'params.changed': '{count} 项是你的试玩值',
83
+ 'params.reset': '还原',
84
+ 'params.finalize': '定稿',
85
+ 'params.was': '定稿值',
86
+ 'params.none': '这个游戏还没声明可调参数。在对话里说「把速度、刷怪间隔做成可调参数」,下一版就会出现滑块。',
87
+ 'elements.filter': '按类型筛选',
88
+ 'elements.all': '全部',
89
+ 'elements.empty': '还没有元素。元素是 elements/ 下的 JSON 文件,agent 做角色、敌人、道具时会写进去。',
90
+ 'elements.errors': '元素文件有 {count} 个问题',
91
+ 'elements.name': '名称',
92
+ 'elements.open': '打开「{name}」',
93
+ 'elements.proposalsWaiting': '方案待选',
94
+ 'elements.select': '多选后可一起交给 agent',
95
+ 'elements.selectOne': '选择「{name}」',
96
+ 'elements.selected': '已选 {count} 个',
97
+ 'elements.clear': '清空',
98
+ 'elements.toModel': '交给 agent',
99
+ 'elements.back': '全部元素',
100
+ 'look.none': '还没有外观,画面里可能是代码画的或色块。',
101
+ 'look.start': '从空白 16×16 开始画',
102
+ 'look.inGame': '游戏里的大小',
103
+ 'look.idle': '',
104
+ 'look.saving': '保存中…',
105
+ 'look.saved': '已保存',
106
+ 'look.failed': '没存上',
107
+ 'look.states': '状态',
108
+ 'look.tools': '编辑工具',
109
+ 'look.pen': '画笔',
110
+ 'look.recolor': '整体换色',
111
+ 'look.penHint': '选颜色,在格子上点或拖',
112
+ 'look.recolorPick': '先点这个元素用到的一种颜色',
113
+ 'look.recolorTo': '再点要换成的颜色',
114
+ 'look.ownColors': '元素用到的颜色',
115
+ 'look.styleColors': '美术风格调色板',
116
+ 'look.erase': '橡皮(透明)',
117
+ 'look.paletteNote': '颜色来自美术风格,整个游戏因此统一。改动即时生效,攒在输入框上方「面板改动」里,由你决定何时告诉 agent。',
118
+ 'look.askTitle': '让 agent 改外观',
119
+ 'look.askPlaceholder': '比如:更像一团有眼睛的烟,边缘往下飘',
120
+ 'look.askSend': '放进对话',
121
+ 'look.proposalsFor': 'agent 的方案({request})——挑中即生效:',
122
+ 'look.pickThis': '就要这个',
123
+ 'look.model3d': '3D 模型',
124
+ 'look.history': '以前的方案({count} 次)',
125
+ 'look.useAgain': '换回 {label}',
126
+ 'fields.title': '字段',
127
+ 'fields.none': '没有可编辑的字段。',
128
+ 'fields.note': '改完离开输入框即保存;提交成新版本后进游戏。',
129
+ 'design.onePager': '一页纸',
130
+ 'design.style': '风格 · {style}',
131
+ 'design.noPitch': '还没有一句话玩法。',
132
+ 'design.pillars': '设计支柱',
133
+ 'design.noPillars': '还没定支柱:和 agent 聊出 2–3 条「这个游戏一定要做到的体验」。',
134
+ 'design.openPillars': '查看支柱说明',
135
+ 'design.editOnePager': '编辑',
136
+ 'design.pitchLabel': '一句话玩法',
137
+ 'design.typesLabel': '元素类型(用顿号分隔)',
138
+ 'design.pillarsLabel': '设计支柱(每行一条,最多 5 条)',
139
+ 'design.onePagerInvalid': '玩法和元素类型不能为空',
140
+ 'design.pillarNotesHint': '每条支柱为什么重要、怎么检验',
141
+ 'design.collapse': '收起',
142
+ 'design.progress': '{done}/{total} 章定稿',
143
+ 'design.fresh': '刚更新',
144
+ 'design.generated': '自动生成',
145
+ 'design.todo': '未写',
146
+ 'design.draft': '草稿',
147
+ 'design.done': '定稿',
148
+ 'design.empty': '这一章还是空的。在对话里和 agent 聊,它会写进 {file};你也可以直接写。',
149
+ 'design.pillarNotesEmpty': '还没有支柱说明。一页纸里的支柱是标题;这里写每条为什么重要、怎么检验(不用复述一页纸)。',
150
+ 'design.emptyGenerated': '还没有内容,会自动生成。',
151
+ 'design.edit': '直接改',
152
+ 'design.editNote': '保存后以文件为准,并记进「面板改动」',
153
+ 'design.numbersNote': '从 elements/ 里的元素文件生成,改数值请到「元素」或对话里。',
154
+ 'design.chart': '{key} 对比',
155
+ 'style.change': '美术风格',
156
+ 'style.current': '当前',
157
+ 'style.galleryTitle': '美术风格',
158
+ 'style.galleryHint': '先看示例挑一个,点一下会把选择写进对话框(不会直接发送)。',
159
+ 'style.restyleTitle': '换美术风格',
160
+ 'style.restyleHint': '换风格会让 agent 把所有外观按新风格重画;做好的版本一律先当候选,等你确认。',
161
+ 'versions.lastCheck': '最近一次检查',
162
+ 'versions.title': '版本',
163
+ 'versions.none': '还没有版本。',
164
+ 'versions.status.current': '线上',
165
+ 'versions.status.candidate': '候选',
166
+ 'versions.status.rejected': '已退回',
167
+ 'versions.status.past': '历史',
168
+ 'versions.rollback': '切回这一版',
169
+ 'versions.compare': '与 v{version} 对比',
170
+ 'versions.same': '文件完全一样',
171
+ 'versions.export': '导出',
172
+ 'versions.exportCurrent': '导出线上版为单文件',
173
+ 'versions.exportFailed': '导出失败:版本文件读不到',
174
+ 'versions.exportNone': '还没有可导出的版本',
175
+ 'versions.share': '分享',
176
+ 'versions.shareNote': '导出成一个 .html 文件,发给别人双击就能玩(存档留在对方浏览器里)。',
177
+ 'versions.later': '发布到 itch.io、排行榜、联机在后面的版本里做。',
178
+ 'versions.log': '试玩记录',
179
+ 'versions.logEmpty': '还没有记录。',
180
+ 'versions.shotAlt': '检查时无头浏览器里的画面',
181
+ 'versions.shotCaption': '检查跑 2 秒后的画面',
182
+ 'checks.none': '还没跑过检查。每轮结束时,只要项目有改动就会自动检查。',
183
+ 'checks.ok': '检查通过',
184
+ 'checks.fail': '检查未通过',
185
+ 'checks.gaveUp': '自动修复 2 次仍未通过,已停下,等你和 agent 商量',
186
+ 'checks.passed': '{count} 个测试用例通过',
187
+ 'checks.attempt': '第 {attempt} 次自动修复后',
188
+ 'checks.layerData': '数据校验',
189
+ 'checks.layerSmoke': '加载冒烟',
190
+ 'checks.layerTests': '测试脚本',
191
+ 'nudge.picked': '「{name}」换上了方案 {label}',
192
+ 'nudge.finalized': '参数已定稿写进 game.json',
193
+ 'nudge.rejected': '已退回 v{version}',
194
+ 'play.stop': '停止',
195
+ 'play.idleHint': '默认不自动运行,点画面开始',
196
+ 'play.start': '开始试玩 v{version}',
197
+ 'params.tell': '告诉 agent',
198
+ 'params.tellLead': '试玩时我把参数调成了:{list}。感觉:',
199
+ 'turn.title': '本轮改动 · {title}',
200
+ 'turn.openPanel': '打开游戏面板',
201
+ 'turn.see': '查看',
202
+ 'turn.deployed': 'v{version} 已上线',
203
+ 'turn.candidate': 'v{version} 通过检查,等你确认',
204
+ 'turn.checkOk': '检查通过,{passed} 个用例',
205
+ 'turn.fixed': '自动修复 {count} 次',
206
+ 'turn.checkFailed': '检查未通过({count} 项),试玩区仍是上一版',
207
+ 'turn.gaveUp': '自动修复 2 次仍未通过({count} 项),已停下',
208
+ 'turn.elementNew': '新元素「{name}」',
209
+ 'turn.elementLook': '「{name}」换了外观',
210
+ 'turn.elementFields': '「{name}」改了 {fields}',
211
+ 'turn.elementRemoved': '删除了元素 {names}',
212
+ 'turn.chapter': '策划《{title}》有更新',
213
+ 'turn.params': '参数:{list}',
214
+ 'turn.code': '改了 {count} 个代码/资源文件',
215
+ 'turn.tests': '改了 {count} 个测试',
216
+ 'chat.attached': '已附上 {count} 项面板改动',
217
+ 'chat.checkFailed': '检查未通过 {attempt}/{cap}',
218
+ 'chat.fixing': '已交回 agent 在这一轮里修,修好会自动重检。',
219
+ 'chat.lastAttempt': '这是最后一次自动修复;再不过就停下,等你决定。',
220
+ 'chat.other': '游戏面板的消息',
221
+ 'draft.start': '我想做一个小游戏,帮我从一页纸开始:先问我几个问题,给我几种玩法方向选。',
222
+ 'draft.pickStyle': '美术风格选「{label}」。',
223
+ 'draft.restyle': '把美术风格换成「{label}」:所有元素的外观按新风格重画,game.json 的 artStyle 和 palette 一起更新。',
224
+ 'draft.restyleElement': '把元素「{name}」({id}) 的外观改成:{ask}。用 game_propose 给我 3 个看得出差别的方案。',
225
+ 'draft.elementRef': '关于元素「{name}」({id}):',
226
+ 'draft.elementsRef': '关于这些元素:{list}——',
227
+ 'toast.drafted': '已写进对话框,改好再发送',
228
+ 'toast.confirmed': 'v{version} 已上线',
229
+ 'toast.rejected': '已退回,记进了「面板改动」',
230
+ 'toast.finalized': '参数已定稿写进 game.json',
231
+ 'toast.fieldSaved': '{key} 已保存',
232
+ 'toast.picked': '已换上方案 {label}',
233
+ 'toast.chapterSaved': '《{title}》已保存',
234
+ 'toast.restyleDrafted': '换风格请求已写进对话框',
235
+ 'toast.rolledBack': '试玩区已切回 v{version}',
236
+ 'toast.exported': 'v{version} 已导出',
237
+ 'toast.savesCleared': '存档已清空',
238
+ 'toast.autoOn': '已开启自动上线',
239
+ 'toast.autoOff': '已关闭自动上线:之后的版本先当候选',
240
+ 'recipe.base': '身体:{base}',
241
+ 'recipe.proportions': '比例',
242
+ 'recipe.parts': '部件',
243
+ 'recipe.palette': '配色',
244
+ 'recipe.motion': '动效',
245
+ 'look.preview3dEmpty': '还没有能运行的版本,预览要等第一版通过检查',
246
+ 'look.drag3d': '左右拖转动、上下拖调俯仰;改动提交成新版本后进游戏',
247
+ 'play.inserted': '已插入对话框:{label}',
248
+ 'play.pickHover': '{label}',
249
+ 'play.diff': '差异高亮',
250
+ 'play.diffHint': '蓝圈:改过 · 绿圈:新加',
251
+ 'turn.lookBefore': '改前',
252
+ 'turn.lookAfter': '改后',
253
+ 'recipe.key.quadruped': '四足',
254
+ 'recipe.key.bird': '禽',
255
+ 'recipe.key.fish': '鱼',
256
+ 'recipe.key.serpent': '蛇形',
257
+ 'recipe.key.humanoid': '人形',
258
+ 'recipe.key.bodyLength': '身长',
259
+ 'recipe.key.bodyHeight': '身高',
260
+ 'recipe.key.legLength': '腿长',
261
+ 'recipe.key.headSize': '头大小',
262
+ 'recipe.key.snout': '吻长',
263
+ 'recipe.key.legs': '足数',
264
+ 'recipe.key.heads': '头数',
265
+ 'recipe.key.beak': '喙长',
266
+ 'recipe.key.length': '长度',
267
+ 'recipe.key.thickness': '粗细',
268
+ 'recipe.key.segments': '节数',
269
+ 'recipe.key.height': '身高',
270
+ 'recipe.key.ear': '耳',
271
+ 'recipe.key.horn': '角',
272
+ 'recipe.key.tail': '尾',
273
+ 'recipe.key.wing': '翼',
274
+ 'recipe.key.fin': '鳍',
275
+ 'recipe.key.eye': '眼',
276
+ 'recipe.key.face': '面',
277
+ 'recipe.key.count': '数量',
278
+ 'recipe.key.size': '大小',
279
+ 'recipe.key.fan': '展开角',
280
+ 'recipe.key.body': '身体',
281
+ 'recipe.key.accent': '点缀',
282
+ 'recipe.key.belly': '腹部',
283
+ 'recipe.key.skin': '皮肤',
284
+ 'recipe.key.tailSway': '摆尾',
285
+ 'recipe.key.breath': '呼吸',
286
+ 'recipe.key.flap': '扇翅',
287
+ 'recipe.key.swim': '游动',
288
+ 'recipe.key.bob': '浮动',
289
+ 'recipe.key.amplitude': '幅度',
290
+ 'recipe.key.period': '周期(秒)',
291
+ 'recipe.key.scale': '整体大小',
292
+ 'play.ground': '地面',
293
+ 'play.pickedNote': '已插入对话框,接着写想法、自己发送',
294
+ 'switcher.delete': '删除「{title}」',
295
+ 'switcher.deleteTitle': '删除「{title}」?',
296
+ 'switcher.deleteBody': '移到废纸篓:从这里消失、绑定它的会话都解绑,文件夹 {folder} 进系统废纸篓,删错了还能从废纸篓找回。只从列表移除:文件夹原样留着,以后可以让模型用 game_open 的 path 重新登记。',
297
+ 'switcher.deleteTrash': '移到废纸篓',
298
+ 'switcher.deleteForget': '只从列表移除',
299
+ 'switcher.deleteCancel': '取消',
300
+ 'switcher.deletedTrash': '已删除「{title}」,文件夹在废纸篓里',
301
+ 'switcher.deletedForget': '已从列表移除「{title}」,文件夹还在原处',
302
+ 'switcher.deleteTrashFailed': '没能移到废纸篓:{reason}。什么都没改,可以改用「只从列表移除」。',
303
+ 'switcher.deleteNotProject': '这个文件夹里已经不是这个项目了(game.json 不见或换了),不会去动它。可以「只从列表移除」。',
304
+ 'switcher.deleteIsWorkspace': '这个项目就是本会话的工作区本身,不能移到废纸篓。可以「只从列表移除」。',
305
+ 'switcher.deleteDenied': '这个会话是只读的,不能删除项目。',
306
+ 'commit.more': ' 等 {count} 项',
307
+ 'commit.retry': '再试一次',
308
+ 'commit.details': '看详情',
309
+ 'commit.toAgent': '交给 agent 修',
310
+ 'commit.deployed': 'v{version} 已上线,试玩区已换成新版本',
311
+ 'commit.candidate': 'v{version} 已成为候选,在「试玩」里确认上线',
312
+ 'commit.unchanged': '这些修改已经在当前版本里了',
313
+ 'commit.noEntry': '游戏还没有入口(index.html),等 agent 把游戏写出来再提交',
314
+ 'commit.failedToast': '已定稿,但检查没通过,试玩区还是上一版;见顶部的提示',
315
+ 'commit.error': '提交失败:{error}',
316
+ 'draft.commitFailed': '我在面板里改了一些东西,提交成新版本时检查没通过:\n{list}\n帮我看看怎么修。',
317
+ 'lore.title': '设定',
318
+ 'lore.placeholder': '它是谁、从哪来(可以贴《山海经》原文)、什么脾气、遇到玩家会怎样……',
319
+ 'lore.note': '离开输入框即保存。agent 写它的行为和文案时会照着设定来;策划里的「元素设定」会自动汇总。',
320
+ 'look.fineTune': '细调外观(比例、部件、颜色)',
321
+ 'commit.title': '有新改动还没进游戏',
322
+ 'commit.titleFirst': '还没有可玩版本',
323
+ 'commit.summary': '{count} 个文件 · 最近一次 {ago}',
324
+ 'commit.firstSummary': '{count} 个文件 · 检查通过后就会出现在试玩区',
325
+ 'commit.edits': '面板修改:{list}',
326
+ 'commit.showFiles': '查看改动',
327
+ 'commit.hideFiles': '收起',
328
+ 'commit.moreFiles': '另有 {count} 个文件',
329
+ 'commit.go': '检查并发版',
330
+ 'commit.busyTitle': 'agent 还在改',
331
+ 'commit.busyTurn': '这一轮结束时会自动检查,不用你点',
332
+ 'commit.busyRecent': '{file} {ago}改过 · 停下来后就能发版',
333
+ 'commit.checking': '检查中…',
334
+ 'commit.checkingSteps': '数据校验 → 冒烟 2 秒 → 跑测试,通常几秒到二十秒;试玩区照常能玩',
335
+ 'commit.failed': '检查没通过,试玩区还是 v{version}',
336
+ 'commit.failedFirst': '检查没通过,还没有可玩版本',
337
+ 'ago.now': '刚刚',
338
+ 'ago.s': '{n} 秒前',
339
+ 'ago.m': '{n} 分钟前',
340
+ 'ago.h': '{n} 小时前',
341
+ 'versions.by.user': '你发布',
342
+ 'versions.by.agent': 'agent 发布',
343
+ 'versions.by.turn': '回合结束自动',
344
+ 'gltf.file': '模型文件:{src}',
345
+ 'gltf.material': '材质',
346
+ 'gltf.toon': '卡通着色',
347
+ 'gltf.original': '原材质',
348
+ 'gltf.scale': '大小',
349
+ 'gltf.clips': '动画',
350
+ 'look.views': '视角',
351
+ 'look.front': '正面',
352
+ 'look.side': '侧面',
353
+ 'look.back': '背面',
354
+ 'gltf.colors': '颜色(按材质)',
355
+ 'gltf.vertexColors': '顶点色',
356
+ 'gltf.vertexColorsHint': '这个材质用了顶点色:新颜色会和顶点色相乘,可能偏暗',
357
+ 'gltf.reset': '还原',
358
+ 'gltf.morphs': '形态键',
359
+ 'gltf.bones': '骨骼比例',
360
+ 'gltf.boneSearch': '找骨头…',
361
+ 'gltf.rotate': '旋转',
362
+ 'gltf.moreBones': '另有 {count} 根,搜索名字找',
363
+ };
364
+ /** English dictionary. */
365
+ export const en = {
366
+ 'tab.title': 'Game',
367
+ 'guide.title': 'Game dev',
368
+ 'guide.description': 'A game-design workbench: play and tune, edit element looks, the design doc, versions and checks',
369
+ 'more': 'More',
370
+ 'refresh': 'Refresh',
371
+ 'switch': 'Switch project',
372
+ 'loading': 'Loading…',
373
+ 'error': 'Could not read the game state: {error}',
374
+ 'common.back': 'Back',
375
+ 'common.cancel': 'Cancel',
376
+ 'common.save': 'Save',
377
+ 'common.close': 'Close',
378
+ 'home.title': 'Game dev',
379
+ 'home.eyebrow': 'Start from an idea',
380
+ 'home.headline': 'Tell the agent what game you want to make',
381
+ 'home.step1': 'One-pager',
382
+ 'home.step1d': 'settle a one-line pitch, element kinds and design pillars with the agent',
383
+ 'home.step2': 'Pick a style',
384
+ 'home.step2d': 'choose an art style from the examples below',
385
+ 'home.step3': 'Play early',
386
+ 'home.step3d': 'each turn is checked; a passing version shows up under Play',
387
+ 'home.start': 'Get me started',
388
+ 'pick.title': 'Switch project',
389
+ 'pick.current': 'This session: {title}',
390
+ 'pick.all': 'All projects ({count})',
391
+ 'switcher.new': 'New project',
392
+ 'switcher.newHint': 'Settle the pitch, elements and style with the agent, then it creates the project',
393
+ 'switcher.here': 'This session',
394
+ 'switcher.noVersion': 'No playable version',
395
+ 'switcher.elements': '{count} elements',
396
+ 'switcher.justNow': 'just now',
397
+ 'switcher.minutes': '{count} min ago',
398
+ 'switcher.hours': '{count} h ago',
399
+ 'switcher.days': '{count} d ago',
400
+ 'draft.newProject': 'I want to start a new game. Begin with a one-pager: ask me a few questions and give me some directions to choose from.',
401
+ 'toast.switched': 'Project switched',
402
+ 'toast.newDrafted': 'Opener written into the composer — send it and the agent starts the one-pager with you',
403
+ 'pick.existing': 'Projects',
404
+ 'pick.unbind': 'No project for this session',
405
+ 'autoConfirm.label': 'Auto-deploy',
406
+ 'autoConfirm.onHint': 'Passing versions go straight to the play area; turn off to confirm each one',
407
+ 'autoConfirm.offHint': 'Passing versions wait as candidates for your confirm or reject',
408
+ 'tabs.label': 'Game panel',
409
+ 'tabs.play': 'Play',
410
+ 'tabs.elements': 'Elements',
411
+ 'tabs.design': 'Design',
412
+ 'tabs.versions': 'Versions',
413
+ 'meta.version': 'live v{version}',
414
+ 'meta.noVersion': 'No playable version yet',
415
+ 'play.live': 'Live',
416
+ 'play.candidateShort': 'Candidate',
417
+ 'play.candidateTitle': 'v{version} waits for you',
418
+ 'play.candidate': 'It passed the checks; confirm to put it in the play area',
419
+ 'play.tryCandidate': 'Try the candidate',
420
+ 'play.backToCurrent': 'Back to live',
421
+ 'play.reject': 'Reject',
422
+ 'play.rejectReason': 'What is wrong? (optional, passed on to the agent)',
423
+ 'play.rejectGo': 'Reject it',
424
+ 'play.confirm': 'Confirm',
425
+ 'play.checkFailed': 'The last turn failed its checks; the play area stays on the previous version',
426
+ 'play.checkGaveUp': 'Still failing after 2 automatic fixes — stopped for you and the agent',
427
+ 'play.seeChecks': 'See checks →',
428
+ 'play.restyling': 'Restyle requested: the redrawn version will wait as a candidate',
429
+ 'play.none': 'No version has passed the checks yet. Once the agent writes index.html and tests and publishes (or a turn ends) green, it appears here.',
430
+ 'play.noEntry': 'The agent has not written index.html yet. Talk the gameplay through first.',
431
+ 'play.loadFailed': 'Could not read the version files: {error}',
432
+ 'play.focus': 'Click the game before using the keyboard',
433
+ 'play.pick': 'Pick',
434
+ 'play.pickHint': 'Click something in the game to see which element it is',
435
+ 'play.pickNothing': 'No element there',
436
+ 'play.pickUnsupported': 'This version does not support picking (no dshGame.pick)',
437
+ 'play.openElement': 'Open element',
438
+ 'play.refElement': 'Quote in chat',
439
+ 'play.restart': 'Restart',
440
+ 'play.errors': '{count} errors',
441
+ 'play.clearSaves': 'Clear this game\'s saves in this browser',
442
+ 'params.title': 'Parameters',
443
+ 'params.hint': 'Changes apply at once',
444
+ 'params.changed': '{count} are your trial values',
445
+ 'params.reset': 'Reset',
446
+ 'params.finalize': 'Finalize',
447
+ 'params.was': 'Finalized value',
448
+ 'params.none': 'This game declares no tunable parameters yet. Ask the agent to "make speed and spawn rate tunable" and sliders appear next version.',
449
+ 'elements.filter': 'Filter by type',
450
+ 'elements.all': 'All',
451
+ 'elements.empty': 'No elements yet. Elements are JSON files under elements/; the agent writes them as it makes characters, enemies and items.',
452
+ 'elements.errors': '{count} problems in element files',
453
+ 'elements.name': 'Name',
454
+ 'elements.open': 'Open “{name}”',
455
+ 'elements.proposalsWaiting': 'Options waiting',
456
+ 'elements.select': 'Select several to hand to the agent',
457
+ 'elements.selectOne': 'Select “{name}”',
458
+ 'elements.selected': '{count} selected',
459
+ 'elements.clear': 'Clear',
460
+ 'elements.toModel': 'Hand to agent',
461
+ 'elements.back': 'All elements',
462
+ 'look.none': 'No look yet — the game may draw it in code or as a block.',
463
+ 'look.start': 'Start a blank 16×16',
464
+ 'look.inGame': 'In-game size',
465
+ 'look.idle': '',
466
+ 'look.saving': 'Saving…',
467
+ 'look.saved': 'Saved',
468
+ 'look.failed': 'Not saved',
469
+ 'look.states': 'States',
470
+ 'look.tools': 'Edit tools',
471
+ 'look.pen': 'Pen',
472
+ 'look.recolor': 'Recolor',
473
+ 'look.penHint': 'Pick a color, click or drag on the grid',
474
+ 'look.recolorPick': 'Click one of the colors this element uses',
475
+ 'look.recolorTo': 'Then click the color to swap in',
476
+ 'look.ownColors': 'Colors this element uses',
477
+ 'look.styleColors': 'Art-style palette',
478
+ 'look.erase': 'Eraser (transparent)',
479
+ 'look.paletteNote': 'Colors come from the art style, so the whole game stays consistent. Edits apply at once and collect under "Panel changes" above the composer until you tell the agent.',
480
+ 'look.askTitle': 'Ask the agent for a new look',
481
+ 'look.askPlaceholder': 'e.g. more like a puff of smoke with eyes, edges drifting down',
482
+ 'look.askSend': 'Put in chat',
483
+ 'look.proposalsFor': 'The agent\'s options ({request}) — picking applies it:',
484
+ 'look.pickThis': 'This one',
485
+ 'look.model3d': '3D model',
486
+ 'look.history': 'Earlier options ({count})',
487
+ 'look.useAgain': 'Use {label} again',
488
+ 'fields.title': 'Fields',
489
+ 'fields.none': 'No editable fields.',
490
+ 'fields.note': 'Saved when you leave the box; reaches the game once you commit it as a new version.',
491
+ 'design.onePager': 'One-pager',
492
+ 'design.style': 'Style · {style}',
493
+ 'design.noPitch': 'No pitch yet.',
494
+ 'design.pillars': 'Design pillars',
495
+ 'design.noPillars': 'No pillars yet: find 2–3 experiences this game must deliver with the agent.',
496
+ 'design.openPillars': 'Read the pillar notes',
497
+ 'design.editOnePager': 'Edit',
498
+ 'design.pitchLabel': 'One-line pitch',
499
+ 'design.typesLabel': 'Element types (separated by 、)',
500
+ 'design.pillarsLabel': 'Design pillars (one per line, up to 5)',
501
+ 'design.onePagerInvalid': 'The pitch and element types cannot be empty',
502
+ 'design.pillarNotesHint': 'why each pillar matters, how to test it',
503
+ 'design.collapse': 'Collapse',
504
+ 'design.progress': '{done}/{total} chapters final',
505
+ 'design.fresh': 'Updated',
506
+ 'design.generated': 'Generated',
507
+ 'design.todo': 'Empty',
508
+ 'design.draft': 'Draft',
509
+ 'design.done': 'Final',
510
+ 'design.empty': 'Empty so far. Talk it through with the agent; it writes into {file} — or write it yourself.',
511
+ 'design.pillarNotesEmpty': 'No pillar notes yet. The one-pager holds the pillars; write here why each matters and how to test it (no need to restate the one-pager).',
512
+ 'design.emptyGenerated': 'Nothing yet; generated automatically.',
513
+ 'design.edit': 'Edit',
514
+ 'design.editNote': 'The file wins once saved; listed under "Panel changes"',
515
+ 'design.numbersNote': 'Generated from the element files; change numbers under Elements or in chat.',
516
+ 'design.chart': '{key} compared',
517
+ 'style.change': 'Art style',
518
+ 'style.current': 'Current',
519
+ 'style.galleryTitle': 'Art style',
520
+ 'style.galleryHint': 'Pick one by looking; a click writes the choice into the composer (not sent).',
521
+ 'style.restyleTitle': 'Change the art style',
522
+ 'style.restyleHint': 'A restyle redraws every look; the result always waits as a candidate for your confirm.',
523
+ 'versions.lastCheck': 'Last check',
524
+ 'versions.title': 'Versions',
525
+ 'versions.none': 'No versions yet.',
526
+ 'versions.status.current': 'Live',
527
+ 'versions.status.candidate': 'Candidate',
528
+ 'versions.status.rejected': 'Rejected',
529
+ 'versions.status.past': 'Past',
530
+ 'versions.rollback': 'Switch back to this',
531
+ 'versions.compare': 'Compare with v{version}',
532
+ 'versions.same': 'Identical files',
533
+ 'versions.export': 'Export',
534
+ 'versions.exportCurrent': 'Export the live version as one file',
535
+ 'versions.exportFailed': 'Export failed: version files unreadable',
536
+ 'versions.exportNone': 'No version to export yet',
537
+ 'versions.share': 'Share',
538
+ 'versions.shareNote': 'Exports one .html file anyone can open to play (saves stay in their browser).',
539
+ 'versions.later': 'Publishing to itch.io, leaderboards and multiplayer come later.',
540
+ 'versions.log': 'Playtest log',
541
+ 'versions.logEmpty': 'Nothing logged yet.',
542
+ 'versions.shotAlt': 'The game in the headless check',
543
+ 'versions.shotCaption': 'After 2 seconds of the check run',
544
+ 'checks.none': 'No check has run yet. Every turn that changes the project ends with one.',
545
+ 'checks.ok': 'Checks passed',
546
+ 'checks.fail': 'Checks failed',
547
+ 'checks.gaveUp': 'Still failing after 2 automatic fixes — stopped; talk it over with the agent',
548
+ 'checks.passed': '{count} test cases passed',
549
+ 'checks.attempt': 'after automatic fix {attempt}',
550
+ 'checks.layerData': 'Data',
551
+ 'checks.layerSmoke': 'Smoke run',
552
+ 'checks.layerTests': 'Test scripts',
553
+ 'nudge.picked': '“{name}” now uses option {label}',
554
+ 'nudge.finalized': 'Parameters finalized into game.json',
555
+ 'nudge.rejected': 'Rejected v{version}',
556
+ 'play.stop': 'Stop',
557
+ 'play.idleHint': 'Not running until you start it',
558
+ 'play.start': 'Play v{version}',
559
+ 'params.tell': 'Tell the agent',
560
+ 'params.tellLead': 'While playing I set the parameters to: {list}. It felt: ',
561
+ 'turn.title': 'This turn · {title}',
562
+ 'turn.openPanel': 'Open game panel',
563
+ 'turn.see': 'View',
564
+ 'turn.deployed': 'v{version} is live',
565
+ 'turn.candidate': 'v{version} passed and waits for you',
566
+ 'turn.checkOk': 'checks passed, {passed} cases',
567
+ 'turn.fixed': '{count} automatic fixes',
568
+ 'turn.checkFailed': 'Checks failed ({count}); the play area keeps the previous version',
569
+ 'turn.gaveUp': 'Still failing after 2 automatic fixes ({count}); stopped',
570
+ 'turn.elementNew': 'New element “{name}”',
571
+ 'turn.elementLook': '“{name}” got a new look',
572
+ 'turn.elementFields': '“{name}”: {fields} changed',
573
+ 'turn.elementRemoved': 'Removed {names}',
574
+ 'turn.chapter': 'Design “{title}” updated',
575
+ 'turn.params': 'Parameters: {list}',
576
+ 'turn.code': '{count} code/asset files changed',
577
+ 'turn.tests': '{count} tests changed',
578
+ 'chat.attached': 'Attached {count} panel changes',
579
+ 'chat.checkFailed': 'Checks failed {attempt}/{cap}',
580
+ 'chat.fixing': 'Handed back to the agent to fix in this turn; it is rechecked automatically.',
581
+ 'chat.lastAttempt': 'This is the last automatic fix; after that it stops for you to decide.',
582
+ 'chat.other': 'Game panel message',
583
+ 'draft.start': 'I want to make a small game. Start me on a one-pager: ask me a few questions and give me some directions to choose from.',
584
+ 'draft.pickStyle': 'Art style: “{label}”.',
585
+ 'draft.restyle': 'Change the art style to “{label}”: redraw every element\'s look in the new style and update artStyle and palette in game.json.',
586
+ 'draft.restyleElement': 'Change the look of element “{name}” ({id}) to: {ask}. Give me 3 clearly different options with game_propose.',
587
+ 'draft.elementRef': 'About element “{name}” ({id}): ',
588
+ 'draft.elementsRef': 'About these elements: {list} — ',
589
+ 'toast.drafted': 'Written into the composer — edit, then send',
590
+ 'toast.confirmed': 'v{version} is live',
591
+ 'toast.rejected': 'Rejected; listed under "Panel changes"',
592
+ 'toast.finalized': 'Parameters finalized into game.json',
593
+ 'toast.fieldSaved': '{key} saved',
594
+ 'toast.picked': 'Option {label} applied',
595
+ 'toast.chapterSaved': '“{title}” saved',
596
+ 'toast.restyleDrafted': 'Restyle request written into the composer',
597
+ 'toast.rolledBack': 'Play area switched back to v{version}',
598
+ 'toast.exported': 'v{version} exported',
599
+ 'toast.savesCleared': 'Saves cleared',
600
+ 'toast.autoOn': 'Auto-deploy on',
601
+ 'toast.autoOff': 'Auto-deploy off: new versions wait as candidates',
602
+ 'recipe.base': 'Body: {base}',
603
+ 'recipe.proportions': 'Proportions',
604
+ 'recipe.parts': 'Parts',
605
+ 'recipe.palette': 'Colors',
606
+ 'recipe.motion': 'Motion',
607
+ 'look.preview3dEmpty': 'No runnable version yet — the preview waits for the first passing version',
608
+ 'look.drag3d': 'Drag sideways to turn, up and down to tilt; edits reach the game once you commit them',
609
+ 'play.inserted': 'Added to the composer: {label}',
610
+ 'play.pickHover': '{label}',
611
+ 'play.diff': 'Show changes',
612
+ 'play.diffHint': 'Blue: changed · Green: new',
613
+ 'turn.lookBefore': 'Before',
614
+ 'turn.lookAfter': 'After',
615
+ 'recipe.key.quadruped': "Quadruped",
616
+ 'recipe.key.bird': "Bird",
617
+ 'recipe.key.fish': "Fish",
618
+ 'recipe.key.serpent': "Serpent",
619
+ 'recipe.key.humanoid': "Humanoid",
620
+ 'recipe.key.bodyLength': "Body length",
621
+ 'recipe.key.bodyHeight': "Body height",
622
+ 'recipe.key.legLength': "Leg length",
623
+ 'recipe.key.headSize': "Head size",
624
+ 'recipe.key.snout': "Snout",
625
+ 'recipe.key.legs': "Legs",
626
+ 'recipe.key.heads': "Heads",
627
+ 'recipe.key.beak': "Beak",
628
+ 'recipe.key.length': "Length",
629
+ 'recipe.key.thickness': "Thickness",
630
+ 'recipe.key.segments': "Segments",
631
+ 'recipe.key.height': "Height",
632
+ 'recipe.key.ear': "Ears",
633
+ 'recipe.key.horn': "Horns",
634
+ 'recipe.key.tail': "Tails",
635
+ 'recipe.key.wing': "Wings",
636
+ 'recipe.key.fin': "Fins",
637
+ 'recipe.key.eye': "Eyes",
638
+ 'recipe.key.face': "Face",
639
+ 'recipe.key.count': "Count",
640
+ 'recipe.key.size': "Size",
641
+ 'recipe.key.fan': "Spread",
642
+ 'recipe.key.body': "Body",
643
+ 'recipe.key.accent': "Accent",
644
+ 'recipe.key.belly': "Belly",
645
+ 'recipe.key.skin': "Skin",
646
+ 'recipe.key.tailSway': "Tail sway",
647
+ 'recipe.key.breath': "Breathing",
648
+ 'recipe.key.flap': "Flapping",
649
+ 'recipe.key.swim': "Swimming",
650
+ 'recipe.key.bob': "Bobbing",
651
+ 'recipe.key.amplitude': "Amplitude",
652
+ 'recipe.key.period': "Period (s)",
653
+ 'recipe.key.scale': "Overall size",
654
+ 'play.ground': 'Ground',
655
+ 'play.pickedNote': 'Added to the composer — write what you think and send it yourself',
656
+ 'switcher.delete': 'Delete “{title}”',
657
+ 'switcher.deleteTitle': 'Delete “{title}”?',
658
+ 'switcher.deleteBody': 'Move to trash: it disappears here, sessions bound to it are unbound, and the folder {folder} goes to the system trash, where you can still recover it. Remove from list only: the folder stays as it is; the model can register it again later with game_open path.',
659
+ 'switcher.deleteTrash': 'Move to trash',
660
+ 'switcher.deleteForget': 'Remove from list only',
661
+ 'switcher.deleteCancel': 'Cancel',
662
+ 'switcher.deletedTrash': 'Deleted “{title}” — the folder is in the trash',
663
+ 'switcher.deletedForget': 'Removed “{title}” from the list — the folder is still there',
664
+ 'switcher.deleteTrashFailed': 'Could not move it to the trash: {reason}. Nothing changed; you can remove it from the list instead.',
665
+ 'switcher.deleteNotProject': 'That folder no longer holds this project (its game.json is gone or different), so it is left alone. You can remove it from the list.',
666
+ 'switcher.deleteIsWorkspace': 'This project is the session’s workspace itself and cannot go to the trash. You can remove it from the list.',
667
+ 'switcher.deleteDenied': 'This session is read-only and cannot delete projects.',
668
+ 'commit.more': ' and {count} more',
669
+ 'commit.retry': 'Try again',
670
+ 'commit.details': 'Details',
671
+ 'commit.toAgent': 'Ask the agent to fix',
672
+ 'commit.deployed': 'v{version} is live; the play area now runs it',
673
+ 'commit.candidate': 'v{version} is a candidate; confirm it under Play',
674
+ 'commit.unchanged': 'These edits are already in the current version',
675
+ 'commit.noEntry': 'The game has no entry (index.html) yet; commit once the agent has written it',
676
+ 'commit.failedToast': 'Finalized, but the checks failed; the play area keeps the previous version (see the bar at the top)',
677
+ 'commit.error': 'Commit failed: {error}',
678
+ 'draft.commitFailed': 'I edited a few things in the panel, and committing them as a new version failed the checks:\n{list}\nPlease help me fix it.',
679
+ 'lore.title': 'Lore',
680
+ 'lore.placeholder': 'Who it is, where it comes from (paste the source text), its temper, how it meets the player…',
681
+ 'lore.note': 'Saved when you leave the box. The agent follows it for the element\'s behavior and wording; the design doc\'s 元素设定 chapter collects every element\'s lore.',
682
+ 'look.fineTune': 'Fine-tune the look (proportions, parts, colors)',
683
+ 'commit.title': 'New changes are not in the game yet',
684
+ 'commit.titleFirst': 'No playable version yet',
685
+ 'commit.summary': '{count} files · last change {ago}',
686
+ 'commit.firstSummary': '{count} files · appears in the play area once the checks pass',
687
+ 'commit.edits': 'panel edits: {list}',
688
+ 'commit.showFiles': 'Show changes',
689
+ 'commit.hideFiles': 'Hide',
690
+ 'commit.moreFiles': '{count} more files',
691
+ 'commit.go': 'Check and publish',
692
+ 'commit.busyTitle': 'The agent is still writing',
693
+ 'commit.busyTurn': 'The checks run on their own when this turn ends',
694
+ 'commit.busyRecent': '{file} changed {ago} · publish once it settles',
695
+ 'commit.checking': 'Checking…',
696
+ 'commit.checkingSteps': 'Data → 2-second smoke run → tests, usually a few seconds to twenty; the play area keeps running',
697
+ 'commit.failed': 'The checks failed; the play area keeps v{version}',
698
+ 'commit.failedFirst': 'The checks failed; no playable version yet',
699
+ 'ago.now': 'just now',
700
+ 'ago.s': '{n} s ago',
701
+ 'ago.m': '{n} min ago',
702
+ 'ago.h': '{n} h ago',
703
+ 'versions.by.user': 'Published by you',
704
+ 'versions.by.agent': 'Published by the agent',
705
+ 'versions.by.turn': 'Auto at turn end',
706
+ 'gltf.file': 'Model file: {src}',
707
+ 'gltf.material': 'Material',
708
+ 'gltf.toon': 'Toon shading',
709
+ 'gltf.original': 'Its own materials',
710
+ 'gltf.scale': 'Size',
711
+ 'gltf.clips': 'Animations',
712
+ 'look.views': 'View',
713
+ 'look.front': 'Front',
714
+ 'look.side': 'Side',
715
+ 'look.back': 'Back',
716
+ 'gltf.colors': 'Colors (by material)',
717
+ 'gltf.vertexColors': 'vertex colors',
718
+ 'gltf.vertexColorsHint': 'This material uses vertex colors: the new color multiplies them and may look darker',
719
+ 'gltf.reset': 'Reset',
720
+ 'gltf.morphs': 'Shape keys',
721
+ 'gltf.bones': 'Bone sizes',
722
+ 'gltf.boneSearch': 'Find a bone…',
723
+ 'gltf.rotate': 'Rotation',
724
+ 'gltf.moreBones': '{count} more; search by name',
725
+ };
726
+ /** The dictionary namespace this view binds. */
727
+ export const NS = 'game';