/* Generic Herbivore Sleep Behaviour // */ machine HerbSleep { state RestToSleepCheck { transition IsAnimPlaying("rest", "lp", false) == true { action SetStandStill() action SetRandomTimerBetween(1, 4.0, 4.5) goto SleepFromRest } transition { goto SleepStart } } ;//---------------------------------------------------------------- state SleepFromRest { transition IsTimerUp(1) { action SetFlockImpulse(false) direct goto RestWait } } ;//---------------------------------------------------------------- state SleepStart { action SetRunMode(false) action SetSpeedModifierWalk(1.0) action SetAutoMovementBlend(true) action SetRandomTimerBetween(1, 9.0, 15.0) action SetRandomTimerBetween(2, 25.0, 35.0) transition IsUnitInsideTerritory(0.3) == true { goto TerrainCheck } transition IsTerritorial() == false { goto TerrainCheck } transition { action StartLook("LookProximity", 0.5) goto ReturnToTerritoryBegin } } state ReturnToTerritoryBegin { transition SeekRandomPointInsideTerritory(0.3) { goto ReturnToTerritoryLoop } transition IsTimerUp(1) { goto ReturnToTerritoryCoarse } } state ReturnToTerritoryCoarse { action SetRandomTimerBetween(1, 7.0, 10.0) transition { goto CoarseTerritorySearch } } state CoarseTerritorySearch { transition SeekRandomPointInsideTerritory(0.95) { goto ReturnToTerritoryLoop } transition IsTimerUp(1) { ;// i give up, sleep where ever i am currently goto TerrainCheck } } state ReturnToTerritoryLoop { transition HasArrived() { goto TerrainCheck } transition IsTimerUp(2) { goto TerrainCheck } } state TerrainCheck { transition { goto TerrainWander } } state TerrainWander { /* transition IsInWaterArea() == false { goto SleepBegin } */ transition SetWander() { action SetRandomTimerBetween(1, 70.0, 80.0) goto FindSuitableGround } } state FindSuitableGround { transition IsAwayFromWater(4.0) { goto SleepBegin } transition IsTimerUp(1) { goto TerrainWander } /* transition IsTimerUp(1) { goto SleepBegin ;// really give up } */ transition HasArrived() { goto TerrainWander } } state SleepBegin { action SendEnclosureEvent("rest") action SetSpeedDirect(0.0) action SetStandStill() action SetAutoMovementBlend(false) action StopLook() action PlayAnim("rest", "st", false) transition { action SetFlockImpulse(false) goto RestWait } } state RestWait { transition IsAnimPlaying("rest","lp", false) { action SetAutoLinkAnimOff("rest", "lp", true) action StopAnimState("rest") goto RestEndWait } ;// new anim system causing issues... transition IsAnimPlaying("rest", "st", false) == false { action SetRandomTimerBetween(1, 3.0, 3.0) goto RestEndWaitTempFix } } ;// new anim system causing issues... state RestEndWaitTempFix { transition IsAnimPlaying("rest","lp", false) { action SetAutoLinkAnimOff("rest", "lp", true) action StopAnimState("rest") goto RestEndWait } transition IsTimerUp(1) { action SetAutoLinkAnimOff("rest", "lp", true) action StopAnimState("rest") goto RestEndWait } } state RestEndWait { transition IsAnimStatePlaying("rest", false) == false { action PlayAnim("sleep", "st", false) goto SleepPlaySoundWait } } state SleepPlaySoundWait { transition IsAnimPlaying("sleep", "lp", false) { goto SleepLoop } } state SleepLoop { ;//action UpdateDeltaVariable("Sleepyness", -0.01) action UpdateSleep() } ;------------------------ Exit States Begin ---------------------- exitstart state CleanUp { transition IsDead() { direct goto LockDeathPose } transition { direct goto EndSleep } } state EndSleep { transition IsAnimPlaying("rest", "lp", false) { action SetAutoLinkAnimOff("rest", "lp", false) action StopAnimState("rest") goto RestCleanUpWait } transition IsAnimStatePlaying("rest", false) { goto CleanUp ;// wait for rest_st to switch to rest_lp, or rest_ed to finish } transition IsAnimStatePlaying("sleep", false) { action StopAnimState("sleep") goto SleepCleanUpWait } transition { action SetFlockImpulse(true) goto CleanUpEnd } } state LockDeathPose { transition IsAnimPlaying("sleep", "st", false) { action SetLockLastPose("sleep", "st", true) action SetAutoLinkAnimOff("sleep", "st", true) action StopAnim("sleep", "st") action LockDeadPose() goto CleanUpEnd } transition IsAnimPlaying("sleep", "lp", false) { action SetLockLastPose("sleep", "lp", true) action SetAutoLinkAnimOff("sleep", "lp", true) action StopAnim("sleep", "lp") action LockDeadPose() goto CleanUpEnd } transition { direct goto EndSleep } ;// the stuff here is risky at this stage so turned off for now transition IsKillCause("retired") == false { direct goto EndSleep } transition IsAnimPlaying("rest", "st", false) { action StopAllUserAnimations() ;//action SetAutoLinkAnimOff("rest", "st", true) ;//action StopAnim("rest", "st") direct goto RestTest } transition IsAnimPlaying("rest", "lp", false) { action StopAllUserAnimations() ;//action SetAutoLinkAnimOff("rest", "lp", true) ;//action StopAnim("rest", "lp") direct goto RestTest } transition IsAnimPlaying("rest", "ed", false) { action StopAllUserAnimations() ;//action SetAutoLinkAnimOff("rest", "ed", true) ;//action StopAnim("rest", "ed") direct goto RestTest } transition { direct goto EndSleep } } state RestTest { action PlayAnim("fall", "st", true, 0.0) action SetLockLastPose("fall", "st", true) action SetAutoLinkAnimOff("fall", "st", true) transition { goto DeadFallWait } } state DeadFallWait { transition IsAnimPlaying("fall", "st", true) == false { action LockDeadPose() goto CleanUpEnd } } state RestCleanUpWait { transition IsAnimStatePlaying("rest", false) == false { goto CleanUpLoop } } state SleepCleanUpWait { transition IsAnimStatePlaying("sleep", false) == false { action PlayAnim("rest", "ed", false) goto RestCleanUpWait } } state CleanUpLoop { transition { action SetAutoMovementBlend(true) action StopLook() action SetFlockImpulse(true) goto CleanUpEnd } } exitend state CleanUpEnd { } /* exitstart state CleanUp { transition IsAnimPlaying("rest", "lp", false) { action SetAutoLinkAnimOff("rest", "lp", false) action StopAnimState("rest") goto RestCleanUpWait } transition IsAnimStatePlaying("rest", false) { goto CleanUp ;// wait for rest_st to switch to rest_lp, or rest_ed to finish } transition IsAnimStatePlaying("sleep", false) { action StopAnimState("sleep") goto SleepCleanUpWait } transition { goto CleanUpEnd } } state RestCleanUpWait { transition IsAnimStatePlaying("rest", false) == false { goto CleanUpLoop } } state SleepCleanUpWait { transition IsAnimStatePlaying("sleep", false) == false { action PlayAnim("rest", "ed", false) goto RestCleanUpWait } } state CleanUpLoop { action SetAutoMovementBlend(true) transition { goto CleanUpEnd } } exitend state CleanUpEnd { action SetAutoMovementBlend(true) action StopLook() action SetFlockImpulse(true) } */ ;------------------------ Exit States End ---------------------- }