パートナーザッピングを作る

Modを作ろう

バイオハザード0のパートナーザッピングを作ってみました。

バイオハザード0というゲームにパートナーザッピングという仕組みがあります。2人の主人公から操作する方をリアルタイムに切り替えながら攻略していくというものです。これが凄く面白く、スカイリムでもやってみたいとずっと思っていたので、作ってみました。

切り替える実装は2つ思いつきました。

プレイヤーそのものを取り換える

スカイリムのプレイヤーはリファレンスIDが14のActorと決められているので、これをかえることはできません。そこで、このActorのデータを切り替えることで、擬似的に他人に置き換えるというものです。

残念ながら、切り替えられるものとそうでないものに分かれます。種族、Actor Value、装備、スペルなどは切り替えられますが、Perk、顔データは難しいです。ですので、似たようなActorを2人用意して切り替えるくらいになります。

操作するActorを切り替える

現実世界のプレイヤーの操作をActorに伝えるかどうかを切り替えるSetPlayerControls関数がPapyrusにはあります。Actorのこの関数を実行すると、前進や攻撃といった操作で、そのActorも動くようになります。増やすのであって切り替えるわけではないので、元々のプレイヤーも同時に動きます。切り替えるにはプレイヤーが動かないようにする必要があります。

Game.SetPlayerAIDriven関数は、プレイヤーのAI駆動を切り替えます。AI駆動とは、パッケージやシーンで動くということです。適切なシーンを用意してプレイヤーに割り当てることで、別のActorを操作している間はプレイヤーをその場で静止させておいたり、NPCと同じように自動的に動かすことができます。

ActorをSetPlayerControlsで操作できるようにしても、Actorに割り当てられているパッケージは動き続けます。操作中はパッケージをその場で動かないといったものにする工夫が必要です。

SetPlayerControls関数のあとはEnableAI関数でAIを有効にしてあげないと、Actorが固まります。セットで使うといいようです。

SetCameraTarget関数でカメラがとらえるActorを切り替えられます。カメラは操作中のフォロワーに切り替えます。

これで、移動、攻撃、カメラが切り替わります。これ以外のHUD周りやインベントリメニューなどは切り替わらないので、完全なパートナーザッピングではないです。あとは、攻撃されたときの画面の揺れやコントローラーの振動もプレイヤーが対象のままです。どちらもPapyrusに関数があるのでフォロワーにたいして発生させることはできるのですが、プレイヤーに発生するものを止める方法はないようです。

サンプルソースコード

パートナーザッピング (papyrus)

Actor Property PlayerRef Auto ; プレイヤーのリファレンス
Actor Property FollowerRef Auto ; フォロワーのリファレンス
Scene Property PlayerScene Auto ; プレイヤーが自動で動くためのシーン
Faction Property FollowerStayFaction Auto ; フォロワーがじっとしているためのファクション

Function StartZapping()
    Game.SetPlayerAIDriven(true) ; プレイヤーのAI駆動をON
    PlayerRef.SetPlayerControls(false) ; プレイヤーに操作を伝えなくする
    PlayerRef.EnableAI(true) ; これを実行しないとプレイヤーが自動で動かない
    PlayerScene.Start() ; プレイヤーが自動で動くシーンを開始
    Game.SetCameraTarget(FollowerRef) ; カメラをフォロワーに向ける
    FollowerRef.SetPlayerControls(true) ; フォロワーに操作を伝える
    FollowerRef.EnableAI(true) ; これを実行しないとフォロワーが動かない
    FollowerRef.AddToFaction(FollowerStayFaction) ; フォロワーが勝手に動かないようにする
EndFunction

Function StopZapping()
    Game.SetCameraTarget(PlayerRef) ; カメラをプレイヤーに戻す
    FollowerRef.SetPlayerControls(false) ; フォロワーに操作を伝えなくする
    FollowerRef.EnableAI(true)
    FollowerRef.RemoveFromFaction(FollowerStayFaction) ; フォロワーが勝手に動くようにする
    PlayerScene.Stop() ; プレイヤーが自動で動くシーンを停止
    Game.SetPlayerAIDriven(false) ; プレイヤーのAI駆動をOFF
    PlayerRef.SetPlayerControls(true) ; プレイヤーに操作を伝える
    PlayerRef.EnableAI(true) ; これを実行しないとプレイヤーが自動で動かない
EndFunction

PlayerScene

フォロワーを操作している間にプレイヤーを動かすためのものです。例えばフォロワーを追従させるなど、プレイヤーにさせたいシーンを作ります。

FollowerStayFaction

フォロワーを操作している間にフォロワーが勝手に動かないようにするパッケージを用意します。パッケージのConditionsに「このFollowerStayFactionに属している」を設定します。QuestとReferenceAliasを用意し、ReferenceAliasにフォロワーとパッケージを割り当てておきます。これでフォロワーをFollowerStayFactionに入れたり外したりでフォロワーに適用させるパッケージを制御できます。

注意すべきことなど

自前のフォロワー拡張に実装して色々と試行錯誤をしている段階です。まだ不明な点がいくつかあります。

SetPlayerControls関数はEnableAI関数とセットで使うといいのですが、プレイヤーにたいしても使った方がいいみたいです。プレイヤーは普段は操作で動いているので気になりませんが、馬に乗る時やGo to bedで就寝する時などはSceneでAI駆動するので、それに影響が出ます。動かなくて困った時はコンソールでtaiを実行するといいです。

タイトルとURLをコピーしました