/* Generic Being Knocked Over Machine // // This machine is run on the target, but called from the pusher. // The pusher needs to call the following actions before setting it's target to run this machine: // // action SetTargetToSlave() ; sets target into command mode // action PushTarget() ; sets the targets steering into a pushed mode // action SetNumPassedParamTarget(1) ; sets up the parameters required by this machine // action SetPassedParamTargetKnockDir(0) ; " " " " // action SetTargetsTargetToMe() // action SetTargetFSM(fsm::"KnockOver") ; sets the target to run this machine // */ machine KnockOver { state KnockAnimCheck ;// check if animations exist and remap if possible { ;// hit lt and hit rt assumed to be at least present - this assumption no longer holds true - doh! ;// now assume fall_st and fall_ed always present action SetStandStill() transition GetPassedParam(0) == 1 { direct goto FdAnimCheck } transition GetPassedParam(0) == 3 { direct goto BkAnimCheck } transition { direct goto KnockStart } } state FdAnimCheck { transition IsAnimLoaded("hit", "fd")==false { action SetPassedParam(0, 2) direct goto KnockStart } transition IsAnimLoaded("getup", "fd")==false { action SetPassedParam(0, 2) direct goto KnockStart } transition { direct goto KnockStart } } state BkAnimCheck { transition IsAnimLoaded("hit", "bk")==false { action SetPassedParam(0, 4) direct goto KnockStart } transition IsAnimLoaded("getup", "bk")==false { action SetPassedParam(0, 2) direct goto KnockStart } transition { direct goto KnockStart } } state KnockStart { transition GetPassedParam(0) == 2 { direct goto LtAnimCheck } transition GetPassedParam(0) == 4 { direct goto RtAnimCheck } transition { direct goto InitKnock } } state LtAnimCheck { transition IsAnimLoaded("hit", "lt")==false { action SetPassedParam(0, 5) ;// fall direct goto InitKnock } transition IsAnimLoaded("getup", "lt")==false { action SetPassedParam(0, 5) direct goto InitKnock } transition { direct goto InitKnock } } state RtAnimCheck { transition IsAnimLoaded("hit", "rt")==false { action SetPassedParam(0, 5) ;// fall direct goto InitKnock } transition IsAnimLoaded("getup", "rt")==false { action SetPassedParam(0, 5) direct goto InitKnock } transition { direct goto InitKnock } } state InitKnock { action CreateKnockMusterZone(false, false) action SetDispInjured(false, true) transition CanGetUp() { ;//action UpdateVariable("health", -100.0) action TargetHurtMe(false, 1.0) direct goto KnockUpdateHealth } transition { ;//action UpdateVariable("health", -100000.0) action TargetHurtMe(false, -1.0) direct goto KnockUpdateHealth } } state KnockUpdateHealth { action UpdateTargetKills() action ReleaseTarget() action SetAutoMovementBlend(false) transition IsDead() { direct goto PlayHitDead } transition { direct goto PlayHit } } state PlayHit { transition GetPassedParam(0) == 1 { action PlayAnimSpeed("hit", "fd", true, 1.0) goto FallWait } transition GetPassedParam(0) == 2 { action PlayAnimSpeed("hit", "lt", true, 1.0) goto FallWait } transition GetPassedParam(0) == 3 { action PlayAnimSpeed("hit", "bk", true, 1.0) goto FallWait } transition GetPassedParam(0) == 4 { action PlayAnimSpeed("hit", "rt", true, 1.0) goto FallWait } transition { action PlayAnim("fall", "st", true, 0.0) action SetAutoLinkAnimOff("fall", "st", true) goto DropWait } } state PlayHitDead { action LeaveFlock() action StopAllUserAnimations(true) transition GetPassedParam(0) == 1 { action PlayAnimSpeed("hit", "fd", true, 1.0) action SetLockLastPose("hit", "fd", true) goto FallWait } transition GetPassedParam(0) == 2 { action PlayAnimSpeed("hit", "lt", true, 1.0) action SetLockLastPose("hit", "lt", true) goto FallWait } transition GetPassedParam(0) == 3 { action PlayAnimSpeed("hit", "bk", true, 1.0) action SetLockLastPose("hit", "bk", true) goto FallWait } transition GetPassedParam(0) == 4 { action PlayAnimSpeed("hit", "rt", true, 1.0) action SetLockLastPose("hit", "rt", true) goto FallWait } transition { action PlayAnim("fall", "st", true, 0.0) action SetLockLastPose("fall", "st", true) action SetAutoLinkAnimOff("fall", "st", true) goto DropWait } } state FallWait { transition AnimStateFinished("hit") == true { action SetRandomTimerBetween(1, 2.0, 3.0) goto LieEndWait } } state DropWait { transition AnimStateFinished("fall") == true { action SetRandomTimerBetween(1, 2.0, 3.0) goto LieEndWait } } state LieEndWait { transition IsDead() { action LockDeadPose() goto KnockEndStart } transition { action SetRandomTimerBetween(1, 2.0, 3.0) direct goto SteerFinishedWait } } state SteerFinishedWait { transition HasArrived() { action SetLockFacing(false) action SetAvoidanceSteer(true) direct goto FlailPlay } transition IsTimerUp(1) { action SetLockFacing(false) action SetAvoidanceSteer(true) direct goto FlailPlay } } state FlailPlay { transition GetPassedParam(0) == 2 { goto FlailPlayLeft } transition GetPassedParam(0) == 4 { goto FlailPlayRight } transition { goto GetupPlay } } state FlailPlayLeft { transition IsAnimLoaded("panic", "lt") == false { direct goto GetupPlay } transition { action PlayAnimSpeed("panic", "lt", true, 1.0) goto FlailWait } } state FlailPlayRight { transition IsAnimLoaded("panic", "rt") == false { direct goto GetupPlay } transition { action PlayAnimSpeed("panic", "rt", true, 1.0) goto FlailWait } } state FlailWait { transition AnimStateFinished("panic") { goto GetupPlay } } state GetupPlay { transition GetPassedParam(0) == 1 { action PlayAnimSpeed("getup", "fd", true, 1.0) goto GetUpWait } transition GetPassedParam(0) == 2 { action PlayAnimSpeed("getup", "lt", true, 1.0) goto GetUpWait } transition GetPassedParam(0) == 3 { action PlayAnimSpeed("getup", "bk", true, 1.0) goto GetUpWait } transition GetPassedParam(0) == 4 { action PlayAnimSpeed("getup", "rt", true, 1.0) goto GetUpWait } transition { action PlayAnim("fall", "ed", true, 0.0) goto DropEndWait } } state GetUpWait { transition AnimStateFinished("getup") { action SetAutoMovementBlend(true) goto KnockEndStart } } state DropEndWait { transition AnimStateFinished("fall") { action SetAutoMovementBlend(true) goto KnockEndStart } } exitstart state KnockEndStart { action SetVariable("Sedate", 0.0) transition { goto KnockEnd } } exitend state KnockEnd { action SetUpdateTargetKillsFlag(false) action SetDispInjured(false, false) action SetLockFacing(false) action SetAvoidanceSteer(true) action DeleteAllCommands() } }