Compare commits

...
4 Commits
Author SHA1 Message Date
cthangover 307da15a12 Add mod documentation in seven languages 2026-10-29 09:26:23 +01:00
iisaev 90ce5fad8c gitignore file 2026-10-28 15:20:06 +03:00
cthangover fceeee6f32 Add shared syntax highlighting for source text fields 2026-10-26 19:44:25 +03:00
cthangover 445f7d5e61 Localization in es, zh, ja, ko, vi 2026-10-23 20:54:54 +02:00
30 changed files with 1948 additions and 8 deletions

No files matched your search

+1
View File
@@ -12,6 +12,7 @@ obj/
gen/ gen/
obj/ obj/
bin/ bin/
art_sources/
*.tres~ *.tres~
*.tscn~ *.tscn~
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

+71
View File
@@ -0,0 +1,71 @@
# UI — the shared interface of every game
UI is the interface layer that the games share: the toolbar in the top-right corner, the in-game menu, the save indicator, notifications in the top-left corner, the background view and the common look of panels, buttons and lists. It has no story or rules of its own. Almost every other mod builds on it, which is why it is in every game and why so many mods list it as a requirement.
![A scene in Cthangover at noon: the clock at the top left, the toolbar at the top right, the scene's choices on the right.](assets/scene-hud.jpg)
## The toolbar
Each icon opens a panel. The buttons are not fixed: every mod in the game adds its own, so a novel without items has no bag, and a game with the Scenario Studio has one more icon.
![The Cthangover toolbar: tools, map, bag, characters, recruits, skills, menu (gear) and journal.](assets/toolbar.png)
In Cthangover, from left to right:
1. **Tools** — the developer tools menu (only when editors are in the game).
2. **Map** — world map (Map Engine).
3. **Bag** — inventory (Items).
4. **Characters** — party and characters (Characters).
5. **Recruits** — recruited characters (Recruiting).
6. **Skills** — skills (Skills).
7. **Menu** — the in-game menu described below (this mod).
8. **Journal** — quests (Quests).
Other games show other sets; RPG Plus, for example, adds the **character sheet**.
## The in-game menu
The gear icon opens the menu: **Resume**, **Save**, **Load**, **Settings**, **Main menu** and **Exit**. Save is greyed out in scenes that do not allow saving, as in this picture. Load, Save and Settings open the same windows as in the main menu.
![The in-game menu over a scene: Menu, Resume, Save, Load, Settings, Main menu, Exit.](assets/game-menu.jpg)
## Notifications
Short messages appear in the top-left corner: a new journal entry, a hint from the story. Up to four are shown at once, each for about ten seconds; more wait their turn.
![A notification under the clock: "Look around. Something is lying in the alley." — a hint from Cthangover's prologue.](assets/notification.png)
## For mod authors
**Add a toolbar button and its panel** with a `ui` entry in your manifest. This is how Items adds the bag:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` orders the icons (map 10, bag 20, characters 30, skills 40, menu 50, journal 60, studio 90);
- `button.icon` is the icon's name, `button.locale` the tooltip's translation key;
- an entry without `button` is a panel or overlay that the game opens itself — Crafting adds its workbench as `"kind": "overlay"` in the `ModLastPanel` slot and opens it from scenarios.
**Open a panel from a scenario** with the `ui.toggle_panel` action, and **show a notification** with the `notify` command:
```scenario
notify "The journal has a new entry."
```
**Use the common look.** Panels built in code take their frames, labels, chips and buttons from the toolkit (`UiKit`) and its colour and size tokens, so a new panel matches the rest of the game and follows its theme.
## If something goes wrong
1. **A toolbar button is missing.** The mod that adds it is not part of this game; check the game's scheme in **Mods & Collections**.
2. **Save is greyed out.** The current scene does not allow saving; move to another place and try again. Authors allow it with `save_allowed: true` in the header of one of the scene's scenarios.
3. **A panel opens but is empty.** The panel's mod has nothing to show yet in this game — for example, no quests have started.
+71
View File
@@ -0,0 +1,71 @@
# UI — la interfaz común de todos los juegos
UI es la capa de interfaz que comparten todos los juegos: la barra de herramientas en la esquina superior derecha, el menú del juego, el indicador de guardado, las notificaciones en la esquina superior izquierda, la vista del fondo y el aspecto común de paneles, botones y listas. No tiene historia ni reglas propias. Casi todos los demás mods se construyen sobre ella, y por eso está presente en todos los juegos y tantos mods la declaran como dependencia.
![Una escena de Cthangover al mediodía: el reloj arriba a la izquierda, la barra de herramientas arriba a la derecha y las opciones de la escena a la derecha.](assets/scene-hud.jpg)
## La barra de herramientas
Cada icono abre su panel. Los botones no son fijos: cada mod del juego añade los suyos, así que una novela sin objetos no tiene bolsa, y un juego con Scenario Studio muestra un icono más.
![La barra de herramientas de Cthangover: herramientas, mapa, bolsa, personajes, reclutas, habilidades, menú (engranaje) y diario.](assets/toolbar.png)
En Cthangover, de izquierda a derecha:
1. **Herramientas** — el menú de herramientas de desarrollo (solo cuando hay editores en el juego).
2. **Mapa** — el mapa del mundo (Map Engine).
3. **Bolsa** — el inventario (Items).
4. **Personajes** — el grupo y los personajes (Characters).
5. **Reclutas** — los personajes reclutados (Recruiting).
6. **Habilidades** — las habilidades (Skills).
7. **Menú** — el menú del juego, descrito más abajo (este mod).
8. **Diario** — las misiones (Quests).
Otros juegos muestran otros conjuntos; RPG Plus, por ejemplo, añade la **hoja de personaje**.
## El menú del juego
El icono del engranaje abre el menú: **Continuar**, **Guardar**, **Cargar**, **Ajustes**, **Menú principal** y **Salir**. En las escenas que no permiten guardar, la opción Guardar aparece deshabilitada, como en la imagen. Cargar, Guardar y Ajustes abren las mismas ventanas que en el menú principal.
![El menú del juego sobre una escena: Menu, Resume, Save, Load, Settings, Main menu, Exit.](assets/game-menu.jpg)
## Notificaciones
En la esquina superior izquierda aparecen mensajes breves: una entrada nueva del diario, una pista de la historia. Se ven hasta cuatro a la vez, cada uno unos diez segundos; los demás esperan su turno.
![Una notificación bajo el reloj: «Mira a tu alrededor. Hay algo tirado en el callejón.» — una pista del prólogo de Cthangover.](assets/notification.png)
## Para autores de mods
**Añadir un botón a la barra de herramientas con su panel** se hace con una entrada `ui` en el manifiesto. Así añade Items la bolsa:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` ordena los iconos (mapa 10, bolsa 20, personajes 30, habilidades 40, menú 50, diario 60, estudio 90);
- `button.icon` es el nombre del icono y `button.locale`, la clave de traducción del tooltip;
- una entrada sin `button` es un panel o una capa superpuesta que el juego abre por su cuenta: Crafting añade su mesa de trabajo como `"kind": "overlay"` en el slot `ModLastPanel` y la abre desde los escenarios.
**Abrir un panel desde un escenario** se hace con la acción `ui.toggle_panel`, y **mostrar una notificación**, con el comando `notify`:
```scenario
notify "Nueva entrada en el diario."
```
**Usa el aspecto común.** Los paneles creados en código toman sus marcos, etiquetas, chips y botones del kit de interfaz (`UiKit`) y de sus tokens de color y tamaño, así que un panel nuevo encaja con el resto del juego y sigue su tema.
## Si algo falla
1. **Falta un botón en la barra de herramientas.** El mod que lo añade no forma parte de este juego; revisa el esquema del juego en **Mods y colecciones**.
2. **Guardar aparece deshabilitado.** La escena actual no permite guardar; ve a otro sitio e inténtalo de nuevo. Los autores lo permiten con `save_allowed: true` en la cabecera de uno de los escenarios de la escena.
3. **Un panel se abre vacío.** Su mod todavía no tiene nada que mostrar en este juego; por ejemplo, aún no ha empezado ninguna misión.
+71
View File
@@ -0,0 +1,71 @@
# UI — すべてのゲームで共有されるインターフェース
UI は全ゲームが共有するインターフェース層です。右上のツールバー、ゲーム内メニュー、セーブインジケーター、左上の通知、背景の表示、そしてパネル・ボタン・リストの共通デザインがここに集まっています。UI 自体は物語もルールも持ちません。ほぼすべての他の MOD が UI の上に成り立っているため、どのゲームにも含まれており、依存関係に挙げる MOD も非常に多くなっています。
![Cthangover の正午のシーン:左上に時計、右上にツールバー、右側にシーンの選択肢。](assets/scene-hud.jpg)
## ツールバー
アイコンごとにパネルが開きます。ボタンは固定ではなく、ゲームに含まれる各 MOD が自分のボタンを追加します。そのため、アイテムのないノベルにはインベントリのボタンがなく、Scenario Studio を含むゲームではアイコンが一つ増えます。
![Cthangover のツールバー:ツール、マップ、インベントリ、キャラクター、勧誘した者たち、スキル、メニュー(歯車)、日誌。](assets/toolbar.png)
Cthangover では左から順に:
1. **ツール** — 開発者ツールのメニュー(エディターがゲームに含まれているときだけ)。
2. **マップ** — ワールドマップ(Map Engine)。
3. **インベントリ** — 所持品(Items)。
4. **キャラクター** — パーティとキャラクター(Characters)。
5. **勧誘した者たち** — 勧誘で仲間にしたキャラクター(Recruiting)。
6. **スキル** — スキル(Skills)。
7. **メニュー** — 後述のゲーム内メニュー(この MOD)。
8. **日誌** — クエスト(Quests)。
他のゲームでは並びが異なります。たとえば RPG Plus は**キャラクターシート**を追加します。
## ゲーム内メニュー
歯車のアイコンでメニューが開きます:**再開**、**セーブ**、**ロード**、**設定**、**メインメニュー**、**終了**。セーブが許可されていないシーンでは、画像のように「セーブ」がグレーアウトします。「ロード」「セーブ」「設定」はメインメニューと同じウィンドウを開きます。
![シーンの上に開いたゲーム内メニュー:Menu, Resume, Save, Load, Settings, Main menu, Exit。](assets/game-menu.jpg)
## 通知
左上には短いメッセージが表示されます。日誌の新しい記録や、物語からのヒントなどです。同時に最大 4 件まで表示され、それぞれ約 10 秒で消えます。残りは順番を待ちます。
![時計の下の通知:「あたりを見渡せ。路地に何か落ちている。」 — Cthangover プロローグのヒント。](assets/notification.png)
## MOD 作者向け
**ツールバーボタンとそのパネルを追加する**には、manifest の `ui` エントリーを使います。Items がインベントリを追加しているのがその例です:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` がアイコンの順序を決めます(マップ 10、インベントリ 20、キャラクター 30、スキル 40、メニュー 50、日誌 60、スタジオ 90);
- `button.icon` はアイコン名、`button.locale` はツールチップの翻訳キー;
- `button` のないエントリーは、ゲームが自ら開くパネルやオーバーレイです。Crafting は作業台を `"kind": "overlay"` として `ModLastPanel` スロットに登録し、シナリオから開きます。
**シナリオからパネルを開く**には `ui.toggle_panel` アクションを、**通知を表示する**には `notify` コマンドを使います:
```scenario
notify "日誌に新しい記録"
```
**共通デザインを使う。** コードで組み立てたパネルは、フレームやラベル、チップ、ボタンを UI キット(`UiKit`)とその色・サイズのトークンから受け取ります。新しいパネルもゲームの見た目に自然になじみ、テーマに従います。
## うまく動かないとき
1. **ツールバーにボタンがない。** そのボタンを追加する MOD がこのゲームに含まれていません。**MOD とコレクション**でゲームの構成を確認してください。
2. **「セーブ」がグレーアウトしている。** 現在のシーンはセーブを許可していません。別の場所へ移動してからもう一度。作者はシーンのシナリオのいずれかのヘッダーに `save_allowed: true` と書けばセーブを許可できます。
3. **パネルが開くが中身がない。** その MOD には、このゲームでまだ見せるものがないのです。たとえばクエストがまだ始まっていない、といった具合です。
+71
View File
@@ -0,0 +1,71 @@
# UI — 모든 게임이 공유하는 인터페이스
UI는 모든 게임이 함께 쓰는 인터페이스 계층입니다. 오른쪽 위의 툴바, 인게임 메뉴, 저장 표시, 왼쪽 위의 알림, 배경 화면, 그리고 패널·버튼·목록의 공통 디자인이 여기에 속합니다. UI 자체에는 이야기도 규칙도 없습니다. 거의 모든 다른 모드가 UI 위에서 만들어지기 때문에 모든 게임에 들어 있고, 수많은 모드가 이를 의존성으로 지정합니다.
![정오의 Cthangover 장면: 왼쪽 위 시계, 오른쪽 위 툴바, 오른쪽 장면 선택지.](assets/scene-hud.jpg)
## 툴바
아이콘 하나당 패널 하나가 열립니다. 버튼 목록은 고정되어 있지 않습니다. 게임의 각 모드가 자기 버튼을 추가하므로, 아이템이 없는 소설 게임에는 인벤토리 버튼이 없고 Scenario Studio가 포함된 게임에는 아이콘이 하나 더 보입니다.
![Cthangover 툴바: 도구, 지도, 인벤토리, 캐릭터, 영입자, 스킬, 메뉴(톱니바퀴), 일지.](assets/toolbar.png)
Cthangover 기준 왼쪽부터:
1. **도구** — 개발자 도구 메뉴(게임에 편집기가 있을 때만).
2. **지도** — 월드 맵(Map Engine).
3. **인벤토리** — 소지품(Items).
4. **캐릭터** — 파티와 캐릭터(Characters).
5. **영입자** — 영입한 캐릭터(Recruiting).
6. **스킬** — 스킬(Skills).
7. **메뉴** — 아래에서 설명할 인게임 메뉴(이 모드).
8. **일지** — 퀘스트(Quests).
다른 게임에서는 구성이 다릅니다. 예를 들어 RPG Plus는 **캐릭터 시트**를 추가합니다.
## 인게임 메뉴
톱니바퀴 아이콘을 누르면 메뉴가 열립니다: **계속**, **저장**, **불러오기**, **설정**, **메인 메뉴**, **나가기**. 저장이 허용되지 않는 장면에서는 그림처럼 저장 항목이 회색으로 비활성화됩니다. 불러오기, 저장, 설정은 메인 메뉴와 같은 창을 엽니다.
![장면 위에 열린 인게임 메뉴: Menu, Resume, Save, Load, Settings, Main menu, Exit.](assets/game-menu.jpg)
## 알림
왼쪽 위에는 짧은 메시지가 나타납니다. 일지에 새 항목이 생겼다거나, 이야기가 힌트를 건네는 식입니다. 한 번에 최대 네 개까지 표시되고 각각 열 초 정도 머문 뒤 사라지며, 나머지는 차례를 기다립니다.
![시계 아래 알림: "주변을 둘러보자. 골목에 뭔가 놓여 있다." — Cthangover 프롤로그의 힌트.](assets/notification.png)
## 모드 제작자를 위해
**툴바 버튼과 그 패널 추가하기** — manifest에 `ui` 항목을 넣으면 됩니다. Items가 인벤토리를 추가하는 방식이 그 예입니다:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index`는 아이콘 순서를 정합니다(지도 10, 인벤토리 20, 캐릭터 30, 스킬 40, 메뉴 50, 일지 60, 스튜디오 90);
- `button.icon`은 아이콘 이름, `button.locale`은 툴팁의 번역 키입니다;
- `button` 없는 항목은 게임이 스스로 여는 패널이나 오버레이입니다. Crafting은 작업대를 `"kind": "overlay"`로 `ModLastPanel` 슬롯에 넣고 시나리오에서 엽니다.
**시나리오에서 패널 열기**는 `ui.toggle_panel` 액션으로, **알림 표시**는 `notify` 명령으로 합니다:
```scenario
notify "새 일지 항목"
```
**공통 디자인 사용하기.** 코드로 만든 패널도 프레임, 라벨, 칩, 버튼을 UI 키트(`UiKit`)와 색·크기 토큰에서 가져옵니다. 새 패널도 게임 전체와 자연스럽게 어울리고 테마를 따릅니다.
## 문제가 생겼을 때
1. **툴바에 버튼이 없다.** 그 버튼을 추가하는 모드가 이 게임에 포함되어 있지 않습니다. **모드와 컬렉션**에서 게임 구성을 확인하세요.
2. **저장이 비활성화되어 있다.** 현재 장면은 저장을 허용하지 않습니다. 다른 곳으로 이동한 뒤 다시 시도하세요. 제작자는 장면 시나리오 중 하나의 헤더에 `save_allowed: true`를 넣어 저장을 허용할 수 있습니다.
3. **패널은 열리지만 비어 있다.** 해당 모드가 이 게임에서 아직 보여 줄 것이 없는 것입니다. 예컨대 퀘스트가 아직 시작되지 않았을 때 그렇습니다.
+71
View File
@@ -0,0 +1,71 @@
# UI — общий интерфейс всех игр
UI — общий для всех игр слой интерфейса: панель инструментов в правом верхнем углу, игровое меню, индикатор сохранения, уведомления в левом верхнем углу, просмотр фона и единый вид панелей, кнопок и списков. Собственной истории и правил у него нет. Почти все остальные моды строятся поверх него — поэтому UI есть в каждой игре и значится в зависимостях у огромного числа модов.
![Сцена в Cthangover в полдень: часы слева вверху, панель инструментов справа вверху, варианты выбора сцены справа.](assets/scene-hud.jpg)
## Панель инструментов
Каждая иконка открывает свою панель. Набор кнопок не фиксирован: свой добавляет каждый мод игры, поэтому в новелле без предметов не будет сумки, а в игре со Scenario Studio появится ещё одна иконка.
![Панель инструментов Cthangover: инструменты, карта, сумка, персонажи, рекруты, навыки, меню (шестерёнка) и журнал.](assets/toolbar.png)
В Cthangover слева направо:
1. **Инструменты** — меню инструментов разработчика (только когда в игре есть редакторы).
2. **Карта** — карта мира (Map Engine).
3. **Сумка** — инвентарь (Items).
4. **Персонажи** — отряд и персонажи (Characters).
5. **Рекруты** — завербованные персонажи (Recruiting).
6. **Навыки** — навыки (Skills).
7. **Меню** — игровое меню, о нём ниже (этот мод).
8. **Журнал** — задания (Quests).
В других играх набор другой: например, RPG Plus добавляет **лист персонажа**.
## Игровое меню
Иконка-шестерёнка открывает меню: **Вернуться**, **Сохранить**, **Загрузить**, **Настройки**, **Главное меню** и **Выход**. В сценах, где сохранение запрещено, пункт «Сохранить» неактивен — как на скриншоте. «Загрузить», «Сохранить» и «Настройки» открывают те же окна, что и в главном меню.
![Игровое меню поверх сцены: Menu, Resume, Save, Load, Settings, Main menu, Exit.](assets/game-menu.jpg)
## Уведомления
В левом верхнем углу появляются короткие сообщения: новая запись в журнале, подсказка от сюжета. Одновременно показывается до четырёх, каждое держится на экране около десяти секунд, остальные ждут своей очереди.
![Уведомление под часами: «Осмотрись. В переулке что-то лежит.» — подсказка из пролога Cthangover.](assets/notification.png)
## Авторам модов
**Добавить кнопку на панели инструментов и её панель** можно записью `ui` в манифесте. Так Items добавляет сумку:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` задаёт порядок иконок (карта 10, сумка 20, персонажи 30, навыки 40, меню 50, журнал 60, студия 90);
- `button.icon` — имя иконки, `button.locale` — ключ перевода подсказки;
- запись без `button` — панель или оверлей, который игра открывает сама: Crafting добавляет верстак как `"kind": "overlay"` в слот `ModLastPanel` и открывает его из сценариев.
**Открыть панель из сценария** можно действием `ui.toggle_panel`, а **показать уведомление** — командой `notify`:
```scenario
notify "Новая запись в журнале."
```
**Придерживайтесь общего стиля.** Панели, собранные в коде, берут рамки, надписи, чипы и кнопки из набора виджетов (`UiKit`) и его токенов цвета и размера, поэтому новая панель сразу вписывается в игру и следует её теме.
## Если что-то пошло не так
1. **На панели инструментов нет кнопки.** Мод, который её добавляет, не входит в эту игру; проверьте состав игры в разделе **Моды и коллекции**.
2. **«Сохранить» неактивно.** Текущая сцена не разрешает сохранение; перейдите в другое место и попробуйте снова. Авторы разрешают его строкой `save_allowed: true` в заголовке одного из сценариев сцены.
3. **Панель открывается пустой.** Моду панели пока нечего показывать в этой игре — например, задания ещё не начались.
+71
View File
@@ -0,0 +1,71 @@
# UI — giao diện chung của mọi game
UI là lớp giao diện mà mọi game dùng chung: thanh công cụ ở góc trên bên phải, menu trong game, biểu tượng lưu, thông báo ở góc trên bên trái, khung xem nền và diện mạo thống nhất của bảng điều khiển, nút bấm, danh sách. UI không có cốt truyện hay luật chơi riêng. Gần như mọi mod khác đều được xây trên nó, vì thế nó hiện diện trong mọi game và rất nhiều mod liệt kê nó làm phụ thuộc.
![Một cảnh trong Cthangover lúc buổi trưa: đồng hồ trên bên trái, thanh công cụ trên bên phải, các lựa chọn của cảnh ở bên phải.](assets/scene-hud.jpg)
## Thanh công cụ
Mỗi biểu tượng mở một bảng điều khiển. Các nút không cố định: mod nào trong game cũng thêm nút của riêng mình, nên một tiểu thuyết tương tác không có túi đồ, còn game có Scenario Studio thì nhiều thêm một biểu tượng.
![Thanh công cụ của Cthangover: công cụ, bản đồ, túi đồ, nhân vật, người được chiêu mộ, kỹ năng, menu (bánh răng) và nhật ký.](assets/toolbar.png)
Trong Cthangover, từ trái sang phải:
1. **Công cụ** — menu công cụ dành cho nhà phát triển (chỉ khi game có trình soạn thảo).
2. **Bản đồ** — bản đồ thế giới (Map Engine).
3. **Túi đồ** — vật phẩm mang theo (Items).
4. **Nhân vật** — đội và các nhân vật (Characters).
5. **Người được chiêu mộ** — các nhân vật đã chiêu mộ (Recruiting).
6. **Kỹ năng** — kỹ năng (Skills).
7. **Menu** — menu trong game, nói ở dưới (mod này).
8. **Nhật ký** — nhiệm vụ (Quests).
Các game khác hiển thị bộ nút khác; chẳng hạn RPG Plus thêm **bảng nhân vật**.
## Menu trong game
Biểu tượng bánh răng mở menu: **Tiếp tục**, **Lưu**, **Tải**, **Cài đặt**, **Menu chính** và **Thoát**. Ở những cảnh không cho phép lưu, nút Lưu bị mờ đi như trong hình. Tải, Lưu và Cài đặt mở đúng những cửa sổ như ở menu chính.
![Menu trong game đè lên một cảnh: Menu, Resume, Save, Load, Settings, Main menu, Exit.](assets/game-menu.jpg)
## Thông báo
Góc trên bên trái xuất hiện những tin nhắn ngắn: một mục mới trong nhật ký, một gợi ý từ cốt truyện. Cùng lúc hiện tối đa bốn cái, mỗi cái giữ khoảng mười giây; cái khác xếp hàng chờ tới lượt.
![Thông báo dưới đồng hồ: "Hãy nhìn quanh. Có thứ gì đó nằm trong con hẻm." — một gợi ý từ phần mở đầu của Cthangover.](assets/notification.png)
## Cho tác giả mod
**Thêm nút thanh công cụ cùng bảng điều khiển của nó** bằng một mục `ui` trong manifest. Items thêm túi đồ theo cách này:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` xếp thứ tự các biểu tượng (bản đồ 10, túi đồ 20, nhân vật 30, kỹ năng 40, menu 50, nhật ký 60, studio 90);
- `button.icon` là tên biểu tượng, `button.locale` là khóa dịch của chú thích;
- mục không có `button` là bảng điều khiển hoặc lớp phủ mà game tự mở — Crafting đặt bàn chế tạo của mình dưới dạng `"kind": "overlay"` ở khe `ModLastPanel` và mở nó từ kịch bản.
**Mở bảng điều khiển từ kịch bản** bằng hành động `ui.toggle_panel`, còn **hiện thông báo** bằng lệnh `notify`:
```scenario
notify "Mục nhật ký mới"
```
**Dùng diện mạo chung.** Bảng điều khiển viết bằng code lấy khung, nhãn, thẻ và nút từ bộ công cụ giao diện (`UiKit`) cùng các token màu và kích thước, nên bảng mới tự hòa vào tổng thể game và đi theo chủ đề của nó.
## Khi có trục trặc
1. **Thiếu nút trên thanh công cụ.** Mod thêm nút đó không nằm trong game này; hãy kiểm tra thành phần của game trong **Mod và bộ sưu tập**.
2. **Nút Lưu bị mờ.** Cảnh hiện tại không cho phép lưu; hãy đến nơi khác rồi thử lại. Tác giả cho phép lưu bằng dòng `save_allowed: true` trong phần đầu một trong các kịch bản của cảnh.
3. **Bảng điều khiển mở ra nhưng trống trơn.** Mod ấy chưa có gì để hiển thị trong game này — ví dụ, chưa có nhiệm vụ nào bắt đầu.
+71
View File
@@ -0,0 +1,71 @@
# UI — 所有游戏共用的界面
UI 是所有游戏共用的界面层:右上角的工具栏、游戏内菜单、存档指示器、左上角的通知,以及背景画面和面板、按钮、列表的统一外观。它自己没有剧情,也不定规则。几乎所有其他模组都构建在它之上,所以每个游戏里都有它,大量模组也把它列为依赖。
![Cthangover 中午时分的一幕:左上角是时钟,右上角是工具栏,右侧是场景选项。](assets/scene-hud.jpg)
## 工具栏
每个图标都会打开一个面板。按钮并非固定不变:游戏中的每个模组都会加上自己的按钮,因此没有物品系统的小说游戏不会有背包,而带 Scenario Studio 的游戏则多出一个图标。
![Cthangover 的工具栏:工具、地图、背包、角色、招募者、技能、菜单(齿轮)和日志。](assets/toolbar.png)
在 Cthangover 中,从左到右依次是:
1. **工具** — 开发者工具菜单(仅当游戏包含编辑器时出现)。
2. **地图** — 世界地图(Map Engine)。
3. **背包** — 物品栏(Items)。
4. **角色** — 队伍和角色(Characters)。
5. **招募者** — 已招募的角色(Recruiting)。
6. **技能** — 技能(Skills)。
7. **菜单** — 下文介绍的游戏内菜单(本模组)。
8. **日志** — 任务(Quests)。
其他游戏显示的按钮不同:例如 RPG Plus 会多出**角色面板**。
## 游戏内菜单
齿轮图标打开菜单:**继续**、**保存**、**读取**、**设置**、**主菜单**和**退出**。在不允许存档的场景中,“保存”会变灰,如图所示。“读取”“保存”和“设置”打开的窗口与主菜单中相同。
![场景上方的游戏内菜单:Menu, Resume, Save, Load, Settings, Main menu, Exit。](assets/game-menu.jpg)
## 通知
左上角会出现简短消息:日志新增条目、剧情给出的提示等。同屏最多显示四条,每条停留约十秒,其余依次排队。
![时钟下方的通知:“看看四周。巷子里躺着什么东西。”——Cthangover 序章中的一条提示。](assets/notification.png)
## 给模组作者
**添加工具栏按钮及其面板**:在 manifest.json 里写一个 `ui` 条目。Items 就是这样添加背包的:
```json
"ui": [
{
"id": "inventory",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
"button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
"priority": 10
}
]
```
- `button.index` 决定图标顺序(地图 10、背包 20、角色 30、技能 40、菜单 50、日志 60、工作室 90);
- `button.icon` 是图标名,`button.locale` 是提示文字的翻译键;
- 不带 `button` 的条目是游戏自行打开的面板或覆盖层:Crafting 以 `"kind": "overlay"` 把工作台放进 `ModLastPanel` 槽位,并从剧本中打开它。
**从剧本打开面板**用 `ui.toggle_panel` 动作,**显示通知**用 `notify` 命令:
```scenario
notify "新的日志条目。"
```
**使用统一外观。** 用代码构建的面板会从组件库(`UiKit`)及其颜色、尺寸令牌中获取边框、文字、标签和按钮,因此新面板自然融入游戏整体风格并跟随主题变化。
## 出现问题时
1. **工具栏上少了按钮。** 添加它的模组不属于当前游戏;请在**模组与合集**中查看游戏的构成。
2. **“保存”是灰色的。** 当前场景不允许存档;换到别的地方再试。作者在场景任一剧本的头部写上 `save_allowed: true` 即可允许存档。
3. **面板打开了却是空的。** 对应模组在当前游戏中暂时没有内容可显示——例如还没有任务开始。
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = The interface layer every game shares: the toolbar, the in-game menu, the save indicator, notifications and the common look of panels, buttons and lists.
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = La capa de interfaz que comparten todos los juegos: la barra de herramientas, el menú del juego, el indicador de guardado, las notificaciones y el aspecto común de paneles, botones y listas.
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = すべてのゲームで共有される UI レイヤー:ツールバー、ゲーム内メニュー、セーブインジケーター、通知、そしてパネル・ボタン・リストの共通デザイン。
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = 모든 게임이 공유하는 인터페이스 레이어: 툴바, 인게임 메뉴, 저장 표시, 알림, 그리고 패널·버튼·목록의 공통 디자인입니다.
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = Общий для всех игр слой интерфейса: панель инструментов, игровое меню, индикатор сохранения, уведомления и единый вид панелей, кнопок и списков.
+1 -2
View File
@@ -1,6 +1,4 @@
# --- scenes/battle/winground.tscn --- # --- scenes/battle/winground.tscn ---
mod_ui_base_name = UI
mod_ui_base_desc = Engine UI subsystem: widget toolkit (Widget/ModWidget/lists), ViewBox background viewport, ToolBox toolbar, GameMenu/SaveIcon, notification panels, UiKit design system and DeviceInput.
ui/battle/victory = Victory ui/battle/victory = Victory
ui/battle/victory/return = Continue ui/battle/victory/return = Continue
ui/battle/victory/loot_title = Loot: ui/battle/victory/loot_title = Loot:
@@ -102,6 +100,7 @@ ui/save/game_day = Day {day}, {time}
ui/save/party_size = Party: {count} ui/save/party_size = Party: {count}
# --- GameMenu --- # --- GameMenu ---
menu/title = Menu
menu/resume = Resume menu/resume = Resume
menu/save = Save menu/save = Save
menu/load = Load menu/load = Load
+268
View File
@@ -0,0 +1,268 @@
# --- scenes/battle/winground.tscn ---
ui/battle/victory = Victoria
ui/battle/victory/return = Continuar
ui/battle/victory/loot_title = Botín:
# --- scenes/battle/deadground.tscn ---
ui/battle/defeat = Derrota
ui/battle/endgame/to_main_menu = Menú principal
# --- scenes/battle/battle.tscn ---
ui/battle/next = Terminar turno
# --- scenes/menu/main_menu.tscn ---
menu/newgame = Nueva partida
ui/menu/load = Cargar
menu/settings = Ajustes
menu/exit = Salir
# --- Mods ---
mods/title = Mods
mods/enable = Activar
mods/disable = Desactivar
mods/enabled = Activado
mods/disabled = Desactivado
mods/disabled_reason = Desactivado
mods/dep_disabled_reason = La dependencia «{0}» está desactivada
mods/not_in_game_reason = No forma parte del juego «{0}»
mods/dependency_disabled = Dependencia desactivada
mods/invalid_dep_format = Formato de dependencia no válido: «{0}»
mods/required_mod_not_loaded = El mod requerido «{0}» no está cargado
mods/version_mismatch = Versión no coincide: requiere {0}, encontrada {1}
mods/restart_required = Hay que reiniciar para que los cambios surtan efecto
mods/back = Atrás
mods/author = Autor
mods/version = Versión
mods/depends = Dependencias
mods/used_by = Lo usan
mods/overrides_title = Sustituciones
mods/reset_order = Restablecer orden
mods/reset_order_title = Restablecer orden
mods/reset_order_text = ¿Seguro que quieres restablecer el orden de los mods? Se recalculará automáticamente
mods/reset_order_confirm = Sí
mods/reset_order_cancel = Cancelar
mods/tab_device = Dispositivo
mods/tab_network = Red
mods/network_refresh = Actualizar
mods/network_loading = Cargando catálogo...
mods/network_ready = Catálogo cargado
mods/network_empty = No hay mods en el catálogo
mods/network_error = No se pudo cargar el catálogo
mods/network_no_urls = No hay URL de catálogo configuradas
mods/status_installed = Instalado
mods/status_update_available = Hay actualización
mods/status_not_installed = No instalado
mods/status_modified = Modificado localmente
mods/catalog_export = Exportar al catálogo
mods/catalog_title = Exportar entrada del catálogo
mods/catalog_download_url = URL de descarga
mods/catalog_category = Categoría
mods/category_story = Historia
mods/category_characters = Personajes
mods/category_gameplay = Jugabilidad
mods/category_visual = Visual
mods/category_audio = Audio
mods/category_ui = Interfaz
mods/category_locale = Idioma
mods/category_library = Biblioteca
mods/category_engine = Motor
mods/category_overhaul = Conversión total
mods/category_tools = Herramientas
mods/category_editor = Editor
mods/category_debug = Depuración
mods/category_other = Otros
mods/catalog_tags = Etiquetas (separadas por comas)
mods/catalog_changelog = Cambios
mods/catalog_status = Estado
mods/catalog_min_game_version = Versión mínima del juego
mods/catalog_icon_url = URL del icono
mods/catalog_copy = Copiar JSON
mods/catalog_export_file = Exportar a archivo
mods/catalog_close = Cerrar
mods/install_button = Instalar
mods/update_button = Actualizar
mods/overwrite_button = Sobrescribir
mods/downgrade_button = Volver a versión anterior
mods/restart_button = Hay que reiniciar
mods/installing = Instalando...
mods/install_complete = Instalación completada. Hay que reiniciar.
mods/install_failed = La instalación falló. Mira el registro para más detalles.
# --- Save/Load ---
ui/load/title = Cargar
ui/save/title = Guardar
ui/save/empty = Vacío
ui/save/overwrite_title = Sobrescribir partida
ui/save/overwrite_text = Ya hay una partida en esta ranura. ¿Sobrescribirla?
ui/save/save_button = Sobrescribir
ui/save/cancel_button = Cancelar
ui/save/game_day = Día {day}, {time}
ui/save/party_size = Grupo: {count}
# --- GameMenu ---
menu/title = Menú
menu/resume = Continuar
menu/save = Guardar
menu/load = Cargar
menu/main_menu = Menú principal
# --- Character Panel ---
ui/character_panel/title = Acciones de los personajes
ui/character_panel/reset = Restablecer
ui/character_panel/close = Cerrar
ui/character_panel/reset_title = Restablecer la asignación de acciones
ui/character_panel/reset_text = ¿Seguro que quieres restablecer todas las asignaciones de acciones? Las acciones de los personajes volverán a los valores por defecto; las acciones recogidas se quedan en la reserva.
ui/character_panel/reset_ok = Restablecer
ui/character_panel/reset_cancel = Cancelar
ui/character_panel/party = Grupo
ui/character_panel/party_sub = 3 ranuras por personaje · las cartas sin usar esperan en la reserva
ui/character_panel/template = plantilla: {0}
ui/character_panel/pool_title = Reserva de acciones
ui/character_panel/search = Buscar por nombre o ID...
ui/character_panel/filter_all = Todas
ui/character_panel/type_enemy = Objetivo enemigo
ui/character_panel/type_alias = Objetivo aliado
ui/character_panel/type_self = A uno mismo
ui/character_panel/type_passive = Pasiva
ui/character_panel/type_active = Activa
ui/character_panel/cost = {0} PA
ui/character_panel/cooldown = Recarga {0}
ui/character_panel/slot = Ranura {0}
ui/character_panel/slot_empty = + ranura vacía: arrastra una carta aquí
ui/character_panel/assigned = Asignadas {0}/{1} · en reserva {2}
ui/character_panel/hint_select = elige una carta y después una ranura
ui/character_panel/drag_hint = Arrastra una carta a una ranura · ranura↔ranura las intercambia
ui/character_panel/pool_hint = Una carta sigue siendo del jugador mientras está en la reserva. Se permiten duplicados.
ui/character_panel/pool_empty = La reserva está vacía: aquí aparecerán las acciones recogidas
ui/character_panel/nothing_found = No se encontró nada
ui/character_panel/stat_hp = PV
ui/character_panel/stat_ap = PA
ui/character_panel/stat_atk = ATQ
ui/character_panel/stat_def = DEF
# --- Inventory ---
ui/inventory/title = Inventario
ui/inventory/use = Usar
ui/inventory/drop = Tirar
ui/inventory/drop_all = Todo
ui/inventory/drop_confirm = Tirar
ui/inventory/drop_quantity = Tirar
ui/inventory/close = Cerrar
ui/inventory/no_ap = No hay PA suficientes
ui/inventory/select_target = Elige un objetivo
ui/inventory/cancel = Cancelar
ui/inventory/tab_all = Todo
ui/inventory/tab_food = Comida
ui/inventory/tab_resource = Recursos
ui/inventory/tab_recipe = Recetas
ui/inventory/tab_quest = Misiones
ui/inventory/search = Buscar en el inventario...
ui/inventory/sort_type = Por tipo
ui/inventory/sort_name = Por nombre
ui/inventory/sort_cost = Por precio
ui/inventory/sort_count = Por cantidad
ui/inventory/shown = Mostrando {0} de {1}
ui/inventory/hint_select = Clic izquierdo: seleccionar · la acción está en los detalles
ui/inventory/stack = Montón
ui/inventory/id = ID
ui/inventory/action = Acción
ui/inventory/verb = Verbo
ui/inventory/props_header = Propiedades · PropertyData
ui/inventory/props_none = sin propiedades
ui/inventory/no_action = Sin ItemAction: el objeto todavía no se puede usar
ui/inventory/cost = Precio
ui/inventory/empty = El inventario está vacío
ui/inventory/select = Selecciona un objeto de la lista
ui/inventory/ap = PA
ui/inventory/ap_cost = −1 PA
ui/inventory/used = Usado: {0}
ui/inventory/used_recipe = Receta aprendida: {0}
ui/inventory/use_failed = UseAction → false: el objeto no se gastó
ui/inventory/dropped = Tirado: {0} ×{1}
ui/inventory/applied = Aplicado: {0} → {1}
ui/inventory/applied_failed = El objetivo no aceptó el efecto: el objeto no se gastó
ui/inventory/drop_cant = No se puede tirar (CantDrop)
ui/inventory/type_quest = Misión
ui/inventory/type_used = Usable
ui/inventory/type_target = Con objetivo
ui/inventory/type_food = Comida
ui/inventory/type_resource = Recurso
ui/inventory/type_recipe = Receta
ui/inventory/type_cant_drop = No se puede tirar
ui/inventory/verb_use = Usar
ui/inventory/verb_eat = Comer
ui/inventory/verb_target = Aplicar al objetivo
ui/inventory/verb_recipe = Aprender receta
ui/inventory/tag_recipe = receta
ui/inventory/tag_target = objetivo
ui/inventory/tag_food = bebida
ui/inventory/tag_use = usar
# --- Map ---
ui/map/title = Mapa
ui/map/close = Cerrar
ui/map/subtitle = Distrito norte
ui/map/zone_count = {0} lugares
ui/map/legend_current = estás aquí
ui/map/legend_available = disponible
ui/map/legend_locked = cerrado
ui/map/hint = Clic izquierdo en un marcador: elegir lugar · Esc: cerrar el mapa
ui/map/current = Estás aquí
ui/map/available = Disponible
ui/map/locked = Cerrado
ui/map/you_are_here = estás aquí
ui/map/closed_note = cerrado
ui/map/go = Viajar
ui/map/here = Estás aquí
ui/map/transition = Transición
ui/map/card_hint = El botón de abajo cambia de escena. Esc: cerrar el mapa.
ui/map/locked_message = El camino todavía no está abierto.
ui/map/empty = Mapa no disponible
ui/map/empty_hint = No se encontró el fondo map.png: añade a un mod el fondo y los archivos de zonas map/*.json.
# --- Skills ---
ui/skills/title = Habilidades
ui/skills/grants_action = Concede una carta de acción
ui/skills/side_title = Estudio de la carta
ui/skills/collection = Colección
ui/skills/search = Buscar en la colección…
ui/skills/sort_rarity = Por rareza
ui/skills/sort_type = Por tipo
ui/skills/sort_name = Por nombre
ui/skills/filter_all = Todas
ui/skills/filter_rarities = Todas las rarezas
ui/skills/hint = Clic izquierdo: estudiar la carta · el marco y el brillo dependen de la rareza
ui/skills/reset = Restablecer filtros
ui/skills/empty = Todavía no hay habilidades
ui/skills/nothing_found = No se encontró nada
ui/skills/no_effects = Todavía no hay efectos permanentes
ui/skills/collection_effect = Efecto de la colección
ui/skills/collection_effect_hint = Total de toda la colección · se actualiza al instante
ui/skills/rarity/common = Común
ui/skills/rarity/uncommon = Poco común
ui/skills/rarity/rare = Rara
ui/skills/rarity/epic = Épica
ui/skills/rarity/legendary = Legendaria
ui/skills/type/active = Activa
ui/skills/type/passive = Pasiva
ui/skills/type/for_character = Para el personaje
# --- Quest Journal ---
ui/journal/title = Diario
ui/journal/active = Activas
ui/journal/completed = Completadas
ui/journal/close = Cerrar
ui/journal/empty = No hay misiones
ui/journal/toc = Índice
ui/journal/entry_header = Entrada
ui/journal/entry_of = Entrada {0} de {1}
ui/journal/finished = Completada
ui/journal/seals = Sellos
ui/journal/no_entries = Las páginas de esta entrada siguen en blanco. La tinta aparecerá a medida que avance la historia.
tools/unsaved_title = Cambios sin guardar
tools/unsaved_text = Tienes cambios sin guardar. ¿Cerrar sin guardar?
tools/unsaved_discard_text = Hay cambios sin guardar. ¿Descartarlos?
tools/window_maximize = Maximizar / restaurar (doble clic en el título)
tools/window_close = Cerrar
tools/menu_title = Herramientas
+268
View File
@@ -0,0 +1,268 @@
# --- scenes/battle/winground.tscn ---
ui/battle/victory = 勝利
ui/battle/victory/return = 続ける
ui/battle/victory/loot_title = 戦利品:
# --- scenes/battle/deadground.tscn ---
ui/battle/defeat = 敗北
ui/battle/endgame/to_main_menu = メインメニュー
# --- scenes/battle/battle.tscn ---
ui/battle/next = ターン終了
# --- scenes/menu/main_menu.tscn ---
menu/newgame = ニューゲーム
ui/menu/load = ロード
menu/settings = 設定
menu/exit = 終了
# --- Mods ---
mods/title = MOD
mods/enable = 有効にする
mods/disable = 無効にする
mods/enabled = 有効
mods/disabled = 無効
mods/disabled_reason = 無効
mods/dep_disabled_reason = 依存先「{0}」が無効です
mods/not_in_game_reason = ゲーム「{0}」に含まれていません
mods/dependency_disabled = 依存先が無効
mods/invalid_dep_format = 依存の書式が不正:「{0}」
mods/required_mod_not_loaded = 必要な MOD「{0}」が読み込まれていません
mods/version_mismatch = バージョン不一致:{0} が必要、{1} を検出
mods/restart_required = 変更を反映するには再起動が必要です
mods/back = 戻る
mods/author = 作者
mods/version = バージョン
mods/depends = 依存関係
mods/used_by = 利用元
mods/overrides_title = 上書き
mods/reset_order = 順序をリセット
mods/reset_order_title = 順序をリセット
mods/reset_order_text = MOD の順序をリセットしますか? 自動で計算し直されます
mods/reset_order_confirm = はい
mods/reset_order_cancel = キャンセル
mods/tab_device = 端末
mods/tab_network = ネットワーク
mods/network_refresh = 更新
mods/network_loading = カタログを読み込み中...
mods/network_ready = カタログを読み込みました
mods/network_empty = カタログに MOD がありません
mods/network_error = カタログを読み込めませんでした
mods/network_no_urls = カタログの URL が設定されていません
mods/status_installed = インストール済み
mods/status_update_available = 更新あり
mods/status_not_installed = 未インストール
mods/status_modified = ローカルで変更
mods/catalog_export = カタログに書き出す
mods/catalog_title = カタログ項目を書き出す
mods/catalog_download_url = ダウンロード URL
mods/catalog_category = カテゴリー
mods/category_story = ストーリー
mods/category_characters = キャラクター
mods/category_gameplay = ゲームプレイ
mods/category_visual = ビジュアル
mods/category_audio = オーディオ
mods/category_ui = UI
mods/category_locale = 言語
mods/category_library = ライブラリ
mods/category_engine = エンジン
mods/category_overhaul = 大型改造
mods/category_tools = ツール
mods/category_editor = エディター
mods/category_debug = デバッグ
mods/category_other = その他
mods/catalog_tags = タグ(カンマ区切り)
mods/catalog_changelog = 変更履歴
mods/catalog_status = 状態
mods/catalog_min_game_version = 最低ゲームバージョン
mods/catalog_icon_url = アイコンの URL
mods/catalog_copy = JSON をコピー
mods/catalog_export_file = ファイルに書き出す
mods/catalog_close = 閉じる
mods/install_button = インストール
mods/update_button = 更新
mods/overwrite_button = 上書き
mods/downgrade_button = ダウングレード
mods/restart_button = 再起動が必要
mods/installing = インストール中...
mods/install_complete = インストール完了。再起動が必要です。
mods/install_failed = インストールに失敗しました。詳しくはログを見てください。
# --- Save/Load ---
ui/load/title = ロード
ui/save/title = セーブ
ui/save/empty = 空き
ui/save/overwrite_title = セーブを上書き
ui/save/overwrite_text = このスロットにはすでにセーブがあります。上書きしますか?
ui/save/save_button = 上書き
ui/save/cancel_button = キャンセル
ui/save/game_day = {day} 日目、{time}
ui/save/party_size = パーティ:{count}
# --- GameMenu ---
menu/title = メニュー
menu/resume = 再開
menu/save = セーブ
menu/load = ロード
menu/main_menu = メインメニュー
# --- Character Panel ---
ui/character_panel/title = キャラクターのアクション
ui/character_panel/reset = リセット
ui/character_panel/close = 閉じる
ui/character_panel/reset_title = アクションの割り当てをリセット
ui/character_panel/reset_text = すべてのアクションの割り当てをリセットしますか? キャラクターのアクションは既定に戻り、集めたアクションはプールに残ります。
ui/character_panel/reset_ok = リセット
ui/character_panel/reset_cancel = キャンセル
ui/character_panel/party = パーティ
ui/character_panel/party_sub = キャラクターごとに 3 スロット · 使わないカードはプールで待機
ui/character_panel/template = テンプレート:{0}
ui/character_panel/pool_title = アクションプール
ui/character_panel/search = 名前か ID で検索...
ui/character_panel/filter_all = すべて
ui/character_panel/type_enemy = 敵が対象
ui/character_panel/type_alias = 味方が対象
ui/character_panel/type_self = 自分が対象
ui/character_panel/type_passive = パッシブ
ui/character_panel/type_active = アクティブ
ui/character_panel/cost = {0} AP
ui/character_panel/cooldown = クールダウン {0}
ui/character_panel/slot = スロット {0}
ui/character_panel/slot_empty = + 空きスロット——ここにカードをドラッグ
ui/character_panel/assigned = 割り当て {0}/{1} · プール内 {2}
ui/character_panel/hint_select = カードを選んでからスロットを選ぶ
ui/character_panel/drag_hint = カードをスロットへドラッグ · スロット同士で入れ替え
ui/character_panel/pool_hint = プールにある間もカードはプレイヤーのものです。重複できます。
ui/character_panel/pool_empty = プールは空です——集めたアクションがここに表示されます
ui/character_panel/nothing_found = 何も見つかりません
ui/character_panel/stat_hp = HP
ui/character_panel/stat_ap = AP
ui/character_panel/stat_atk = 攻撃
ui/character_panel/stat_def = 防御
# --- Inventory ---
ui/inventory/title = インベントリ
ui/inventory/use = 使う
ui/inventory/drop = 捨てる
ui/inventory/drop_all = すべて
ui/inventory/drop_confirm = 捨てる
ui/inventory/drop_quantity = 捨てる
ui/inventory/close = 閉じる
ui/inventory/no_ap = AP が足りない
ui/inventory/select_target = 対象を選択
ui/inventory/cancel = キャンセル
ui/inventory/tab_all = すべて
ui/inventory/tab_food = 食べ物
ui/inventory/tab_resource = 素材
ui/inventory/tab_recipe = レシピ
ui/inventory/tab_quest = クエスト
ui/inventory/search = インベントリを検索...
ui/inventory/sort_type = 種類順
ui/inventory/sort_name = 名前順
ui/inventory/sort_cost = 価格順
ui/inventory/sort_count = 個数順
ui/inventory/shown = {1} 個中 {0} 個を表示
ui/inventory/hint_select = 左クリック——選択 · アクションは詳細に
ui/inventory/stack = スタック
ui/inventory/id = ID
ui/inventory/action = アクション
ui/inventory/verb = 動詞
ui/inventory/props_header = プロパティ · PropertyData
ui/inventory/props_none = プロパティなし
ui/inventory/no_action = ItemAction なし——このアイテムはまだ使えません
ui/inventory/cost = 価格
ui/inventory/empty = インベントリは空です
ui/inventory/select = 一覧からアイテムを選んでください
ui/inventory/ap = AP
ui/inventory/ap_cost = −1 AP
ui/inventory/used = 使った:{0}
ui/inventory/used_recipe = レシピを覚えた:{0}
ui/inventory/use_failed = UseAction → false:アイテムは消費されなかった
ui/inventory/dropped = 捨てた:{0} ×{1}
ui/inventory/applied = 使用:{0} → {1}
ui/inventory/applied_failed = 対象が効果を受け付けなかった——アイテムは消費されなかった
ui/inventory/drop_cant = 捨てられない(CantDrop)
ui/inventory/type_quest = クエスト
ui/inventory/type_used = 使用可
ui/inventory/type_target = 対象あり
ui/inventory/type_food = 食べ物
ui/inventory/type_resource = 素材
ui/inventory/type_recipe = レシピ
ui/inventory/type_cant_drop = 捨てられない
ui/inventory/verb_use = 使う
ui/inventory/verb_eat = 食べる
ui/inventory/verb_target = 対象に使う
ui/inventory/verb_recipe = レシピを覚える
ui/inventory/tag_recipe = レシピ
ui/inventory/tag_target = 対象
ui/inventory/tag_food = 飲み物
ui/inventory/tag_use = 使用
# --- Map ---
ui/map/title = マップ
ui/map/close = 閉じる
ui/map/subtitle = 北地区
ui/map/zone_count = {0} か所
ui/map/legend_current = 現在地
ui/map/legend_available = 行ける
ui/map/legend_locked = 閉鎖
ui/map/hint = マーカーを左クリック——場所を選ぶ · Esc——マップを閉じる
ui/map/current = 現在地
ui/map/available = 行ける
ui/map/locked = 閉鎖
ui/map/you_are_here = 現在地
ui/map/closed_note = 閉鎖
ui/map/go = 移動
ui/map/here = 現在地
ui/map/transition = 移動
ui/map/card_hint = 下のボタンでシーンを切り替えます。Esc——マップを閉じる。
ui/map/locked_message = 道はまだ開いていません。
ui/map/empty = マップを表示できません
ui/map/empty_hint = 背景 map.png が見つかりません——MOD に背景と map/*.json のゾーンファイルを追加してください。
# --- Skills ---
ui/skills/title = スキル
ui/skills/grants_action = アクションカードを付与
ui/skills/side_title = カードの研究
ui/skills/collection = コレクション
ui/skills/search = コレクションを検索…
ui/skills/sort_rarity = レア度順
ui/skills/sort_type = 種類順
ui/skills/sort_name = 名前順
ui/skills/filter_all = すべて
ui/skills/filter_rarities = すべてのレア度
ui/skills/hint = 左クリック——カードを調べる · 枠と輝きはレア度で変わる
ui/skills/reset = フィルターをリセット
ui/skills/empty = まだスキルがありません
ui/skills/nothing_found = 何も見つかりません
ui/skills/no_effects = まだ恒久的な効果はありません
ui/skills/collection_effect = コレクション効果
ui/skills/collection_effect_hint = コレクション全体の合計 · すぐに更新
ui/skills/rarity/common = コモン
ui/skills/rarity/uncommon = アンコモン
ui/skills/rarity/rare = レア
ui/skills/rarity/epic = エピック
ui/skills/rarity/legendary = レジェンダリー
ui/skills/type/active = アクティブ
ui/skills/type/passive = パッシブ
ui/skills/type/for_character = キャラクター用
# --- Quest Journal ---
ui/journal/title = 日誌
ui/journal/active = 進行中
ui/journal/completed = 完了
ui/journal/close = 閉じる
ui/journal/empty = クエストはありません
ui/journal/toc = 目次
ui/journal/entry_header = 記録
ui/journal/entry_of = 記録 {0} / {1}
ui/journal/finished = 完了
ui/journal/seals = 印章
ui/journal/no_entries = この記録のページはまだ白紙です。物語が進むにつれて文字が現れます。
tools/unsaved_title = 保存していない変更
tools/unsaved_text = 保存していない変更があります。保存せずに閉じますか?
tools/unsaved_discard_text = 保存していない変更があります。破棄しますか?
tools/window_maximize = 最大化 / 元に戻す(タイトルをダブルクリック)
tools/window_close = 閉じる
tools/menu_title = ツール
+268
View File
@@ -0,0 +1,268 @@
# --- scenes/battle/winground.tscn ---
ui/battle/victory = 승리
ui/battle/victory/return = 계속
ui/battle/victory/loot_title = 전리품:
# --- scenes/battle/deadground.tscn ---
ui/battle/defeat = 패배
ui/battle/endgame/to_main_menu = 메인 메뉴
# --- scenes/battle/battle.tscn ---
ui/battle/next = 턴 종료
# --- scenes/menu/main_menu.tscn ---
menu/newgame = 새 게임
ui/menu/load = 불러오기
menu/settings = 설정
menu/exit = 나가기
# --- Mods ---
mods/title = 모드
mods/enable = 켜기
mods/disable = 끄기
mods/enabled = 켜짐
mods/disabled = 꺼짐
mods/disabled_reason = 꺼짐
mods/dep_disabled_reason = 의존 대상 "{0}"이(가) 꺼져 있습니다
mods/not_in_game_reason = 게임 "{0}"에 포함되지 않음
mods/dependency_disabled = 의존 대상이 꺼짐
mods/invalid_dep_format = 잘못된 의존성 형식: "{0}"
mods/required_mod_not_loaded = 필요한 모드 "{0}"이(가) 로드되지 않았습니다
mods/version_mismatch = 버전 불일치: {0} 필요, {1} 발견
mods/restart_required = 변경 사항을 적용하려면 다시 시작해야 합니다
mods/back = 뒤로
mods/author = 작성자
mods/version = 버전
mods/depends = 의존성
mods/used_by = 사용처
mods/overrides_title = 덮어쓰기
mods/reset_order = 순서 초기화
mods/reset_order_title = 순서 초기화
mods/reset_order_text = 모드 순서를 초기화할까요? 자동으로 다시 계산됩니다
mods/reset_order_confirm = 예
mods/reset_order_cancel = 취소
mods/tab_device = 기기
mods/tab_network = 네트워크
mods/network_refresh = 새로 고침
mods/network_loading = 카탈로그 불러오는 중...
mods/network_ready = 카탈로그를 불러왔습니다
mods/network_empty = 카탈로그에 모드가 없습니다
mods/network_error = 카탈로그를 불러오지 못했습니다
mods/network_no_urls = 카탈로그 URL이 설정되지 않았습니다
mods/status_installed = 설치됨
mods/status_update_available = 업데이트 있음
mods/status_not_installed = 설치 안 됨
mods/status_modified = 로컬에서 수정됨
mods/catalog_export = 카탈로그로 내보내기
mods/catalog_title = 카탈로그 항목 내보내기
mods/catalog_download_url = 다운로드 URL
mods/catalog_category = 분류
mods/category_story = 스토리
mods/category_characters = 캐릭터
mods/category_gameplay = 게임플레이
mods/category_visual = 비주얼
mods/category_audio = 오디오
mods/category_ui = UI
mods/category_locale = 언어
mods/category_library = 라이브러리
mods/category_engine = 엔진
mods/category_overhaul = 대규모 개편
mods/category_tools = 도구
mods/category_editor = 에디터
mods/category_debug = 디버그
mods/category_other = 기타
mods/catalog_tags = 태그 (쉼표로 구분)
mods/catalog_changelog = 변경 기록
mods/catalog_status = 상태
mods/catalog_min_game_version = 최소 게임 버전
mods/catalog_icon_url = 아이콘 URL
mods/catalog_copy = JSON 복사
mods/catalog_export_file = 파일로 내보내기
mods/catalog_close = 닫기
mods/install_button = 설치
mods/update_button = 업데이트
mods/overwrite_button = 덮어쓰기
mods/downgrade_button = 다운그레이드
mods/restart_button = 다시 시작 필요
mods/installing = 설치 중...
mods/install_complete = 설치 완료. 다시 시작해야 합니다.
mods/install_failed = 설치에 실패했습니다. 자세한 내용은 로그를 확인하세요.
# --- Save/Load ---
ui/load/title = 불러오기
ui/save/title = 저장
ui/save/empty = 비어 있음
ui/save/overwrite_title = 저장 덮어쓰기
ui/save/overwrite_text = 이 슬롯에 이미 저장 파일이 있습니다. 덮어쓸까요?
ui/save/save_button = 덮어쓰기
ui/save/cancel_button = 취소
ui/save/game_day = {day}일째, {time}
ui/save/party_size = 파티: {count}
# --- GameMenu ---
menu/title = 메뉴
menu/resume = 계속
menu/save = 저장
menu/load = 불러오기
menu/main_menu = 메인 메뉴
# --- Character Panel ---
ui/character_panel/title = 캐릭터 액션
ui/character_panel/reset = 초기화
ui/character_panel/close = 닫기
ui/character_panel/reset_title = 액션 배정 초기화
ui/character_panel/reset_text = 모든 액션 배정을 초기화할까요? 캐릭터 액션은 기본값으로 돌아가고, 모은 액션은 풀에 남습니다.
ui/character_panel/reset_ok = 초기화
ui/character_panel/reset_cancel = 취소
ui/character_panel/party = 파티
ui/character_panel/party_sub = 캐릭터마다 슬롯 3개 · 쓰지 않는 카드는 풀에서 대기
ui/character_panel/template = 템플릿: {0}
ui/character_panel/pool_title = 액션 풀
ui/character_panel/search = 이름 또는 ID로 검색...
ui/character_panel/filter_all = 전체
ui/character_panel/type_enemy = 적 대상
ui/character_panel/type_alias = 아군 대상
ui/character_panel/type_self = 자신 대상
ui/character_panel/type_passive = 패시브
ui/character_panel/type_active = 액티브
ui/character_panel/cost = {0} AP
ui/character_panel/cooldown = 재사용 대기 {0}
ui/character_panel/slot = 슬롯 {0}
ui/character_panel/slot_empty = + 빈 슬롯 — 여기로 카드를 끌어 오세요
ui/character_panel/assigned = 배정 {0}/{1} · 풀에 {2}
ui/character_panel/hint_select = 카드를 고른 다음 슬롯을 고르세요
ui/character_panel/drag_hint = 카드를 슬롯으로 끌어 놓기 · 슬롯끼리 서로 바꾸기
ui/character_panel/pool_hint = 카드는 풀에 있는 동안에도 플레이어의 것입니다. 중복이 허용됩니다.
ui/character_panel/pool_empty = 풀이 비어 있습니다 — 모은 액션이 여기에 나타납니다
ui/character_panel/nothing_found = 아무것도 찾지 못했습니다
ui/character_panel/stat_hp = HP
ui/character_panel/stat_ap = AP
ui/character_panel/stat_atk = 공격
ui/character_panel/stat_def = 방어
# --- Inventory ---
ui/inventory/title = 인벤토리
ui/inventory/use = 사용
ui/inventory/drop = 버리기
ui/inventory/drop_all = 전부
ui/inventory/drop_confirm = 버리기
ui/inventory/drop_quantity = 버리기
ui/inventory/close = 닫기
ui/inventory/no_ap = AP가 부족합니다
ui/inventory/select_target = 대상 선택
ui/inventory/cancel = 취소
ui/inventory/tab_all = 전체
ui/inventory/tab_food = 음식
ui/inventory/tab_resource = 자원
ui/inventory/tab_recipe = 레시피
ui/inventory/tab_quest = 퀘스트
ui/inventory/search = 인벤토리 검색...
ui/inventory/sort_type = 유형순
ui/inventory/sort_name = 이름순
ui/inventory/sort_cost = 가격순
ui/inventory/sort_count = 개수순
ui/inventory/shown = {1}개 중 {0}개 표시
ui/inventory/hint_select = 좌클릭 — 선택 · 액션은 상세 정보에
ui/inventory/stack = 묶음
ui/inventory/id = ID
ui/inventory/action = 액션
ui/inventory/verb = 동사
ui/inventory/props_header = 속성 · PropertyData
ui/inventory/props_none = 속성 없음
ui/inventory/no_action = ItemAction 없음 — 아직 사용할 수 없는 아이템
ui/inventory/cost = 가격
ui/inventory/empty = 인벤토리가 비어 있습니다
ui/inventory/select = 목록에서 아이템을 고르세요
ui/inventory/ap = AP
ui/inventory/ap_cost = −1 AP
ui/inventory/used = 사용함: {0}
ui/inventory/used_recipe = 레시피를 배웠다: {0}
ui/inventory/use_failed = UseAction → false: 아이템이 소모되지 않았습니다
ui/inventory/dropped = 버림: {0} ×{1}
ui/inventory/applied = 적용: {0} → {1}
ui/inventory/applied_failed = 대상이 효과를 받지 않았습니다 — 아이템이 소모되지 않았습니다
ui/inventory/drop_cant = 버릴 수 없음 (CantDrop)
ui/inventory/type_quest = 퀘스트
ui/inventory/type_used = 사용 가능
ui/inventory/type_target = 대상 지정
ui/inventory/type_food = 음식
ui/inventory/type_resource = 자원
ui/inventory/type_recipe = 레시피
ui/inventory/type_cant_drop = 버릴 수 없음
ui/inventory/verb_use = 사용
ui/inventory/verb_eat = 먹기
ui/inventory/verb_target = 대상에게 사용
ui/inventory/verb_recipe = 레시피 배우기
ui/inventory/tag_recipe = 레시피
ui/inventory/tag_target = 대상
ui/inventory/tag_food = 음료
ui/inventory/tag_use = 사용
# --- Map ---
ui/map/title = 지도
ui/map/close = 닫기
ui/map/subtitle = 북부 지구
ui/map/zone_count = 장소 {0}곳
ui/map/legend_current = 현재 위치
ui/map/legend_available = 갈 수 있음
ui/map/legend_locked = 닫힘
ui/map/hint = 표식을 좌클릭 — 장소 선택 · Esc — 지도 닫기
ui/map/current = 현재 위치
ui/map/available = 갈 수 있음
ui/map/locked = 닫힘
ui/map/you_are_here = 현재 위치
ui/map/closed_note = 닫힘
ui/map/go = 이동
ui/map/here = 현재 위치
ui/map/transition = 전환
ui/map/card_hint = 아래 버튼으로 장면을 바꿉니다. Esc — 지도 닫기.
ui/map/locked_message = 아직 길이 열리지 않았습니다.
ui/map/empty = 지도를 쓸 수 없음
ui/map/empty_hint = 배경 map.png를 찾지 못했습니다 — 모드에 배경과 map/*.json 구역 파일을 추가하세요.
# --- Skills ---
ui/skills/title = 스킬
ui/skills/grants_action = 액션 카드를 부여
ui/skills/side_title = 카드 연구
ui/skills/collection = 컬렉션
ui/skills/search = 컬렉션 검색…
ui/skills/sort_rarity = 희귀도순
ui/skills/sort_type = 유형순
ui/skills/sort_name = 이름순
ui/skills/filter_all = 전체
ui/skills/filter_rarities = 모든 희귀도
ui/skills/hint = 좌클릭 — 카드 살펴보기 · 테두리와 빛은 희귀도를 따릅니다
ui/skills/reset = 필터 초기화
ui/skills/empty = 아직 스킬이 없습니다
ui/skills/nothing_found = 아무것도 찾지 못했습니다
ui/skills/no_effects = 아직 영구 효과가 없습니다
ui/skills/collection_effect = 컬렉션 효과
ui/skills/collection_effect_hint = 컬렉션 전체 합계 · 즉시 갱신
ui/skills/rarity/common = 일반
ui/skills/rarity/uncommon = 고급
ui/skills/rarity/rare = 희귀
ui/skills/rarity/epic = 영웅
ui/skills/rarity/legendary = 전설
ui/skills/type/active = 액티브
ui/skills/type/passive = 패시브
ui/skills/type/for_character = 캐릭터용
# --- Quest Journal ---
ui/journal/title = 일지
ui/journal/active = 진행 중
ui/journal/completed = 완료
ui/journal/close = 닫기
ui/journal/empty = 퀘스트 없음
ui/journal/toc = 목차
ui/journal/entry_header = 항목
ui/journal/entry_of = 항목 {0} / {1}
ui/journal/finished = 완료
ui/journal/seals = 인장
ui/journal/no_entries = 이 항목의 페이지는 아직 비어 있습니다. 이야기가 진행되면 글자가 나타납니다.
tools/unsaved_title = 저장하지 않은 변경
tools/unsaved_text = 저장하지 않은 변경이 있습니다. 저장하지 않고 닫을까요?
tools/unsaved_discard_text = 저장하지 않은 변경이 있습니다. 버릴까요?
tools/window_maximize = 최대화 / 복원 (제목 더블클릭)
tools/window_close = 닫기
tools/menu_title = 도구
+1 -2
View File
@@ -100,6 +100,7 @@ ui/save/game_day = День {day}, {time}
ui/save/party_size = Отряд: {count} ui/save/party_size = Отряд: {count}
# --- GameMenu --- # --- GameMenu ---
menu/title = Меню
menu/resume = Вернуться menu/resume = Вернуться
menu/save = Сохранить menu/save = Сохранить
menu/load = Загрузить menu/load = Загрузить
@@ -258,8 +259,6 @@ ui/journal/entry_of = Запись {0} из {1}
ui/journal/finished = Завершено ui/journal/finished = Завершено
ui/journal/seals = Печати ui/journal/seals = Печати
ui/journal/no_entries = Страницы этой записи ещё пусты. Чернила появятся, когда история сдвинется с места. ui/journal/no_entries = Страницы этой записи ещё пусты. Чернила появятся, когда история сдвинется с места.
mod_ui_base_name = Интерфейс
mod_ui_base_desc = Подсистема UI движка: набор виджетов (Widget/ModWidget, списки), ViewBox фона, тулбар ToolBox, GameMenu/SaveIcon, панели уведомлений, дизайн-система UiKit и DeviceInput. Ядро работает с модом через контракты IWidget/IToolbarHost и мосты.
tools/unsaved_title = Есть изменения tools/unsaved_title = Есть изменения
tools/unsaved_text = У вас есть несохранённые изменения. Закрыть без сохранения? tools/unsaved_text = У вас есть несохранённые изменения. Закрыть без сохранения?
+268
View File
@@ -0,0 +1,268 @@
# --- scenes/battle/winground.tscn ---
ui/battle/victory = Chiến thắng
ui/battle/victory/return = Tiếp tục
ui/battle/victory/loot_title = Chiến lợi phẩm:
# --- scenes/battle/deadground.tscn ---
ui/battle/defeat = Thất bại
ui/battle/endgame/to_main_menu = Menu chính
# --- scenes/battle/battle.tscn ---
ui/battle/next = Kết thúc lượt
# --- scenes/menu/main_menu.tscn ---
menu/newgame = Trò chơi mới
ui/menu/load = Tải
menu/settings = Cài đặt
menu/exit = Thoát
# --- Mods ---
mods/title = Mod
mods/enable = Bật
mods/disable = Tắt
mods/enabled = Đã bật
mods/disabled = Đã tắt
mods/disabled_reason = Đã tắt
mods/dep_disabled_reason = Phụ thuộc "{0}" đang tắt
mods/not_in_game_reason = Không thuộc game "{0}"
mods/dependency_disabled = Phụ thuộc đang tắt
mods/invalid_dep_format = Định dạng phụ thuộc không hợp lệ: "{0}"
mods/required_mod_not_loaded = Mod cần thiết "{0}" chưa được tải
mods/version_mismatch = Không khớp phiên bản: cần {0}, tìm thấy {1}
mods/restart_required = Cần khởi động lại để thay đổi có hiệu lực
mods/back = Quay lại
mods/author = Tác giả
mods/version = Phiên bản
mods/depends = Phụ thuộc
mods/used_by = Được dùng bởi
mods/overrides_title = Ghi đè
mods/reset_order = Đặt lại thứ tự
mods/reset_order_title = Đặt lại thứ tự
mods/reset_order_text = Bạn có chắc muốn đặt lại thứ tự mod? Nó sẽ được tính lại tự động
mods/reset_order_confirm = Có
mods/reset_order_cancel = Hủy
mods/tab_device = Thiết bị
mods/tab_network = Mạng
mods/network_refresh = Làm mới
mods/network_loading = Đang tải danh mục...
mods/network_ready = Đã tải danh mục
mods/network_empty = Không có mod trong danh mục
mods/network_error = Không tải được danh mục
mods/network_no_urls = Chưa cấu hình URL danh mục
mods/status_installed = Đã cài
mods/status_update_available = Có bản cập nhật
mods/status_not_installed = Chưa cài
mods/status_modified = Đã sửa cục bộ
mods/catalog_export = Xuất sang danh mục
mods/catalog_title = Xuất mục danh mục
mods/catalog_download_url = URL tải xuống
mods/catalog_category = Thể loại
mods/category_story = Cốt truyện
mods/category_characters = Nhân vật
mods/category_gameplay = Lối chơi
mods/category_visual = Hình ảnh
mods/category_audio = Âm thanh
mods/category_ui = Giao diện
mods/category_locale = Ngôn ngữ
mods/category_library = Thư viện
mods/category_engine = Engine
mods/category_overhaul = Đại tu
mods/category_tools = Công cụ
mods/category_editor = Trình sửa
mods/category_debug = Gỡ lỗi
mods/category_other = Khác
mods/catalog_tags = Thẻ (cách nhau bằng dấu phẩy)
mods/catalog_changelog = Nhật ký thay đổi
mods/catalog_status = Trạng thái
mods/catalog_min_game_version = Phiên bản game tối thiểu
mods/catalog_icon_url = URL biểu tượng
mods/catalog_copy = Sao chép JSON
mods/catalog_export_file = Xuất ra tệp
mods/catalog_close = Đóng
mods/install_button = Cài đặt
mods/update_button = Cập nhật
mods/overwrite_button = Ghi đè
mods/downgrade_button = Hạ phiên bản
mods/restart_button = Cần khởi động lại
mods/installing = Đang cài...
mods/install_complete = Cài xong. Cần khởi động lại.
mods/install_failed = Cài đặt thất bại. Xem nhật ký để biết chi tiết.
# --- Save/Load ---
ui/load/title = Tải
ui/save/title = Lưu
ui/save/empty = Trống
ui/save/overwrite_title = Ghi đè bản lưu
ui/save/overwrite_text = Ô này đã có bản lưu. Ghi đè?
ui/save/save_button = Ghi đè
ui/save/cancel_button = Hủy
ui/save/game_day = Ngày {day}, {time}
ui/save/party_size = Tổ đội: {count}
# --- GameMenu ---
menu/title = Menu
menu/resume = Tiếp tục
menu/save = Lưu
menu/load = Tải
menu/main_menu = Menu chính
# --- Character Panel ---
ui/character_panel/title = Hành động của nhân vật
ui/character_panel/reset = Đặt lại
ui/character_panel/close = Đóng
ui/character_panel/reset_title = Đặt lại phân bổ hành động
ui/character_panel/reset_text = Bạn có chắc muốn đặt lại mọi phân bổ hành động? Hành động của nhân vật sẽ trở về mặc định, các hành động đã thu thập vẫn ở trong kho.
ui/character_panel/reset_ok = Đặt lại
ui/character_panel/reset_cancel = Hủy
ui/character_panel/party = Tổ đội
ui/character_panel/party_sub = 3 ô cho mỗi nhân vật · thẻ chưa dùng chờ trong kho
ui/character_panel/template = mẫu: {0}
ui/character_panel/pool_title = Kho hành động
ui/character_panel/search = Tìm theo tên hoặc ID...
ui/character_panel/filter_all = Tất cả
ui/character_panel/type_enemy = Nhắm kẻ địch
ui/character_panel/type_alias = Nhắm đồng đội
ui/character_panel/type_self = Nhắm bản thân
ui/character_panel/type_passive = Bị động
ui/character_panel/type_active = Chủ động
ui/character_panel/cost = {0} AP
ui/character_panel/cooldown = Hồi chiêu {0}
ui/character_panel/slot = Ô {0}
ui/character_panel/slot_empty = + ô trống — kéo một thẻ vào đây
ui/character_panel/assigned = Đã gán {0}/{1} · trong kho {2}
ui/character_panel/hint_select = chọn một thẻ, rồi chọn một ô
ui/character_panel/drag_hint = Kéo thẻ vào ô · ô↔ô để đổi chỗ
ui/character_panel/pool_hint = Thẻ vẫn thuộc về người chơi khi ở trong kho. Được phép trùng lặp.
ui/character_panel/pool_empty = Kho trống — các hành động thu thập được sẽ xuất hiện ở đây
ui/character_panel/nothing_found = Không tìm thấy gì
ui/character_panel/stat_hp = HP
ui/character_panel/stat_ap = AP
ui/character_panel/stat_atk = ATK
ui/character_panel/stat_def = DEF
# --- Inventory ---
ui/inventory/title = Túi đồ
ui/inventory/use = Dùng
ui/inventory/drop = Vứt
ui/inventory/drop_all = Tất cả
ui/inventory/drop_confirm = Vứt
ui/inventory/drop_quantity = Vứt
ui/inventory/close = Đóng
ui/inventory/no_ap = Không đủ AP
ui/inventory/select_target = Chọn mục tiêu
ui/inventory/cancel = Hủy
ui/inventory/tab_all = Tất cả
ui/inventory/tab_food = Đồ ăn
ui/inventory/tab_resource = Tài nguyên
ui/inventory/tab_recipe = Công thức
ui/inventory/tab_quest = Nhiệm vụ
ui/inventory/search = Tìm trong túi đồ...
ui/inventory/sort_type = Theo loại
ui/inventory/sort_name = Theo tên
ui/inventory/sort_cost = Theo giá
ui/inventory/sort_count = Theo số lượng
ui/inventory/shown = Hiển thị {0} trên {1}
ui/inventory/hint_select = Chuột trái — chọn · hành động trong phần chi tiết
ui/inventory/stack = Chồng
ui/inventory/id = ID
ui/inventory/action = Hành động
ui/inventory/verb = Động từ
ui/inventory/props_header = Thuộc tính · PropertyData
ui/inventory/props_none = không có thuộc tính
ui/inventory/no_action = Không có ItemAction — vật phẩm chưa dùng được
ui/inventory/cost = Giá
ui/inventory/empty = Túi đồ trống
ui/inventory/select = Chọn một vật phẩm trong danh sách
ui/inventory/ap = AP
ui/inventory/ap_cost = −1 AP
ui/inventory/used = Đã dùng: {0}
ui/inventory/used_recipe = Đã học công thức: {0}
ui/inventory/use_failed = UseAction → false: vật phẩm không bị tiêu hao
ui/inventory/dropped = Đã vứt: {0} ×{1}
ui/inventory/applied = Đã áp dụng: {0} → {1}
ui/inventory/applied_failed = Mục tiêu không nhận hiệu ứng — vật phẩm không bị tiêu hao
ui/inventory/drop_cant = Không thể vứt (CantDrop)
ui/inventory/type_quest = Nhiệm vụ
ui/inventory/type_used = Dùng được
ui/inventory/type_target = Có mục tiêu
ui/inventory/type_food = Đồ ăn
ui/inventory/type_resource = Tài nguyên
ui/inventory/type_recipe = Công thức
ui/inventory/type_cant_drop = Không thể vứt
ui/inventory/verb_use = Dùng
ui/inventory/verb_eat = Ăn
ui/inventory/verb_target = Dùng lên mục tiêu
ui/inventory/verb_recipe = Học công thức
ui/inventory/tag_recipe = công thức
ui/inventory/tag_target = mục tiêu
ui/inventory/tag_food = đồ uống
ui/inventory/tag_use = dùng
# --- Map ---
ui/map/title = Bản đồ
ui/map/close = Đóng
ui/map/subtitle = Quận phía bắc
ui/map/zone_count = {0} địa điểm
ui/map/legend_current = bạn ở đây
ui/map/legend_available = có thể đến
ui/map/legend_locked = đã đóng
ui/map/hint = Chuột trái vào điểm đánh dấu — chọn địa điểm · Esc — đóng bản đồ
ui/map/current = Bạn ở đây
ui/map/available = Có thể đến
ui/map/locked = Đã đóng
ui/map/you_are_here = bạn ở đây
ui/map/closed_note = đã đóng
ui/map/go = Di chuyển
ui/map/here = Bạn ở đây
ui/map/transition = Chuyển cảnh
ui/map/card_hint = Nút bên dưới chuyển cảnh. Esc — đóng bản đồ.
ui/map/locked_message = Con đường chưa mở.
ui/map/empty = Bản đồ không khả dụng
ui/map/empty_hint = Không tìm thấy phông nền map.png — hãy thêm phông nền và các tệp vùng map/*.json vào một mod.
# --- Skills ---
ui/skills/title = Kỹ năng
ui/skills/grants_action = Cấp một thẻ hành động
ui/skills/side_title = Nghiên cứu thẻ
ui/skills/collection = Bộ sưu tập
ui/skills/search = Tìm trong bộ sưu tập…
ui/skills/sort_rarity = Theo độ hiếm
ui/skills/sort_type = Theo loại
ui/skills/sort_name = Theo tên
ui/skills/filter_all = Tất cả
ui/skills/filter_rarities = Mọi độ hiếm
ui/skills/hint = Chuột trái — xem thẻ · khung và ánh sáng theo độ hiếm
ui/skills/reset = Đặt lại bộ lọc
ui/skills/empty = Chưa có kỹ năng nào
ui/skills/nothing_found = Không tìm thấy gì
ui/skills/no_effects = Chưa có hiệu ứng vĩnh viễn
ui/skills/collection_effect = Hiệu ứng bộ sưu tập
ui/skills/collection_effect_hint = Tổng của cả bộ sưu tập · cập nhật tức thì
ui/skills/rarity/common = Thường
ui/skills/rarity/uncommon = Khá hiếm
ui/skills/rarity/rare = Hiếm
ui/skills/rarity/epic = Sử thi
ui/skills/rarity/legendary = Huyền thoại
ui/skills/type/active = Chủ động
ui/skills/type/passive = Bị động
ui/skills/type/for_character = Cho nhân vật
# --- Quest Journal ---
ui/journal/title = Nhật ký
ui/journal/active = Đang làm
ui/journal/completed = Đã xong
ui/journal/close = Đóng
ui/journal/empty = Không có nhiệm vụ
ui/journal/toc = Mục lục
ui/journal/entry_header = Mục
ui/journal/entry_of = Mục {0} trên {1}
ui/journal/finished = Đã xong
ui/journal/seals = Ấn triện
ui/journal/no_entries = Các trang của mục này vẫn còn trống. Mực sẽ hiện ra khi câu chuyện tiếp diễn.
tools/unsaved_title = Thay đổi chưa lưu
tools/unsaved_text = Bạn có thay đổi chưa lưu. Đóng mà không lưu?
tools/unsaved_discard_text = Có thay đổi chưa lưu. Bỏ chúng?
tools/window_maximize = Phóng to / khôi phục (nhấp đúp vào tiêu đề)
tools/window_close = Đóng
tools/menu_title = Công cụ
+268
View File
@@ -0,0 +1,268 @@
# --- scenes/battle/winground.tscn ---
ui/battle/victory = 胜利
ui/battle/victory/return = 继续
ui/battle/victory/loot_title = 战利品:
# --- scenes/battle/deadground.tscn ---
ui/battle/defeat = 失败
ui/battle/endgame/to_main_menu = 主菜单
# --- scenes/battle/battle.tscn ---
ui/battle/next = 结束回合
# --- scenes/menu/main_menu.tscn ---
menu/newgame = 新游戏
ui/menu/load = 读取
menu/settings = 设置
menu/exit = 退出
# --- Mods ---
mods/title = 模组
mods/enable = 启用
mods/disable = 停用
mods/enabled = 已启用
mods/disabled = 已停用
mods/disabled_reason = 已停用
mods/dep_disabled_reason = 依赖"{0}"已停用
mods/not_in_game_reason = 不属于游戏"{0}"
mods/dependency_disabled = 依赖已停用
mods/invalid_dep_format = 依赖格式无效:"{0}"
mods/required_mod_not_loaded = 所需模组"{0}"未加载
mods/version_mismatch = 版本不匹配:需要 {0},找到 {1}
mods/restart_required = 需要重启才能使更改生效
mods/back = 返回
mods/author = 作者
mods/version = 版本
mods/depends = 依赖
mods/used_by = 被使用于
mods/overrides_title = 覆盖项
mods/reset_order = 重置顺序
mods/reset_order_title = 重置顺序
mods/reset_order_text = 确定要重置模组顺序吗?它会被自动重新计算
mods/reset_order_confirm = 是
mods/reset_order_cancel = 取消
mods/tab_device = 设备
mods/tab_network = 网络
mods/network_refresh = 刷新
mods/network_loading = 正在加载目录...
mods/network_ready = 目录已加载
mods/network_empty = 目录中没有模组
mods/network_error = 无法加载目录
mods/network_no_urls = 没有配置目录 URL
mods/status_installed = 已安装
mods/status_update_available = 有可用更新
mods/status_not_installed = 未安装
mods/status_modified = 本地已修改
mods/catalog_export = 导出到目录
mods/catalog_title = 导出目录条目
mods/catalog_download_url = 下载 URL
mods/catalog_category = 分类
mods/category_story = 剧情
mods/category_characters = 角色
mods/category_gameplay = 玩法
mods/category_visual = 视觉
mods/category_audio = 音频
mods/category_ui = 界面
mods/category_locale = 语言
mods/category_library = 库
mods/category_engine = 引擎
mods/category_overhaul = 大型改动
mods/category_tools = 工具
mods/category_editor = 编辑器
mods/category_debug = 调试
mods/category_other = 其他
mods/catalog_tags = 标签(逗号分隔)
mods/catalog_changelog = 更新日志
mods/catalog_status = 状态
mods/catalog_min_game_version = 最低游戏版本
mods/catalog_icon_url = 图标 URL
mods/catalog_copy = 复制 JSON
mods/catalog_export_file = 导出到文件
mods/catalog_close = 关闭
mods/install_button = 安装
mods/update_button = 更新
mods/overwrite_button = 覆盖
mods/downgrade_button = 降级
mods/restart_button = 需要重启
mods/installing = 正在安装...
mods/install_complete = 安装完成。需要重启。
mods/install_failed = 安装失败。详情请查看日志。
# --- Save/Load ---
ui/load/title = 读取
ui/save/title = 保存
ui/save/empty = 空
ui/save/overwrite_title = 覆盖存档
ui/save/overwrite_text = 这个栏位已有存档。要覆盖吗?
ui/save/save_button = 覆盖
ui/save/cancel_button = 取消
ui/save/game_day = 第 {day} 天,{time}
ui/save/party_size = 队伍:{count}
# --- GameMenu ---
menu/title = 菜单
menu/resume = 继续
menu/save = 保存
menu/load = 读取
menu/main_menu = 主菜单
# --- Character Panel ---
ui/character_panel/title = 角色行动
ui/character_panel/reset = 重置
ui/character_panel/close = 关闭
ui/character_panel/reset_title = 重置行动分配
ui/character_panel/reset_text = 确定要重置所有行动分配吗?角色的行动会恢复默认,收集到的行动会留在池中。
ui/character_panel/reset_ok = 重置
ui/character_panel/reset_cancel = 取消
ui/character_panel/party = 队伍
ui/character_panel/party_sub = 每个角色 3 个栏位 · 未使用的卡牌在池中等待
ui/character_panel/template = 模板:{0}
ui/character_panel/pool_title = 行动池
ui/character_panel/search = 按名称或 ID 搜索...
ui/character_panel/filter_all = 全部
ui/character_panel/type_enemy = 目标敌人
ui/character_panel/type_alias = 目标队友
ui/character_panel/type_self = 目标自己
ui/character_panel/type_passive = 被动
ui/character_panel/type_active = 主动
ui/character_panel/cost = {0} AP
ui/character_panel/cooldown = 冷却 {0}
ui/character_panel/slot = 栏位 {0}
ui/character_panel/slot_empty = + 空栏位——把卡牌拖到这里
ui/character_panel/assigned = 已分配 {0}/{1} · 池中 {2}
ui/character_panel/hint_select = 先选卡牌,再选栏位
ui/character_panel/drag_hint = 把卡牌拖进栏位 · 栏位之间可交换
ui/character_panel/pool_hint = 卡牌在池中时仍归玩家所有。允许重复。
ui/character_panel/pool_empty = 池是空的——收集到的行动会出现在这里
ui/character_panel/nothing_found = 什么都没找到
ui/character_panel/stat_hp = HP
ui/character_panel/stat_ap = AP
ui/character_panel/stat_atk = 攻击
ui/character_panel/stat_def = 防御
# --- Inventory ---
ui/inventory/title = 背包
ui/inventory/use = 使用
ui/inventory/drop = 丢弃
ui/inventory/drop_all = 全部
ui/inventory/drop_confirm = 丢弃
ui/inventory/drop_quantity = 丢弃
ui/inventory/close = 关闭
ui/inventory/no_ap = AP 不足
ui/inventory/select_target = 选择目标
ui/inventory/cancel = 取消
ui/inventory/tab_all = 全部
ui/inventory/tab_food = 食物
ui/inventory/tab_resource = 资源
ui/inventory/tab_recipe = 配方
ui/inventory/tab_quest = 任务
ui/inventory/search = 搜索背包...
ui/inventory/sort_type = 按类型
ui/inventory/sort_name = 按名称
ui/inventory/sort_cost = 按价格
ui/inventory/sort_count = 按数量
ui/inventory/shown = 显示 {1} 个中的 {0} 个
ui/inventory/hint_select = 左键——选择 · 行动在详情中
ui/inventory/stack = 堆叠
ui/inventory/id = ID
ui/inventory/action = 动作
ui/inventory/verb = 动词
ui/inventory/props_header = 属性 · PropertyData
ui/inventory/props_none = 没有属性
ui/inventory/no_action = 没有 ItemAction——物品暂时无法使用
ui/inventory/cost = 价格
ui/inventory/empty = 背包是空的
ui/inventory/select = 在列表中选择一个物品
ui/inventory/ap = AP
ui/inventory/ap_cost = −1 AP
ui/inventory/used = 已使用:{0}
ui/inventory/used_recipe = 学会了配方:{0}
ui/inventory/use_failed = UseAction → false:物品未被消耗
ui/inventory/dropped = 已丢弃:{0} ×{1}
ui/inventory/applied = 已作用:{0} → {1}
ui/inventory/applied_failed = 目标没有接受效果——物品未被消耗
ui/inventory/drop_cant = 无法丢弃(CantDrop)
ui/inventory/type_quest = 任务
ui/inventory/type_used = 可使用
ui/inventory/type_target = 需要目标
ui/inventory/type_food = 食物
ui/inventory/type_resource = 资源
ui/inventory/type_recipe = 配方
ui/inventory/type_cant_drop = 不可丢弃
ui/inventory/verb_use = 使用
ui/inventory/verb_eat = 吃
ui/inventory/verb_target = 对目标使用
ui/inventory/verb_recipe = 学习配方
ui/inventory/tag_recipe = 配方
ui/inventory/tag_target = 目标
ui/inventory/tag_food = 饮品
ui/inventory/tag_use = 使用
# --- Map ---
ui/map/title = 地图
ui/map/close = 关闭
ui/map/subtitle = 北区
ui/map/zone_count = {0} 个地点
ui/map/legend_current = 你在这里
ui/map/legend_available = 可前往
ui/map/legend_locked = 已关闭
ui/map/hint = 左键点击标记——选择地点 · Esc——关闭地图
ui/map/current = 你在这里
ui/map/available = 可前往
ui/map/locked = 已关闭
ui/map/you_are_here = 你在这里
ui/map/closed_note = 已关闭
ui/map/go = 前往
ui/map/here = 你在这里
ui/map/transition = 切换
ui/map/card_hint = 下方的按钮会切换场景。Esc——关闭地图。
ui/map/locked_message = 道路尚未开放。
ui/map/empty = 地图不可用
ui/map/empty_hint = 找不到背景 map.png——请在模组中加入该背景和 map/*.json 区域文件。
# --- Skills ---
ui/skills/title = 技能
ui/skills/grants_action = 授予一张行动卡
ui/skills/side_title = 研究卡牌
ui/skills/collection = 收藏
ui/skills/search = 搜索收藏…
ui/skills/sort_rarity = 按稀有度
ui/skills/sort_type = 按类型
ui/skills/sort_name = 按名称
ui/skills/filter_all = 全部
ui/skills/filter_rarities = 全部稀有度
ui/skills/hint = 左键——研究卡牌 · 边框和光芒随稀有度变化
ui/skills/reset = 重置筛选
ui/skills/empty = 还没有技能
ui/skills/nothing_found = 什么都没找到
ui/skills/no_effects = 还没有永久效果
ui/skills/collection_effect = 收藏效果
ui/skills/collection_effect_hint = 整个收藏的总和 · 即时更新
ui/skills/rarity/common = 普通
ui/skills/rarity/uncommon = 优秀
ui/skills/rarity/rare = 稀有
ui/skills/rarity/epic = 史诗
ui/skills/rarity/legendary = 传说
ui/skills/type/active = 主动
ui/skills/type/passive = 被动
ui/skills/type/for_character = 用于角色
# --- Quest Journal ---
ui/journal/title = 日志
ui/journal/active = 进行中
ui/journal/completed = 已完成
ui/journal/close = 关闭
ui/journal/empty = 没有任务
ui/journal/toc = 目录
ui/journal/entry_header = 条目
ui/journal/entry_of = 第 {0} 条,共 {1} 条
ui/journal/finished = 已完成
ui/journal/seals = 印记
ui/journal/no_entries = 这个条目的页面还是空的。随着故事推进,墨迹会出现。
tools/unsaved_title = 未保存的更改
tools/unsaved_text = 你有未保存的更改。不保存就关闭吗?
tools/unsaved_discard_text = 有未保存的更改。要放弃吗?
tools/window_maximize = 最大化 / 还原(双击标题)
tools/window_close = 关闭
tools/menu_title = 工具
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = Lớp giao diện mà mọi game dùng chung: thanh công cụ, menu trong game, biểu tượng lưu, thông báo và diện mạo thống nhất của bảng điều khiển, nút bấm, danh sách.
+2
View File
@@ -0,0 +1,2 @@
mod_ui_base_name = UI
mod_ui_base_desc = 所有游戏共用的界面层:工具栏、游戏内菜单、存档指示器、通知,以及面板、按钮和列表的统一外观。
+1 -1
View File
@@ -3,7 +3,7 @@
"name": "UI", "name": "UI",
"version": "1.0.0", "version": "1.0.0",
"author": "ct", "author": "ct",
"description": "Engine UI subsystem: widget toolkit (Widget/ModWidget/lists), ViewBox background viewport, ToolBox toolbar, GameMenu/SaveIcon, notification panels, UiKit design system, DeviceInput. Kernel keeps only contracts (IWidget, IDialogBox, IToolbarHost, ISaveIconHost, IBackgroundView, IUiLazyConstruct, MenuRegistry, ToolFactory, NotificationBuffer, SceneEventController, CthangoverTheme/UiTokens boot styling) and drives this mod through those seams.", "description": "The interface layer every game shares: the toolbar, the in-game menu, the save indicator, notifications and the common look of panels, buttons and lists.",
"category": "ui", "category": "ui",
"depends": [], "depends": [],
"sources": [ "sources": [
+3
View File
@@ -22,6 +22,7 @@ namespace Cthangover.Mods.Interface.Menu
private ISettingsPanel _settingsPanel; private ISettingsPanel _settingsPanel;
private ISaveLoadPanel _saveLoadPanel; private ISaveLoadPanel _saveLoadPanel;
private Button _saveBtn; private Button _saveBtn;
private Label _title;
private readonly Dictionary<Button, string> _btnKeys = new(); private readonly Dictionary<Button, string> _btnKeys = new();
/// <summary>Wires menu buttons, instantiates the hidden settings and save/load panels from the <see cref="MenuRegistry"/>, and subscribes to language changes.</summary> /// <summary>Wires menu buttons, instantiates the hidden settings and save/load panels from the <see cref="MenuRegistry"/>, and subscribes to language changes.</summary>
@@ -42,6 +43,7 @@ namespace Cthangover.Mods.Interface.Menu
_btnKeys[GetNode<Button>("Panel/Margin/VBox/SettingsBtn")] = "menu/settings"; _btnKeys[GetNode<Button>("Panel/Margin/VBox/SettingsBtn")] = "menu/settings";
_btnKeys[GetNode<Button>("Panel/Margin/VBox/MainMenuBtn")] = "menu/main_menu"; _btnKeys[GetNode<Button>("Panel/Margin/VBox/MainMenuBtn")] = "menu/main_menu";
_btnKeys[GetNode<Button>("Panel/Margin/VBox/ExitBtn")] = "menu/exit"; _btnKeys[GetNode<Button>("Panel/Margin/VBox/ExitBtn")] = "menu/exit";
_title = GetNode<Label>("Panel/Margin/VBox/Title");
AttachPanel(MenuRegistry.OpenPanel("settings")); AttachPanel(MenuRegistry.OpenPanel("settings"));
AttachPanel(MenuRegistry.OpenPanel("save_load")); AttachPanel(MenuRegistry.OpenPanel("save_load"));
@@ -92,6 +94,7 @@ namespace Cthangover.Mods.Interface.Menu
{ {
foreach (var kv in _btnKeys) foreach (var kv in _btnKeys)
kv.Key.Text = TranslationServer.Translate(kv.Value); kv.Key.Text = TranslationServer.Translate(kv.Value);
_title.Text = TranslationServer.Translate("menu/title");
} }
private void OnReturnClick() private void OnReturnClick()
+72
View File
@@ -0,0 +1,72 @@
using System.Collections.Generic;
using Cthangover.Core.UI.Theming;
using Godot;
namespace Cthangover.Mods.Interface.Theming
{
/// <summary>
/// Shared source palettes for editable fields and read-only previews.
/// Each call returns a new highlighter: Godot binds it to one TextEdit and
/// keeps a per-document cache, so sharing a resource between editors would
/// mix their text. Scenario commands are supplied by the caller to keep
/// the UI toolkit independent of the dialog engine.
/// </summary>
public static class SourceSyntax
{
/// <summary>Colours JSON strings, numbers, punctuation and literal values, including unfinished input.</summary>
public static CodeHighlighter CreateJsonHighlighter()
{
var highlighter = CreateBase();
highlighter.AddColorRegion("\"", "\"", UiTokens.AccentBright);
return highlighter;
}
/// <summary>Colours Godot text scene/resource sections, strings, constructors, numbers and comments.</summary>
public static CodeHighlighter CreateTscnHighlighter()
{
var highlighter = CreateBase();
highlighter.FunctionColor = UiTokens.TypeTarget;
highlighter.AddColorRegion("\"", "\"", UiTokens.AccentBright);
highlighter.AddColorRegion(";", "", UiTokens.Faint, true);
foreach (var section in new[] { "gd_scene", "gd_resource", "ext_resource", "sub_resource", "resource", "node", "connection", "editable" })
highlighter.AddKeywordColor(section, UiTokens.TypeTarget);
return highlighter;
}
/// <summary>Colours scenario commands, named arguments, quoted dialogue, labels and comments.</summary>
public static CodeHighlighter CreateScenarioHighlighter(IEnumerable<string> commands)
{
var highlighter = CreateBase();
if (commands != null)
{
foreach (var command in commands)
highlighter.AddKeywordColor(command, UiTokens.Info);
}
highlighter.AddKeywordColor("select", UiTokens.Info);
highlighter.AddKeywordColor("option", UiTokens.Info);
foreach (var argument in new[] {
"key", "first", "second", "hide_color", "wait", "speed", "hidden",
"sprites", "loop", "target", "quest_id", "show", "hide", "duration"
})
highlighter.AddKeywordColor(argument, UiTokens.Accent);
highlighter.AddColorRegion("\"", "\"", UiTokens.AccentBright);
highlighter.AddColorRegion("#", "", UiTokens.Faint, true);
highlighter.AddColorRegion(":", " ", UiTokens.TypeTarget, true);
return highlighter;
}
private static CodeHighlighter CreateBase()
{
var highlighter = new CodeHighlighter
{
NumberColor = UiTokens.Info,
SymbolColor = UiTokens.Muted,
FunctionColor = UiTokens.Body,
MemberVariableColor = UiTokens.Body,
};
foreach (var literal in new[] { "true", "false", "null" })
highlighter.AddKeywordColor(literal, UiTokens.TypeTarget);
return highlighter;
}
}
}
+18 -3
View File
@@ -99,15 +99,30 @@ namespace Cthangover.Mods.Interface.View
{ {
var result = layerName?.ToLowerInvariant() switch var result = layerName?.ToLowerInvariant() switch
{ {
"background" => InteractiveLayerBackground ??= CreateLayerDirect("InteractiveLayer_Background", 1), "background" => InteractiveLayerBackground ??= CreateSceneLayer("InteractiveLayer_Background"),
"foreground" => InteractiveLayerForeground ??= CreateLayerDirect("InteractiveLayer_Foreground", 3), "foreground" => InteractiveLayerForeground ??= CreateSceneLayer("InteractiveLayer_Foreground"),
"ui" => InteractiveLayerUI ??= CreateLayerDirect("InteractiveLayer_UI", 5), "ui" => InteractiveLayerUI ??= CreateLayerDirect("InteractiveLayer_UI", 5),
_ => InteractiveLayerForeground ??= CreateLayerDirect("InteractiveLayer_Foreground", 3) _ => InteractiveLayerForeground ??= CreateSceneLayer("InteractiveLayer_Foreground")
}; };
return result; return result;
} }
/// <summary>
/// Creates a layer that belongs to the picture itself. It keeps the default
/// z index and is ordered by its place among the ViewBox children instead: a
/// z index is global to the canvas, so it lifted scene objects over the dialog
/// box, the toolbar and the open panels that follow the ViewBox in the tree.
/// The background layer stays below the foreground one whichever comes first.
/// </summary>
private Control CreateSceneLayer(string name)
{
var layer = CreateLayerDirect(name, 0);
if (InteractiveLayerForeground != null)
MoveChild(layer, InteractiveLayerForeground.GetIndex());
return layer;
}
private Control CreateLayerDirect(string name, int zIndex) private Control CreateLayerDirect(string name, int zIndex)
{ {
var layer = new Control var layer = new Control