Critical Hit – Backstab and Parryとは
Critical Hit - Backstab and Parry in Skyrim Special Editionで紹介しています。
スクリプトベースなので改造しやすいのと、バックスタブのモーションがバニラのものと同じで好みなので使い続けています。
問題もあって、本来はアニメーションがFNIS用で、もう記憶にないのですがFNIS時代はきちんと動いていたように思います。これがNemesisになってから不発することが多くなりました。
デバッグの結果、PlayIdleWithTarget関数でアニメーションを再生する手前までは問題なく、アニメーションの再生が安定しないようでした。原因は不明ですが、おそらくはActorの状態が適切ではないようで、そのうち直ったり、また不発になったりします。
また、アニメーションは再生されるが攻撃がヒットせず、相手にダメージがまったく無いことがあります。
アニメーションファイルを調べてみた
このModが追加しているアニメーションはCH_paired_1hmkillmovebackstab.hkxになります。これはどうやらバニラのpaired_1hmkillmovebackstab.hkxに手を加えたもののようです。
このバニラのアニメーションですが、マルカルスに入ったところでウェイリンがマルグレットに仕掛ける攻撃にも使われています。Sceneの中でPlayIdleWithTarget関数を使っており、これが不発になったことはありません。
試しにCritical Hitが再生しているCH_paired_1hmkillmovebackstab.hkxのかわりにpaired_1hmkillmovebackstab.hkxを使うようにしたところ、安定して発動するようになりました。ただし、相手が確定で死亡するようです。
hkanno64で両者を調べてみたのですが、アノテーションが一切なく、どういう処理になっているのかわかりませんでした。おそらくはアノテーション以外にもTriggerと呼ばれる命令の仕組みがあるようです。
OARにはTriggerを無視するというオプションがあるので、OARで置き換えてオプションを設定してみたところ、死ななくなりました。ただ、効果音もなく、イベントも発火しなくなってしまいます。
FNIS用設定ファイルを参考にアノテーションを追加してみました。
# numOriginalFrames: 97
# duration: 3.200000
# numAnnotationTracks: 201
# numAnnotations: 18
0.000000 2_KillMoveStart
0.005000 NPCKillMoveStart
0.036000 NPCSoundPlay.NPCKillStruggle
0.240000 NPCFootScuffLeft
0.772000 NPCFootScuffRight
0.916000 NPCFootScuffLeft
1.105000 NPCweaponSwing
1.118000 NPCSoundPlay.NPCKillStabIn
1.202000 NPCHitFrame
1.328000 NPCSoundPlay.NPCKillGore
1.535000 NPCSoundPlay.NPCKillStruggle
1.867000 NPCSoundPlay.NPCKillStabOut
2.202000 2_KillMoveEnd
2.849000 NPCFootScuffLeft
3.003000 NPCFootScuffRight
3.164000 NPCpairedStop
3.166667 NPCPairEnd
3.166667 NPCKillMoveEnd
結局のところ、最後には死んでしまいます。
なんとなくですが、攻撃が常にヒットするようになる気がします。
強引に死亡しないようにしてみた
対象にStartDeferredKill関数を実行して不死化しておくと死ななくなるので、用が済んだらEndDeferredKill関数で不死化を解除します。
でも、EndDeferredKill関数を実行した直後に死んでしまいます。これはアニメーション中のKill命令自体は止まっておらず、関数名のとおり死を遅延させているだけだからのようです。
そこで、アノテーションを部分的に取り除いてみたりしたのですが、ダメでした。どうやら、KillMoveStartではじまり、KillMoveEndで終わると、相手はかならず死ぬようです。この2つだけを取り除いてみたところ、死ななくなりました。
スクリプト側はこのイベントをみて処理を入れているため、かわりとなるイベントが必要です。
Behavior Data Injectorを使ってイベントを新規追加
SKSE\Plugins\BehaviorDataInjector\CriticalHit_BDI.jsonになります。
[
{
"projectPath": "Actors",
"type": "kEvent",
"name": "BackstabStart"
},
{
"projectPath": "Actors",
"type": "kEvent",
"name": "BackstabEnd"
}
]
アノテーションを更新
pairedアニメーションの場合、そのまま書いてもダメなようで、頭にNPCをつけると攻撃側、2_をつけると被害者側にイベントが発生するようです。
# numOriginalFrames: 97
# duration: 3.200000
# numAnnotationTracks: 201
# numAnnotations: 16
0.000000 2_BackstabStart
0.036000 NPCSoundPlay.NPCKillStruggle
0.240000 NPCFootScuffLeft
0.772000 NPCFootScuffRight
0.916000 NPCFootScuffLeft
1.105000 NPCweaponSwing
1.118000 NPCSoundPlay.NPCKillStabIn
1.202000 NPCHitFrame
1.328000 NPCSoundPlay.NPCKillGore
1.535000 NPCSoundPlay.NPCKillStruggle
1.867000 NPCSoundPlay.NPCKillStabOut
2.202000 2_BackstabEnd
2.849000 NPCFootScuffLeft
3.003000 NPCFootScuffRight
3.164000 NPCpairedStop
3.166667 NPCPairEnd
どういうわけか、攻撃側はKillMoveEndイベントが発火します。とはいえ、攻撃側なので影響はなさそうです。
操作を改善する
MCMでバックスタブを有効にすると、プレイヤーにCH_BackStabDetectAbilityというスペルが付与されます。
このスペルはプレイヤーのPowerAttack_Start_endイベントを検知したら、CH_BackStabSpellというタッチ式のスペルを詠唱します。タッチ式なので相手を正面に捉え、十分に接近する必要があります。
CH_BackStabSpellが相手に着弾すると、バックスタブのアニメーションを再生する、という流れになっています。
角度の検査はCH_BackStabSpellにあります。
問題は、バックスタブを仕掛けるために攻撃するという点にあります。バックスタブが不発になった場合は、そのまま意図しない攻撃が出てしまうので、ストレスになります。逆に、あえて通常の攻撃をしたかったり、パワーアタックを入れたかったり、MCOでコンボを入れたかったとしても、バックスタブに化けてしまうこともあります。
要はCH_BackStabSpellを発動すればいいので、バックスタブキーを用意して、CH_BackStabSpellを詠唱するようにしたところ、上記の問題が解決できました。