Files

73 lines
4.7 KiB
Markdown

# Validator — プレイせずに MOD を検査する
Validator は、実行中のゲームのすべての MOD——マニフェスト、データファイル、シナリオ、シーンパッチ、C# ソース——を読み、壊れているか怪しいものを報告します。誰も宣言していないアイテム・シーン・背景への参照、不明なシナリオコマンド、誤ったパラメーター、不足した依存関係。ゲームが始まるたびにバックグラウンドで走り、レポートを書くので、タイプミスはプレイヤーがその行に到達する前に見つかります。
検査するのはファイルに見えるものだけです。Validator はゲームをプレイしません: 受け入れられたシナリオでも、作者の意図どおりに動くとは限らず、実行時に id を組み立てるコードは追えません。
## 誤りとその修正
プレイヤーに狼の肉を与えるシナリオの行。アイテム id にタイプミスがあります:
```scenario
scene: home_kitchen
priority: 0
---
action item.add id=food/wolf_meet count=1
end
```
次に Cthangover を起動すると、レポートにこれが入ります:
```json
{
"severity": "error",
"code": "REF_NOT_FOUND",
"message": "item 'food/wolf_meet' is referenced but never declared",
"mod": "cthangover_game",
"file": "scenarios/doc_validator_demo.scenario",
"line": 4,
"suggestion": "declare item 'food/wolf_meet' or fix the reference",
"related": null
}
```
MOD、ファイル、行が誤りを指し示します。`food/wolf_meat` に直せば問題は消え、概要のエラー数がひとつ減ります(この実行では 18 から 17 へ)。
## 実行のしかたとレポートの読み方
- それを含むゲームに入ると(Cthangover は開発者ツールと一緒に同梱します)、MOD の読み込みのあとで自動的に始まり、バックグラウンドスレッドで走ります。ゲームは止まりません。
- ログには一巡ごとに一行入ります: `validator: started, 33 mod(s) queued`、そのあとにエラー・警告・情報の合計。
- レポートは `user://validation/report.json`(ゲームのユーザーデータフォルダー)に書かれます。概要、バージョンとチェックサム付きの検査済み MOD、そして問題の一覧が入ります。
問題ごとに:
- `severity` — `error`(壊れている)、`warning`(おそらく誤り)、`info`(見ておく価値がある。たとえばどこからも参照されないアイテム);
- `code` — 問題の種類。たとえば `REF_NOT_FOUND`、`JSON_PARSE_ERROR`、`SCHEMA_MISSING_FIELD`、`SCHEMA_UNKNOWN_PARAM`、`DECL_UNUSED`、`DYNAMIC_KEY`;
- `mod`、`file`、`line` — どこを直すか; `suggestion` — 何をすればいいか。
`DYNAMIC_KEY` の情報は、キーが実行時に組み立てられるため Validator が検査できないことを意味します。エラーではありません。
## 何を検査するか
検査は三つのフェーズで走ります:
1. **スキーマ** — `manifest.json` に文字列の `id` と `version` がある; JSON ファイルが解釈できる。
2. **契約** — 各 MOD が何を宣言し、何を参照するか: あらゆる種類のエンティティ(キャラクター、アイテム、クエスト、スキル、レシピ、行動、そしてスキーマが記述した種類)、シナリオのコマンドと行動とそのパラメーター、シーンパッチ、C# コードが読み書きするプロパティ。
3. **突き合わせ** — すべての参照に宣言がある、`depends` が他の MOD から使うものを覆っている、誰にも使われない宣言の一覧。
シナリオの行動とパラメーターは、MOD が同梱するスキーマに対して(Schemas を参照)、コマンドパレットと同じ規則で検査されます。
## 設定
Modマネージャーのこの MOD の設定タブで:
- **Enabled**、**Run on start** — 一巡を止める;
- **Parse C#**、**Parse GDScript**(既定ではオフ、遅い)、**Parse scenarios** — どのソースを読むか;
- **Write report**、**Report path** — `report.json` の行き先;
- **Block mods on error** — 設定にはありますが、現行バージョンでは何も変わりません: MOD が止められることはありません。
## うまくいかないとき
1. **レポートがない。** 一巡が終わる前にゲームが閉じられた(Cthangover では 30 秒ほど)か、**Write report** がオフです。
2. **`DYNAMIC_KEY` の行が多い。** キーを組み立てるコードでは普通のことです。情報扱いです。