忍者ブログ

方向音痴のSkyrim

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

フォロワー拡張Modの自作11【傭兵を雇ってみる1】

フォロワークエストの作成は前回で終了しても特に問題ないものの(仲間割れ問題は残ってますが)、傭兵はお金を払って雇いたい。
ということで、傭兵への対応をやってみたいと思います。

バニラの傭兵雇用クエスト「HirelingQuest」です。
まずはこれを読み解いて、自作フォロワークエストにどう追加するか考えてみます。



Dialog Viewを見てみると、いくつか項目があります。虐殺者エリクとの会話Dialog Viewとジェネッサとの会話Dialog View、それから「雇用」と「再雇用」のDialog View。
これは「雇用」のダイアログです。バニラの各傭兵さんのセリフが並んでいます。「雇用承諾」「お金が足りないとき」「仲間がいっぱいのとき」の3種。



こちらは「再雇用」のダイアログ。線がカクカク伸びていて分かりづらいですが、「前の解雇から時間たってないしタダでいいよ」→「じゃあついてきて」の会話の流れをつなげている線です。
このダイアログBranchの背景色は薄い萌黄色です。これはBlockedという特殊なDialog Branchで、他のダイアログを全てブロックアウトし自分のダイアログだけを表示させる性質を持っているそうです。
傭兵の再雇用可能期間は、解雇から24時間以内。この間はBlockedのダイアログが出てくるので、自作クエスト含め他の会話が一切できなくなります。



最後にScriptを確認。
傭兵雇用クエストには「HirelingQuest」というスクリプトが1つ付いています。
雇用時のダイアログについているPapyrus Fragmentの記述を合わせてみると、このクエストで傭兵雇用に必要な前処理(プレイヤーから500G取り上げて、顔馴染みにさせる)を行い、フォロワー化処理は「Dialog Follower」クエストに任せているようです。



こちらは「DialogueFollower」クエスト。
「Dialogue Follower」クエストの「SetHirelingRehire」というスクリプトは、傭兵の再雇用処理を行っています。Propertyがたくさん登録されてますが、各傭兵専用の変数などで数が多く見えるだけで、変数の種類は限られています。

あれこれ見た結果、バニラの傭兵がそれぞれに持っているGlobal変数は次の2種類が見つかりました。
・HirelingRecognize<傭兵名>
 プレイヤーに雇用されたことがあるか(プレイヤーと顔馴染みになっているか)
・CanRehire<傭兵名>
 解雇された時の日時+1日(再雇用可能期間)

再雇用処理があるぶん、普通のフォロワーに比べてちょっとばかり複雑です。
幾分悩んだ末とりあえず、絶対に必要そうなGlobal変数と、自作フォロワークエストに傭兵専用の雇用処理スクリプトを作ることにしました。
「プレイヤーと顔馴染み」になる処理はゲーム内で一回行われればそれで十分な処理なので、自作フォロワークエストでは行わないことにしました。傭兵さんに顔を覚えてもらいたい時は、一度バニラ枠で雇用します。



まずはGlobal変数の作成(第10回のサンプルファイルでは既に作成済みです)
傭兵の再雇用期間を記憶するための変数を新規作成します。
各傭兵ごとに設定すべきものですが、自作フォロワークエストでは不特定多数の傭兵を簡単に扱えるようにしたいので(現状だとテルドリン・セロに対応できない)、この変数は共用することにしました。
Variable Typeは"Float"を選択。



自作フォロワークエストを開き、「SL01SPSHirelingScript」というスクリプトを新規作成します。傭兵雇用処理については、このScriptにまとめることにしました。



Propertyの設定は後回しにして、先にScriptを書きます。バニラの傭兵関連Scriptをお手本にしています。
内容をコピー&ペーストしてセーブ。処理の内容は3つ。
  • 雇用: プレイヤーから雇用費用のゴールドを取り上げて、傭兵専用の雇用中ファクション(バニラのファクション)に傭兵を突っ込む。SL01SPSQuestScriptの雇用処理を呼び出してフォロワー化。
  • 解雇: フォロワーの解雇処理の最中に呼び出す傭兵専用追加処理です。傭兵の雇用中ファクションから脱退させる。自作の再雇用期間Global変数にプラス1。Global変数のGameDayPassedは、その名のとおり単位が1日なので、解雇時日時から24時間後の時刻が再雇用Global変数に保存されます。
  • 再雇用: お金を取られない以外は、雇用処理と同じ。最後の行で、再雇用Global変数に1を設定し、再雇用可能期間をリセットします。
 
 
コンパイルがうまく通ったら、HirelingScriptを選択してPropertisボタンを押します。
Scriptであらかじめ書き込んできたPropertyが並んでいるので、ひとつずつ値を設定していきます。面倒な場合は「Auto-Fill」ボタンを押すと、CKがそれっぽい値を探して設定してくれます。CKがちゃんと正しい値を選んでくれたかをきちんと確認すれば、OKして大丈夫。
画像のPropertyを上から順に説明すると、
  • バニラの雇用中専用ファクションCurrentHireling
  • Global変数「GameDayPassed」
  • Gold001はアイテム「ゴールド」のIDです
  • Global変数「HirelingGold」傭兵雇用料金。料金を変えたければこのGlobal変数の値を変えるといけます。ゲームの途中でGlobal変数を変えた場合、UpdateCurrentInstanceGlobalという関数でアップデートしないと、変更した値がダイアログ内の表示に反映されないそうです。あるいは新しくGlobal変数を作って、自作フォロワークエスト専用の雇用料金を設定しても面白いかもしれません。
  • 自作Global変数「SL01CanRehire」。再雇用可能期間を記憶させるための変数
  • スクリプト「SL01SPSQuestScript」。外部のスクリプトにある関数を使いたい時は、こんなふうにスクリプト名をTypeとしてPropertyを設定します。「SL01SPSQuestScript」はextends QuestというQuestに準じるスクリプトなので、Propertyの値にはそのスクリプトがくっついているクエストを選択します。

次に傭兵雇用の処理を追加するため、SL01SPSQuestScriptを少し修正します。
Scriptを開けて、直接書き込んでいきます。
SL01SPSHirelingScript Property SL01SPSHireling Auto
Propertyが新たに必要になるので、他のPropertyの下にこの1行を追加します。
先ほど作成した、傭兵雇用処理用Scriptです。

次に解雇処理のFunctionに、傭兵解雇専用の処理を書き加えます。

この処理を……、



こんなふうに、"DismissFollowerAlias.Clear()"という処理の直前に追加。
そして、"akSpeaker.RemoveFromFaction(pCurrentHireling)"という処理の前に";"セミコロンをつけて、必ずコメントアウトします。もしくは、この行を削除します。この処理は「SL01SPSHirelingScript」で行うので、もう必要ありません。

あとついでに、上の方にある"akSpeaker.AddToFaction(pDismissFollowerFaction)"という行の先頭から";"のセミコロンを削除して処理を有効化します。
最終的に上のScriptと同じになっていれば、書き換え完了です。

バニラ枠フォロワーは、解雇の時この「DismissedFollowerFaction」というファクションに加入させられています。このファクションは二重解雇防止のために使われているらしいのですが、それ以外の役割があるのかどうかはよく分かりません。ただ、このファクションに入っていることで、「このNPCは過去にフォロワーになったことがある=プレイヤーと顔見知りである」という目印にもなります。何か便利そうだし、このフォロワークエストの機能もよりバニラと近いものにしたいので、処理を有効化することにしました。

余談
";akSpeaker.AddToFaction(pPotentialSPSFollower)"てのがコメントアウトしてあります。自作フォロワークエストでフォロワー化したNPCに、唾をつけとこうという意図で書き加えていた行です。恐らく唾をつける必要性は皆無に等しいので、この処理を有効にすることはないかと思われます。この行は消してしまって大丈夫です。

;---------------- Set SPSFollower --------------------------
Function SL01SetSPSFollower(Actor FollowerRef)

	~空きAliasを探す処理~
		
		aAliasSPSFollower[iAliasIndex].ForceRefTo(FollowerRef)
		FollowerRef.RemoveFromFaction(pDismissFollowerFaction)
		Debug.Trace("[SL01SPS:SetSPSFollower] " + FollowerRef + " becomes your " + aAliasSPSFollower[iAliasIndex])
		
		~その他色々の雇用処理~

EndFunction
雇用処理の方でも、コメントアウトしていた"FollowerRef.RemoveFromFaction(pDismissFollowerFaction)"の先頭からセミコロンを削除して、処理を有効にします。
フォロワーとして雇用したら、「DismissedFollowerFaction」から外れることになります。これもバニラ枠フォロワーと同じ処理。
ちなみに動物フォロワーに対しては、これらの処理はありません。

ここまでできたら、セーブしてコンパイルします。



「Properties」ボタンを押して、新しく加えたPropertyに値を設定します。もしかしたら、CKが勝手に値を設定してくれているかもしれません。設定があっているかだけチェックして、よければOKを押してウィンドウを閉じます。
これでスクリプトの設定は完了。

次はダイアログの準備です。

前へ | 次へ
PR

Author

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

ブログ内検索

最新コメント

[07/18 JasonDaurl]
[07/16 chomechome-X]
[07/16 ブレトン魔術師]
[07/15 amo]
[07/10 初心者シセロ]