Compare commits

..
2 Commits
Author SHA1 Message Date
cthangover 91c9b6f630 Add mod documentation in seven languages 2026-10-29 09:26:17 +01:00
iisaev 0d806a842c gitignore file 2026-10-28 15:20:01 +03:00
27 changed files with 676 additions and 8 deletions

No files matched your search

+1
View File
@@ -12,6 +12,7 @@ obj/
gen/
obj/
bin/
art_sources/
*.tres~
*.tscn~
+37
View File
@@ -0,0 +1,37 @@
{
"settings": [
{
"key": "checks.dice",
"name": "collection_settings/dice",
"description": "collection_settings/dice_hint",
"group": "collection_settings/dice_group",
"type": "choice",
"source": null,
"allow_custom": true,
"automatic": "collection_settings/dice_auto",
"pattern": "^(?:none|0|(?:[1-9][0-9]?|100)?d(?:[2-9]|[1-9][0-9]+))$",
"options": [
{
"value": "d20",
"name": "d20"
},
{
"value": "d6",
"name": "d6"
},
{
"value": "2d6",
"name": "2d6"
},
{
"value": "d100",
"name": "d100"
},
{
"value": "none",
"name": "collection_settings/no_dice"
}
]
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — rolling a stat against a difficulty
Stat Checks adds one scenario command, `check`: take a character's stat, add a dice roll and a bonus, compare the total with a difficulty, and continue the story on success or on failure. A visual novel uses it to persuade a guard, a tile RPG to force a rusty door. The stats themselves come from Stats Engine and the game's rules (in RPG Plus, Classic RPG Rules).
## In the game
In the RPG Plus prologue a stranger stands at a crossroads. One answer names the check it makes — Charisma against 10:
![The crossroads at dusk; the question "What will you say to her?" and two answers: "Politely ask the way [Charisma 10]" and "Walk past in silence".](assets/seer-choice.jpg)
After the answer the roll is shown as one line:
![The dialog box with the line "[Charisma: 11 vs 10] Success".](assets/check-line.jpg)
The hero here is a level 1 rogue with Charisma 8; the d20 rolled 3, so the total is 11 against 10 — a success. The story goes on with the success branch: the stranger gives the hero a charm.
![The success branch: "Polite. Fancy that." She tosses you a clover charm.](assets/check-branch.jpg)
With a total below 10 the line would say *Failure* and the story would take the other branch, where she turns away.
## The scenario behind it
From `rpg_plus_game/scenarios/rpg_plus/prologue.scenario` (lines shortened):
```scenario
option "Politely ask the way [Charisma 10]" -> :ask_way
option "Walk past in silence" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "Polite. Fancy that..."
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "Find it yourself..."
```
`check cha 10` rolls Charisma against difficulty 10. On success it jumps to the label after the arrow, on failure to the `else=` label. Without `else=` a failure simply goes on with the next line.
## The check command
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — a stat id of the game, such as `cha` or `str`.
- `<difficulty>` — the number to reach: the check succeeds when the total is at least this.
- `who=` — a character id, or `player` (the default).
- `dice=` — `d20`, `2d6`, `1d100` and so on. `none` rolls nothing, which makes the check a plain threshold: the stat alone decides, the same way every time — useful in a novel ("brave enough or not").
- `bonus=` — added to the total; it may be negative.
- `else=` — the label for a failure.
- `quiet=1` — do not show the roll line.
The total is **stat + dice + bonus**.
### Default dice
Without `dice=` the check uses the game's setting `checks.dice`, else `d20`. RPG Plus sets it in its collection:
```json
"settings": { "checks.dice": "d20" }
```
A game that wants all its checks without chance sets `"checks.dice": "none"`.
### Telling the result your own way
After a check these dialog variables hold the roll: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc` and `check_result`. With `quiet=1` a `ptext` line can show it in the story's words:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "You push with all your ${check_total}, but the door holds."
```
The standard line is the translation key `checks/line` (`[${check_stat}: ${check_total} vs ${check_dc}] ${check_result}`); a game may override it in its locale files.
## If something goes wrong
1. **The total is only the dice.** The stat id is wrong, or the character has no such stat.
2. **Always the same result.** The game's `checks.dice` is `none`, or `dice=none` is written in the line.
3. **Bad dice text.** A malformed `dice=` rolls nothing rather than breaking the scene, so the check becomes a plain threshold. Write the dice as `d20`, `2d6`, `1d100`.
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — tirar una estadística contra una dificultad
Stat Checks añade un comando de escenario, `check`: toma la estadística de un personaje, suma una tirada de dados y un bonus, compara el total con una dificultad y continúa la historia según salga bien o mal. Una novela visual lo usa para convencer a un guardia; un RPG de tiles, para forzar una puerta oxidada. Las estadísticas en sí vienen de Stats Engine y de las reglas del juego (en RPG Plus, Classic RPG Rules).
## En el juego
En el prólogo de RPG Plus una forastera aguarda en un cruce de caminos. Una de las respuestas anuncia la prueba que supone: Carisma contra 10:
![El cruce al anochecer; la pregunta «¿Qué le dirás?» y dos respuestas: «Preguntar el camino con cortesía [Carisma 10]» y «Pasar de largo en silencio».](assets/seer-choice.jpg)
Tras la respuesta, la tirada se muestra en una sola línea:
![El cuadro de diálogo con la línea «[Carisma: 11 contra 10] Éxito».](assets/check-line.jpg)
El héroe es aquí un pícaro de nivel 1 con Carisma 8; el d20 sacó un 3, así que el total es 11 contra 10: un éxito. La historia sigue por la rama del éxito: la forastera lanza al héroe un amuleto.
![La rama del éxito: «—Educado. Mira tú. —Te lanza un amuleto de trébol».](assets/check-branch.jpg)
Con un total por debajo de 10, la línea diría *Fallo* y la historia tomaría la otra rama, en la que ella se da la vuelta.
## El escenario que hay detrás
De `rpg_plus_game/scenarios/rpg_plus/prologue.scenario` (líneas acortadas):
```scenario
option "Preguntar el camino con cortesía [Carisma 10]" -> :ask_way
option "Pasar de largo en silencio" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "—Educado. Mira tú..."
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "—Ya lo encontrarás..."
```
`check cha 10` tira Carisma contra dificultad 10. Si tiene éxito salta a la etiqueta que sigue a la flecha; si falla, a la etiqueta de `else=`. Sin `else=`, un fallo simplemente continúa con la línea siguiente.
## El comando check
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — un id de estadística del juego, por ejemplo `cha` o `str`.
- `<difficulty>` — el número que hay que alcanzar: la prueba tiene éxito cuando el total llega al menos a eso.
- `who=` — un id de personaje, o `player` (por defecto).
- `dice=` — `d20`, `2d6`, `1d100` y demás. `none` no tira nada: la prueba se convierte en un umbral simple; decide solo la estadística, siempre igual — útil en una novela («lo bastante valiente o no»).
- `bonus=` — se suma al total; puede ser negativo.
- `else=` — la etiqueta del fallo.
- `quiet=1` — no mostrar la línea de la tirada.
El total es **estadística + dados + bonus**.
### Dados por defecto
Sin `dice=`, la prueba usa el ajuste `checks.dice` del juego y, si no existe, `d20`. RPG Plus lo fija en su colección:
```json
"settings": { "checks.dice": "d20" }
```
Un juego que quiera todas sus pruebas sin azar pone `"checks.dice": "none"`.
### Contar el resultado a tu manera
Tras una prueba, estas variables del diálogo guardan la tirada: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc` y `check_result`. Con `quiet=1`, una línea `ptext` puede contarlo con palabras de la historia:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "Apuñas con todo tu ${check_total}, pero la puerta no cede."
```
La línea estándar es la clave de traducción `checks/line` (`[${check_stat}: ${check_total} contra ${check_dc}] ${check_result}`); un juego puede sustituirla en sus archivos de localización.
## Si algo falla
1. **El total es solo los dados.** El id de la estadística está mal, o el personaje no tiene esa estadística.
2. **Siempre el mismo resultado.** El `checks.dice` del juego es `none`, o en la línea está escrito `dice=none`.
3. **Texto de dados roto.** Un `dice=` mal formado no tira nada en lugar de romper la escena, así que la prueba se queda en un umbral simple. Escribe los dados como `d20`, `2d6`, `1d100`.
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — ステータス判定で難易度に挑む
Stat Checks はシナリオにコマンドをひとつ追加します。`check` です。キャラクターのステータスを取り、ダイスの出目とボーナスを加え、合計を難易度と比べて、成功か失敗かで物語を続けます。ビジュアルノベルなら門番を説得し、タイル RPG なら錆びた扉をこじ開けます。ステータスそのものは Stats Engine とゲームのルール(RPG Plus なら Classic RPG Rules)が担います。
## ゲームの中で
RPG Plus のプロローグでは、道が分かれる場所に旅の女が座っています。選択肢のひとつは、その判定——カリスマ対 10——を自ら告げます:
![夕暮れの分かれ道。問いかけ「彼女に何と言う?」と、ふたつの選択肢「丁寧に道を尋ねる[カリスマ 10]」「黙って通り過ぎる」。](assets/seer-choice.jpg)
答えたあと、出目はひとつの行で示されます:
![会話ウィンドウに「[カリスマ: 11 対 10]成功」の行。](assets/check-line.jpg)
ここでの主人公はレベル 1 のローグでカリスマ 8。d20 は 3 が出たので、合計は 11 対 10——成功です。物語は成功の枝へ進み、女は主人公にお守りを投げてよこします。
![成功の枝: 「礼儀正しいね。珍しい」——彼女はクローバーのお守りを放ってよこす。](assets/check-branch.jpg)
合計が 10 に届かなければ、行は *失敗* となり、物語はもう片方の枝——彼女がそっぽを向くほう——へ進んでいたでしょう。
## その裏のシナリオ
`rpg_plus_game/scenarios/rpg_plus/prologue.scenario` から(行は短くしています):
```scenario
option "丁寧に道を尋ねる[カリスマ 10]" -> :ask_way
option "黙って通り過ぎる" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "礼儀正しいね。珍しい…"
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "自分で見つけな…"
```
`check cha 10` はカリスマを難易度 10 に対して振ります。成功なら矢印の先のラベルへ、失敗なら `else=` のラベルへ飛びます。`else=` がなければ、失敗は単に次の行へ続きます。
## check コマンド
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — ゲームのステータス id。たとえば `cha` や `str`。
- `<difficulty>` — 到達すべき数値。合計がこれ以上なら判定は成功。
- `who=` — キャラクターの id、または `player`(既定)。
- `dice=` — `d20`、`2d6`、`1d100` など。`none` は何も振らず、判定は単なるしきい値になります。ステータスだけで決まり、毎回同じ——ノベルならではの使い方(「勇気があるか、ないか」)。
- `bonus=` — 合計に加算。負でもかまいません。
- `else=` — 失敗のときのラベル。
- `quiet=1` — 出目の行を表示しない。
合計は **ステータス + ダイス + ボーナス** です。
### 既定のダイス
`dice=` がなければ、判定はゲーム設定 `checks.dice` を使い、なければ `d20` です。RPG Plus はコレクションで次のように設定しています:
```json
"settings": { "checks.dice": "d20" }
```
偶然を排したいゲームは、`"checks.dice": "none"` と設定します。
### 結果を自分の言葉で語る
判定のあと、これらの会話変数に出目が残ります: `check_stat`、`check_value`、`check_roll`、`check_bonus`、`check_total`、`check_dc`、`check_result`。`quiet=1` と組み合わせれば、`ptext` の行で物語の言葉として語れます:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "${check_total} の力を全部込めて押すが、扉はびくともしない。"
```
標準の行は翻訳キー `checks/line`(`[${check_stat}:${check_total} 対 ${check_dc}] ${check_result}`)です。ゲームはローカライズファイルでこれを差し替えられます。
## うまくいかないとき
1. **合計がダイスのぶんだけ。** ステータスの id が違うか、そのキャラクターにそのステータスがありません。
2. **いつも同じ結果。** ゲームの `checks.dice` が `none` か、行に `dice=none` と書いてあります。
3. **ダイスの書き方が変。** 形の壊れた `dice=` は場を壊すのではなく、何も振らずに済ませるので、判定は単なるしきい値になります。ダイスは `d20`、`2d6`、`1d100` のように書いてください。
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — 능력치로 난이도 굴리기
Stat Checks는 시나리오에 명령 하나를 추가합니다. 바로 `check`입니다. 캐릭터의 능력치를 가져와 주사위 굴림과 보너스를 더하고, 합계를 난이도와 비교한 뒤 성공이냐 실패냐에 따라 이야기를 이어 갑니다. 비주얼 노벨은 이것으로 경비병을 설득하고, 타일 RPG는 녹슨 문을 부수는 데 씁니다. 능력치 자체는 Stats Engine과 게임의 규칙(RPG Plus에서는 Classic RPG Rules)이 가져 옵니다.
## 게임 안에서
RPG Plus 프롤로그에서 길이 갈라지는 자리에 나그네가 앉아 있습니다. 선택지 하나는 자기가 거는 판정 — 매력 대 10 — 을 스스로 밝힙니다:
![해질녘의 갈림길. 질문 "그녀에게 뭐라고 할래?"와 두 선택지: "정중하게 길을 묻는다 [매력 10]", "말없이 지나친다".](assets/seer-choice.jpg)
선택 후에는 굴림이 한 줄로 표시됩니다:
![대화창에 표시된 줄: "[매력: 11 대 10] 성공".](assets/check-line.jpg)
여기서 주인공은 매력 8의 1레벨 무뢰배입니다. d20이 3이 나와 합계는 11 대 10 — 성공입니다. 이야기는 성공 갈래로 이어지고, 나그네는 주인공에게 부적을 던져 줍니다.
![성공 갈래: "예의 바르네. 별일이야." 그녀가 클로버 부적을 던져 준다.](assets/check-branch.jpg)
합계가 10에 미치지 못했다면 그 줄에는 *실패*가 표시되고, 이야기는 그녀가 고개를 돌리는 다른 갈래로 흘러갔을 것입니다.
## 그 뒤의 시나리오
`rpg_plus_game/scenarios/rpg_plus/prologue.scenario`에서 가져 온 것입니다(줄은 줄임):
```scenario
option "정중하게 길을 묻는다 [매력 10]" -> :ask_way
option "말없이 지나친다" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "예의 바르네. 별일이야..."
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "알아서 찾게 될 거야..."
```
`check cha 10`은 매력을 난이도 10에 대해 굴립니다. 성공하면 화살표 뒤의 레이블로, 실패하면 `else=`의 레이블로 건너뜁니다. `else=`가 없으면 실패는 그저 다음 줄로 이어집니다.
## check 명령
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — 게임의 능력치 id. 예: `cha`, `str`.
- `<difficulty>` — 넘어야 할 숫자. 합계가 이것 이상이면 판정은 성공입니다.
- `who=` — 캐릭터 id, 또는 `player`(기본값).
- `dice=` — `d20`, `2d6`, `1d100` 등. `none`은 아무것도 굴리지 않아 판정이 단순 기준선이 됩니다. 능력치만으로, 늘 같은 방식으로 결정됩니다 — 노벨에 유용합니다("충분히 용감한가, 아닌가").
- `bonus=` — 합계에 더해집니다. 음수여도 됩니다.
- `else=` — 실패일 때 갈 레이블.
- `quiet=1` — 굴림 줄을 표시하지 않습니다.
합계는 **능력치 + 주사위 + 보너스**입니다.
### 기본 주사위
`dice=`가 없으면 판정은 게임 설정 `checks.dice`를 쓰고, 그것도 없으면 `d20`을 씁니다. RPG Plus는 자기 컬렉션에 이렇게 정해 두었습니다:
```json
"settings": { "checks.dice": "d20" }
```
모든 판정에서 우연을 빼고 싶은 게임은 `"checks.dice": "none"`으로 정합니다.
### 결과를 제 방식으로 말하기
판정 뒤에는 이 대화 변수들에 굴림이 남습니다: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc`, `check_result`. `quiet=1`과 함께라면 `ptext` 줄이 이야기의 말로 결과를 표현할 수 있습니다:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "모든 ${check_total}을(를) 짜내어 밀지만 문은 버틴다."
```
표준 줄은 번역 키 `checks/line`(`[${check_stat}: ${check_total} 대 ${check_dc}] ${check_result}`)입니다. 게임은 자기 로컬라이즈 파일에서 이것을 바꿀 수 있습니다.
## 문제가 생겼을 때
1. **합계가 주사위뿐이다.** 능력치 id가 틀렸거나 그 캐릭터에게 그 능력치가 없습니다.
2. **결과가 늘 같다.** 게임의 `checks.dice`가 `none`이거나 줄에 `dice=none`이 적혀 있습니다.
3. **주사위 문구가 깨졌다.** 잘못된 형식의 `dice=`는 장면을 망가뜨리는 대신 아무것도 굴리지 않아, 판정이 단순 기준선이 됩니다. 주사위는 `d20`, `2d6`, `1d100`처럼 쓰세요.
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — бросаем стат против сложности
Stat Checks добавляет к сценариям одну команду, `check`: взять стат персонажа, прибавить бросок кубика и бонус, сравнить сумму со сложностью и продолжить историю в зависимости от успеха или провала. Визуальная новелла уговаривает ею стражника, тайловая RPG выламывает ржавую дверь. Сами статы приносят Stats Engine и правила игры (в RPG Plus — Classic RPG Rules).
## В игре
В прологе RPG Plus на перекрёстке сидит странница. Один из ответов сам называет свою проверку — Харизма против 10:
![Перекрёсток в сумерках; вопрос «Что скажешь ей?» и два ответа: «Вежливо спросить дорогу [Харизма 10]» и «Молча пройти мимо».](assets/seer-choice.jpg)
После ответа бросок показывается одной строкой:
![Диалоговое окно со строкой «[Харизма: 11 против 10] Успех».](assets/check-line.jpg)
Герой здесь — бродяга 1-го уровня с Харизмой 8; на d20 выпало 3, поэтому в сумме 11 против 10 — успех. История идёт по ветке успеха: странница отдаёт герою оберег.
![Ветка успеха: «— Вежливый. Надо же. — Она бросает тебе оберег из клевера.](assets/check-branch.jpg)
С суммой меньше 10 в строке стояло бы *Провал*, и история ушла бы по другой ветке, где она отворачивается.
## Сценарий за этим
Из `rpg_plus_game/scenarios/rpg_plus/prologue.scenario` (строки сокращены):
```scenario
option "Вежливо спросить дорогу [Харизма 10]" -> :ask_way
option "Молча пройти мимо" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "— Вежливый. Надо же..."
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "— Найдёшь сам..."
```
`check cha 10` бросает Харизму против сложности 10. При успехе переход к метке после стрелки, при провале — к метке из `else=`. Без `else=` провал просто продолжается следующей строкой.
## Команда check
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — id стата из игры, например `cha` или `str`.
- `<difficulty>` — число, которое нужно достичь: проверка успешна, когда сумма не меньше него.
- `who=` — id персонажа или `player` (по умолчанию).
- `dice=` — `d20`, `2d6`, `1d100` и так далее. `none` ничего не бросает: проверка превращается в простой порог — решает только стат, всегда одинаково. Удобно в новелле («достаточно ли смел»).
- `bonus=` — прибавляется к сумме; может быть отрицательным.
- `else=` — метка для провала.
- `quiet=1` — не показывать строку броска.
Сумма — это **стат + кубик + бонус**.
### Кубик по умолчанию
Без `dice=` проверка берёт настройку игры `checks.dice`, иначе `d20`. RPG Plus задаёт её в своей коллекции:
```json
"settings": { "checks.dice": "d20" }
```
Игра, которая хочет обойтись во всех проверках без случайности, ставит `"checks.dice": "none"`.
### Свой рассказ об исходе
После проверки бросок лежит в этих переменных диалога: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc` и `check_result`. С `quiet=1` строка `ptext` может рассказать о нём словами истории:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "Ты выжимаешь все свои ${check_total}, но дверь держится."
```
Стандартная строка — ключ перевода `checks/line` (`[${check_stat}: ${check_total} против ${check_dc}] ${check_result}`); игра может переопределить его в своих файлах локализации.
## Если что-то пошло не так
1. **В сумме только кубик.** Id стата неверный, либо у персонажа нет такого стата.
2. **Результат всегда одинаковый.** У игры `checks.dice` равен `none`, либо в строке написано `dice=none`.
3. **Каша вместо кубика.** Неправильная запись `dice=` не ломает сцену, а просто ничего не бросает — проверка превращается в простой порог. Пишите кости как `d20`, `2d6`, `1d100`.
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — tung chỉ số đối đầu độ khó
Stat Checks thêm vào kịch bản một lệnh duy nhất: `check`. Lệnh lấy một chỉ số của nhân vật, cộng một lần tung xúc xắc và một điểm cộng, đem tổng so với độ khó, rồi cho câu chuyện tiếp theo kết quả thành hay bại. Tiểu thuyết thị giác dùng nó để thuyết phục lính gác, RPG bản ô dùng nó để phá một cánh cửa rỉ sét. Bản thân các chỉ số đến từ Stats Engine và luật của game (trong RPG Plus là Classic RPG Rules).
## Trong game
Trong phần mở đầu của RPG Plus, một người lạ ngồi nơi ba đường giao nhau. Một lựa chọn tự công bố phép kiểm mà nó thực hiện — Sức hút đối với 10:
![Ngã ba đường lúc chạng vạng; câu hỏi "Ngươi sẽ nói gì với cô ấy?" và hai lựa chọn: "Lễ phép hỏi đường [Sức hút 10]", "Lặng lẽ đi qua".](assets/seer-choice.jpg)
Sau lựa chọn, lần tung hiện thành một dòng:
![Hộp hội thoại với dòng "[Sức hút: 11 so với 10] Thành công".](assets/check-line.jpg)
Nhân vật ở đây là một kẻ du hành cấp 1 với Sức hút 8; d20 ra 3, nên tổng là 11 so với 10 — thành công. Câu chuyện đi theo nhánh thành công: người lạ ném cho nhân vật một lá bùa.
![Nhánh thành công: "Lễ phép. Lạ thật." Cô ném cho ngươi một lá bùa cỏ bốn lá.](assets/check-branch.jpg)
Nếu tổng dưới 10, dòng đó sẽ ghi *Thất bại* và câu chuyện sẽ đi theo nhánh kia, nơi cô ấy quay đi.
## Kịch bản phía sau
Từ `rpg_plus_game/scenarios/rpg_plus/prologue.scenario` (các dòng đã rút gọn):
```scenario
option "Lễ phép hỏi đường [Sức hút 10]" -> :ask_way
option "Lặng lẽ đi qua" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "Lễ phép. Lạ thật..."
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "Tự ngươi sẽ tìm ra..."
```
`check cha 10` tung Sức hút đối với độ khó 10. Thành công thì nhảy đến nhãn sau mũi tên, thất bại thì đến nhãn của `else=`. Không có `else=`, một lần thất bại đơn giản là tiếp tục dòng kế tiếp.
## Lệnh check
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — một id chỉ số của game, ví dụ `cha` hay `str`.
- `<difficulty>` — con số cần đạt: phép kiểm thành công khi tổng ít nhất bằng nó.
- `who=` — id nhân vật, hoặc `player` (mặc định).
- `dice=` — `d20`, `2d6`, `1d100` v.v. `none` không tung gì cả: phép kiểm thành ngưỡng thuần túy — chỉ số tự quyết định, mỗi lần như nhau. Hữu ích trong tiểu thuyết ("đủ can đảm hay chưa").
- `bonus=` — cộng vào tổng; có thể âm.
- `else=` — nhãn cho lần thất bại.
- `quiet=1` — không hiển thị dòng tung xúc xắc.
Tổng bằng **chỉ số + xúc xắc + điểm cộng**.
### Xúc xắc mặc định
Không có `dice=`, phép kiểm dùng cài đặt `checks.dice` của game, nếu không thì `d20`. RPG Plus đặt nó trong bộ sưu tập của mình:
```json
"settings": { "checks.dice": "d20" }
```
Game nào muốn mọi phép kiểm đều không nhờ may rủi thì đặt `"checks.dice": "none"`.
### Kể kết quả theo cách riêng của bạn
Sau mỗi phép kiểm, các biến hội thoại sau giữ lại lần tung: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc` và `check_result`. Với `quiet=1`, một dòng `ptext` có thể kể kết quả bằng ngôn từ của câu chuyện:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "Ngươi dồn toàn bộ ${check_total} vào cú đẩy, nhưng cánh cửa vẫn trơ trơ."
```
Dòng chuẩn là khóa dịch `checks/line` (`[${check_stat}: ${check_total} so với ${check_dc}] ${check_result}`); game có thể thay nó trong các tệp bản địa hóa của mình.
## Khi có trục trặc
1. **Tổng chỉ có xúc xắc.** Id chỉ số sai, hoặc nhân vật không có chỉ số đó.
2. **Luôn cùng một kết quả.** `checks.dice` của game là `none`, hoặc dòng lệnh có `dice=none`.
3. **Chữ xúc xắc hỏng.** `dice=` viết sai dạng sẽ không tung gì thay vì làm hỏng cảnh, nên phép kiểm thành ngưỡng thuần túy. Hãy viết xúc xắc dạng `d20`, `2d6`, `1d100`.
+85
View File
@@ -0,0 +1,85 @@
# Stat Checks — 属性掷骰对抗难度
Stat Checks 为剧本添加一条命令:`check`。它取角色的一个属性,加上骰子和加值,把总数与难度比较,再让故事按成功或失败继续。视觉小说用它说服卫兵,图块 RPG 用它撞开一扇锈门。属性本身来自 Stats Engine 和游戏的规则(RPG Plus 中是 Classic RPG Rules)。
## 在游戏里
RPG Plus 序章中,一位陌生女子坐在岔路口。其中一个选项直接写明它要做的检定——魅力对抗 10:
![黄昏的岔路口;问题"你要对她说什么?"和两个选项:"客气地问路[魅力 10]"和"默默走过"。](assets/seer-choice.jpg)
做出选择后,掷骰结果只占一行:
![对话框中显示一行"[魅力:11 对 10] 成功"。](assets/check-line.jpg)
这里的主角是 1 级游荡者,魅力 8;d20 掷出 3,总数 11 对 10——成功。故事进入成功分支:陌生女子扔给主角一枚护符。
![成功分支:"有礼貌。真稀奇。"她把一枚四叶草护符扔给你。](assets/check-branch.jpg)
如果总数低于 10,这一行会显示*失败*,故事则走另一个分支——她转过身去。
## 背后的剧本
出自 `rpg_plus_game/scenarios/rpg_plus/prologue.scenario`(有删节):
```scenario
option "客气地问路[魅力 10]" -> :ask_way
option "默默走过" -> :leave
:ask_way
check cha 10 who=rpg_hero else=snub -> :gift
:gift
text "有礼貌。真稀奇……"
action item.add id=classic/clover_charm
goto -> :leave
:snub
text "你自己会找到的……"
```
`check cha 10` 掷魅力对抗难度 10。成功就跳到箭头后的标签,失败跳到 `else=` 指定的标签。没有 `else=` 时,失败就只是继续执行下一行。
## check 命令
```scenario
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
```
- `<stat>` — 游戏中的属性 id,例如 `cha` 或 `str`。
- `<difficulty>` — 需要达到的数字:总数不低于它,检定即成功。
- `who=` — 角色 id,或 `player`(默认)。
- `dice=` — `d20`、`2d6`、`1d100` 等。`none` 不掷任何骰子,检定变成单纯的门槛:只看属性,每次结果都一样——适合小说("够不够勇敢")。
- `bonus=` — 加进总数;可以为负。
- `else=` — 失败时跳转的标签。
- `quiet=1` — 不显示掷骰行。
总数 = **属性 + 骰子 + 加值**。
### 默认骰子
没写 `dice=` 时,检定使用游戏设置 `checks.dice`,没有该设置则为 `d20`。RPG Plus 在自己的合集中设置了它:
```json
"settings": { "checks.dice": "d20" }
```
想让所有检定都不靠运气的游戏,可以设 `"checks.dice": "none"`。
### 用自己的话讲述结果
检定之后,这些对话变量保存着掷骰信息:`check_stat`、`check_value`、`check_roll`、`check_bonus`、`check_total`、`check_dc` 和 `check_result`。配合 `quiet=1`,一行 `ptext` 就能用故事自己的话来讲述结果:
```scenario
check str 14 quiet=1 else=stuck -> :open
:stuck
ptext "你使出全部的 ${check_total} 去推,门却纹丝不动。"
```
标准一行是翻译键 `checks/line`(`[${check_stat}:${check_total} 对 ${check_dc}] ${check_result}`);游戏可以在自己的本地化文件里改掉它。
## 如果遇到问题
1. **总数只有骰子。** 属性 id 写错了,或者角色没有这个属性。
2. **结果总是一样。** 游戏的 `checks.dice` 是 `none`,或者这一行里写了 `dice=none`。
3. **骰子写法不对。** 格式错误的 `dice=` 不会弄坏场景,只是什么都不掷——检定于是变成单纯的门槛。骰子请写成 `d20`、`2d6`、`1d100`。
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = Check dice
collection_settings/dice_hint = Choose dice, disable rolls, or enter NdM, such as 2d6 (up to 100 dice).
collection_settings/dice_auto = Uses d20 when unspecified.
collection_settings/no_dice = No dice
collection_settings/dice_group = Checks
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = Dados de las pruebas
collection_settings/dice_hint = Elige dados, desactiva las tiradas o escribe NdM, como 2d6 (hasta 100 dados).
collection_settings/dice_auto = Sin valor se usa d20.
collection_settings/no_dice = Sin dados
collection_settings/dice_group = Pruebas
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = 判定ダイス
collection_settings/dice_hint = ダイスの選択、無効化、または2d6などのNdMを入力(最大100個)。
collection_settings/dice_auto = 未指定の場合はd20を使用。
collection_settings/no_dice = ダイスなし
collection_settings/dice_group = 判定
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = 판정 주사위
collection_settings/dice_hint = 주사위를 선택하거나 굴림을 끄거나 2d6 같은 NdM을 입력하세요(최대 100개).
collection_settings/dice_auto = 지정하지 않으면 d20을 사용합니다.
collection_settings/no_dice = 주사위 없음
collection_settings/dice_group = 판정
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = Кубики проверок
collection_settings/dice_hint = Выберите кубики, отключите броски или введите запись NdM, например 2d6 (до 100 кубиков).
collection_settings/dice_auto = Без настройки используется d20.
collection_settings/no_dice = Без кубиков
collection_settings/dice_group = Проверки
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = Xúc xắc kiểm tra
collection_settings/dice_hint = Chọn xúc xắc, tắt lượt tung hoặc nhập NdM như 2d6 (tối đa 100 viên).
collection_settings/dice_auto = Nếu không đặt, dùng d20.
collection_settings/no_dice = Không tung xúc xắc
collection_settings/dice_group = Kiểm tra
+5
View File
@@ -0,0 +1,5 @@
collection_settings/dice = 检定骰子
collection_settings/dice_hint = 选择骰子、禁用掷骰,或输入 NdM,如 2d6(最多100个骰子)。
collection_settings/dice_auto = 未指定时使用 d20。
collection_settings/no_dice = 不掷骰
collection_settings/dice_group = 检定
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = Stat Checks
mod_stat_checks_desc = Stat checks in any scenario: “check cha 12 -> :success” rolls a stat plus dice against a difficulty, shows the outcome line and branches the story — talking a guard round in a novel, forcing a door in an RPG. The roll stays in dialog variables for lines of your own. Dice default to the game setting checks.dice, else d20; dice=none makes a plain threshold.
mod_stat_checks_desc = One scenario command, check: roll a character's stat plus dice against a difficulty and branch the story on success or failure.
checks/line = [${check_stat}: ${check_total} vs ${check_dc}] ${check_result}
checks/success = Success
checks/failure = Failure
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = Tiradas de característica
mod_stat_checks_desc = Tiradas de característica en cualquier escenario: «check cha 12 -> :éxito» tira una estadística más dados contra una dificultad, muestra la línea con el resultado y ramifica la historia: convencer a un guardia en una novela, forzar una puerta en un RPG. La tirada queda en variables del diálogo para tus propias líneas. Los dados por defecto son el ajuste checks.dice, si no d20; dice=none es un umbral simple.
mod_stat_checks_desc = Un comando de escenario, check: tira la estadística de un personaje más dados contra una dificultad y ramifica la historia según salga bien o mal.
checks/line = [${check_stat}: ${check_total} contra ${check_dc}] ${check_result}
checks/success = Éxito
checks/failure = Fallo
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = 能力値判定
mod_stat_checks_desc = どのシナリオでも使える能力値判定:「check cha 12 -> :成功」はステータスとダイスを難易度と比べ、結果の行を出して物語を分岐させる——ノベルで門番を説得し、RPG で扉をこじ開ける。出目は会話変数に残り、自分の行で使える。ダイスの既定はゲーム設定 checks.dice、なければ d20。dice=none なら単純なしきい値。
mod_stat_checks_desc = シナリオコマンドをひとつ、check。キャラクターのステータスにダイスを足して難易度と比べ、成功か失敗かで物語を分岐させます。
checks/line = [${check_stat}:${check_total} 対 ${check_dc}] ${check_result}
checks/success = 成功
checks/failure = 失敗
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = 능력치 판정
mod_stat_checks_desc = 모든 시나리오에서 쓰는 능력치 판정: “check cha 12 -> :성공”은 능력치와 주사위를 난이도와 겨루고, 결과 줄을 보여 주며 이야기를 갈래로 나눕니다 — 노벨에서 경비병 설득, RPG에서 문 부수기. 굴림 결과는 대화 변수에 남아 직접 쓴 줄에 쓸 수 있습니다. 주사위 기본값은 게임 설정 checks.dice, 없으면 d20. dice=none은 단순 기준값.
mod_stat_checks_desc = 시나리오 명령 하나, check: 캐릭터의 능력치에 주사위를 더해 난이도와 겨루고, 성공이나 실패에 따라 이야기를 나눕니다.
checks/line = [${check_stat}: ${check_total} 대 ${check_dc}] ${check_result}
checks/success = 성공
checks/failure = 실패
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = Проверки характеристик
mod_stat_checks_desc = Проверки характеристик в любом сценарии: «check cha 12 -> :успех» бросает стат плюс кубики против сложности, показывает строку с исходом и ветвит историю — уговорить стражника в новелле, выбить дверь в RPG. Бросок остаётся в переменных диалога для своих строк. Кубики по умолчанию — настройка игры checks.dice, иначе d20; dice=none — простой порог.
mod_stat_checks_desc = Одна команда сценария, check: бросает стат персонажа плюс кубики против сложности и ветвит историю на успехе или провале.
checks/line = [${check_stat}: ${check_total} против ${check_dc}] ${check_result}
checks/success = Успех
checks/failure = Провал
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = Kiểm tra chỉ số
mod_stat_checks_desc = Kiểm tra chỉ số trong mọi kịch bản: «check cha 12 -> :thành_công» tung chỉ số cộng xúc xắc so với độ khó, hiện dòng kết quả và rẽ nhánh câu chuyện — thuyết phục lính gác trong tiểu thuyết, phá cửa trong RPG. Kết quả tung còn lại trong biến hội thoại cho dòng của riêng bạn. Xúc xắc mặc định theo cài đặt checks.dice, không thì d20; dice=none là ngưỡng đơn giản.
mod_stat_checks_desc = Một lệnh kịch bản, check: tung chỉ số của nhân vật cộng xúc xắc so với độ khó và rẽ nhánh câu chuyện theo thành bại.
checks/line = [${check_stat}: ${check_total} so với ${check_dc}] ${check_result}
checks/success = Thành công
checks/failure = Thất bại
+1 -1
View File
@@ -1,5 +1,5 @@
mod_stat_checks_name = 属性检定
mod_stat_checks_desc = 任何剧本中的属性检定:“check cha 12 -> :成功”用属性加骰子对抗难度,显示结果行并让故事分支——在小说里说服守卫,在 RPG 里撬开门。掷骰结果留在对话变量里,供你自己的台词使用。骰子默认取游戏设置 checks.dice,否则为 d20;dice=none 即简单门槛。
mod_stat_checks_desc = 一条剧本命令 check:掷角色属性加骰子对抗难度,让故事按成功或失败分支。
checks/line = [${check_stat}:${check_total} 对 ${check_dc}] ${check_result}
checks/success = 成功
checks/failure = 失败
+1 -1
View File
@@ -3,7 +3,7 @@
"name": "Stat Checks",
"version": "1.0.0",
"author": "ct",
"description": "Stat checks for any scenario: `check cha 12 [dice=d20] [bonus=2] [else=label] -> :success` rolls a stat plus dice against a difficulty, shows the outcome line and branches (a novel's persuasion, a tile RPG's locked door). The roll is left in dialog variables (check_total, check_roll, …) for ptext lines. Dice default to the game setting checks.dice, else d20; dice=none makes a plain threshold. The conditional jump `when` and option conditions live in dialog_base.",
"description": "One scenario command, check: roll a character's stat plus dice against a difficulty and branch the story on success or failure.",
"category": "gameplay",
"sources": [
"src/**/*.cs"