Production History/How to do it
Pet AI 수정 예시
냥이발
2011. 11. 26. 15:09
aidescdata_pet_dog.xml 수정된 dog AI입니다. 수정 포인트에 배경색을 입혔습니다.
거리간격을 유지하고, 힐링 속도를 빠르게하며 시간 오버시 스킬해제, 힐링과 응치를 할때 주인과 겹치지 않기 등입니다.
원격힐링과 응치가 가능했었으나 지금은 막혔습니다.
거리간격을 유지하고, 힐링 속도를 빠르게하며 시간 오버시 스킬해제, 힐링과 응치를 할때 주인과 겹치지 않기 등입니다.
원격힐링과 응치가 가능했었으나 지금은 막혔습니다.
<aidescdata>
<template>
<imports>
<import file="data/db/ai/local/common_pet.xml" />
</imports>
<var_decl>
<var name="visualfield_radius" default="600" />
<var name="audio_range" default="400" />
</var_decl>
<sensor visualfield_radius="%visualfield_radius" visualfield_angle="90" audio_range="%audio_range" />
<!--
펫이 올바르게 작동하기 위해서는 다음 속성들이 수정되어서는 안됩니다.
- return_to_startpoint : false면 ai가 시작지점으로 돌아가려 시도하지 않음
- auto_respawn : false면 죽어도 리스폰을 요청하지 않음
- target_type : 반드시 "always"이어야 함
- support_type : 반드시 "none"이어야 함
-->
<character return_to_startpoint="false" auto_respawn="false" target_type="always" support_type="none">
<!--race stringid="*/wolf/*" type="hate" / -->
</character>
<patterns>
<!-- 똑똑한 펫: 아이템 줍기 -->
<pattern name="pick_item">
<param_decl>
</param_decl>
<sequence>
<!-- 아이템이 있는지 검사한다 -->
<if condition="expr" expr="@check_enable_put_item_in_dist">
<then>
<!-- 있다면 아이템 줍기를 시도한다. -->
<cmd name="pet_pickup_item" success_msg="_LT[xml.ai_local.155]" fail_msg="_LT[xml.ai_local.156]" />
</then>
<else>
<!-- 없다면 주위를 걍 돌아다닌다. -->
<cmd name="move_random" radius="700" run="false" timeout="3000" />
</else>
</if>
<cmd name="wait" min="1000" max="1500" />
</sequence>
</pattern>
<!-- 똑똑한 펫: 상자를 알려준다 -->
<pattern name="command:report_box">
<param_decl />
<sequence>
<cmd name="say_to_all_immediate" text="_LT[xml.ai_local.41]" />
<cmd name="pet_report_box" fail_msg="_LT[xml.ai_local.157]" />
</sequence>
</pattern>
<pattern name="wander">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@master_movestate == 0">
<then>
<cmd name="follow_target" target="1" distance="400" run="false" continue="false" />
</then>
<else>
<if condition="expr" expr="@master_movestate == 1">
<then>
<cmd name="follow_target" target="1" distance="400" run="false" continue="false" />
</then>
<else>
<cmd name="follow_target" target="1" distance="400" run="true" continue="false" />
</else>
</if>
</else>
</if>
</sequence>
</pattern>
<pattern name="command:cute_trick">
<param_decl>
</param_decl>
<sequence>
<cmd name="follow_target" target="1" distance="400" run="true" continue="false" />
<cmd name="skill_relax" on="true" />
<cmd name="wait" min="7000" max="10000" />
</sequence>
</pattern>
<pattern name="command:sitdown">
<param_decl>
</param_decl>
<sequence>
<cmd name="skill_relax" on="true" />
<cmd name="stop" />
</sequence>
</pattern>
<pattern name="command:standup">
<param_decl>
</param_decl>
<sequence>
<cmd name="skill_relax" on="false" />
</sequence>
</pattern>
<pattern name="command:defense">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(20001) and @stamina>4">
<then>
<cmd name="prepare_skill" skill_id="20001" try_cnt="3" />
<cmd name="wait" min="10000" max="10000" />
<cmd name="cancel_skill" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.42]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:smash">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(20002) and @stamina>8">
<then>
<cmd name="prepare_skill" skill_id="20002" try_cnt="3" />
<cmd name="melee_attack" combo="1" timeout="6000" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.43]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:counter">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(20003) and @stamina>5">
<then>
<cmd name="prepare_skill" skill_id="20003" try_cnt="3" />
<cmd name="wait" min="10000" max="10000" />
<cmd name="cancel_skill" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.44]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:call">
<param_decl>
</param_decl>
<sequence>
<cmd name="say_to_all" text="_LT[xml.ai_local.45]" />
<cmd name="follow_target" target="1" distance="400" run="true" continue="false"/>
<cmd name="move_random" radius="400" run="false" timeout="2000" />
</sequence>
</pattern>
<pattern name="command:firebolt">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(30201)">
<then>
<cmd name="stackmagic_attack" skill_id="30201" charge="1" timeout="10000" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.46]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:icebolt">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(30301)">
<then>
<cmd name="stackmagic_attack" skill_id="30301" charge="1" timeout="10000" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.47]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:lightningbolt">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(30101)">
<then>
<cmd name="stackmagic_attack" skill_id="30101" charge="1" timeout="10000" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.48]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="command:healing">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(30006) and @mana>20">
<then>
<cmd name="follow_target" target="1" distance="500" run="true" continue="false" />
<cmd name="prepare_and_use_all_stacks" skill_id="30006" try_cnt="5" target="5" skilldelay="200" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.49]" />
</else>
</if>
<cmd name="wait" min="1000" max="1000" />
<cmd name="cancel_skill" />
</sequence>
</pattern>
<pattern name="command:first_aid">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_preparable_skill(10009)">
<then>
<cmd name="follow_target" target="1" distance="500" run="true" continue="false" />
<cmd name="prepare_skill" skill_id="10009" try_cnt="3" />
<cmd name="process_skill" target="5" />
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.182]" />
</else>
</if>
</sequence>
</pattern>
<pattern name="attack">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@stamina>8">
<!--암것도 못할 상황이 아니라면 전투 -->
<then>
<switch type="random">
<case rate="50">
<cmd name="melee_attack" combo="3" timeout="4000" />
</case>
<case rate="50">
<cmd name="prepare_skill" skill_id="20002" />
<!-- 스매시 -->
<cmd name="melee_attack" combo="1" timeout="4000" />
</case>
</switch>
<switch type="random">
<case rate="20">
<!--일반 공격패턴 -->
<cmd name="melee_attack" combo="3" timeout="4000" />
<switch type="random">
<case rate="40">
<if condition="expr" expr="@is_usable_skill(30201) and @mana>10">
<then>
<cmd name="move_random" radius="600" run="true" timeout="3000" />
<cmd name="stackmagic_attack" skill_id="30201" charge="1" timeout="10000" />
</then>
</if>
</case>
<case rate="20">
<cmd name="prepare_skill" skill_id="20001" />
<!-- 방어 -->
<cmd name="follow" distance="100" run="false" timeout="1000" />
<cmd name="cancel_skill" />
</case>
</switch>
</case>
<case rate="20">
<!-- 마법 -->
<if condition="expr" expr="@is_usable_skill(30201) and @mana>10">
<then>
<cmd name="move_random" radius="600" run="true" timeout="3000" />
<cmd name="stackmagic_attack" skill_id="30201" charge="1" timeout="10000" />
</then>
</if>
</case>
<case rate="10">
<!-- 스매시 -->
<switch type="random">
<case rate="40">
<cmd name="prepare_skill" skill_id="20002" />
<!-- 스매시 -->
<cmd name="melee_attack" combo="1" timeout="4000" />
</case>
<case rate="30">
<cmd name="prepare_skill" skill_id="20002" />
<!-- 스매시 -->
<cmd name="cancel_skill" />
<cmd name="melee_attack" combo="3" timeout="4000" />
</case>
<case rate="30">
<cmd name="prepare_skill" skill_id="20001" />
<!-- 방어 -->
<cmd name="wait" min="2000" max="5000" />
<cmd name="cancel_skill" />
</case>
</switch>
</case>
<case rate="10">
<!-- 디펜스 -->
<cmd name="prepare_skill" skill_id="20001" />
<switch type="random">
<case rate="30">
<cmd name="move_around" radius="400" clockwise="true" run="false" timeout="2000" />
</case>
<case rate="30">
<cmd name="move_around" radius="400" clockwise="false" run="false" timeout="2000" />
</case>
<case rate="40">
<cmd name="follow" distance="400" run="false" timeout="4000" />
</case>
</switch>
<cmd name="cancel_skill" />
</case>
<case rate="30">
<!-- 이동 -->
<switch type="random">
<case rate="30">
<cmd name="move_around" radius="400" clockwise="true" run="true" timeout="2000" />
</case>
<case rate="30">
<cmd name="move_around" radius="400" clockwise="false" run="true" timeout="2000" />
</case>
<case rate="20">
<cmd name="follow" distance="400" run="true" timeout="3000" />
</case>
<case rate="20">
<cmd name="move_against" distance="500" run="true" timeout="3000" />
</case>
</switch>
</case>
<case rate="10">
<!-- 카운터 -->
<cmd name="prepare_skill" skill_id="20003" />
<cmd name="wait" min="1000" max="10000" />
<cmd name="cancel_skill" />
</case>
</switch>
</then>
<else>
<cmd name="say_to_all" text="_LT[xml.ai_local.50]" />
<cmd name="move_around" radius="600" clockwise="true|false|" run="true|false|" timeout="3000" />
</else>
</if>
</sequence>
</pattern>
<pattern name="support">
<param_decl>
</param_decl>
<sequence>
<if condition="expr" expr="@is_usable_skill(30006) and @mana>20 and 0.9>@master_life/@master_life_max">
<then>
<cmd name="prepare_and_use_all_stacks" skill_id="30006" try_cnt="5" target="5" skilldelay="200" />
</then>
</if>
<cmd name="wait" min="1000" max="1000" />
<cmd name="cancel_skill" />
</sequence>
</pattern>
<pattern name="event_defence_success">
<param_decl>
<param name="delay" />
</param_decl>
<sequence>
<cmd name="melee_attack" combo="3" />
</sequence>
</pattern>
<pattern name="event_blowhit">
<param_decl>
<param name="delay" />
</param_decl>
<sequence>
<switch type="random">
<case rate="60">
<if condition="expr" expr="@is_usable_skill(20003)">
<then>
<!-- 카운터 -->
<cmd name="prepare_skill" skill_id="20003" />
<cmd name="wait" min="1000" max="10000" />
<cmd name="cancel_skill" />
</then>
</if>
</case>
<case rate="40">
<!-- 디펜스 -->
<cmd name="prepare_skill" skill_id="20001" />
<switch type="random">
<case rate="60">
<cmd name="move_around" radius="400|500|" clockwise="true|false|" run="false" timeout="5000" />
</case>
<case rate="40">
<cmd name="follow" distance="400" run="false" timeout="4000" />
</case>
</switch>
<cmd name="cancel_skill" />
<if condition="random" rate="50">
<then>
<cmd name="move_around" radius="500" clockwise="true" run="false" timeout="5000" />
</then>
<else>
<cmd name="melee_attack" combo="3" timeout="5000" />
</else>
</if>
</case>
</switch>
</sequence>
</pattern>
</patterns>
<strategy>
<!-- 주인과 max_radius거리만큼 멀어지면 follow_radius거리안으로 주인에게 다가감 -->
<idle type="idle_pet" max_radius="500" follow_radius="100">
<pattern name="wander" />
<pattern id="attack" name="attack" radius="400" />
<pattern id="support" name="support" radius="500" />
<pattern id="submission" name="submission" />
<pattern id="pick_item" name="pick_item" />
<event name="blowhit">
<pattern name="event_blowhit" delay="0" />
</event>
<event name="defence">
<pattern name="event_defence_success" delay="0" />
</event>
</idle>
</strategy>
<!-- 똑똑한 펫일 경우에 상자 명령어에 반응한다. -->
<chat type="pet">
<predefined name="report_box" string="report_box|">
<pattern name="command:report_box" />
</predefined>
</chat>
</template>
<definition race="aidescdata_dog">
<var_def>
<var name="visualfield_radius" value="800" />
<var name="audio_range" value="800" />
</var_def>
</definition>
</aidescdata>