/* // Cerato Stress Rampage // */ machine CeratoStress { state StressStart { action SetAutoMovementBlend(true) action ClearTarget() action SetSpeedModifier(1.0) action SetRunMode(true) action SetFlockImpulse(false) action SetRageIcon(true) transition { goto SetWander } } state SetWander { action StartLook("LookProximity", 0.5) transition SetWander() { goto AcquireTarget } } state AcquireTarget { transition HasArrived() { goto SetWander } action AcquireCannibalFoodTarget() transition HasTarget() { goto TargetAliveCheck } transition GetVariable("water") < 0.4 { direct goto AcquireWater } transition AcquireFence(30, false) { goto FaceFence } } state TargetAliveCheck { transition IsTargetDead() == false { goto SeekTarget } transition GetVariable("water") < 0.4 { direct goto AcquireWater } transition AcquireFence(30, false) { goto FaceFence } transition { goto AcquireTarget } } state AcquireWater { transition AcquireWaterPoint(false) { goto SeekWater } transition AcquireFence(15, false) { action SendEnclosureEvent("attack_Structure") goto FaceFence } transition { goto AcquireTarget } } ;//--------------------------------------------------- state FaceFence { transition { action SendEnclosureEvent("attack_Structure") call CeratoFence SetWander } } ;//---------------------------------------------------- state SeekTarget { transition IsTargetDead() { goto SnapEatCheck } transition SeekTargetOffset(0.2, 0.0, false, false, true) { action SetFlockImpulse(false) action SetSpeedModifier(1.0) goto SeekLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) { ;// target possible stuck in corner action SetFlockImpulse(false) action SetSpeedModifier(1.0) goto CornerSeek } transition { action ClearTarget() goto SetWander } } state SeekLoop { transition HasTarget() == false { goto SetWander } transition InTargetProximityRadius(0.4) { direct goto SeekFacingCheck } transition SeekTargetOffset(0.2, 0.0, false, false, true) { action SetSpeedModifier(1.0) goto SeekLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) { ;// target possible stuck in corner action SetSpeedModifier(1.0) goto CornerSeek } transition HasArrived() { direct goto SeekFacingCheckArrived } } state CornerSeek { transition HasTarget() == false { action ClearTarget() goto SetWander } transition InTargetProximityRadius(4.5) { direct goto SeekFacingCheck } transition SeekTargetOffset(0.2, 0.0, false, false, true) { direct goto SeekLoop } transition SeekTargetOffset(-5.0, 0.0, false, false, true) == false { action ClearTarget() goto SetWander } } state SeekFacingCheck { transition IsTargetDead() { goto SnapEatCheck } transition IsFacingTargetUnit() { goto Attack } transition { action FaceTarget() goto SeekFacingAlignWait } } state SeekFacingAlignWait { transition HasArrived() { direct goto SeekTarget } } state SeekFacingCheckArrived { transition { action SeekTargetOffset(0.2, 0.0, false, false, true) goto SeekTarget } } state Attack { transition { direct goto KnockInit } } state KnockInit { transition IsTargetDead() { goto SnapEatCheck } transition IsTargetHuman() { action SendEnclosureEvent("attack_prey") action SetRandomTimerBetween(3, 0.7, 0.7) action StopLook() action PlayAnim("snap", "lo_lp", false) goto KnockWait } transition IsTargetFSMRunning(fsm::"KnockOver") { action SetWander() action SetRandomTimerBetween(3, 5.0, 6.0) goto SnapPause } transition CanKnockTarget(0.0) == false { action SetWander() action SetRandomTimerBetween(3, 5.0, 6.0) goto SnapPause } transition { action SendEnclosureEvent("attack_prey") action SetRandomTimerBetween(3, 0.7, 0.7) action StopLook() action PlayAnim("snap", "lo_lp", false) goto KnockWait } } state KnockWait { transition IsTimerUp(3) == false { goto KnockWait } transition IsTargetHuman() { goto KnockHuman } transition { goto KnockSetParams } } state KnockHuman { transition InTargetProximityRadius(4.5) == false { action SetWander() action SetRandomTimerBetween(3, 3.0, 4.0) goto SnapPause } transition IsFacingTargetUnit() == false { action SetWander() action SetRandomTimerBetween(3, 3.0, 4.0) goto SnapPause } action SetStandStill() action ControlHuman() action KillHuman() action SetAutoMovementBlendTarget(false) action StopAllUserAnimationsTarget() action PlayAnimTarget("hit", "bk", false) transition { action SetRandomTimerBetween(3, 2.0, 3.0) goto KnockPause } } state KnockSetParams { transition InTargetProximityRadius(4.5) == false { action SetWander() action SetRandomTimerBetween(3, 3.0, 4.0) goto SnapPause } transition IsFacingTargetUnit() == false { action SetWander() action SetRandomTimerBetween(3, 3.0, 4.0) goto SnapPause } action SetStandStill() action SetTargetToSlave() action PushTarget() action SetNumPassedParamTarget(1) action SetPassedParamTargetKnockDir(0) action SetTargetsTargetToMe() action SetTargetFSM(fsm::"KnockOver") transition { action SetRandomTimerBetween(3, 2.0, 3.0) goto KnockPause } } state KnockPause { transition IsTimerUp(3) { goto ExpUpdate } } state ExpUpdate { transition IsTargetDead() { action AddKillExperience(1, 0.0) ;//action UpdateVariable("Stress", -0.2) ;//goto SnapEatCheck goto StressDecr } transition { goto SnapEatCheck } } state SnapPause { transition IsTimerUp(3) { goto SnapEatCheck } } state SnapEatCheck { transition { goto SetWander } } ;//------------------------------------------ state SeekWater { transition SeekWaterPoint() { action SetRandomTimerBetween(3, 15.0, 17.0) goto SeekWaterLoop } transition { goto SetWander } } state SeekWaterLoop { transition IsInWaterArea() { action FaceWaterPoint() goto FaceWater } transition HasArrived() { action FaceWaterPoint() goto FaceWater } transition AcquireWaterPoint(false) { goto SeekWaterClose } transition IsTimerUp(3) == false { goto SeekWaterLoop } transition AcquireFence(5, false) { goto FaceFence } } state SeekWaterClose { transition SeekWaterPoint() { goto SeekWaterCloseLoop } transition { goto SetWander } } state SeekWaterCloseLoop { transition IsInWaterArea() { action FaceWaterPoint() goto FaceWater } transition HasArrived() { action FaceWaterPoint() goto FaceWater } } state FaceWater { transition HasArrived() { goto Drink } } state Drink { action SendEnclosureEvent("drinking") action StopAllRandomAnimations() action SetStandStill() action StopLook() action PlayAnim("drink", "st", false) transition { goto DrinkWait } } state DrinkWait { transition IsAnimPlaying("drink", "lp", false) == true { action SetRandomTimerBetween(1, 3.0, 5.0) goto DrinkLoop } } state DrinkLoop { action UpdateDeltaVariable("Water", 0.02) transition IsTimerUp(1) { goto DrinkBreak } transition GetVariable("foodenergy") > 0.3 { action UpdateDeltaVariable("Stress", -0.05) goto DrinkLoop } } state DrinkBreak { action StopAnimState("drink") transition { goto DrinkBreakStart } } state DrinkBreakStart { action StartLook("LookProximity", 0.5) action AddRandomAnimation("tail", "flck_lp", 3.0, 5.0) transition IsIdleLocked() == false { action SetRandomTimerBetween(1, 4.0, 6.0) goto DrinkBreakLoop } } state DrinkBreakLoop { transition GetVariable("water") > 0.7 { goto StressDecr } transition IsTimerUp(1) { goto Drink } } state StressDecr { action SetRandomTimerBetween(1, 4.0, 5.0) transition { goto StressDecrLoop } } state StressDecrLoop { transition GetVariable("foodenergy") < 0.3 { goto SetWander } transition GetVariable("water") < 0.3 { goto SetWander } action UpdateDeltaVariable("Stress", -0.2) transition IsTimerUp(1) { goto SetWander } } ;//----------------------------------------------------------------- exitstart state StressExit { action StopAnimState("drink") transition { goto StressEndWait } } state StressEndWait { transition IsAnimStatePlaying("drink", true) == false { action SetRandomTimerBetween(1, 20.0, 30.0) goto StressEndIdleWait } } state StressEndIdleWait { transition IsIdleLocked() == false { goto StressExitEnd } transition IsTimerUp(1) { goto StressExitEnd } } exitend state StressExitEnd { action StopLook() action SetAutoMovementBlend(true) action SetLockFacing(false) action SetWalkBackMode(false) action SetRageIcon(false) action SetFlockImpulse(true) } }