忍者ブログ

方向音痴のSkyrim

PCゲーム「Skyrim」の雑多なCKいじり日記

QuestとStoryManagerとOnInit


従士の首飾りを作ってみました。モーサルのシンボルが相変わらず美しい。

それはともかくとして、この首飾りを首長から従士に任命された時にプレイヤーの所持品に加えたいと色々やっておりました。
一番簡単なのはバニラのクエストに手を入れることなんですが、流石にそれは怖すぎてできません。



各ホールドの従士クエストは「Favor250〜258」で管理されていて、これらは全て同じ進行になっています。例外は、ホワイトランのメインクエ中に従士任命される「MQ103」と、リフテンの「FreeformRiftenThane」。ホワイトランはメインクエストの話が絡むだけで、従士に任命されて武器をもらえる部分はFavor250番代の内容と同じ。



Stage「25」がこれらのクエストの実質的終了になるようです。
首長と同盟関係になり、プレゼントの武器やら私兵やら私兵の自室やらがEnableされて諸々のセッティングが終わった後、報酬アイテムがプレイヤーのインベントリに入ります。
ファルクリースなどはDLCのハースファイアで少し手が加えられていますが、首長と同盟関係になる進行は同じ。
Stage25は条件を揃えて首長に話しかけている間だけのごく限られた時間のみに限定され、会話が終了する頃にはすでにStage200になっています。Stage25の状況で、首長と同盟関係になった瞬間をトリガーとして自作のアミュレット配布クエストを開始できればよさそうです。
StoryManagerにはNPC同士の人間関係が変化した瞬間を捉えてくれるイベント「Change Relationship Rank」があるのでこれを利用することにしました。



まずはクエスト作成。従士任命は各ホールドにつき一回しか行われないので、このクエストにもRunOnceをつけておきます。
StoryManagerで扱いたいクエストは、Eventのところで該当するEvent Nodeを選択します。
プレイヤーにアイテムを渡すだけであれば、プレイヤーを指定したAliasの持ち物欄にアミュレットを登録するだけでいけます。Scriptも必要ありません。しかしこの方法だとアイテム追加のお知らせが出ないので、どうしても「貰った」感が薄れてしまいます。首長との会話が終わって持ち物欄を覗いた時にはじめて「なんか増えてる」と気づく程度。
ゲームの途中でMod導入しても従士の首飾りを貰えるようにしたいので、結局Scriptを使うことにしました。



従士任命時に首飾りを貰う場合はStoryManagerからクエストを開始するので、「OnStoryRelationshipChanged」というイベント内でAddItemするだけでよさそうです。


このイベントはStoryManagerからしか呼び出せないものです。
呼ばれたらアイテムをプレイヤーに追加し、クエストをストップ。


 
クエストができたら、StoryManagerに登録です。
「Change Relationship Rank」という項目を開いて、Expand Allボタンを押すと、ツリー構造でいくつかのクエストが管理されているのが分かります。結婚が台無しになった時(?)のと、従士クエストで町の人々を助けるクエストのふたつだけみたいです。ここにお邪魔させてもらうことになります。ゲーム中、NPCの関係が変化するのはそう頻繁にあることではないので、項目を増やしてもそれほど負担にはならないでしょう。

まずは最上位の「Stacked Event Node」を選択して右クリック。単純にクエストだけ登録できればいいので、新しいQuestNodeを新規追加します。TES5Editで確認すると分かりますが、既存の他Nodeに影響を与えることなく自作クエストを追加登録できます。BranchNodeはQuestNodeを束ねて扱いたい時に使うようです。


新規追加したQuestNodeに分かりやすい名前をつけて、Conditionsを設定します。
StoryManagerは各イベントごとにEventDataというものを持っているので、それを活用することができます。



「Change Relationship Rank」は、"NPC1"と"NPC2"という人間関係が変わった両者のNPCをEventDataとして取得してくれています。今回の場合だと、どっちかが首長でどっちかがプレイヤー。二人の関係が「3」になった時をQuestNodeでキャッチします。EventDataに"New Relationship"というのもありますが、ここは単純にGetRelationshipRankでプレイヤーとの関係が「3」である事実だけをとることにします。
首長は「JobJarlFaction」に入っているので、ファクションで見分けるのが簡単です。条件設定はこんな感じ。
上のSSでは、Quest Nodeの設定で"Shares Event"のチェックを忘れています。チェックを入れていないとEventをそのQuest Nodeが独占してしまい、実行条件の合う他のQuest NodeにEventをまわしてくれなくなります。どのEventに追加するかにも寄りますが、必要であれば"Shares Event"のチェックを忘れないようにします。バニラのNodeを見て"Shares Event"にチェックが入っているなら、自作Nodeでも必須だとみなして間違いないかと思います。



このQuestNodeに、それぞれのアミュレット配布クエストをAddします。
プレイヤー対首長との関係変化のみをQuestNodeが通してくるはずなので、各クエストには、「その首長がどこのホールド担当なのか」、「人間関係が変化したのは該当従士クエストのStage25での出来事なのか」をさらにふるい分けるConditionsを設定します。Stageの条件だけでもいいような気がしますけど、一応状況を厳密に特定しておきます。
首長の担当ホールドはCrimeFactionで見分けます。他のバニラクエストでもCrimeFactionで首長を見分ける処理があったので、この方法で大丈夫でしょう。
すべての条件がそろえばクエストはStoryManagerに呼び起こされ、絶妙のタイミングでアミュレットをプレイヤーに授与してくれるはずです。



ホワイトランはメインクエと内戦クエの都合上、従士クエストが二つあるのでこうなります。まだ確認してないので上手く動くか分からないですけど。

……上手く動かなくても、アミュレットが貰えないだけでそれ以上の害はないはずです。アミュレット配布クエストは一度も起動することなく永遠に眠り続けるだけ。



実際にペイルで確認してみました。タイミングぴったり。ペイルの刀剣と一緒にアミュレットが貰えます。
クエスト前に首長との関係がすでに「3」になっていても、問題なくもらえます。

唯一の例外であるリフテンは、首長との人間関係が変化する処理がありません。
従士の武器を授与されるStage200に限定して、StoryManagerの「Player Add Item」を試してみたのですが、Scriptによるアイテム取得はStoryManagerのイベントでは捉えられないのか、単にQuestNodeの条件設定が悪かったのなのか、どうもうまくいきませんでした。
リフテンのためだけに特別なScriptを書くのも億劫なので、アミュレットはイオナさんに預けることにします。

さらにゲーム途中でModを導入した際、すでに従士になっているホールドのアミュレット授与は、自作配布クエストにOnInitを書き加えて行うことにしました。

その名前から単純に、クエストが開始した時点で起こるイベントかと思っていたんですがwikiの説明を見るとクエストのOnInitにはちょっとした癖があるようです。
クエストに関してwikiのNote部分にある説明をまとめると、こうなります。Aliasでも同じことが起こるようです。

クエストでのOnInit
・呼び出されるタイミング:ゲーム開始直後(初回のみ)、クエスト開始時、クエストがリセットされた時
・結果としてクエストは、ゲーム中少なくとも2回OnInitが呼ばれる可能性がある
「Start Game Enable」と「Run Once」にチェックがあるクエストはゲーム開始後の1回のみ



そこでこちらのScriptを用意してみました。ゲーム開始後従士クエストを終えている場合のみ、Mod導入直後の初回起動時にアミュレットを1個プレイヤーの持ち物に加えます。
念のためOnInitにはこの処理を初回の一回だけ行うよう、Bool型の変数を使いました。

上記Scriptを従士クエスト終了済みのPCで試した結果、
「Start Game Enable」のみにチェックを入れた場合 = 2個貰えた
「Start Game Enable」と「Run Once」にチェック = 1個貰えた

「Start Game Enable」のみのチェックだとフラグを使おうが、OnInitが同時に2回起こるので意味ないみたいです。

目的によってはOnInitではなく他の方法をとるのがいいのかもしれませんが、逆に「Start Game Enable」にチェックの入っていないクエストでもクエスト開始より前にやっておきたい確認処理などが同じひとつのクエスト内で行えるので、それは便利かもしれませんね。今回の場合は特にそれが手軽でいいです。

アミュレット配布クエストは「Run Once」のみにチェックを入れています。これだと、Mod導入後の初回起動時とクエスト開始時の2回、OnInitが起動することになります。OnStoryRelationshipChangedとOnInitでフラグを共有することで、アミュレットをどちらかのタイミングで1個だけ授与することができます。
PR

Author

UNI
Skyrimで遊ぶのも、CKで改造するのも好きなファンタジー好きです。
戦闘苦手で難易度は基本EASY、慣れてもNORMAL程度。 アンデッド恐怖症なので、ノルド遺跡探索が辛い……。

ブログ内検索

最新コメント

[11/12 fighf]
[11/11 AllicebeLype]
[11/11 コング]
[11/10 chomechome-X]
[11/05 UNPおじさん]