/* Edmonto Hunger Behaviour // */ machine EdGraze { default state Start { transition CanFlock() { goto FlockCheck } transition { direct goto HungerStart } } state FlockCheck { transition AcquireFlockTarget(true) { goto FlockChangeCheck } transition { direct goto HungerStart } } state FlockChangeCheck { transition CanJoinTargetFlock() == false { action ClearTarget() direct goto HungerStart } transition IsInFlock() == false { action JoinTargetFlock() action ClearTarget() direct goto HungerStart } transition IsTargetFlockBetter() { action JoinTargetFlock() action ClearTarget() direct goto HungerStart } transition { action ClearTarget() direct goto HungerStart } } state HungerStart { action StartLook("LookProximity", 0.5) action ClearTarget() action SetRunMode(false) action SetSpeedModifierWalk(1.0) action SetRandomTimerBetween(1, 3.0, 5.0) action AddRandomAnimation("call", "02_lp", 10.0, 15.0) action AddRandomAnimation("tail", "flck_lp", 7.0, 10.0) transition { direct goto SetWander } } state SetWander { transition SetWander() == true { action SetFlockImpulse(true) goto GetTarget } } state GetTarget { transition AcquireTarget("food") { goto FoundFoodTarget } transition AcquireTree(30, true) { action SetFlockImpulse(false) goto GoingToTree } transition HasArrived() { goto Start } transition IsTimerUp(1) { goto GrazeStart } } state GoingToTree { transition HasArrived() { action SetStandStill() action SetSpeedDirect(0.0) action StopLook() action FaceSetPosition() goto FaceTree } transition InSetPosProximityRadius(0.8) { action SetStandStill() action SetSpeedDirect(0.0) action StopLook() action FaceSetPosition() goto FaceTree } } state FaceTree { transition HasArrived() { action SendEnclosureEvent("feeding_plant") action SetStandStill() action PlayAnim("eat", "md_lp", false) goto EatTree } } state EatTree { ;//action UpdateDeltaVariable("FoodEnergy", 0.005) action HerbEatTarget("tree") action EatFromTree() transition IsAnimStatePlaying("eat", false) == false { goto TreeLook } } state TreeLook { action StartLook("LookProximity", 0.5) action SetRandomTimerBetween(1, 3.0, 5.0) transition { action SetRand(0, 2) goto TreeLookCallWait } } state TreeLookCallWait { transition GetRand() == 0 { action PlayAnim("call", "02_lp", false) goto TreeLookWait } transition { goto TreeLookWait } } state TreeLookWait { transition IsTimerUp(1) { goto TreeEatWander } } state TreeEatWander { transition SetWander() { action SetRandomTimerBetween(1, 6.0, 7.0) goto TreeEatWanderLoop } } state TreeEatWanderLoop { transition IsTimerUp(1) { goto SetWander } } state GrazeStart { transition IsInGrazeArea() == false { action SetFlockImpulse(true) goto GetTarget } transition { action SetStandStill() action SetRandomTimerBetween(1, 1.0, 2.0) action SetFlockImpulse(false) goto Graze } } state Graze { transition IsTimerUp(1) { action StopLook() action SendEnclosureEvent("feeding_plant") action SetAutoMovementBlend(false) action SetSpeedDirect(0.0) action SetStandStill() action PlayAnim("eat", "lo_lp", true) goto GrazeRipWait } } state GrazeRipWait { transition IsAnimPlaying("eat", "lo_lp", true) == false { action SetAutoMovementBlend(true) action SetRandomTimerBetween(1, 6.0, 9.0) action PlayAnimLooping("chew", "lp", false, -1.0, 1.0) action StartLook("LookProximity", 0.5) goto GrazeChew } } state GrazeChew { ;//action UpdateDeltaVariable("FoodEnergy", 0.005) action HerbEatTarget("grass") transition IsTimerUp(1) { action StopAnimState("chew") action SetFlockImpulse(true) goto Start } } state FoundFoodTarget { action SetRunMode(false) action SetSpeedModifierWalk(1.0) transition SeekTarget(true, false) { action SetFlockImpulse(false) goto SeekFood } transition { action ClearTarget() goto SetWander } } state SeekFood { transition HasArrived() { goto SeekFacingCheck } transition InTargetProximityRadius(2.0, true) { action SetStandStill() direct goto SeekFacingCheck } } state SeekFacingCheck { transition HasTarget() == false ;// as food may have disappeared { action ClearTarget() goto SetWander } transition IsFacingTargetUnit() { goto EatFood } transition { action FaceTarget() goto SeekFacingAlignWait } } state SeekFacingAlignWait { transition HasArrived() { goto EatFood } } state EatFood { transition { action SetStandStill() action StopLook() action SendEnclosureEvent("feeding_plant") action SetAutoMovementBlend(false) action SetSpeedDirect(0.0) action SetStandStill() action PlayAnim("eat", "lo_lp", true) goto EatFoodWait } } state EatFoodWait { transition IsAnimPlaying("eat", "lo_lp", true) == false { action SetAutoMovementBlend(true) action SetRandomTimerBetween(1, 6.0, 9.0) action PlayAnimLooping("chew", "lp", false, -1.0, 1.0) action StartLook("LookProximity", 0.5) goto EatFoodChew } } state EatFoodChew { ;//action UpdateDeltaVariable("FoodEnergy", 0.01) action HerbEatTarget("bale") transition IsTimerUp(1) { action StopAnimState("chew") action SetFlockImpulse(true) goto GetTarget } } ;------------------------ Exit States Begin ---------------------- exitstart state HungerCleanUp { action StopAnimState("chew") action StopAnim("eat", "lo_lp") action StopAnimState("eat") transition IsAnimStatePlaying("eat", true) { goto HungerCleanUpWait } transition { goto HungerCleanUpEnd } } state HungerCleanUpWait { transition AnimStateFinished("eat") { goto HungerCleanUpEnd } } exitend state HungerCleanUpEnd { action SetFlockImpulse(true) action StopAllRandomAnimations() action SetAutoMovementBlend(true) action StopLook() } ;------------------------ Exit States End ---------------------- }