/* Dilopho Eat Behaviour // */ machine DiloEat { state EatStart { transition HasTarget() == false { goto EatExitStart } transition { goto EatTarget } } state EatTarget { action StopAnim("fan", "up_lp") action PlayAnimLooping("fan", "dn_lp", false, -1.0, 1.0) action SetRunMode(false) action SetSpeedModifierWalk(1.0) action SetFlockImpulse(false) transition SeekTargetOffset(0.2, 0.0, false, false, true) == false { ;// target possibly in corner action SetRandomTimerBetween(2, 55.0, 60.0) goto CornerSeek } transition { goto EatSeekLoop } } state CornerSeek { transition HasTarget() == false { action SetStandStill() goto EatExitStart } transition InTargetProximityRadius(1.0, true) { action SetStandStill() goto SeekFacingCheck } transition SeekTargetOffset(0.2, 0.0, false, false, true) { direct goto EatSeekLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) == false { ;//action SetStandStill() ;//goto SeekFacingCheck goto EatExitStart } transition IsTimerUp(2) { action SetStandStill() goto SeekFacingCheck } } state SeekFacingCheck { action FaceTargetLocator("d_spine") transition { goto SeekFacingAlign } } state SeekFacingAlign { transition HasTarget() == false { action SetStandStill() goto EatExitStart } transition HasArrived() { goto RipInit } } state EatSeekLoop { transition SeekTargetOffset(0.2, 0.0, false, false, true) == false { ;// target possibly in corner action SetRandomTimerBetween(2, 5.0, 6.0) goto CornerSeek } transition HasTarget() == false { action SetStandStill() goto EatExitStart } transition InTargetProximityRadius(0.0, true) { action SetStandStill() action SetSpeedDirect(0.0) direct goto RipFacingAlign } transition HasArrived() { direct goto RipFacingAlign } } state RipFacingAlign { action FaceTargetLocator("d_spine") transition { goto RipFacingAlignWait } } state RipFacingAlignWait { transition HasTarget() == false { action SetStandStill() goto EatExitStart } transition HasArrived() { goto RipMinDistCheck } } state RipMinDistCheck { ;//action Print("Close Check\n") transition InTargetProximityRadius(-1.5, false) == true ;// too close { goto RipStepBack } transition IsTargetHuman() { action SetStandStill() action SetSpeedDirect(0.0) goto RipInit } ;//action Print("Far Check\n") transition InTargetProximityRadius(0.0, true) == false ;// too far { goto EatTarget } transition { action SetStandStill() action SetSpeedDirect(0.0) goto RipInit } } state RipStepBack { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(10.0) transition { action SetRandomTimerBetween(2, 5.0, 6.0) goto RipStepBackLoop } } state RipStepBackLoop { transition HasTarget() == false { action SetStandStill() goto RipStepBackEnd } transition InTargetProximityRadius(-0.6, false) == false { goto RipStepBackEnd } transition IsTimerUp(2) { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() action SetSpeedDirect(0.0) goto RipInit } transition HasArrived() { goto RipStepBackEnd } } state RipStepBackEnd { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() action SetSpeedDirect(0.0) transition { goto RipFacingAlign } } state RipInit { ;//action LockMachine(true) action StopLook() transition { action SetRandomTimerBetween(3, 1.0, 1.0) goto WaitLookEnd } } state WaitLookEnd { transition IsTimerUp(3) { goto RipStart } } state RipStart { action SendEnclosureEvent("feeding_meat") action StopLook() action SetAutoMovementBlend(false) action PlayAnim("eat", "lo_lp", false) action SetRandomTimerBetween(3, 0.8, 0.8) action SetStandStill() transition { goto RipWait } } state RipWait { transition IsTimerUp(3) { goto RipChewWait } } state RipChewWait { transition IsAnimPlaying("eat", "lo_lp", false) == false { action PlayAnim("idle", "chew_lp", false) goto ChewWait } } state ChewWait { ;//action UpdateDeltaVariable("FoodEnergy", 0.01) action CarnEatTarget(false) action UpdateDeltaVariable("Stress", -0.1) transition IsAnimPlaying("idle", "chew_lp", false) == false { action SetAutoMovementBlend(true) action SetRandomTimerBetween(3, 4.0, 6.0) action StartLook("LookProximity", 0.5) goto ChewLook } } state ChewLook { transition IsTimerUp(3) { direct goto ReacquireTarget } } state ReacquireTarget { ;//action LockMachine(false) /* transition AcquireTarget("food") { direct goto ReacquireDeadCheck } transition { goto EatExitStart } } state ReacquireDeadCheck { transition IsTargetDead() */ transition GetVariable("foodenergy") > 0.9 { goto EatExitStart } transition IsTargetEdible() { goto RipFacingAlign } transition { goto EatExitStart } } ;//------------------------ Exit States Begin ---------------------- exitstart state EatExitStart { transition IsAnimPlaying("eat", "lo_lp", false) { goto EatExitLoop } transition IsAnimPlaying("idle", "chew_lp", false) { goto EatExitLoop } transition { goto EatExitEnd } } state EatExitLoop { transition IsAnimPlaying("eat", "lo_lp", false) == false { goto EatExitLoop2 } } state EatExitLoop2 { transition IsAnimPlaying("idle", "chew_lp", false) == false { goto EatExitEnd } } exitend state EatExitEnd { ;//action LockMachine(false) action SetLockFacing(false) action SetWalkBackMode(false) action SetAutoMovementBlend(true) action SetFlockImpulse(true) } ;//------------------------ Exit States End --------------------- }