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&gt;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&gt;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&gt;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&gt;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&gt;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&gt;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&gt;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&gt;20 and 0.9&gt;@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>