/* Generic Muster Machine // */ machine Muster { state MusterStart { action SetAutoMovementBlend(true) action SetRunMode(true) action SetSpeedModifier(1.0) transition HasMusterTarget() == false { goto MusterEndStart } action GetMusterTarget() transition InMusterTargetRange() == false { action ClearMusterTarget() goto MusterEndStart } transition { action AddRandomAnimation("call", "02_lp", 3.0, 5.0) action AddRandomAnimation("call", "01_lp", 6.0, 8.0) goto MusterFlee } } state MusterFlee { action SetRunMode(true) action SetSpeedModifier(1.0) transition IsTargetDinosaur() { direct goto FleeDinoChoose } transition IsTargetHelicopter() { action SetRandomTimerBetween(1, 20.0, 25.0) action SetFlockImpulse(false) action SetMusterSteering(true) goto FleeHelicopter } transition { action FleeMusterTarget(false, 0.0) action SetRandomTimerBetween(1, 15.0, 20.0) goto FleeLoop } } state FleeLoop { action GetMusterTarget() transition IsTargetHelicopter() { direct goto MusterFlee } transition IsTargetDinosaur() { direct goto MusterFlee } transition InMusterTargetRange() == false { action ClearMusterTarget() goto MusterEndStart } transition IsTimerUp(1) { action ClearMusterTarget() goto MusterEndStart } } state FleeDinoChoose { transition IsMusterAngry() { action StopAllRandomAnimations() action PlayAnim("call", "01_lp", false) goto MusterDinoAngry } transition IsMusterAngryAttack() { action StopAllRandomAnimations() goto MusterDinoAngryAttack } transition { action FleeMusterTarget(false, 0.0) action SetRandomTimerBetween(1, 10.0, 15.0) goto FleeLoopDinoTimeOut } } state MusterDinoAngry { transition IsAnimPlaying("call", "01_lp", false) == false { action SetRunMode(false) action SetSpeedModifierWalk(1.0) action FleeMusterTarget(false, 0.0) action SetRandomTimerBetween(1, 6.0, 8.0) goto FleeLoopDinoTimeOut } } state FleeLoopDinoTimeOut { action GetMusterTarget() transition IsTargetHelicopter() { direct goto MusterFlee } transition IsTargetDinosaur() == false { direct goto MusterFlee } transition InMusterTargetRange() == false { action ClearMusterTarget() goto MusterEndStart } transition IsTimerUp(1) { action ClearMusterTarget() goto MusterEndStart } } state FleeHelicopter { transition FleeMusterTarget(true, 5.0) == false { action FleeMusterTarget(false, 0.0) action SetRandomTimerBetween(2, 2.0, 2.0) goto FleeHeliFailTimeOut } transition InMusterTargetRange() == false { action ClearMusterTarget() goto MusterEndStart } transition IsTimerUp(1) { action ClearMusterTarget() goto MusterEndStart } } state FleeHeliFailTimeOut { transition InMusterTargetRange() == false { action ClearMusterTarget() goto MusterEndStart } transition IsTimerUp(1) { action ClearMusterTarget() goto MusterEndStart } transition IsTimerUp(2) { goto FleeHelicopter } } ;//------------------------ Exit States End ---------------------- state MusterDinoAngryAttack { action SetAutoMovementBlend(true) action SetSpeedModifier(1.0) action SetRunMode(true) transition IsDead() { goto MusterAttackExit } transition IsTargetDinosaur() { goto MusterAttackSeek } transition { goto MusterAttackExit } } state MusterAttackSeek { transition SeekTarget(true, false) { action SetSpeedModifier(1.2) goto MusterAttackSeekLoop } transition { goto MusterAttackExit } } state MusterAttackSeekLoop { action GetMusterTarget() transition IsTargetDinosaur() == false { goto MusterAttackExit } transition InTargetProximityRadius(0.65, true) { direct goto MusterAttackSeekFacingCheck } transition SeekTargetOffset(1.0, 0.0, false, false, true) == false { goto MusterAttackExit } transition HasArrived() { direct goto MusterAttackSeekFacingCheckArrived } } state MusterAttackSeekFacingCheck { transition IsTargetDead() { goto MusterAttackExit } transition IsFacingTargetUnit() { goto AttackMusterTarget } transition { action FaceTarget() goto MusterAttackSeekFacingAlignWait } } state MusterAttackSeekFacingAlignWait { action GetMusterTarget() transition IsTargetDinosaur() == false { goto MusterAttackExit } transition HasArrived() { goto MusterAttackSeek } transition InTargetProximityRadius(0.66, true) == false { action SeekTarget(true, false) goto MusterAttackSeekLoop } } state MusterAttackSeekFacingCheckArrived { transition { action SeekTarget(true, false) goto MusterAttackSeekLoop } } state AttackMusterTarget { transition { goto KnockInit } } state KnockInit { transition IsTargetDead() { goto MusterAttackExit } transition IsTargetFSMRunning(fsm::"KnockOver") { goto MusterAttackExit } transition CanKnockTarget(0.0) == false { goto MusterAttackExit } transition { action StopLook() action SetRandomTimerBetween(3, 0.7, 0.7) action PlayAnim("snap", "lo_lp", false) goto KnockWait } } state KnockWait { transition IsTimerUp(3) { goto KnockSetParams } } state KnockSetParams { 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 KnockExpUpdate } } state KnockExpUpdate { transition IsTargetDead() { action AddKillExperience(1, 0.0) goto MusterAttackExit } transition { goto MusterAttackExit } } state MusterAttackExit { action SetStandStill() action StopAllRandomAnimations() action PlayAnim("call", "01_lp", false) action SetRandomTimerBetween(3, 2.0, 3.0) transition { goto MusterAttackExitRoar } } state MusterAttackExitRoar { transition IsTimerUp(3) { goto MusterEndStart } } ;//------------------------ Exit States End ---------------------- exitstart state MusterEndStart { transition { goto MusterEnd } } exitend state MusterEnd { action SetMusterSteering(false) action SetMusterAngry(false, false) action SetMusterAngryAttack(false, false) action SetFlockImpulse(true) action ClearMusterTarget() transition IsNextDrive("Muster") { goto MusterStart } } ;//------------------------ Exit States End ---------------------- }