※2025/10/6、英wikiよりkagi翻訳を通しました。機械翻訳なので一部不自然な日本語があるかもしれません。ぜひ編集してくれるとありがたいです。
※一部スクリプトが破壊されているところがあります。
== 開発者コンソールの基本とデバッグの有効化 ==
[[File:ck3_debug_shortcut_example.jpg|thumb|CK3 デバッグのスクリーンショット例|CK3 の Steam 版バイナリから作成したショートカットのスクリーンショット。<br><sup>注: ゲームの Steam 版を使用している場合は、ライブラリでタイトルを右クリックし、「プロパティ」をクリックして起動オプションに <code>-debug_mode startup</code> を追加できます。</sup>|x480px]]
[[File:errorhoof.jpg|Errorhoof|こちらは Errorhoof。あなたのスクリプトが壊れていることを伝えに来ました。]]
<br>
デバッグは簡単です! <sup><span class="plainlinks">[https://en.wikipedia.org/wiki/Wikipedia:Citation_needed [要出典]]</span></sup> このページでは、スクリプトのデバッグと問題の修正方法を理解するのに役立ちます。
=== デバッグツールへのアクセスを得る ===
最初に行うべきことは、ゲームでデバッグを有効にすることです。そのためには、ゲームの .exe ファイル(例: <code>C:\Program Files (x86)\Steam\steamapps\common\Crusader Kings III\binaries</code>)を探し、末尾に <code>-debug_mode</code> パラメータを付けたショートカットを作成します。例は右の画像を参照してください。これが完了すると、ゲーム内で <code>`</code> キー([https://en.wikipedia.org/wiki/Grave_accent 「グレイヴ・アクセント」] キーとして知られ、通常はキーボード左上にあります)で開発者コンソールにアクセスできるようになります。また、Errorhoof からスクリプトエラーの警告メッセージを受け取れるようになります。ゲームは起動時に見つけたエラーの一覧を自動的にメモ帳ウィンドウで開きますが、Errorhoof をクリックすると、最新かつ素晴らしい(=あなたの)ミスが並んだ新しいメモ帳ウィンドウを作成できます。
=== 開発者コンソールの基本 ===
以下の画像は、デバッグ UI の各ボタンが何をするかを説明しています。<br>[[File:debugger_ui_2021.jpeg|デバッガーのレイアウト|x420px]]<br>イベントをテストするには、コマンド入力ウィンドウに <code>event name.id</code> と入力して Enter を押すだけです(例: <code>event diplomacy_foreign.1074</code> や <code>event central_asia.0011</code>)。<br>これは、パルスに追加されていない、またはプレイヤーが自然には遭遇し得ない形でゲームに接続されていないイベントをテストするための主要な方法です。同じウィンドウで <code>add_gold = 999999</code> や <code>add_trait = lunatic_genetic</code> といった効果を実行し、テストするイベントを適切に動かすために必要な条件を満たすこともできます。
== デバッグの作法 ==
エラーに困惑しましたか? それは良い兆候です! 最初のステップは「落ち着いて」、できるだけ文字どおりに捉えながらエラーをもう一度読むことです。ローカライズキーを認識しないと書いてあるなら、おそらく本当にその意味です。<br>
以下は、80% の問題解決に役立つ一般的なアドバイスです。残りの 20% については、CK3 モッディングコミュニティのメンバーに相談しましょう。モッダーたちは(ほとんど)親切で、初心者を助けてくれるはずですし、あなたの多くの質問にも答えてくれるでしょう。<br>
<sub>注: 新しいエラーログは上部、古いログは下部にあります。古いエラーを消すにはコンソールをクリアしてください。</sub>
=== ローカライズのデバッグ ===
Crusader Kings 2 の時代からローカライズは大幅に改善され、これまでになく簡単になりましたが、万全というわけではありません。<br>
まず、loc ファイルのエンコードが正しいことを確認してください(正しくない場合はゲームが知らせてくれます)。使用すべきは <code>utf8bom</code> です。正しいエンコードで loc ファイルを保存する方法は以下のとおりです。
* '''Sublime Text''': File → 「Save With Encoding...」 → 「UTF8 with BOM」
* '''Visual Studio Code''': ウィンドウ右下のエンコードとシンタックスハイライトのタブで UTF8(または現在の設定)を選択 → 「Save with Encoding」 → 「UTF8 with BOM」
* '''Notepad++''': Encoding → 「UTF8 with BOM」
<br>
また、キーの欠落、未認識のキー、ハッシュの重複などの問題に遭遇することがあります。
* '''Missing Key'''(キーの欠落): loc キーのタイプミス、または保存し忘れの可能性が高いです(誰にでも起こります)。保存し、ダブルチェックして、キーを打ち直してください。
* '''Unrecognized Key'''(未認識のキー): 対処は上と同じですが、スクリプト内で文字列(loc キーではなく "my text here" のような文字列)を使ったときにも発生します。問題を解決するには、その文字列の内容でキーを作成してください。
* '''Duplicate Key or Hash'''(キーまたはハッシュの重複): ファイル内外のどこかに、同名または同内容のキーが存在します。検索して見つけしだい削除・置換しましょう。
=== エラースパム: 動的ローカライズとトリガー条件のデバッグ ===
イベントを実行すると毎秒何千ものエラーが出ていますか? 慌てないで!<br>
まずは動的ローカライズを確認し、記述ミスがないか確かめてください。よくあるミスは次のとおりです。
* 本来は <code>[ROOT.Char.GetSomething]</code> と書くべきところを <code>[ROOT.GetSomething]</code> と書いている
* 名前のスペルミス。これは本当によくあります。
* 動的ローカライズで、保存済みスコープには <code>scope:</code> は不要なのに、<code>[scope:mysavedscopecharacter.GetFirstName]</code> を使っている(正しくは <code>[mysavedscopecharacter.GetFirstName]</code>)
* 動的ローカライズのスコープ内で参照したキャラクターを実際には保存していない
* スクリプト内でスコープ対象のキャラクター名を変更したのに、ローカライズ側を更新し忘れている
<br>
すべて正しく行っているのに動的ローカライズで問題が出る場合、'''発火したイベントの条件を満たしていない''' 可能性があります。<br>
デバッグコンソールでイベントを起動すると、指定した条件をすべて満たしていなくてもイベント自体はトリガーされます。つまり、トリガーが失敗したせいでスコープ可能でないキャラクターを保存できずに失敗しているかもしれません。<br>
デバッグコンソールから起動したイベントの条件を満たしているかどうかを確認するには、イベントウィンドウ右上の ✔ または ✖ アイコンにカーソルを合わせます。イベントの条件と、その充足状況の詳細が表示されます。<br>
[[File:event_conditions_debug.jpg|x720px|イベント条件のチェック|コンソールが 8 ギガバイトのデバッグログを吐く理由を調査する勇敢なコンテンツデザイナーの図。]]
=== スコープのデバッグ ===
開発者コンソールで <code>script_docs</code> と入力することで、コードで認識されるすべてのトリガー、エフェクト、修飾子、ランタイムログを含むフォルダを生成できます。生成されたファイルは <code>C:\Users\YOURUSERNAME\Documents\Paradox Interactive\Crusader Kings III\logs</code> に出力され、メモ帳や好みの IDE で読むことができます。
これらの <code>.log</code> はメモ帳で開くことができ、さまざまな問題のデバッグに非常に有用です。加えて、以下は最も有用なファイルとその内容の概要です。
{| class="wikitable" width=100%
! File
! Description
|-
| Effects.log
| すべての非スクリプト(ハードコード)効果、その使用方法、および想定される [https://en.wikipedia.org/wiki/Parameter_(computer_programming) 引数] の一覧。
|-
| Triggers.log
| ゲーム内で見つかったすべての非スクリプトトリガーと、対応するスコープやターゲットの一覧。
|-
| Modifiers.log
| スクリプト化された修飾子で使用可能なすべての修飾子と、それらが使用できるタイプの一覧。
|-
| event_scopes.log
| すべての有効なスコープタイプ。タイプを直接参照すべきではない点に注意。
|-
| event_targets.log
| スクリプトで認識されるあらゆるイベントターゲット。スコープ間を [https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming) 親子関係] で上下にたどるのに非常に有用。
|}
=== ホットロード ===
CK3 におけるホットロードとは、''ゲームを実行したまま'' スクリプトを更新する行為を指します。<br>
つまり、スクリプトの細かな変更を毎回ゲームを再起動せずに、その場でテスト・デバッグできます。
ただし、ホットロードには注意が必要です。大きな変更を行うと、ゲームが予期せぬ挙動を示すことがあります。大規模な変更(または更新したスクリプトの外側の要素と相互作用する変更)を行った場合は、ホットロードが不適切だったせいで本来は存在しないエラーに何時間も費やすことを避けるため、ゲームを再起動することを推奨します。
'''ホットロードを安全に行うためのヒント:'''<br>
# 可能であれば、変更をホットロードする際はイベントを閉じておく。
# それが無理な場合は、イベントのデバッグオプションにある [⟳] アイコンを押す。ただし、保存済みスコープは更新されない点に注意。
# ローカライズはいつでも更新可能。ただし、新規のローカライズキーは通常ホットロードされない。
# ホットロードはデバッグや微調整のために使い、スクリプトに起動時エラーがないかの検証には使わない。
== 実行スクリプトによるデバッグ工程の自動化 ==
より複雑な機能やコンテンツをテストする際、対象の機能/コンテンツに到達するために必要な条件を満たすための反復作業を自動化すると、大幅に時間を節約できます。実行スクリプトは、イベントの <syntaxhighlight enclose="none" lang="coffee">immediate</syntaxhighlight> ブロックと同じ方法で効果を実行するため、前述の反復的な手作業を省略するための長い効果チェーンを格納する用途に使えます。
技術的には、実行スクリプトは <syntaxhighlight enclose="none" lang="coffee">.txt</syntaxhighlight> ファイルで、<syntaxhighlight enclose="none" lang="coffee">..\Documents\Paradox Interactive\Crusader Kings III\run</syntaxhighlight> に保存します。以下のコンソールコマンドで起動すると、内部に記述された効果が即座に実行されます。<syntaxhighlight enclose="none" lang="coffee">run run_script_name_here.txt</syntaxhighlight>
以下は実行スクリプトの内容例です。<syntaxhighlight lang="coffeescript">
# HRE 復興の条件を整えるための実行スクリプト。開始はルイ王(867)を推奨。
title:c_cologne = { add_to_list = target_titles }
title:c_mainz = { add_to_list = target_titles }
title:c_trier = { add_to_list = target_titles }
title:d_bohemia = { add_to_list = target_titles }
title:d_east_franconia = { add_to_list = target_titles }
title:d_ostfalen = { add_to_list = target_titles }
title:d_ostmark = { add_to_list = target_titles }
title:k_lotharingia = { add_to_list = target_titles }
title:k_italy = { add_to_list = target_titles }
title:k_east_francia = { add_to_list = target_titles }
create_title_and_vassal_change = {
type = conquest
save_scope_as = change
}
every_in_list = {
list = target_titles
limit = { NOT = { holder = root } }
every_in_de_jure_hierarchy = {
change_title_holder = {
holder = root
change = scope:change
}
}
}
resolve_title_and_vassal_change = scope:change
add_hook = {
target = faith.religious_head
type = strong_test_hook
}
root = {
add_prestige = 4000
add_gold = 500
add_piety = 200
}
</syntaxhighlight>
<br>{{Modding navbox}}
[[Category:Modding]]