/* Edmonto Social Behaviour // */ machine EdPlay { default state Start { transition CanFlock() { direct goto FlockCheck } transition { goto IdleStart } } state FlockCheck { transition IsInFlock() == false { call JoinFlock IdleStart } transition { goto IdleStart } } state IdleStart { action StartLook("LookProximity", 0.5) action SetAutoMovementBlend(true) action SetSpeedModifierWalk(1.0) action SetRunMode(false) action SetSpeedDirect(0.0) action SetStandStill() transition { goto IdleChoose } } state IdleChoose { /* ;// testing transition { action SetVariable("FoodEnergy", 1.0) action SetVariable("Water", 1.0) action SetVariable("Waste", 0.0) action SetVariable("Sleepyness", 0.0) direct goto Nuzzle } ;// testing */ action SetRand(0, 10) transition GetRand() == 0 { direct goto SniffStart } transition GetRand() == 1 { direct goto ScratchStart } transition GetRand() == 2 { direct goto SpecStart } transition GetRand() == 3 { direct goto FullCallStart } transition GetRand() <= 5 { direct goto TalkCall } transition GetRand() == 6 { direct goto GrazeStart } transition GetRand() == 7 { direct goto RandSpecStart } transition GetRand() == 8 { direct goto Nuzzle } transition { action SetAutoMovementBlend(true) goto WanderStart } } ;// sniffing ------------------------------ state SniffStart { transition IsAnimLoaded("idle", "snif_lp") { action SetSpeedDirect(0.0) action SetStandStill() action StopAllUserAnimations() action SetAutoMovementBlend(false) action StopLook() action PlayAnimInstant("idle", "snif_lp", true) goto Sniff } transition { action SetAutoMovementBlend(true) goto WanderStart } } state Sniff { transition AnimStateFinished("idle") { action SetAutoMovementBlend(true) goto WanderStart } ;// temp fix if not have sniff anim will not be able to exit transition IsAnimStatePlaying("idle") == false { action SetAutoMovementBlend(true) goto WanderStart } } ;// scratching ------------------------------ state ScratchStart { transition IsAnimLoaded("spcl", "sctch_lp") { action SetSpeedDirect(0.0) action SetStandStill() action StopAllUserAnimations() action SetAutoMovementBlend(false) action StopLook() action PlayAnimInstant("spcl", "sctch_lp", true) goto Scratch } transition { action SetAutoMovementBlend(true) goto WanderStart } } state Scratch { transition AnimStateFinished("spcl") { action SetAutoMovementBlend(true) goto WanderStart } ;// temp fix if not have sniff anim will not be able to exit transition IsAnimStatePlaying("spcl") == false { action SetAutoMovementBlend(true) goto WanderStart } } ;// full body calling ------------------------------ state FullCallStart { transition IsAnimLoaded("call", "f") { action SetSpeedDirect(0.0) action SetStandStill() action StopAllUserAnimations() action SetAutoMovementBlend(false) action StopLook() action PlayAnimInstant("call", "f", true) goto FullCall } transition { action SetAutoMovementBlend(true) goto WanderStart } } state FullCall { transition IsAnimPlaying("call", "f", false) == false { action SetAutoMovementBlend(true) goto WanderStart } } ;// special ------------------------------ state SpecStart { transition IsAnimLoaded("spcl", "gen_lp") { action SetSpeedDirect(0.0) action SetStandStill() action StopAllUserAnimations() action SetAutoMovementBlend(false) action StopLook() action PlayAnimInstant("spcl", "gen_lp", true) goto SpecWait } transition { action SetAutoMovementBlend(true) goto WanderStart } } state SpecWait { transition AnimStateFinished("spcl") { action SetAutoMovementBlend(true) goto WanderStart } ;// temp fix if not have sniff anim will not be able to exit transition IsAnimStatePlaying("spcl") == false { action SetAutoMovementBlend(true) goto WanderStart } } ;// random special ------------------------------ state RandSpecStart { transition IsRandomAnimLoaded("spcl", "gen") { action SetSpeedDirect(0.0) action SetStandStill() action StopAllUserAnimations() action SetAutoMovementBlend(false) action StopLook() action PlayAnimInstantRandom("spcl", "gen", true) goto RandSpecWait } transition { action SetAutoMovementBlend(true) goto WanderStart } } state RandSpecWait { transition AnimStateFinished("spcl") { action SetAutoMovementBlend(true) goto WanderStart } transition IsAnimStatePlaying("spcl") == false { action SetAutoMovementBlend(true) goto WanderStart } } ;// nuzzle ------------------------------ state Nuzzle { transition AcquireTarget("friend") == false { action SetAutoMovementBlend(true) goto WanderStart } transition IsTargetSameSpecies() == false { action SetAutoMovementBlend(true) goto WanderStart } transition CanNuzzleTarget() == false { action SetAutoMovementBlend(true) goto WanderStart } transition IsAnimLoaded("spcl", "nuz_lt") == false { action SetAutoMovementBlend(true) goto WanderStart } transition IsAnimLoaded("spcl", "nuz_rt") == false { action SetAutoMovementBlend(true) goto WanderStart } transition IsTargetFSMRunning(fsm::"Nuzzle") ;// should be a CanNuzzle check { action SetAutoMovementBlend(true) goto WanderStart } transition { action SetNumPassedParam(2) action SetPassedParam(0, -1) action SetTargetToSlave() action SetTargetFSM(fsm::"Nuzzle") action SetNumPassedParamTarget(2) action SetPassedParamTarget(0, -1) action SetTargetsTargetToMe() ;//action LockTargetMachine(true) direct call Nuzzle WanderStart } } ;// wander ------------------------------ state WanderStart { action AddRandomAnimation("call", "02_lp", 10.0, 15.0) action AddRandomAnimation("tail", "flck_lp", 7.0, 10.0) action SetRandomTimerBetween(1, 2.0, 4.0) transition { goto IdleLoop } } state IdleLoop { transition IsTimerUp(1) { goto IdleWander } } state IdleWander { transition SetWander() == true { action SetRandomTimerBetween(1, 10.0, 15.0) goto IdleWanderLoop } } state IdleWanderLoop { action AcquireTarget("food") transition HasArrived() { action SetStandStill() goto AcquireNewFlock } transition IsTimerUp(1) { action SetStandStill() goto AcquireNewFlock } } state AcquireNewFlock { transition AcquireFlockTarget(true) { goto FlockChangeCheck } transition { goto IdleChoose } } state FlockChangeCheck { transition CanFlock() { direct goto FlockChange } transition { action ClearTarget() goto IdleChoose } } state FlockChange { transition CanJoinTargetFlock() == false { action ClearTarget() goto IdleChoose } transition IsTargetFlockBetter() { action JoinTargetFlock() action ClearTarget() goto IdleChoose } transition { action ClearTarget() goto IdleChoose } } ;// talk call ------------------------------ state TalkCall { action SetRand(0, 10) transition GetRand() < 7 ;// reduce amount of yakking { goto WanderStart } transition AcquireTarget("friend") { goto TalkCallStart } transition { goto WanderStart } } state TalkCallStart { transition { action StartLook("LookTarget", 0.5) action PlayAnimInstant("call", "02_lp", false) goto TalkWait } } state TalkWait { transition IsAnimPlaying("call", "02_lp", false) == false { action SetRandomTimerBetween(1, 1.0, 1.5) goto TalkReponsePause } } state TalkReponsePause { transition IsTimerUp(1) { action PlayAnimTarget("call", "01_lp", false) action StartLook("LookProximity", 0.5) goto WanderStart } } ;// graze call ------------------------------ state GrazeStart { transition IsInGrazeArea() == false { goto WanderStart } transition { action SetStandStill() action SetRandomTimerBetween(1, 1.0, 2.0) 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.01) action HerbEatTarget("grass") transition IsTimerUp(1) { action StopAnimState("chew") goto WanderStart } } ;------------------------ Exit States Begin ---------------------- exitstart state SocialCleanUp { action StopAnimState("chew") action StopAnim("eat", "lo_lp") action StopAnimState("eat") transition IsAnimStatePlaying("eat", true) { goto SocialCleanUpWait } transition { action SetRandomTimerBetween(1, 20.0, 30.0) goto CleanUpIdleWait } } state SocialCleanUpWait { transition AnimStateFinished("eat") { action SetRandomTimerBetween(1, 20.0, 30.0) goto CleanUpIdleWait } } state CleanUpIdleWait { transition IsAutoMovementBlendOn() == false { action SetRandomTimerBetween(1, 20.0, 30.0) goto WaitForAnimFinish } transition IsIdleLocked() == false { goto CleanUpEnd } transition IsTimerUp(1) { goto CleanUpEnd } } state WaitForAnimFinish { transition IsTimerUp(1) { goto CleanUpEnd } transition IsAnimPlaying("idle", "snif_lp", false) { goto WaitForAnimFinish } transition IsAnimStatePlaying("spcl", false) { goto WaitForAnimFinish } transition IsAnimPlaying("call", "f", false) { goto WaitForAnimFinish } transition { action SetAutoMovementBlend(true) goto CleanUpEnd } } exitend state CleanUpEnd { action StopAllRandomAnimations() action SetAutoMovementBlend(true) action StopLook() } ;------------------------ Exit States End ---------------------- }