The Ultimate Dodge Mod
スニークのアニメーションをドッジのアニメーションに置き換えることでゲームエンジン処理による遅延無しのドッジを実現しています。ステップ回避とロール回避があります。
遅延無しのステップ回避はいまのところこのTUDMだけみたいなので、戦闘中のステップ回避をTUDMにやらせることにします。
攻撃の動作中はドッジを出せません。つまり攻撃モーションをドッジでキャンセルできません。ヴァニラでは攻撃の動作中はスニークの切り替えができません。よってドッジも出来ないのだと思われます。
Combat Gameplay Overhaul SE
戦闘のオーバーホールです。色々なことが出来るようになるのですが、ドッジも追加されます。TUDMと同様のスニーク置き換えモードと、スクリプトによるホットキーモードがあります。ステップ回避はなくロール回避のみです。
このModのロール回避は動きがとても良く、TUDMよりこちらを使いたくなりました。そこで、非戦闘中のロール回避をCGOにやらせることにします。
やりたいこと
- 戦闘中(抜刀中)はTUDMの遅延無しのステップ回避を使う。(戦闘中の遅延は避けたい)
- 非戦闘中(納刀中)はCGOのロール回避を使う。遅延は我慢する。(非戦闘中に遅延してもたいした問題ではない)
- ボタンはできるだけ減らしたい。(理想はひとつ)
TUDMのパッチを作る
Idle AnimationのDodgeRollSKSEに「抜刀中である」という条件を追加するだけです。
他にもスタミナの残りに関係なく出せるようにしました。消費がなくなるわけではないので、ドッジを連発しているとスタミナが枯渇したままです。
あとはメインクエストの消化判定を消しました。ドッジの度に検査するのは無駄でしかありません。どれほど効果があるかは不明ですが、消さないよりはマシだと思います。
スタミナとメインクエストの条件式はDodgeRollSneakStyle1PlayerとDodgeRollSneakStyle2Playerにもあります。
CGOのパッチを作る
TUDMもCGOもスニーク開始のIdle AnimationであるSneakStartに手を入れているので競合します。
ロード順はTUDMが後になるようにします。これでスニークキーを押してもTUDMのドッジしか出なくなります。
このままだとCGOのドッジが出せないので、CGOはホットキーモードにして、スニークキーを割り当てます。CGOのホットキーを処理しているスクリプトに手を加えて、納刀中のみドッジを発動するようにします。
DSerCombatGameplayOverhaul.psc (papyrus)
Event OnKeyDown(int KeyCode)
;(略)
;If KeyCode == DodgeHotkey.GetValue() && DodgeInputType.GetValue() != 0 ;Keycode is dodge and sneak controls is off
If KeyCode == DodgeHotkey.GetValue()
if !PlayerRef.IsWeaponDrawn()
debug.SendAnimationEvent(PlayerRef, "DodgeRoll")
endif
return
EndIf
;(略)
EndEvent
これで、スニークキーひとつでTUDMのステップ回避とCGOのロール回避を両立できます。スニークしたいときはTUDMのスニーク用ホットキーを設定して使います。
攻撃の動作をドッジでキャンセルする
TUDMのスニーク置き換え版ドッジは攻撃の動作中に出せないという制約があり、これをなんとかするにはアニメーションの処理に手を入れなければならず、色々と弊害もありそうで難しいです。
そこで、CGOのホットキー版ドッジを攻撃の動作中に出せるようにしました。さらに最適化も行っています。
DSerCombatGameplayOverhaul.psc (papyrus)
Event OnKeyDown(int KeyCode)
;(略)
;If KeyCode == DodgeHotkey.GetValue() && DodgeInputType.GetValue() != 0 ;Keycode is dodge and sneak controls is off
If KeyCode == DodgeHotkey.GetValue()
if PlayerRef.GetAnimationVariableBool("IsStaggering")
debug.SendAnimationEvent(PlayerRef, "DodgeRoll")
return
endif
if PlayerRef.IsOnMount()
return
endif
if PlayerRef.GetAnimationVariableBool("IsAttacking")
debug.SendAnimationEvent(PlayerRef, "DodgeRoll")
return
endif
if PlayerRef.GetSleepState() != 0 || PlayerRef.GetActorValue("Health") <= 0.0
return
endif
if PlayerRef.IsWeaponDrawn()
return
endif
debug.SendAnimationEvent(PlayerRef, "DodgeRoll")
return
EndIf
;(略)
EndEvent
ついでにスプリントキーとスニークキーをひとつにする
TUDMで設定するスニーク用ホットキーにスプリントキーを設定します。
静止状態または前方以外に移動中はスニークするようにします。スプリントが発動できない状況で無駄になっているキーを有効活用できます。
UDSKSEFunctionsScript.psc (papyrus)
event OnKeyDown(int KeyCode)
;/
if(playerRef.IsSneaking() == 0) && (playerRef.IsSprinting() == 0) && (KeyCode == SneakKey)
playerRef.playIdle(SneakStartPlayer)
ResetSneakEye()
elseIf(playerRef.IsSneaking() == 1) && (KeyCode == SneakKey)
playerRef.playIdle(SneakStopPlayer)
ResetSneakEye()
/;
if KeyCode == SneakKey
if playerRef.IsSneaking() == 1
playerRef.playIdle(SneakStopPlayer)
ResetSneakEye()
else
Float fDirection = PlayerRef.GetAnimationVariableFloat("Direction")
if PlayerRef.GetAnimationVariableFloat("Speed") < 5.0 || \
(0.125 < fDirection && fDirection < 0.875) ; 左斜め前から後ろ、右斜め前まで
playerRef.playIdle(SneakStartPlayer)
ResetSneakEye()
endif
endif
elseIf(KeyCode == DodgeToggleKey)
PreDodgeStyleChange(0)
endIf
endEvent
ResetSneakEye関数はHUDのスニークアイコンの表示、非表示の切り替えです。常に表示させない設定で遊んでいる場合は、これをコメントアウトします。
さらにCGOの持ち替えキーも節約
Equipment Managerの戦闘キーに「任意のキーを発動する」機能を付けました。抜刀中に短押しした時だけCGOの持ち替えキーにする、ということが出来ます。
あるいは戦闘キーを抜刀中の短押し時に持ち替えキーそのものにするという機能も付いています。
コントローラーで斜めにドッジする
コントローラーで操作していると、斜め方向へのドッジを出すのがとても難しくなります。
推測ですが、プレイヤーの最後の移動方向というパラメータがどこかに保存されており、アニメーションはそれを見てドッジする方向を決めているのだと思われます。キーボードだとキーが4つしかありませんが、これがかえって簡単に斜めを入力できるのです。ところがコントローラーだと360度入力なので、正確に斜め方向にいれないと上下左右のどれかにいれたと認識されてしまうようです。
あらかじめcontrolmap.txtでコントローラーサポートありの状態でもキーボードによる移動ができるようにしておきます。
JoyToKeyで斜めドッジを割り当てます。例えば左ボタンや右ボタンにするとします。POVのところです。
そして、割り当てる機能の画面ではKeyboard 2を選び、「ボタンが離された時入力1(そして押されている間は入力2)」を選びます。押された時に「前進キー」「右移動キー」を割り当てます。離された時に「ドッジキー」を割り当てます。
コツは、少しの間キーを押しつづけることです。あまりにもキーを押す時間が短いと、移動方向が検知されず、前回の移動方向にドッジが出てしまいます。これはキーボードで操作しても同じことなので、Skyrimの仕様だと思われます。
この方法のいいところは、Skyrimではない外部のツールに処理させるので、Skyrimの負荷に影響しないというところです。もしスクリプトでどうにかしようとすれば、スクリプト負荷の影響を受けるので、せっかくの遅延なしのドッジ環境が台無しになってしまいます。
上の例ではドッジまで含めていますが、斜め移動だけにしておき、ドッジしたい時はドッジキーと併用するようにすれば、斜め移動キーとしても使えます。