/* Generic Ram Fence // // This machine should be used through the normal call mechanism // */ machine RamFence { default state RamStart { action SetAutoMovementBlend(true) action SetSpeedModifier(1.0) action SetRunMode(true) transition AcquireFence(50, false) { action LockMachine(false) action SendEnclosureEvent("attack_Structure") goto FaceFence } transition { goto RamFenceExit } } state FaceFence { action StopLook() action FaceTarget() transition { action SetRandomTimerBetween(2, 8.0, 10.0) goto FaceTargetWait } } state FaceTargetWait { transition HasArrived() { action SetStandStill() goto MinDistanceCheck } transition IsTimerUp(2) { action SetStandStill() goto MinDistanceCheck } } state MinDistanceCheck { transition InTargetProximityRadius(9.0, true) { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(14.0) action SetRandomTimerBetween(3, 4.0, 5.0) goto MinDistanceStep } transition { goto SeekFence } } state MinDistanceStep { transition InTargetProximityRadius(11.0, false) == false { action SetWalkBackMode(false) action SetLockFacing(false) goto SeekFence } transition IsTimerUp(3) { action SetWalkBackMode(false) action SetLockFacing(false) goto SeekFence } } state SeekFence { action SetSpeedModifier(1.5) action SetRunMode(true) transition { action SetRandomTimerBetween(1, 4.0, 5.0) goto SeekStart } } state SeekStart { transition CanBreakFence(45.0, 60.0) ;// (damage range) { action SetRandomTimerBetween(1, 4.0, 5.0) action SetNumPassedParam(1) ;// for SeekFenceOffset action SetPassedParam(0, -4.0) ;// for SeekFenceOffset goto BreakFence } transition { action SetSpeedModifier(1.0) action SetRunMode(true) action SetNumPassedParam(1) ;// for SeekFenceOffset action SetPassedParam(0, -4.0) ;// for SeekFenceOffset action SetRandomTimerBetween(1, 4.0, 5.0) goto AttackFence } } ;// ---- Break Fence state BreakFence { action SetSpeedModifier(1.5) action SetRunMode(true) transition SeekFenceOffset(0, -0.1) { action StopLook() action SetRandomTimerBetween(1, 10.0, 12.0) goto RamWait } transition IsTimerUp(1) { action StartLook("LookProximity", 0.5) goto FenceAttackRecoilWander } } state RamWait { transition IsTimerUp(1) { action StartLook("LookProximity", 0.5) goto FenceAttackRecoilWander } transition IsFacingTargetUnit(0.7) == false { goto RamWait } transition InTargetProximityRadius(6.0, true) { direct goto RamFence } } state RamFence { ;// temp check transition IsAnimLoaded("hbut", "st")==true { action PlayAnim("hbut", "st", false) action PlayAnim("shake", "01_lp", false) goto HeadButtWait } transition { action PlayAnim("shake", "01_lp", false) action RamFence(false, 0.0) action DamageFence(10000.0, false, false) action SendEnclosureEvent("destroy_structure") goto HitWait } } state HitWait { transition IsAnimPlaying("shake", "01_lp", false) == false { goto LeaveEnclosure } } state HeadButtWait { transition IsAnimPlaying("hbut", "st", false) == false { action RamFence(false, 0.0) action DamageFence(10000.0, false, false) action SendEnclosureEvent("destroy_structure") goto HeadButtEnd } } state HeadButtEnd { transition IsAnimStatePlaying("hbut", false) == false { goto LeaveEnclosure } } state LeaveEnclosure { transition { action SeekSetPosition() action SetRandomTimerBetween(3, 7.0, 8.0) goto WaitLeaveFence } } state WaitLeaveFence { transition HasArrived() { goto RamFenceExit } transition IsTimerUp(3) { goto RamFenceExit } } ;//--------------- Recoil state AttackFence { transition SeekFenceOffset(0, -0.1) { action SetRandomTimerBetween(1, 7.0, 7.5) goto AttackSeekFenceLoop } transition IsTimerUp(1) { action StartLook("LookProximity", 0.5) action SetRandomTimerBetween(1, 7.0, 7.5) goto FenceAttackRecoilWander } } state AttackSeekFenceLoop { transition InTargetProximityRadius(4.6, true) { action SetStandStill() action SetSpeedDirect(0.0) goto FenceAttackRecoil } transition IsTimerUp(1) { action SetStandStill() action SetSpeedDirect(0.0) goto FenceAttackRecoilWander } } state FenceAttackRecoil { ;//action PlayAnim("idle", "recl_lp", false) action PlayAnim("rcl", "lt", false) action DamageFence(0.0, true, true) action ShockDamage(); transition { goto FenceAttackRecoilLoop } } state FenceAttackRecoilLoop { transition IsAnimPlaying("idle", "recl_lp", false) == false { goto FenceAttackRecoilRoar } } state FenceAttackRecoilRoar { action PlayAnim("call", "02_lp", false) action SendEnclosureEvent("Call_angry") transition { action SetRandomTimerBetween(1, 2.0, 3.0) goto FenceAttackRecoilCallLoop } } state FenceAttackRecoilCallLoop { transition IsTimerUp(1) { action StartLook("LookProximity", 0.5) goto FenceAttackRecoilWander } } state FenceAttackRecoilWander { action SetWander() transition { action SetRandomTimerBetween(1, 4.0, 5.0) action SetSpeedModifierWalk(1.0) action SetRunMode(false) goto FenceAttackRecoilWanderLoop } } state FenceAttackRecoilWanderLoop { transition IsTimerUp(1) { goto RamFenceExit } transition HasArrived() { goto RamFenceExit } } ;//----------------------------------------------------------------- exitstart state RamFenceExit { transition { goto RamFenceExitEnd } } exitend state RamFenceExitEnd { action SetFenceExclusion(true) ;// will only set if scripted exited prematurely action StopLook() action SetAutoMovementBlend(true) action SetLockFacing(false) action SetWalkBackMode(false) } }