; 普段はReadyステートに遷移させておく Event OnEffectStart(Actor Target, Actor Caster) ; 中略 GoToState("Ready") EndEvent ; ステート遷移用関数を定義する Function GoToReady() EndFunction Function GoToKillmove() EndFunction ; 普段のステート State Ready Event OnAnimationEvent(ObjectReference akSource, string asEventName) ; 略 EndEvent ; 攻撃を受けたらBusyステートに遷移して、しばらくしたらReadyステートに戻る Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) GotoState("Busy") ; 中略 Utility.Wait(1.0) GoToReady() EndEvent EndState ; 攻撃を受けてしばらくOnHitを無視しているときのステート State Busy ; BusyステートからReadyステートに戻る Function GoToReady() GotoState("Ready") EndFunction EndState ; キルムーブの発動を検知している間のステート State Killmove ; 自分が攻撃側であることが判明したらReadyステートに戻る ; 自分が被害者側であることが判明したらBusyステートに遷移する Event OnAnimationEvent(ObjectReference akSource, string asEventName) if asEventName == "Decapitate" GotoState("Busy") elseif asEventName == "weaponSwing" GoToReady() killmove = false UnregisterForAnimationEvent(akSource, "weaponSwing") endif EndEvent Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) GotoState("Busy") if !(akSource as Weapon) ; 武器でないなら無視 Utility.Wait(1.0) GoToKillmove() elseif !TargetActor.IsDead() ; 死んでないなら無視 Utility.Wait(1.0) GoToKillmove() else ; 武器によって殺されたので処理 position = (TargetRef.GetHeadingAngle(akAggressor) as Int) weap = (akSource as Weapon) GotoState("kState" + weap.GetWeaponType()) endif EndEvent Function GoToReady() GotoState("Ready") EndFunction Function GoToKillmove() GotoState("Killmove") EndFunction EndState