Code:
<XML>
<!-->
초급 레벨 나이프맨
주로 근접 공격을 하는 NPC
</-->
<FSM name="knifeman" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="default" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;500" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="run" func="dice,runWaypoints">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="dice:200,distTarget:250;600" next="stepForward"/>
<TRANS cond="dice:300,distTarget:50;350" next="charge"/>
<TRANS cond="dice:300,distTarget:0;200" next="slash"/>
<TRANS cond="dice:100,distTarget:0;250,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="charge" cooltime="4000" action="charge" enterfunc="faceToTarget" func="rotateToTarget" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="chargeend"/>
</STATE>
<STATE name="chargeend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:400" next="combat"/>
</STATE>
<STATE name="slash" cooltime="3000" action="slash" func="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="2000" action="knifeman_suffer1" enterfunc="faceToTarget,reduceGroggy:20" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2500" action="knifeman_suffer2" enterfunc="faceToTarget,reduceGroggy:30" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="3000" action="knifeman_suffer3" enterfunc="faceToTarget,reduceGroggy:40" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="stepForward" cooltime="0" action="stepforward" func="faceToTarget,runWaypoints">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepBackward" cooltime="0" action="stepbackward" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="0" action="stepright" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="0" action="stepleft" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
중급 레벨 나이프맨
주로 근접 공격을 하는 NPC
초급과는 달리 피격시 회피동작을 취함.
초급보다 더 충격에 잘 견디며, 달리기가 빠르며, 공격적임.
</-->
<FSM name="knifeman2" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="default" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run3" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;500" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="run2" func="dice,runWaypoints">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="dice:200,distTarget:250;600" next="stepForward"/>
<TRANS cond="dice:350,distTarget:50;350" next="charge"/>
<TRANS cond="dice:350,distTarget:0;200" next="slash"/>
<TRANS cond="dice:100,distTarget:0;250,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="charge" cooltime="3500" action="charge2" enterfunc="faceToTarget" func="rotateToTarget" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction" next="chargeend"/>
</STATE>
<STATE name="chargeend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:400" next="combat"/>
</STATE>
<STATE name="slash" cooltime="2500" action="slash2" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="1500" action="knifeman_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:30" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2000" action="knifeman_suffer2" enterfunc="faceToTarget,reduceGroggy:45" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2500" action="knifeman_suffer3" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="stepForward" cooltime="0" action="stepforward" func="faceToTarget,runWaypoints">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepBackward" cooltime="0" action="stepbackward" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="1000" action="stepright" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="1000" action="stepleft" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
고급 레벨 나이프맨
주로 근접 공격을 하는 NPC
중급과는 달리 피격 또는 공격후 동작전이 딜레이가 없음.
중급보다 더 충격에 잘 견디며, 달리기가 빠르며, 공격적임.
</-->
<FSM name="knifeman3" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="default" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run3" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;500" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="run3" func="dice,runWaypoints">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="dice:200,distTarget:250;600" next="stepForward"/>
<TRANS cond="dice:400,distTarget:50;350" next="charge"/>
<TRANS cond="dice:400,distTarget:0;200" next="slash"/>
<TRANS cond="dice:100,distTarget:0;250,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:0;550,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="charge" cooltime="3000" action="charge3" enterfunc="faceToTarget" func="rotateToTarget" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction" next="chargeend"/>
</STATE>
<STATE name="chargeend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:400" next="combat"/>
</STATE>
<STATE name="slash" cooltime="2000" action="slash3" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="1000" action="knifeman_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:40" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:0" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="1500" action="knifeman_suffer2" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2000" action="knifeman_suffer3" enterfunc="faceToTarget,reduceGroggy:80" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="stepForward" cooltime="0" action="stepforward" func="faceToTarget,runWaypoints">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepBackward" cooltime="0" action="stepbackward" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="500" action="stepright" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="500" action="stepleft" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
초급 레벨 헌터
근접과 원거리 공격을 겸하는 NPC
</-->
<FSM name="hunter" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasTarget" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints,dice">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepBackward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepForward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepRight"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepLeft"/>
<TRANS cond="distTarget:0;1500,angleTargetHeight:30;90" next="combat"/>
<TRANS cond="distTarget:0;700" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;250" next="slash1"/>
<TRANS cond="distTarget:0;1000,angleTargetHeight:30;90" next="backdash"/>
<TRANS cond="distTarget:1000;1500,angleTargetHeight:30;90" next="shootUp"/>
<TRANS cond="dice:100,distTarget:0;300,isEmptySpace:180;500" next="backdash"/>
<TRANS cond="dice:200,distTarget:350;650" next="dash"/>
<TRANS cond="dice:100,distTarget:300;700,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:600;1000,isEmptySpace:0;200" next="stepForward"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="slash1" cooltime="4000" action="slash1_1" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="slash2"/>
</STATE>
<STATE name="slash2" cooltime="4000" action="slash2_1" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="backdash"/>
</STATE>
<STATE name="suffer1" cooltime="2000" action="hunter_suffer1" enterfunc="faceToTarget,reduceGroggy:20" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2500" action="hunter_suffer2" enterfunc="faceToTarget,reduceGroggy:30" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="3000" action="hunter_suffer3" enterfunc="faceToTarget,reduceGroggy:40" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="dash" cooltime="0" action="dash" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="backdash" cooltime="0" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepForward" cooltime="2000" action="stepshootforward" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepBackward" cooltime="2000" action="stepshootbackward" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="2000" action="stepshootright" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="2000" action="stepshootleft" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="shootUp" cooltime="2000" action="huntershootup" func="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
중급 레벨 헌터
근접과 원거리 공격을 겸하는 NPC
초급과는 달리 피격시 회피를 시도음.
초급보다 더 충격에 잘 견디며, 공격적임.
</-->
<FSM name="hunter2" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasTarget" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints,dice">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepBackward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepForward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepRight"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepLeft"/>
<TRANS cond="distTarget:0;1500,angleTargetHeight:30;90" next="combat"/>
<TRANS cond="distTarget:0;700" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;250" next="slash1"/>
<TRANS cond="distTarget:0;1000,angleTargetHeight:30;90" next="backdash"/>
<TRANS cond="distTarget:1000;1500,angleTargetHeight:30;90" next="shootUp"/>
<TRANS cond="dice:100,distTarget:0;300,isEmptySpace:180;500" next="backdash"/>
<TRANS cond="dice:200,distTarget:350;650" next="dash"/>
<TRANS cond="dice:100,distTarget:300;700,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:600;1000,isEmptySpace:0;200" next="stepForward"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="slash1" cooltime="2500" action="slash1_2" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction" next="slash2"/>
</STATE>
<STATE name="slash2" cooltime="2500" action="slash2_2" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction" next="backdash"/>
</STATE>
<STATE name="suffer1" cooltime="1500" action="hunter_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:30" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2000" action="hunter_suffer2" enterfunc="faceToTarget,reduceGroggy:45" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2500" action="hunter_suffer3" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="dash" cooltime="0" action="dash" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="backdash" cooltime="0" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepForward" cooltime="1500" action="stepshootforward" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepBackward" cooltime="1500" action="stepshootbackward" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="1500" action="stepshootright" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="1500" action="stepshootleft" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="shootUp" cooltime="1500" action="huntershootup" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
고급 레벨 헌터
근접과 원거리 공격을 겸하는 NPC
중급과는 달리 피격 또는 공격후 동작전이 딜레이가 없음.
중급보다 더 충격에 잘 견디며, 공격적임.
</-->
<FSM name="hunter3" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasTarget" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints,dice">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepBackward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepForward"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepRight"/>
<TRANS cond="FailedBuildWayPoints,dice:100" next="stepLeft"/>
<TRANS cond="distTarget:0;1500,angleTargetHeight:30;90" next="combat"/>
<TRANS cond="distTarget:0;700" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;250" next="slash1"/>
<TRANS cond="distTarget:0;1000,angleTargetHeight:30;90" next="backdash"/>
<TRANS cond="distTarget:1000;1500,angleTargetHeight:30;90" next="shootUp"/>
<TRANS cond="dice:100,distTarget:0;300,isEmptySpace:180;500" next="backdash"/>
<TRANS cond="dice:200,distTarget:350;650" next="dash"/>
<TRANS cond="dice:100,distTarget:300;700,isEmptySpace:180;200" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:600;1000,isEmptySpace:0;200" next="stepForward"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:400;850,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="slash1" cooltime="2000" action="slash1_3" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction" next="slash2"/>
</STATE>
<STATE name="slash2" cooltime="2000" action="slash2_3" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction" next="backdash"/>
</STATE>
<STATE name="suffer1" cooltime="1000" action="hunter_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:40" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:0" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="1500" action="hunter_suffer2" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2000" action="hunter_suffer3" enterfunc="faceToTarget,reduceGroggy:80" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="dash" cooltime="0" action="dash" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="backdash" cooltime="0" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepForward" cooltime="1000" action="stepshootforward" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepBackward" cooltime="1000" action="stepshootbackward" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepRight" cooltime="1000" action="stepshootright" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="1000" action="stepshootleft" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="shootUp" cooltime="1000" action="huntershootup" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
초급 레벨 라이플맨
원거리 공격 NPC
</-->
<FSM name="rifleman" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,FailedBuildWayPoints" next="shoot"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="timeElapsedSinceEntered:100" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;1400" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;1000,isEmptySpace:180;400" next="backdash"/>
<TRANS cond="canSeeTarget,distTarget:0;1500" next="shoot"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="preparerun"/>
</STATE>
<STATE name="shoot" cooltime="4000" action="shoot" func="faceToTarget">
<TRANS cond="angleTargetHeight:30;90" next="shootup"/>
<TRANS cond="angleTargetHeight:-90;-25" next="shootdown"/>
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootup" cooltime="0" action="shootup" func="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootdown" cooltime="0" action="shootdown" func="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="2000" action="rifleman_suffer1" enterfunc="faceToTarget,reduceGroggy:20" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2500" action="rifleman_suffer2" enterfunc="faceToTarget,reduceGroggy:30" >
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="3000" action="rifleman_suffer3" enterfunc="faceToTarget,reduceGroggy:40" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="backdash" cooltime="3000" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepRight" cooltime="2000" action="stepright" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="2000" action="stepleft" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
중급 레벨 라이플맨
원거리 공격 NPC
초급보다 자주 쏘며 자주 튄다.
</-->
<FSM name="rifleman2" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,FailedBuildWayPoints" next="shoot"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="timeElapsedSinceEntered:100" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;1400" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;1000,isEmptySpace:180;400" next="backdash"/>
<TRANS cond="canSeeTarget,distTarget:0;1500" next="shoot"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="preparerun"/>
</STATE>
<STATE name="shoot" cooltime="3000" action="shoot" func="faceToTarget">
<TRANS cond="angleTargetHeight:30;90" next="shootup"/>
<TRANS cond="angleTargetHeight:-90;-25" next="shootdown"/>
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootup" cooltime="0" action="shootup" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootdown" cooltime="0" action="shootdown" func="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="1500" action="rifleman_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:30" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:300" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="2000" action="rifleman_suffer2" enterfunc="faceToTarget,reduceGroggy:45" >
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2500" action="rifleman_suffer3" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="backdash" cooltime="2000" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepRight" cooltime="1500" action="stepright" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="1500" action="stepleft" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:60" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:45" next="suffer2"/>
<TRANS cond="groggyGreater:30" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
고급 레벨 라이플맨
원거리 공격 NPC
중급보다 자주 쏘며 자주 튄다.
</-->
<FSM name="rifleman3" entrystate="find">
<STATE name="find" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:40" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:30" next="suffer2"/>
<TRANS cond="groggyGreater:20" next="suffer1"/>
<TRANS cond="groggyGreater:1" next="idle"/>
<TRANS cond="canSeeTarget,lookAtTarget:45,distTarget:0;4500,hasTarget" next="waitrandom"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,hasTarget" next="waitrandom"/>
<TRANS cond="hasTarget,distTarget:0;1500" next="waitrandom"/>
<TRANS cond="timeElapsedSinceEntered:10000" next="waitrandom"/>
</STATE>
<STATE name="waitrandom" cooltime="0" action="idle" enterfunc="dice" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:0" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:500" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1000" next="idle"/>
<TRANS cond="dice:25,timeElapsedSinceEntered:1500" next="idle"/>
<TRANS cond="default" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasTarget" next="preparerun"/>
</STATE>
<STATE name="preparerun" cooltime="0" action="idle" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;3000,FailedBuildWayPoints" next="shoot"/>
<TRANS cond="FailedBuildWayPoints" next="idle"/>
<TRANS cond="timeElapsedSinceEntered:100" next="runToTarget"/>
</STATE>
<STATE name="runToTarget" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="runWaypoints">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,distTarget:0;1400" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="runToTarget"/>
</STATE>
<STATE name="combat" cooltime="0" action="idle" func="dice">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="distTarget:0;1000,isEmptySpace:180;400" next="backdash"/>
<TRANS cond="canSeeTarget,distTarget:0;1500" next="shoot"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:90;200" next="stepRight"/>
<TRANS cond="dice:100,distTarget:200;1500,isEmptySpace:270;200" next="stepLeft"/>
<TRANS cond="timeElapsedSinceEntered:500" next="preparerun"/>
</STATE>
<STATE name="shoot" cooltime="2000" action="shoot" func="faceToTarget">
<TRANS cond="angleTargetHeight:30;90" next="shootup"/>
<TRANS cond="angleTargetHeight:-90;-25" next="shootdown"/>
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootup" cooltime="0" action="shootup" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="shootdown" cooltime="0" action="shootdown" func="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="1000" action="rifleman_suffer1" enterfunc="dice,faceToTarget,reduceGroggy:40" >
<TRANS cond="dice:100" next="stepRight"/>
<TRANS cond="dice:100" next="stepLeft"/>
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="sufferend" cooltime="0" action="idle" func="rotateToTarget" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="timeElapsedSinceEntered:0" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="1500" action="rifleman_suffer2" enterfunc="faceToTarget,reduceGroggy:60" >
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="2000" action="rifleman_suffer3" enterfunc="faceToTarget,reduceGroggy:80" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction,distTarget:0;250" next="sufferend"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="backdash" cooltime="1000" action="backdash" func="rotateToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stepRight" cooltime="1000" action="stepright" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="stepLeft" cooltime="1000" action="stepleft" enterfunc="faceToTarget">
<TRANS cond="groggyGreater:80" next="suffer3"/>
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:60" next="suffer2"/>
<TRANS cond="groggyGreater:40" next="suffer1"/>
<TRANS cond="endAction" next="sufferend"/>
</STATE>
<STATE name="afterblasted" cooltime="0" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
로봇보스
게릴라 로봇 보스
</-->
<FSM name="robot" entrystate="wait">
<STATE name="wait" cooltime="0" action="wait" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="timeElapsedSinceEntered:3000" next="arrive"/>
</STATE>
<STATE name="arrive" cooltime="0" action="robot_arrive" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="hasTarget" next="combat"/>
</STATE>
<STATE name="combat" cooltime="0" action="robot_run" enterfunc="buildWaypointsToTarget" func="dice,runWaypoints">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="angleTargetHeight:45;90,distTarget:300;1500" next="stomp_front"/>
<TRANS cond="dice:100,distTarget:0;600" next="stomp"/>
<TRANS cond="dice:100,distTarget:0;350,lookAtTarget:90" next="smash"/>
<TRANS cond="dice:100,distTarget:600;1200,lookAtTarget:30" next="charge"/>
<TRANS cond="distTarget:0;250" next="closecombat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="combat"/>
</STATE>
<STATE name="closecombat" cooltime="0" action="idle" func="dice,rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="angleTargetHeight:45;90,distTarget:300;1500" next="stomp_front"/>
<TRANS cond="dice:100,distTarget:0;600" next="stomp"/>
<TRANS cond="dice:200,distTarget:0;350,lookAtTarget:90" next="smash"/>
<TRANS cond="dice:100,distTarget:300;1200,lookAtTarget:30" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:5000" next="idle"/>
</STATE>
<STATE name="stomp_front" cooltime="0" action="robot_stomp_front" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stomp2" cooltime="4500" action="robot_stomp" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="stomp" cooltime="6000" action="idle" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="distTarget:300;900" next="stomp_front"/>
<TRANS cond="default" next="stomp2"/>
</STATE>
<STATE name="smash" cooltime="3000" action="robot_smash" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="charge" cooltime="8000" action="robot_charge" enterfunc="faceToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:2000" next="suffer3"/>
<TRANS cond="groggyGreater:1600" next="suffer2"/>
<TRANS cond="groggyGreater:1200" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="20000" action="robot_suffer1" enterfunc="faceToTarget,reduceGroggy:400" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="20000" action="robot_suffer2" enterfunc="faceToTarget,reduceGroggy:800" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="20000" action="robot_suffer3" enterfunc="faceToTarget" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="afterblasted" cooltime="0" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
초능력자보스
게릴라 초능력자 보스
</-->
<FSM name="psychic" entrystate="wait">
<STATE name="wait" cooltime="0" action="wait" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="timeElapsedSinceEntered:3000" next="arrive"/>
</STATE>
<STATE name="arrive" cooltime="0" action="psychic_arrive" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="hasTarget" next="combat"/>
</STATE>
<STATE name="combat" cooltime="0" action="run" enterfunc="buildWaypointsToTarget" func="dice,runWaypoints">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,angleTargetHeight:30;90,distTarget:500;1500" next="bashup"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:300;2000,lookAtTarget:30" next="bash"/>
<TRANS cond="canSeeTarget,dice:150,distTarget:0;800,lookAtTarget:60" next="wave"/>
<TRANS cond="canSeeTarget,dice:150,distTarget:0;700" next="storm"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;800,isEmptySpace:180;300" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:0;600,isEmptySpace:180;300,angleTargetHeight:10;90" next="stepBackward"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;1000,isEmptySpace:90;300" next="stepRight"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;1000,isEmptySpace:270;300" next="stepLeft"/>
<TRANS cond="canSeeTarget,distTarget:0;500" next="closecombat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="combat"/>
</STATE>
<STATE name="closecombat" cooltime="0" action="idle" func="dice,rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="canSeeTarget,angleTargetHeight:30;90,distTarget:500;1500" next="bashup"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:300;2000,lookAtTarget:30" next="bash"/>
<TRANS cond="canSeeTarget,dice:150,distTarget:0;800,lookAtTarget:60" next="wave"/>
<TRANS cond="canSeeTarget,dice:150,distTarget:0;700,lookAtTarget:30" next="storm"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;800,isEmptySpace:180;300" next="stepBackward"/>
<TRANS cond="dice:100,distTarget:0;600,isEmptySpace:180;300,angleTargetHeight:10;90" next="stepBackward"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;1000,isEmptySpace:90;300" next="stepRight"/>
<TRANS cond="canSeeTarget,dice:100,distTarget:0;1000,isEmptySpace:270;300" next="stepLeft"/>
<TRANS cond="cannotSeeTarget" next="combat"/>
<TRANS cond="distTarget:500;2000,lookAtTarget:30" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:5000" next="idle"/>
</STATE>
<STATE name="stepBackward" cooltime="1500" action="stepbackward" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="stepRight" cooltime="1500" action="stepright" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="stepLeft" cooltime="1500" action="stepleft" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="bash" cooltime="3500" action="psychic_bash" enterfunc="faceToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="bashup" cooltime="0" action="psychic_bashup" enterfunc="faceToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="wave" cooltime="4500" action="psychic_wave" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="storm" cooltime="10000" action="psychic_storm" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:3000" next="suffer3"/>
<TRANS cond="groggyGreater:2400" next="suffer2"/>
<TRANS cond="groggyGreater:1800" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="25000" action="psychic_suffer1" enterfunc="faceToTarget,reduceGroggy:600" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="25000" action="psychic_suffer2" enterfunc="faceToTarget,reduceGroggy:1200" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="25000" action="psychic_suffer3" enterfunc="faceToTarget" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="afterblasted" cooltime="0" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
<!-->
장군보스
게릴라 장군 보스
</-->
<FSM name="general" entrystate="wait">
<STATE name="wait" cooltime="0" action="wait" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="timeElapsedSinceEntered:3000" next="arrive"/>
</STATE>
<STATE name="arrive" cooltime="0" action="general_arrive" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="idle" cooltime="0" action="idle" func="findTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="hasTarget" next="combat"/>
</STATE>
<STATE name="combat" cooltime="0" action="general_run" enterfunc="buildWaypointsToTarget" func="dice,runWaypoints">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="angleTargetHeight:45;90,distTarget:300;1500" next="jumpattack"/>
<TRANS cond="dice:100,distTarget:400;600,isEmptySpace:90;300" next="jumpattack"/>
<TRANS cond="dice:100,distTarget:500;1000,lookAtTarget:30" next="dashattack"/>
<TRANS cond="dice:100,distTarget:0;500,lookAtTarget:60" next="leftslash"/>
<TRANS cond="dice:100,distTarget:0;500,lookAtTarget:60" next="rightslash"/>
<TRANS cond="dice:100,distTarget:700;2000" next="dash"/>
<TRANS cond="dice:100,distTarget:500;1000" next="step"/>
<TRANS cond="distTarget:0;250" next="closecombat"/>
<TRANS cond="timeElapsedSinceEntered:500" next="combat"/>
</STATE>
<STATE name="closecombat" cooltime="0" action="idle" func="dice,rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="hasNoTarget" next="idle"/>
<TRANS cond="angleTargetHeight:45;90,distTarget:300;1500" next="jumpattack"/>
<TRANS cond="dice:100,distTarget:400;600,isEmptySpace:90;300" next="jumpattack"/>
<TRANS cond="dice:100,distTarget:500;1000,lookAtTarget:30" next="dashattack"/>
<TRANS cond="dice:100,distTarget:0;500,lookAtTarget:60" next="leftslash"/>
<TRANS cond="dice:100,distTarget:0;500,lookAtTarget:60" next="rightslash"/>
<TRANS cond="dice:100,distTarget:700;2000" next="dash"/>
<TRANS cond="dice:100,distTarget:500;1000" next="step"/>
<TRANS cond="dice:100,distTarget:500;2000,lookAtTarget:30" next="combat"/>
<TRANS cond="timeElapsedSinceEntered:5000" next="idle"/>
</STATE>
<STATE name="dash" cooltime="0" action="general_dash" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="step" cooltime="0" action="general_step" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="leftslash" cooltime="2500" action="general_leftslash" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:1500" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="rightslash" cooltime="2500" action="general_rightslash" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="jumpattack" cooltime="4000" action="general_jumpattack" func="rotateToTarget" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="dashattack" cooltime="8000" action="general_dashattack" func="rotateToTarget">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="groggyGreater:4000" next="suffer3"/>
<TRANS cond="groggyGreater:3200" next="suffer2"/>
<TRANS cond="groggyGreater:2400" next="suffer1"/>
<TRANS cond="endAction" next="combat"/>
</STATE>
<STATE name="suffer1" cooltime="30000" action="general_suffer1" enterfunc="faceToTarget,reduceGroggy:800" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer2" cooltime="30000" action="general_suffer2" enterfunc="faceToTarget,reduceGroggy:1600" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="suffer3" cooltime="30000" action="general_suffer3" enterfunc="faceToTarget" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="suffer3Recover"/>
</STATE>
<STATE name="suffer3Recover" cooltime="0" action="suffer3recover" enterfunc="reduceGroggy:9999">
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="endAction" next="idle"/>
</STATE>
<STATE name="afterblasted" cooltime="0" >
<TRANS cond="hpEqual:0" next="__die"/>
<TRANS cond="default" next="idle"/>
</STATE>
</FSM>
</XML>
ChannelRule.xml
Code:
0x30, 0x82, 0x04, 0xBC, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA6, 0x30, 0x82, 0x04, 0xA2, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC2, 0xBD, 0x89, 0x0A, 0x53, 0x0C, 0x03, 0xEA, 0xC9, 0xE1, 0xEA, 0x93, 0xA5, 0x16, 0x94, 0x24, 0xFF, 0x91, 0xE7, 0xBC, 0x39, 0x87, 0x63, 0xF3, 0xB9, 0x8A, 0x72, 0x2D, 0x1C, 0x23, 0x45, 0x58, 0xFF, 0x96, 0x4D, 0x7F, 0x04, 0x8C, 0x9A, 0xD4, 0xFF, 0x3E, 0x8E, 0x71, 0x7D, 0x98, 0xAB, 0x9B, 0x53, 0x8E, 0xA0, 0x5E, 0xE2, 0xDB, 0x06, 0x48, 0x33, 0x9F, 0xDC, 0x4C, 0xB4, 0x81, 0x76, 0x59, 0x16, 0x57, 0x21, 0x72, 0x65, 0xE1, 0x0A, 0x17, 0xD5, 0xD7, 0xE6, 0x2C, 0x19, 0x91, 0xD5, 0x0B, 0x4D, 0xC0, 0x79, 0x46, 0xC4, 0xDD, 0xE2, 0x9F, 0xBE, 0x8C, 0x63, 0x10, 0x98, 0xEB, 0x36, 0x2E, 0x57, 0xDD, 0x61, 0xF8, 0x34, 0xE5, 0xF5, 0x19, 0xD8, 0x3E, 0x41, 0x00, 0xD4, 0x88, 0xAF, 0x4C, 0x6C, 0x8B, 0x4A, 0x85, 0xDA, 0xBA, 0xC5, 0x7C, 0xDC, 0xBC, 0xE1, 0x44, 0x55, 0xFB, 0xBB, 0x87, 0xEB, 0xE3, 0x02, 0x8C, 0xD6, 0xC4, 0x0B, 0x94, 0x47, 0x5D, 0x2F, 0x8B, 0x75, 0x15, 0x44, 0x2D, 0x91, 0x86, 0x09, 0x17, 0x1B, 0x38, 0xFE, 0x7F, 0x43, 0xF1, 0x3F, 0x6B, 0xCD, 0x00, 0x57, 0xCD, 0xB6, 0xCF, 0x6C, 0x4F, 0x33, 0xFB, 0x9E, 0x39, 0x32, 0x1C, 0xA5, 0xAE, 0xF3, 0x96, 0x7F, 0x75, 0x0C, 0xCE, 0x24, 0xF6, 0xE7, 0xB0, 0x5E, 0x94, 0x2A, 0x49, 0x04, 0xC2, 0xC9, 0xCF, 0x74, 0x5F, 0x32, 0xF9, 0x7C, 0x9B, 0x3B, 0xD6, 0x3D, 0x06, 0x41, 0xC5, 0x76, 0x91, 0x94, 0xA8, 0x45, 0x17, 0xF2, 0x68, 0x7D, 0x2B, 0x05, 0x38, 0x46, 0x5B, 0xF5, 0x17, 0x21, 0x74, 0xD2, 0x75, 0x40, 0xF9, 0xDA, 0x30, 0x1B, 0x00, 0x27, 0x26, 0x23, 0xFB, 0xFD, 0x86, 0xF0, 0xE5, 0x92, 0x0F, 0x8C, 0x37, 0xA6, 0x64, 0x7E, 0xA6, 0x2D, 0xC9, 0xCC, 0x51, 0xEC, 0x4C, 0x90, 0x52, 0x60, 0x2A, 0x2F, 0xFF, 0x02, 0x01, 0x11, 0x02, 0x82, 0x01, 0x00, 0x28, 0x17, 0xF6, 0x91, 0x2F, 0x37, 0x2D, 0xFB, 0xA2, 0x08, 0xDD, 0x78, 0xC0, 0x1B, 0x3C, 0x9E, 0x34, 0x9E, 0x0A, 0x10, 0x29, 0xF6, 0x3A, 0x39, 0xB5, 0x42, 0x26, 0x90, 0xD1, 0x16, 0x52, 0x0A, 0xCB, 0x35, 0x88, 0x6C, 0xF9, 0x68, 0x3D, 0xFE, 0xAD, 0x05, 0x59, 0x8F, 0xD6, 0x17, 0xE7, 0x18, 0x73, 0x15, 0xD5, 0xB9, 0x2E, 0xB4, 0x9F, 0x69, 0x37, 0xCE, 0x16, 0xC4, 0x7F, 0x84, 0x10, 0xD6, 0x1B, 0x30, 0x0E, 0x6A, 0x60, 0x44, 0xEB, 0x7D, 0x60, 0xBB, 0x82, 0x36, 0x41, 0x7F, 0xE8, 0x18, 0xEA, 0x5C, 0x55, 0x34, 0x37, 0x97, 0x18, 0x11, 0xD4, 0x68, 0x32, 0x83, 0x6A, 0xC7, 0x03, 0xA0, 0x21, 0x26, 0x0C, 0xA4, 0x0A, 0xE4, 0x0C, 0xD0, 0x9D, 0x76, 0x3A, 0x8F, 0x3A, 0xD0, 0xD8, 0xCB, 0xF8, 0x3A, 0xCB, 0x94, 0x07, 0x62, 0xB0, 0x30, 0x4B, 0x90, 0x4C, 0x7F, 0x02, 0xA4, 0xC4, 0xB9, 0xBD, 0x6B, 0xFE, 0xAB, 0xBA, 0xBA, 0xB9, 0x4F, 0x40, 0xA1, 0xE4, 0x79, 0x0B, 0x7A, 0xE1, 0x7F, 0x9F, 0x0E, 0x95, 0xFD, 0x8A, 0xFC, 0x34, 0xD4, 0x0D, 0x53, 0xF4, 0x21, 0x7C, 0x35, 0xF5, 0x60, 0x2F, 0x26, 0xBF, 0x43, 0x1B, 0x68, 0x58, 0xF4, 0x13, 0x09, 0x7F, 0x8B, 0x25, 0x74, 0x60, 0xE3, 0x38, 0x02, 0x90, 0x4D, 0xFD, 0xFB, 0x45, 0x08, 0x0A, 0x48, 0xD7, 0xAF, 0x82, 0x63, 0xAD, 0x80, 0xEA, 0x27, 0xC8, 0x8C, 0x4E, 0x90, 0xDE, 0xC0, 0x27, 0xF4, 0xB5, 0x97, 0xB2, 0x4B, 0x20, 0x09, 0xF7, 0xE8, 0x8C, 0x91, 0x9F, 0x1C, 0x75, 0x16, 0x6C, 0x42, 0xD9, 0xC1, 0x75, 0x04, 0x96, 0xA3, 0xAC, 0xD1, 0x6C, 0xAE, 0xED, 0x5F, 0x8C, 0x14, 0x08, 0xCB, 0xC9, 0x83, 0x0C, 0x81, 0x96, 0x86, 0x0E, 0xEC, 0xD3, 0xAE, 0x97, 0x57, 0x55, 0xF8, 0x7E, 0x79, 0xC8, 0xF6, 0x8F, 0xC0, 0xE1, 0x31, 0x02, 0x81, 0x81, 0x00, 0xC6, 0xE0, 0xB1, 0x29, 0xC6, 0xE8, 0x36, 0x8B, 0x85, 0x1F, 0x29, 0xFE, 0x37, 0x22, 0x29, 0x33, 0x90, 0x2E, 0xF3, 0xC0, 0xCD, 0x5B, 0x51, 0xB7, 0x44, 0xFA, 0x0F, 0x9D, 0x20, 0x32, 0x37, 0x4E, 0x83, 0xC5, 0x66, 0x50, 0xC8, 0xE5, 0x61, 0xF8, 0x54, 0x6D, 0xAA, 0xF7, 0xB9, 0xCD, 0xF5, 0x1D, 0xBD, 0xF7, 0x3D, 0x96, 0xC8, 0x8F, 0xA6, 0x52, 0x1D, 0x8C, 0x7B, 0x2C, 0x33, 0x18, 0x95, 0xD3, 0xA2, 0x51, 0x38, 0x78, 0xF2, 0x95, 0x6C, 0x04, 0xB0, 0xA9, 0x2E, 0x15, 0x7E, 0xD9, 0xBE, 0xEE, 0x00, 0xF3, 0xD5, 0xBC, 0xD4, 0x61, 0xDE, 0x4C, 0x9D, 0xF0, 0x3D, 0x78, 0xC3, 0x24, 0x2E, 0x29, 0x71, 0xFF, 0x54, 0xE6, 0x87, 0xA7, 0x52, 0x18, 0xEC, 0xF7, 0x8A, 0x75, 0x60, 0x80, 0x42, 0x8F, 0x0B, 0xC0, 0xF9, 0x2C, 0x5A, 0x69, 0xF1, 0x41, 0xCD, 0x48, 0x1A, 0x4D, 0xBC, 0xA1, 0xAE, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA, 0xAC, 0xA0, 0xFC, 0x60, 0x50, 0xE3, 0x3E, 0xAC, 0xE2, 0x8B, 0x41, 0x4F, 0x55, 0x1C, 0xD7, 0x45, 0xEB, 0xAA, 0x86, 0xCF, 0x5D, 0xD0, 0xC2, 0x07, 0x5F, 0x69, 0x75, 0x2C, 0xEC, 0x9D, 0x3E, 0x4E, 0x04, 0xAE, 0x26, 0x2F, 0x1B, 0x67, 0x9F, 0x5C, 0xA5, 0x6A, 0xA5, 0xA8, 0x6E, 0xB3, 0xBE, 0x87, 0xEF, 0x05, 0xE5, 0x4D, 0x80, 0xD6, 0xAD, 0x48, 0x7F, 0x4D, 0x66, 0xAF, 0xAE, 0x26, 0x19, 0x68, 0x79, 0x51, 0x78, 0xCB, 0xA5, 0xBB, 0xA5, 0x61, 0x53, 0x1F, 0x9B, 0x46, 0x18, 0x7C, 0xD4, 0xF4, 0x2F, 0xB3, 0x86, 0x50, 0x95, 0x53, 0xEB, 0x92, 0x74, 0x79, 0x2B, 0xD6, 0xF1, 0xA4, 0xD9, 0xFC, 0x37, 0x91, 0xA3, 0x67, 0xAE, 0xBB, 0xCA, 0xE5, 0xD6, 0x25, 0xF3, 0xAB, 0xAC, 0x25, 0x66, 0x9B, 0x49, 0xCA, 0x72, 0xF4, 0x49, 0xF0, 0x59, 0x26, 0x6B, 0xCA, 0x7B, 0xA0, 0x28, 0xCE, 0x3F, 0x02, 0x81, 0x81, 0x00, 0x8C, 0x62, 0x5E, 0xF0, 0x50, 0x2B, 0x71, 0xCB, 0xE5, 0x7F, 0x68, 0xEF, 0xAE, 0x72, 0x77, 0x6F, 0xB1, 0x12, 0x15, 0x79, 0x09, 0x6D, 0xA3, 0x17, 0xF4, 0x74, 0x47, 0x41, 0xBC, 0x5F, 0xAE, 0x91, 0xC6, 0x6D, 0x39, 0x29, 0xF7, 0x38, 0x81, 0x63, 0xFF, 0x5C, 0x78, 0xAE, 0xDD, 0x82, 0x52, 0xAB, 0x95, 0x26, 0xFE, 0x4C, 0x51, 0x56, 0x57, 0x49, 0x05, 0xCC, 0x93, 0x2E, 0x42, 0x2F, 0x78, 0xD1, 0x9F, 0xC0, 0xDC, 0x91, 0x9C, 0x2D, 0x3D, 0x30, 0x7C, 0xB3, 0xA8, 0x0F, 0x2C, 0x5D, 0x77, 0xB7, 0x0F, 0xBB, 0x2D, 0x76, 0x3B, 0x90, 0x60, 0xAE, 0x8D, 0x9A, 0x85, 0xBE, 0xA7, 0xDD, 0x4D, 0xC2, 0xE7, 0x0E, 0x96, 0x48, 0x5F, 0xC1, 0x67, 0x20, 0xA7, 0x45, 0x52, 0xAD, 0x35, 0x0F, 0x3E, 0x0A, 0x9E, 0xE2, 0x91, 0xC4, 0xF4, 0x87, 0x04, 0xA6, 0xEB, 0x41, 0xF4, 0x73, 0x1B, 0xBD, 0x6B, 0xF1, 0x02, 0x81, 0x81, 0x00, 0xEB, 0xED, 0xC4, 0xB1, 0x4B, 0x97, 0x6C, 0x77, 0x39, 0x4D, 0xB0, 0x3D, 0x77, 0xD7, 0xA2, 0xAC, 0x7E, 0x0A, 0xFA, 0xD9, 0x3B, 0xA3, 0x97, 0x4D, 0x34, 0x1D, 0x90, 0x6E, 0x48, 0x66, 0x39, 0xA4, 0x0D, 0x31, 0x94, 0xD8, 0xA4, 0xCE, 0x7F, 0xA5, 0x0B, 0xE6, 0xFA, 0xF6, 0x44, 0x2B, 0xF4, 0x77, 0x16, 0x86, 0x9C, 0x23, 0x1B, 0xC4, 0x8D, 0xD0, 0x44, 0x3B, 0x94, 0x24, 0x69, 0x1C, 0x60, 0x17, 0xE9, 0xDB, 0x97, 0xF9, 0x38, 0x23, 0x83, 0x6E, 0x79, 0xB7, 0xA5, 0x46, 0xD8, 0x8F, 0x84, 0x8C, 0x31, 0x1D, 0xD6, 0x24, 0x0F, 0x9B, 0x9A, 0x47, 0x20, 0x6D, 0x9F, 0x38, 0x51, 0xD4, 0x5E, 0xEB, 0x47, 0xBB, 0xD4, 0x5D, 0x8E, 0xC2, 0x92, 0xA0, 0xD8, 0x51, 0x14, 0xA9, 0x1A, 0x0B, 0x6E, 0x7E, 0xB0, 0x45, 0x73, 0x3F, 0x04, 0x09, 0x5A, 0xAE, 0x42, 0x47, 0x55, 0x29, 0x0F, 0x35, 0x76, 0xD1, 0x02, 0x81, 0x80, 0x1E, 0x05, 0x2A, 0xB3, 0x7A, 0x8E, 0xA5, 0x60, 0x87, 0x52, 0xC9, 0x93, 0x1A, 0x30, 0x46, 0x58, 0xE6, 0x30, 0x52, 0xFB, 0x38, 0xFC, 0x97, 0x6D, 0x0A, 0xE9, 0xBD, 0xC5, 0xDC, 0x25, 0x3C, 0x6C, 0x54, 0xF0, 0x65, 0x72, 0x8C, 0xEB, 0xEF, 0xCB, 0xDF, 0xAB, 0x1C, 0x3E, 0xC3, 0xA8, 0x8F, 0xA6, 0xCE, 0x33, 0x7B, 0xE3, 0x3B, 0x1D, 0x3E, 0x34, 0x35, 0xE1, 0xEA, 0x47, 0xFF, 0x98, 0x43, 0xCA, 0x4A, 0xD8, 0x36, 0xB8, 0x90, 0xC4, 0x9D, 0xAB, 0x17, 0x14, 0x68, 0x4A, 0xFC, 0x0F, 0xB7, 0xCB, 0x19, 0x6F, 0xB1, 0x48, 0xD5, 0x24, 0xB0, 0x64, 0xA7, 0x60, 0x2F, 0xCD, 0xBA, 0x26, 0xE0, 0x95, 0x08, 0xCE, 0xEA, 0x41, 0xAB, 0xE6, 0xA1, 0x8E, 0xBB, 0xC5, 0x7F, 0xE5, 0x54, 0x5B, 0x94, 0xDB, 0x6A, 0x76, 0x78, 0xC0, 0x0D, 0x9F, 0xB6, 0xFB, 0x2C, 0x12, 0xA3, 0xFD, 0x68, 0xBB, 0xE8, 0xB2,