2015年4月—2024年4月,论坛已建立9周年,欢迎加入QQ群讨论:419848937

传送AI详解

爆率、物品、补丁修改等技术参考资料
回复
头像
天堂之手
Mr.GL
Mr.GL
帖子: 263
注册时间: 2018-02-24 21:37

传送AI详解

帖子 天堂之手 » 2018-03-14 15:56

npcdate部分 teleporter    7059    [trishya]  ...... npc_ai={[trishya];{[fnHi] = [trishya001.htm]};{[fnYouAreChaotic] = [trishya003.htm]}}

HTML部分

trishya001.htm: 

<html><head><body>守门人特黎西亚:<br>为了要到别的村庄,偶尔休息,慢慢地走过去,也有好处的。但是如果没有那么多的时间,我们守门人也可 

以打开时空之门来帮你。好,你想到哪里去?<br><a action="bypass -h teleport_request">前往别的村庄。 </a><br><a action="bypass -h talk_select">任务</a></body></html> 


trishya003.htm

<html><head><body>守门人特黎西亚:<br>你这种人没有资格利用守门人管理的时空之门。用你自己的双脚走到其他村庄吧。</body></html>

从上面的HTM我们可以看出来fnhi定义的HTM完成初始传送页面.里面bypass -h teleport_request调用了传送菜单. m~<<ok_  
fnYouAreChaotic应该是条件判断不成功时候调用的页面

AI部分 

下面我们来看看它的AI部分 

首先我们找到trishya部分AI很简单.

class trishya : teleporter G{!adBna  www.5 uwl.net
property_define_begin     telposlist_begin Position

        {"城镇「说话之岛」"; -84141; 244623; -3729; 20000; 0 }

        {"城镇「精灵村庄」"; 46890; 51531; -2976; 11000; 0 } 

        {"城镇「暗精灵村」"; 9716; 5502; -4500; 9000; 0 } 

        {"城镇「矮人村庄」"; 115120; -178112; -916; 11000; 0 } 

        {"城镇「半兽人村」"; -45186; -112459; -236; 10000; 0 } 

        {"城镇「古鲁丁村庄」"; -80749; 149834; -3043; 10000; 0 } 

        {"城镇「古鲁丁城镇」"; -12787; 122779; -3114; 6000; 1 } 

        {"城镇「狄恩城镇」"; 5744; 142928; -2704; 10000; 2 }

        {"城镇「奇岩城镇」"; 82700; 148000; -3464; 1000; 3 }

        {"城镇「猎人村庄」"; 117088; 76931; -2670; 13000; 0 } 

        {"城镇「欧瑞城镇」"; 83011; 53207; -1470; 18000; 4 } 

        {"城镇「亚丁城镇」"; 146783; 25808; -2000; 18000; 5 } 

        {"练级区域55-60「龙谷中部」"; 112263; 122920; -3671; 35000; 2 } 

        {"练级区域65-70「龙穴入口」"; 131144; 114488; -3724; 45000; 0 }

        {"练级区域65-70「遗望神殿」"; -52931; 191053; -3546; 5000; 0 } 
    telposlist_end 
property_define_end 
class_end 

上面AI部分只定义了telposlist的坐标,它的具体ai调用了父类teleporter F
按照上面的npcai我们很方便的定义自己的传送人 比如  class XXXX : teleporter ( XXXX就是自己定义传送AI名称) 
然后花点时间到SE里面采点,作个自己的个性telposlist就可以. 
相应的HTM里面用bypass -h teleport_request完成页面调用显示. 

AI部分进阶 

 现在我们来看看它的父类,看看是如何完成具体的AI功能的调用的 

class teleporter : default_npc      //所有NPC的父类我们不做讨论 

parameter_define_begin M8,W|eTM 
    string ShopName ""
    string fnHi "thi.htm"
    string fnYouAreChaotic "tcm.htm"  
parameter_define_end                    //这部分定义了几个全局变量teleporter级别,影响所有它的子类                                         //telposlist对应ShopName                                         //thi.htm 通配名 对应不同的NPC的HTM 其中定义字段可以在相关npcdat里面查找 
                                        //tcm.htm 通配名 对应不同的NPC的HTM
                                        //其中定义字段可以在相关npcdat里面查找,比如 fnHi ; fnYouAreChaotic DAG2p
property_define_begin
    telposlist_begin Position 
        {"说话之岛村庄"; -84169; 244693; -3729; 100000; 0 } 
    telposlist_end 
property_define_end 
                                        //默认值定义为说话之岛村庄

//NPC的行为动作都是靠调用各种handle来实现的,下面我我们来分析下具体handler定义  
handler 1                              // 攻击句柄开始 
    variable_begin

          "attacker"  

          "damage"

          "myself"   

          "_choiceN"

          "_code" 

          "_from_choice" 

    variable_end

                                        //定义攻击事件 (handler 1) 6个变量和SE对应不能更改.  
    shift_sp 1                        //攻击事件开始 
    push_event                   
    push_const 36                      //玩家选择行为 

    add                           

    fetch_i                            //压栈取值 
    push_const 0                    

    push_const 2000                    //设置时间范围0~2000 
    func_call 2      // func[AddAttackDesire] //一段时间增加攻击欲望状态 
    shift_sp -3                        //出栈,对应前面的3个push_const语句     shift_sp -1                        //攻击句柄结束 
handler_end  
                                        //这里定义的状态就是NPC被攻击之后,会摆出姿势的AI ~F)


----------------------------------分割线--------------------------------------------   


handler 3                             //谈话句柄开始 
    variable_begin 

        "talker"   
        "myself" 

        "_choiceN" 
        "_code" 

        "_from_choice" 
    variable_end gZ 6Hj62D  
                                        //定义谈话事件 (handler 3) 5个变量和SE对应不能更改. 
    push_event  

    push_const 32           //玩家选择行为 
   add 
    fetch_i              //  压入堆栈
    push_const 412                  //判断否为红名
    add ?6>rQ6tBv  
    fetch_i                        //压栈取值 
    push_const 0            //取常量0 

    greater                          //大于 
    branch_false L768                //大于就继续执行,否则就执行L767 
L767 _0
    shift_sp 1                      //判断为红名谈话事件开始
    push_event     
    push_const 32                    //玩家选择行为 
    add D8I)3cXa'  
    fetch_i                          //压栈取值 
    push_parameter fnYouAreChaotic  //取tcm.htm定义的特定NPC的HTM     func_call 43                       // 显示页面 
    shift_sp -2                      //出栈,对应前面的2个push_const语句 
    shift_sp -1                      //红名谈话时间结束 

    jump L769                        //转 L769 

    shift_sp 1            //判断白名谈话事件开始 
    push_event   
    push_const 32  
    add            //同上 
    push_parameter fnHi              //取thi.htm定义的特定NPC的HTM
    func_call 43                       //显示页面
    shift_sp -2                      //出栈 

    shift_sp -1                      //谈话时间结束 
L769 pa+^5N  
handler_end                            //谈话句柄结束


//这里很清楚可以看出NPC是如何根据玩家状态来选择不同的对话事件的.以此扩展应该可以做出自己更多的判断行为及功能 

----------------------------------分割线-------------------------------------------- 

handler 28                               //传送句柄开始  
    variable_begin
        "talker" 
        "myself" 
        "_choiceN"
        "_code" 
        "_from_choice" 
    variable_end 
                                        //定义传送件 (handler28) 5个变量和SE对应不能更改. 
    shift_sp 1                        //事件开始 
    push_event                     
    push_const 32 
    add   
    fetch_i                          //玩家选择行为 

    push_property Position          //坐标 
    push_parameter ShopName          //子类telposlist表
S73.    ""                             
    push_string S73                  //X   
S74.    ""                      
    push_string S74                  //Y
S75.    ""
    push_string S75                  //Z 
    func_call 45                       //传送 
    shift_sp -6            //出栈 
    shift_sp -1                    //事件结束 

handler_end               //传送句柄结束 


// 通用的调用telposlist表传送AI部分
class_end                              //teleporter ai定义结束 


//好了到此结束,希望大家可以做出自己有特色的传送师
图片

回复