「Crusader Kings III」開発日記#30が公開されていましたので、その内容をご紹介。今回はイベントスクリプティングについて。本体発売前の開発日記です。
開発日記
開発日記#30は、イベントスクリプティングについて。
イベントの構造
- 標準的なキャラクターイベントの中核はほとんど変わらない。タイトル、説明、ポートレートで、下にひとつ以上選択肢がある。しかしスクリプトは機能性、可読性、時間経過による一般的なスクリプトの衛生状態を改良する変更を行った。上の画像はCK2とCK3のイベント開始部分の比較だ。
- まずイベントタイプとイベントIDを入れ替え、イベントはネームスペースと固有のIDによって作成されるようにした。これにより、イベントを折り畳んだ後でもイベントIDを読めるようになった。
- トリガーをつけたテキストも変更した。CK2ではプレイヤーの状況に合わせてフレーバーをつけるのに便利だったが、トリガーを簡単に相互排他にする方法がなかったので、扱いにくいものでもあり、上の画像のような状況になることもあった。
- CK3ではfirst_validブロックを使用してスクリプトを削減できる。上の画像はフランス文化のキャラクター、Ashariを信仰するキャラクター、80歳以上のキャラクターで文章が異なり、どれにも当てはまらない場合にはフォールバックするスクリプトだ。
イベントテーマと背景
- CK3ではpictureブロックとborder ブロックが存在しない。こうしたものは新しいイベントのテーマシステムにほぼ組み込まれている。
- テーマは左上に表示されるイベントアイコンを決定するもので、イベントをグループ化し、プレイヤーにイベントが何に関連しているかを知らせるのに役立つものだ。テーマごとにデフォルトの背景やアンビエントSFXのセットも用意されている。背景やイベントアイコンはもっと適切なものがあればスクリプトでオーバーライドすることもできる。
- 当然ながらイベントテーマは完全にスクリプト可能だ。
ポートレートとアニメーション
- 新システムのポートレートはCK2よりもダイナミックで、どのイベントにも0-5個のポートレートがある。このうち2つは完全にアニメーションし(それぞれ左右に配置される)、あとの3つはイベントの下に並ぶ顔で、これはアニメーションしない。これを組み合わせてイベントに合った見た目にできる。
すべてにon_actionsを!
- CK2(特に初期)ではMean Time To Happenシステムを使っていた。しかし多くのイベントのバランスを取るときにシステムの柔軟性が不利な点となっていた。また、純粋な確率に基づいて動作するため、多くの奇妙な統計的特徴が発生し、パフォーマンスを著しく低下させていた。
- CK2の長い開発の中で、私たちはon_actionsを介してイベントをトリガーする方向に移行した。バランスをとるのに手間がかかるが、イベントがいつ、どのように起こるか制御でき、微調整が非常に簡単でパフォーマンスもずっと優れている。
- CK3ではすべてon_actionsを使っている。特定のアクションが世界で起こったとき(例えば、キャラクターが生まれたとき)にイベントを発生させたり、定期的(例えば5年ごと)にイベントを発生させたりできる。
- 大きな改善点のひとつはスクリプトされたon_actionsの追加だ。これはコードされたon_actionsと同様に機能し、重みづけされた、あるいはされていないイベント/エフェクトの複合体として動作する。例えば内戦後の和解についての新しいイベントのセットを作ったとして、戦争終結時のエフェクトを設定するには上の画像のようなものを追加し……
- 適切なディレクトリにこのような内容のファイルを作るだけだ。
- エフェクトをスクリプトできるところならどこでも新たなon_actionへの参照をスクリプトできる。
Immediateブロック
- CKのスクリプトに新たに追加された主な機能は、私たちがimmediateブロックの規則性と合わせて使っているスクリプトされたリストだ。これを使うとさまざまなグループをソートして条件に合ったキャラクターを選ぶことができ、さらにその中でソートすることが簡単にできる。
- 例えば封臣や廷臣から気難しい男性の老人を選びたい場合はこのようになる。
- さらに、その中からもっとも怒りっぽく気難しい者を2名選んで、イベントなどで口論になるようにもできる。
- 私たちは不必要なメンテナンスを最小限に抑え、潜在的なバグが発生する前に摘み取ることを重視しており、このスクリプトは同じ条件を使用する2つの別のリストを呼び出し、それ自体が別のスクリプトのトリガーの一部であることから、まだ警告が出るはずだ。解決する方法はいくつかあるが、ordered_in_listエフェクトを使った新しい機能をご紹介する。
- ordered_in_listはリストを受け取り、script_mathsと呼ばれるシステム(これについてはまた別の機会に)を使用して、そのリスト内の項目に数値を割り当てる。ブロック内のエフェクトを通常どおりデフォルトではリスト内の最高値を持つ項目に適用する(しかしここではリスト内の任意の数の項目にエフェクトを適用するように指示している)。
- immediateブロックについては、他にスコープや変数の保存が簡単になった。標準的なimmediateブロックの機能(イベントが表示される前に実行される)は変更されず、Immediateで実行された見えるエフェクトはすべてのイベント選択肢のツールチップの「Has Happened」ヘッダーの下に表示される。
選択肢:AIにパーソナリティを与え、プレイヤーにストレスを与える
- 選択肢はCK2と似たような動作をする。見えるイベントには最低ひとつあり、選択肢ごとにテキストラベルが必要だが、それ以外は好きなエフェクトをつけられる。
- 2つの主な追加点はai_chanceの使用が大幅に拡大されたこととstress_impactだ。ai_chanceはCK2と同様にNPCキャラクターがその選択肢を選ぶ確率を決める。CK3ではこのブロックとai_value_modifiers(キャラクターが持っている値や特性から性格を作り上げる)をより幅広く使い、キャラクターの行動ができるだけ性格に基づくようにした。
- stress_impactについて。ストレスとは一言で言えばキャラクターの性格に反した行動をした時にキャラクターが得るマイナスの影響の尺度だ。これをチェックするために、特定の選択肢に関連するすべての性格特性をstress_impactブロックに記載し、スクリプトされたstress_impactの値を使用する。stress_impactブロックでのストレスの得失を任意の数だけ結合させることができ、これが計算されてイベント選択肢のひとつの値となる。
- ストレスをstress_impactブロックではなく通常の効果として追加することもできるが、その場合は結合されない。
トリガーについては?
- CK2のスクリプトされたトリガーは、長い要件のリストをひとつの参照の下にグループ化し、チェックする必要があるときにこれを参照する方法だった。私たちはかわりにスクリプトされたトリガーを作った。これは他のファイルから参照できるようにファイルに一度書き出されたトリガーのリストだ。トリガーの更新や修正が必要なときはスクリプトされたトリガーを一度修正するだけですべての場所が修正される。メンテナンスを減らし、バグの可能性を大幅に低減させることになる。
- CK2ではスクリプトされたトリガーはイベントとは別の場所に保存しなければならなかった。CK3ではインラインのスクリプトされたトリガーを追加することで、これを改善した。複数のファイルにまたがって使用する必要があるスクリプトされたトリガーは以前のフォルダシステムのままだが、これによって主なスクリプトされたトリガーと副次的なスクリプトされたトリガーを分割し、ゲーム全体でスクリプトされたトリガーをより徹底的に使用できるようになり、複雑さや詳細さに妥協しないスクリプトの作成が格段に容易になった。
コメント