/* Generic Carnivore Play Behaviour // */ machine CarnPlay { default state PlayStart { action SendEnclosureEvent("play_carn") action SetAutoMovementBlend(true) action SetStandStill() action SetRandomTimerBetween(1, 4.0, 10.0) transition { goto Wait } } state Wait { transition IsTimerUp(1) { action SetWander() action SetSpeedModifier(1.2) goto PlayLoop } } state PlayLoop { ;action AcquireTarget("play") action AcquireTarget("food") transition HasTarget() { goto FoundTarget } } state FoundTarget { action SetRand(1, 4) transition GetRand() == 1 { ;goto PounceOnTarget goto RamTarget } transition GetRand() == 2 { goto RamTarget } transition GetRand() == 3 { ;goto BiteTarget goto RamTarget } transition GetRand() == 4 { ;goto CircleTarget goto RamTarget } } state PounceOnTarget { ;get to pouncing distance from target action MaintainDistanceFromTarget(10.0) transition { goto MovingToPouncingDistance } } state MovingToPouncingDistance { transition IsAtDistanceFromTarget(10.0, 1.0) { action FaceTarget() goto AtPouncingDistance } } state AtPouncingDistance { transition IsFacingTarget() { action PounceOnTarget() action PlayAnim("special", "pounce", false) goto PounceEnd } } state PounceEnd { transition AnimStateFinished("special") { action PounceOffTarget() goto PlayStart } } state RamTarget { ; make sure we have a target action RenderCircleAroundTarget() transition HasTarget() == false { action print("[RamTarget] error, no target!!\n") goto Error } action PlayAnim("special", "roar", false) ;move far enough away so we can ram target action AvoidTarget(20.0, true) action IsFacingTargetsFacing() action IsFacingOppositeTargetsFacing() transition IsAtDistanceFromTargetOrGreater(20) { action RamTarget() goto RamTargetStartRam } } stateRamTargetStartRam { ; make sure we have a target action RenderCircleAroundTarget() transition HasTarget() == false { action print("[stateRamTargetStartRam] - error, no target!!\n") goto Error } transition InTargetProximity(4.0) { ;attempt to knock over target action AttemptToKnockTargetOver() action ClearTarget() action print("rammed target!\n") goto PlayStart } } state BiteTarget { } state CircleTarget { } state Error { action assert(0) } }