/* Dilopho Hunger Behaviour // */ machine DiloHunger { state Start { action SetAutoMovementBlend(true) action StopLook() ;//transition GetFlockTarget() == true ;//{ ;// goto FlockTargetCheck ;//} ;//action AcquirePrefPrey() ;//transition HasTarget() ;//{ ;// goto FoundTarget ;//} transition { goto SetWander } } state SetWander { ;//action StartLook("LookProximity", 0.5) action SetFlockHungerNeed(false) action StopAnim("fan", "up_lp") action PlayAnimLooping("fan", "dn_lp", false, -1.0, 1.0) action PlayAnimLooping("stalk", "lp", false, -1.0, 1.0) action SetSpeedModifierWalk(0.8) action SetRunMode(false) transition { goto WanderTry } } state WanderTry { transition SetWander() == true { action SetRandomTimerBetween(1, 2.0, 3.0) goto WanderWait } } state WanderWait { transition IsTimerUp(1) { goto GetTarget } } state GetTarget { transition HasArrived() { goto SetWander } transition GetFlockHungerNeed() { goto FlockTargetCheck } transition AcquirePrefPrey() { goto FoundTarget } } state FoundTarget { transition IsTargetDead() == false { goto SeekBegin } transition GetVariable("foodenergy") > 0.9 { goto GetTarget } transition { goto SeekBegin } } state SeekBegin { action SetFlockHungerNeed(true) transition IsTargetDead() { goto EatTarget } transition SeekTarget(true, false) { action StopAnim("stalk", "lp") action StopAnim("fan", "up_lp") goto ChaseTarget } transition SeekTargetOffset(-5.0, 0.0, false, false, true) { ;// target possible stuck in corner action StopAnim("stalk", "lp") action StopAnim("fan", "up_lp") goto CornerSeekStart } transition { action ClearTarget() goto SetWander } } state FlockTargetCheck { transition GetFlockTarget() == false { goto SetWander } transition CanAttackTarget() == false { action ClearTarget() goto SetWander } transition { goto FoundTarget } } state ChaseTarget { action SendEnclosureEvent("seek_prey") action PlayAnimLooping("fan", "dn_lp", false, -1.0, 1.0) action SetSpeedModifier(1.0) action SetRunMode(true) transition { goto ChaseLoop } } state ChaseLoop { transition HasTarget() == false { goto Start } transition IsTargetDead() { action SetStandStill() goto EatTarget } transition HasArrived() { goto SetWander } transition SeekTarget(true, false) == false { goto FoundTarget } transition InTargetProximityRadius(10.0, true) { action StopAnim("fan", "dn_lp") action PlayAnimLooping("fan", "up_lp", false, -1.0, 1.0) goto ChaseFanUpLoop } transition InTargetProximityRadius(2.8, true) { goto FacingCheck } } state CornerSeekStart { action PlayAnimLooping("fan", "dn_lp", false, -1.0, 1.0) action SetSpeedModifier(1.0) action SetRunMode(true) transition { goto CornerSeek } } state CornerSeek { transition HasTarget() == false { action ClearTarget() goto SetWander } transition SeekTarget(true, false) { direct goto ChaseLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) == false { action ClearTarget() goto SetWander } transition InTargetProximityRadius(10.0, true) { action StopAnim("fan", "dn_lp") action PlayAnimLooping("fan", "up_lp", false, -1.0, 1.0) goto CornerFanUpLoop } transition InTargetProximityRadius(2.8, true) { goto CornerFacingCheck } } state CornerFanUpLoop { transition IsTargetDead() { action SetStandStill() goto EatTarget } transition SeekTarget(true, false) { direct goto ChaseFanUpLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) == false { action ClearTarget() goto SetWander } transition InTargetProximityRadius(2.8, true) { goto CornerFacingCheck } } state CornerFacingCheck { transition IsFacingTargetUnit(0.7) == false { goto CornerSeek } transition { goto Spit } } state ChaseFanUpLoop { transition IsTargetDead() { action SetStandStill() goto EatTarget } transition InTargetProximityRadius(2.8, true) { goto FacingCheck } transition HasArrived() { goto SetWander } } state FacingCheck { transition IsFacingTargetUnit(0.8) == false { goto ChaseLoop } transition IsFacingTargetsFacing(0.4, true) { goto Spit } transition { goto ChaseLoop } } state Spit { action SetStandStill() action PlayAnim("snap", "md_lp", false) action StopAnim("fan", "dn_lp") action PlayAnimLooping("fan", "up_lp", false, -1.0, 1.0) transition IsTargetHuman() { action ControlHuman() action SetRandomTimerBetween(1, 0.6, 0.7) goto SpitWait } transition { action SetRandomTimerBetween(1, 0.6, 0.7) goto SpitWait } } state SpitWait { transition IsTimerUp(1) { ;// goto SetWander ;// -----testing goto TargetSpitRecoil ;// should check if it actually hit target first } } state TargetSpitRecoil { ;// check if target can recoil transition IsTargetDead() { goto EatTarget } ;// transition IsTargetHuman() { goto SpitHuman } action SetTargetToSlave() action SetNumPassedParamTarget(1) action SetPassedParamTargetKnockDir(0) action SetTargetsTargetToMe() action SetTargetFSM(fsm::"SpitRecoil") transition { action SetRandomTimerBetween(1, 3.0, 3.0) goto SpitExpUpdate } } state SpitExpUpdate { transition IsTimerUp(1) == false { goto SpitExpUpdate } transition IsTargetDead() { action AddKillExperience(1, 0.0) goto SpitRunAway } transition { goto SpitRunAway } } state SpitHuman { transition ControlHuman() { call DilophoVis SpitRunAway } transition { goto SpitRunAway } } state SpitRunAway { transition IsTargetDead() { goto SpitPosture } transition SeekTargetOffset(17.0, 0, false, true, true) { action SetSpeedModifier(1.0) action SetRunMode(true) action SetRandomTimerBetween(1, 2.5, 3.0) goto SpitRunAwayLoop } transition { action SetRandomTimerBetween(1, 2.0, 3.0) goto SpitPause } } state SpitRunAwayLoop { transition IsTimerUp(1) { action SetStandStill() action FaceTarget() goto SpitRunAwayFace } } state SpitRunAwayFace { transition HasArrived() { goto SpitRunAwayChoose } } state SpitRunAwayChoose { action SetRand(0, 9) transition GetRand() < 3 { goto SpitPosture } transition GetRand() < 6 { action PlayAnim("call", "01_lp", false) action SetRandomTimerBetween(1, 2.0, 3.0) goto SpitPauseLoop } transition { action SetRandomTimerBetween(1, 2.0, 3.0) goto SpitPauseLoop } } state SpitPause { action SetRand(0, 3) transition GetRand() == 0 { goto SpitPosture } transition { goto SpitPauseLoop } } state SpitPauseLoop { transition IsTimerUp(1) { goto SetWander } } state SpitPosture { action SetAutoMovementBlend(false) action PlayAnimInstant("idle", "post_lp", false) transition { goto SpitPostureWait } } state SpitPostureWait { transition IsAnimPlaying("idle", "post_lp", false) == false { action SetRandomTimerBetween(1, 2.0, 3.0) action SetAutoMovementBlend(true) goto SpitPauseLoop } } state EatTarget { action StopAnim("stalk", "lp") transition GetVariable("foodenergy") > 0.9 { action SetFlockHungerNeed(false) goto Start } transition { action SetFlockHungerNeed(false) call DilophoEat Start } } ;//------------------------ Exit States Begin ---------------------- exitstart state HungerCleanUp { action StopAnimState("eat") transition IsAnimStatePlaying("eat", true)==false { goto HungerCleanUpWait } transition { goto HungerCleanUpEnd } } state HungerCleanUpWait { transition IsAnimStatePlaying("eat", false)==false { goto HungerCleanUpEnd } } exitend state HungerCleanUpEnd { ;//action StopLook() action StopAnim("fan", "up_lp") action PlayAnimLooping("fan", "dn_lp", false, -1.0, 1.0) action StopAnim("stalk", "lp") action SetFlockHungerNeed(false) } ;//------------------------ Exit States End ---------------------- }