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

传送AI详解

主要是游戏中一些经典任务、游戏资料的科普.
回复
头像
hagcse
Mr.GL
Mr.GL
帖子: 151
注册时间: 2018-02-25 15:50

传送AI详解

帖子 hagcse » 2018-03-10 15:47

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
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 } copyright dedecms

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

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

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

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

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

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

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

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

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

{"练级区域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里面查找 内容来自dedecms
//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 //谈话时间结束

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 //传送 copyright dedecms
shift_sp -6            //出栈 
shift_sp -1 //事件结束

handler_end               //传送句柄结束


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


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

回复