読者です 読者をやめる 読者になる 読者になる

RのSkyrim Mod開発日記

SkyrimのMod開発を中心に、備忘録などを載せていきます。

Skyrim Mod 製作日記 - 5 - はじめてのクエスト作成2

やりたいこと:NPCとの会話で選択肢を選択後にクエストステージの更新とクエストタイトルを表示させる
やったこと:それを可能とするスクリプトを探して実行させるように置き換える

前回遭遇した問題について

前回、Creation Kit(以降CK)のチュートリアルを進めていましたが、CKがクラッシュする問題に見舞われました。

この時まさに丁度、BethesdaのCommunityに同様の問題をかかえる方の投稿がありました。
beta-community.bethesda.net

自分も便乗して現在の状況について書き込みします。
さらに、Communityを調べていると、それよりも2ヶ月ほど前の記事に、解決の糸口となる内容が記載されていました。

[Dialogue Views]タブの隣にある[Player Dialogue]でも編集可能なことを知ります。
f:id:rrryutaro:20170109115210p:plain

クラッシュする問題の根本解決は出来ていませんが、これで作業を進めることは出来るようになりました。

新たな問題

CKのチュートリアルはPS4向けに作られているわけではありませんので、スクリプトを作る工程があります。
PS4では外部アセットと呼ばれる、自分で作ったスクリプトやらテクスチャやらを利用できませんので、ここでかなり躓きました。

そして、この問題もまさに丁度Communityに投稿がありました。
beta-community.bethesda.net

投稿そのものは2ヶ月前ですが、丁度今まさにのタイミングでコメントが付き、丁度自分と同じ問題を抱えていると思われる内容でした。

現在既に解決策を見出して、この記事を書いているため、それまでの過程を改めるのが少々おっくうなので結論ですが、既存のスクリプトから利用できそうなものを探して使うだけです。

例えば、今回のケースでやりたいことは、錬金術士のトレーナーに話しかけ、錬金術を習いたいかという問いかけに、Yesと答えたら、トレーナーは指示を出し、同時にクエストステージを0から10に変更し、かつクエストステージ10のタイトルを表示させることです。

スクリプトが使える場合、Topic Info Fragments.に、次のように書き込むだけです。

GetOwningQuest().SetStage(10)
GetOwningQuest().SetObjectiveDisplayed(10)

これと同じことが出来そうなスクリプトを探すために、C:\Program Files (x86)\Steam\steamapps\common\Skyrim Special Edition\Data\Source\Scriptsを基点に、次の正規表現文字列でgrepします。

SetObjectiveDisplayed\(10\D

"SetObjectiveDisplayed(10)"とせずに、正規表現を使うのは"(10, "のように、第2引数なりを指定しているものをピックアップするためです。
後元々は、"SetObjectiveDisplayed\(\D"として、プロパティが使えるスクリプトが無いかを探していたためです。

これにより、いくつかの候補が見つかったので、あとは中身を覗いてそのまま利用できそうなスクリプトを探します。
今回は丁度、"TIF__0001B24C"というスクリプトが見つかりました。

では、これを使うようにしたいのですが、CKだとたぶん出来ないです。
少なくとも自分は方法が分かりませんので、一旦、ダミーでスクリプトが呼ばれる状態を作ります。
f:id:rrryutaro:20170109120749p:plain

これを保存し、今度はSSEEditで開き該当の設定を表示します。
f:id:rrryutaro:20170109120934p:plain

スクリプトのファイル名を直接変更します。
f:id:rrryutaro:20170109121019p:plain

"fragmentName"はたまたま同じだったのでそのままです。
SSEEDitを閉じて、保存し、CKで開き直します。

読込むスクリプトが"TIF__0001B24C"となっています。
f:id:rrryutaro:20170109121402p:plain

中身は次のようになっています。
f:id:rrryutaro:20170109121442p:plain

CKでは、";BEGIN CODE"と";END CODE"で囲われている部分をTopic Info Fragmentsとして、画面に表示させているのでしょう。
ともかくもこれで、目的とする動作をさせることができるようになりました。
既存のスクリプトなので、PS4のModとしてアップロードできます。

なお、Communityで話題となっていた、questAliasUtilitySCRIPTは、onACTIVATEで動くものなので、何か対象となるアイテムを用意して、それを操作した時にしか使えませんが、プロパティでクエストステージの数値を指定できるので、汎用性があるため、使えるところでは一番適切なスクリプトでしょう。

このようにして、進めるしかありませんので、場合によっては、既存のスクリプトの動作に合わせてクエストの設定をする必要があるかと思います。

例えば、上記のケースでは、そのステージのクエスト完了をするスクリプトとして、"SetObjectiveCompleted(10)"があるスクリプトを探してみましたが、大抵はその次のステージに進める記述があり、ステージの数値は12とか15などがあります。
このため、自分のクエストでもステージの数値を場合によっては、それに合わす必要があります。

ともかくも、これでどうにかある程度クエストの作り方がわかりました。

以上