关于移植fuland的ai过程中的笔记……
[color=plum]本文是针对此次改版,ai的变化需要移植时的一个笔记性质的参考。[/color][color=plum]那啥,本人只是一个硬件工程师,软件啥的什么语法啊专业词汇啊,都不熟悉,说了外行话就无视吧。
[/color]
[font=黑体][size=3][b]第一步,文件的变化……
[/b][/size][/font]
[b]找到过去11-2版本以前的ai文件和11-3更新后的ai文件,进行初步的比较。[/b]
11-2的:
[table=98%][tr][td]AI.lua[/td][td]14,066 字节[/td][td]2005-12-22[/td][td]11:22[/td][td]LUA 文件[/td][/tr][tr][td]Const.lua[/td][td]2,447 字节[/td][td]2005-12-22[/td][td]11:22[/td][td]LUA 文件[/td][/tr][tr][td]Util.lua[/td][td]2,663 字节[/td][td]2005-12-22[/td][td]11:22[/td][td]LUA 文件[/td][/tr][/table]
11-3的:
[table=98%][tr][td]AI.lua[/td][td]14,066 字节[/td][td]2005-9-27[/td][td]9:15[/td][td]LUA 文件[/td][/tr][tr][td]AI_M.lua[/td][td]13,803 字节[/td][td]2008-1-17[/td][td]19:47[/td][td]LUA 文件[/td][/tr][tr][td]Const.lua[/td][td]3,111 字节[/td][td]2008-1-17[/td][td]19:47[/td][td]LUA 文件[/td][/tr][tr][td]Util.lua[/td][td]2,663 字节[/td][td]2005-6-28[/td][td]9:41[/td][td]LUA 文件[/td][/tr][/table]
[b]就数量来说多了[color=blue]AI_M.lua[/color]这个文件,就大小来说[color=blue]Const.lua[/color]有了明显的变化,其中[color=blue]Const.lua[/color]只是一个用来放置参数编号的表。
就没有变化的[color=blue]AI.lua[/color]和[color=blue]Util.lua[/color]进行了逐行比较,没有任何变化,那么下一步的分析就放在[color=blue]AI_M.lua[/color]和[color=blue]Const.lua[/color]上了。
[/b]
[font=黑体][size=3][b]第二步,[color=blue]Const.lua[/color]的变化……[/b][/size][/font]
[b]打开2个[color=blue]Const.lua[/color]开始逐行比对
[color=darkorange]-- c function [/color]无变化,这里是放置[color=darkorange]function[/color]的
[color=darkorange]-- constants[/color] 多了[color=darkorange]V_MERTYPE = 12 -- 용병 종류[/color]一行,这个参数是佣兵种类的参数,具体设置在[color=blue]AI_M.lua[/color]中可以查到。
[color=darkorange]-- 호문클루스 종류[/color] 这个是生命体种类的参数,没有变化
[color=darkorange]-- 용병 종류[/color] 这个是佣兵种类等级的参数表如下:[/b][table=98%][tr][td=1,3,72]弓箭手佣兵[/td][td=1,1,72]等级[/td][td=1,1,72]1[/td][td=1,1,72]2[/td][td=1,1,72]3[/td][td=1,1,72]4[/td][td=1,1,72]5[/td][td=1,1,72]6[/td][td=1,1,72]7[/td][td=1,1,72]8[/td][td=1,1,72]9[/td][td=1,1,72]10[/td][/tr][tr][td=1,1,72]代码[/td][td=1,1,72]1[/td][td=1,1,72]2[/td][td=1,1,72]3[/td][td=1,1,72]4[/td][td=1,1,72]5[/td][td=1,1,72]6[/td][td=1,1,72]7[/td][td=1,1,72]8[/td][td=1,1,72]9[/td][td=1,1,72]10[/td][/tr][tr][td=1,1,72]编码[/td][td=1,1,72]ARCHER01[/td][td=1,1,72]ARCHER02[/td][td=1,1,72]ARCHER03[/td][td=1,1,72]ARCHER04[/td][td=1,1,72]ARCHER05[/td][td=1,1,72]ARCHER06[/td][td=1,1,72]ARCHER07[/td][td=1,1,72]ARCHER08[/td][td=1,1,72]ARCHER09[/td][td=1,1,72]ARCHER10[/td][/tr][tr][td=1,3,72]枪兵佣兵[/td][td=1,1,72]等级[/td][td=1,1,72]1[/td][td=1,1,72]2[/td][td=1,1,72]3[/td][td=1,1,72]4[/td][td=1,1,72]5[/td][td=1,1,72]6[/td][td=1,1,72]7[/td][td=1,1,72]8[/td][td=1,1,72]9[/td][td=1,1,72]10[/td][/tr][tr][td=1,1,72]代码[/td][td=1,1,72]11[/td][td=1,1,72]12[/td][td=1,1,72]13[/td][td=1,1,72]14[/td][td=1,1,72]15[/td][td=1,1,72]16[/td][td=1,1,72]17[/td][td=1,1,72]18[/td][td=1,1,72]19[/td][td=1,1,72]20[/td][/tr][tr][td=1,1,72]编码[/td][td=1,1,72]LANCER01[/td][td=1,1,72]LANCER02[/td][td=1,1,72]LANCER03[/td][td=1,1,72]LANCER04[/td][td=1,1,72]LANCER05[/td][td=1,1,72]LANCER06[/td][td=1,1,72]LANCER07[/td][td=1,1,72]LANCER08[/td][td=1,1,72]LANCER09[/td][td=1,1,72]LANCER10[/td][/tr][tr][td=1,3,72]剑士佣兵[/td][td=1,1,72]等级[/td][td=1,1,72]1[/td][td=1,1,72]2[/td][td=1,1,72]3[/td][td=1,1,72]4[/td][td=1,1,72]5[/td][td=1,1,72]6[/td][td=1,1,72]7[/td][td=1,1,72]8[/td][td=1,1,72]9[/td][td=1,1,72]10[/td][/tr][tr][td=1,1,72]代码[/td][td=1,1,72]21[/td][td=1,1,72]22[/td][td=1,1,72]23[/td][td=1,1,72]24[/td][td=1,1,72]25[/td][td=1,1,72]26[/td][td=1,1,72]27[/td][td=1,1,72]28[/td][td=1,1,72]29[/td][td=1,1,72]30[/td][/tr][tr][td=1,1,72]编码[/td][td=1,1,72]SWORDMAN01[/td][td=1,1,72]SWORDMAN02[/td][td=1,1,72]SWORDMAN03[/td][td=1,1,72]SWORDMAN04[/td][td=1,1,72]SWORDMAN05[/td][td=1,1,72]SWORDMAN06[/td][td=1,1,72]SWORDMAN07[/td][td=1,1,72]SWORDMAN08[/td][td=1,1,72]SWORDMAN09[/td][td=1,1,72]SWORDMAN10[/td][/tr][/table]
[b][color=darkorange]-- MOTION[/color] 无变化,这里是放置生命体或者佣兵的状态代码的
[color=darkorange]-- command[/color] 无变化,这是玩家的操作对应的代码
然后下面是对指令对应的韩文名的定义……
[size=2]由此可见,[color=blue]Const.lua[/color]中针对11-3增加的佣兵部分变化不大,主要是增加了对[color=blue]AI_M.lua[/color]中的一部分代码的定义而已,并没有明显的指针等出现…………[/size]
[/b]
[font=黑体][size=3][b]第三步,[color=blue]AI_M.lua[/color]探秘……[/b][/size][/font]
[b][font=黑体][size=3][/size][/font][/b]
[b]其实一开始我就猜到一个问题,是不是也有相同的[color=darkorange]GetMyEnemy[/color]的相同[color=darkorange]function[/color]设定……(GetMyEnemy也就是自主寻敌部分,也就是有的人抱怨生命体不会主动攻击的原因,这里就是需要设置的地方。)
结果在全文件3/4处,我也没想过去研究第几行了,找到了这个[color=darkorange]function[/color]。
这里要附加说明的,实际上在游戏中我们发现[color=darkorange]GetOwnerEnemy[/color]跟生命体的语句是完全一样的(重力社也知道偷懒啊)
语句如下:[/b][color=darkorange][quote]function GetMyEnemy (myid)
local result = 0
local type = GetV (V_MERTYPE,myid)
if (type >= ARCHER01 and type <= SWORDMAN10) then
result = GetMyEnemyA (myid)
else
result = GetMyEnemyB (myid)
end
return result
end[/quote]
[quote]-------------------------------------------
-- 厚急傍屈 GetMyEnemy
-------------------------------------------
function GetMyEnemyA (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local target
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
target = GetV (V_TARGET,v)
if (target == myid) then
enemys[index] = v
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
-------------------------------------------
-- 急傍屈 GetMyEnemy
-------------------------------------------
function GetMyEnemyB (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local type
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
if (1 == IsMonster(v)) then
enemys[index] = v
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
[/quote]
[/color]
[b]如果你懂lua,我想你已经看懂这两段的意思了,第一段是攻击模式的判定,根据你的佣兵编码(不是代码),编码在第二步我已经列表出来了。其中,GetMyEnemyA是跟随护主,GetMyEnemyB是主动寻敌。
简单地说,现在的默认设定是,三种1-10级的佣兵都是GetMyEnemyA,因此如果你想要某一类及某一登记的佣兵要主动攻击,那么就修改成GetMyEnemyB即可。
这里放出应该修改的行段
既是:[/b][color=darkorange]if (type >= ARCHER01 and type <= SWORDMAN10) then
result = GetMyEnemyA (myid)
else
result = GetMyEnemyB (myid)
end[/color]
[b]这里可以修改成:[/b]
[color=darkorange]if (type >= ARCHER01 and type <=ARCHER03 or type >= LANCER01 and type <=LANCER03 or type >= SWORDMAN01 and type <=SWORDMAN03 ) then
result = GetMyEnemyA (myid)
elseif (type >= ARCHER04 and type <=ARCHER10 or type >= LANCER04 and type <=LANCER10 or type >= SWORDMAN04 and type <=SWORDMAN10) then
result = GetMyEnemyB (myid)
end[/color]
[b]意思是大于或等于4级的所有种类佣兵主动攻击,低于或等于3级的不主动攻击。
针对你的佣兵的级别你可以适量修改上面的佣兵编码来对应你的需求,或者找我定制。
如果你想所有等级的佣兵都主动攻击,那么请修改成[/b]
[color=darkorange]if (type >= ARCHER01 and type <= SWORDMAN10) then
result = GetMyEnemyB (myid)
else
result = GetMyEnemyA (myid)
end[/color]
[b]即可[/b]
[b]这里总结一下:
4个文件[color=blue]AI.lua[/color],[color=blue]AI_M.lua[/color],[color=blue]Const.lua[/color]和[color=blue]Util.lua[/color]
其中[color=blue]AI.lua[/color]是生命体的ai程序,跟佣兵的ai没有任何关系,使用过去旧的没有问题。
[color=blue]AI_M.lua[/color]是佣兵的ai程序,跟生命体的ai没有任何关系,按自己需求修改即可。
[color=blue]Const.lua[/color]是编码及代码表,请移植的时候将佣兵相关的语句也要写进去。
[color=blue]Util.lua[/color]是部分公式,目前[color=blue]AI.lua[/color]和[color=blue]AI_M.lua[/color]的语句都没有超出这个公示表的,因此使用过去旧的没有问题。
针对旧的版本你所使用的ai移植,比如你想保留旧有的生命体ai的设定,又不干扰现有的佣兵的ai,是完全可以做到的,你只需要移植11-3中的[color=blue]Const.lua[/color]的佣兵编码,保留过去的[color=blue]AI.lua[/color]和[color=blue]Util.lua[/color]就行了。
这里添加一个不知道是不是重力社就有的bug,也就是/hoai指令并不能切换user_ai和ai根目录中的[color=blue]AI_M.lua[/color],所以你如果要修改佣兵的ai,请直接修改ai目录下的即可。我个人认为是因为目前/hoai指令只是绑定了ai头语句下关联的lua文件而已。
[/b]
[color=plum]修改好的ai已经放置于我的空间,文件名[/color][color=red]生命体AI免调整11-3老狗移植版.rar[/color] [color=blue]MD5值:e12fd309d0b55851b1b4408b8287927b[/color][color=plum],是基于fuland的生命体ai移植的。
我的空间地址为fengli1943.ys168.com,我的qq为140317494。[/color]
[[i] 本帖最后由 喵喵の狗狗 于 2008-1-18 02:55 编辑 [/i]] 这些字是他们认识我 我却不认识他们....:wacko: 如果不懂,直接去我空间下载拉现成的就可以了-_- 其实很简单的。 我又想起来某个群...前几天在讨论FULAND是地名还是人[233] 由于白痴重力社的ai的getmyenemy部分是完全照搬生命体的,而生命体没有普攻是远距离攻击的类型。
因此开启主动攻击后也就是getmyenemyB后,默认的攻击方式是近身攻击。
我很想说草拟大爷,这个问题我将明天完善。
感谢不灭同学帮忙进行debug。 好久没看过过程式的代码了...用惯BASIC/PASCAL的人看这个应该会很爽...
留言后再慢慢看...
[[i] 本帖最后由 natineprince 于 2008-1-18 08:53 编辑 [/i]] [quote]原帖由 [i]南都夜夜[/i] 于 2008-1-18 02:02 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733043&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
我又想起来某个群...前几天在讨论FULAND是地名还是人[233] [/quote]
FULAND
搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技
FULAND:我们是正规的搜索引擎优化公司,采用的是符合搜索引擎规则的优化技术。我们拒绝参与非法事件。涉嫌非法事件不仅有失到的风范,而且会带来严重后果--违反搜索引擎规则会遭受搜索引擎永久除名的惩罚。所以我们拒绝参与以下活动:作弊、关键字...
[url]www.fuland.cn/[/url] 13K 2008-1-16 - 百度快照
搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技孚优科技搜索引擎优化公司为客户网站排名提供专业周到的搜索引擎优化(SEO)服务,并积极推动搜索引擎优化在国内的发展,致力于网站优化、网站排名、网站推广方案和 ...
fuland.cn/ - 14k - 类似网页
index002- 繁 - [ 转为简体网页 ]www.fuland.com.tw/ - 3k - 类似网页
[233]
还是狗狗比腐烂好~~ 啊喵…… 我在你的空间下fuland这个目录下没找着你作的移植AI压缩包啊! 藏哪了……:ph34r: 顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰 [quote]原帖由 [i]永生不灭[/i] 于 2008-1-18 08:55 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733311&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰 [/quote]
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
if (1 == IsMonster(v)) then
enemys[index] = v
index = index+1
end
end
end
[color=white]...索性整段获取敌人的代码去掉了...[/color]
这段去掉应该就不会攻击了吧...在代码的角度...
[[i] 本帖最后由 natineprince 于 2008-1-18 09:00 编辑 [/i]] dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
老狗试下把这段改成min_dis=0
看看会不会原地攻击 [quote]原帖由 [i]南都夜夜[/i] 于 2008-1-18 02:02 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733043&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
我又想起来某个群...前几天在讨论FULAND是地名还是人[233] [/quote]
.......................无语 [quote]原帖由 [i]natineprince[/i] 于 2008-1-18 09:03 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733335&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
老狗试下把这段改成min_dis=0
看看会不会原地攻击 [/quote]
会不会不攻击啊...
其实楼上的是搜索引擎[233] [quote]原帖由 [i]-_-|||[/i] 于 2008-1-18 09:05 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733348&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
会不会不攻击啊... [/quote]
我指远程系的...
搜索引擎?哦...了解了...那改掉这个就不会搜索...达到不主动打怪的目的了?
[[i] 本帖最后由 natineprince 于 2008-1-18 09:07 编辑 [/i]] [quote]原帖由 [i]fuland[/i] 于 2008-1-18 09:04 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733342&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
.......................无语 [/quote]
某雪还在那里说啥隔座大山野战什么的...[233]
我说FULAND是个人...
却有人说FULAND=福建...
-v- 看到代码倍感亲切。。 [quote]原帖由 [i]natineprince[/i] 于 2008-1-18 09:05 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733351&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
我指远程系的...
搜索引擎?哦...了解了...那改掉这个就不会搜索...达到不主动打怪的目的了? [/quote]
乐乐是笨蛋……
怎么会联系到福建……不可能有联系的啊…… 可以把GetActors ()那个函数发上来看看么?
我觉得上面那段不像是寻敌代码...反而GetActors ()这个像获取附近对象的. [quote]原帖由 [i]fuland[/i] 于 2008-1-18 09:10 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733373&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
乐乐是笨蛋……
怎么会联系到福建……不可能有联系的啊…… [/quote]
你索性整个文件发给我看好了... [quote]原帖由 [i]fuland[/i] 于 2008-1-18 09:10 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733373&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
乐乐是笨蛋……
怎么会联系到福建……不可能有联系的啊…… [/quote]
A10:59:18
fuland是福州?
B10:59:26
…没啊…
B11:00:10
福州你个头
A 11:00:14
= =
A 11:00:17
那是啥
B11:00:21
…我没在山区打野战的爱好 原始ai我也放到我空间了,你有需要可以看看
GetActors ()就是寻敌函数 [quote]原帖由 [i]natineprince[/i] 于 2008-1-18 09:12 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733379&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
你索性整个文件发给我看好了... [/quote]
其实他们在水.....
文件可以在RO文件夹下面找到啊... function GetActors () end
...
晕... [quote]原帖由 [i]-_-|||[/i] 于 2008-1-18 09:16 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733393&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
其实他们在水.....
文件可以在RO文件夹下面找到啊... [/quote]
公司没RO啊...
老狗那里看到的function GetActors () end,实际应该是重载了的啊? 佣兵的技能怎么使用呢。
这样改完的佣兵只会普攻吧 -_- 技能代码我没有,我已经说过了。
但是我觉得这次这个是一双刃剑……因为部分技能和玩家技能重叠……可能会变成一个内挂性质的东西了………… function GetMyEnemyA (myid)
local result = 0//返回值,敌人
local owner = GetV (V_OWNER,myid)//主人
local actors = GetActors ()//角色
local enemys = {}//敌人集
local index = 1
local target
//获取敌人集
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
target = GetV (V_TARGET,v)
if (target == myid) then
enemys[index] = v
index = index+1
end
end
end
local min_dis = 100
local dis
//当敌人集合中存在距离少于 min_dis 的,返回距离最近的敌人
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
这次没理解错了吧...
LS又用2狼上这边啊... [quote]
function OnATTACK_ST ()
TraceAI ("OnATTACK_ST")
//敌人不在视线内
if (true == IsOutOfSight(MyID,MyEnemy)) then -- ENEMY_OUTSIGHT_IN
MyState = IDLE_ST
TraceAI ("ATTACK_ST -> IDLE_ST")
return
end
//敌人已死亡
if (MOTION_DEAD == GetV(V_MOTION,MyEnemy)) then -- ENEMY_DEAD_IN
MyState = IDLE_ST
TraceAI ("ATTACK_ST -> IDLE_ST")
return
end
//在攻击范围外.状态变为 追
if (false == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_OUTATTACKSIGHT_IN
MyState = CHASE_ST
//移动片段.[color=red]远程攻击关键?[/color]
MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
Move (MyID,MyDestX,MyDestY)
//移动片段END
TraceAI ("ATTACK_ST -> CHASE_ST : ENEMY_OUTATTACKSIGHT_IN")
return
end
//没使用技能,则普攻
if (MySkill == 0) then
Attack (MyID,MyEnemy)
else
//使用技能,则...SkillObject函数没看...
if (1 == SkillObject(MyID,MySkillLevel,MySkill,MyEnemy)) then
MyEnemy = 0
end
MySkill = 0
end
TraceAI ("ATTACK_ST -> ATTACK_ST : ENERGY_RECHARGED_IN")
return
end
[/quote] [quote]原帖由 [i]natineprince[/i] 于 2008-1-18 09:50 发表 [url=http://bbs.rohome.net/redirect.php?goto=findpost&pid=8733479&ptid=869118][img]http://bbs.rohome.net/images/common/back.gif[/img][/url]
function GetMyEnemyA (myid)
local result = 0//返回值,敌人
local owner = GetV (V_OWNER,myid)//主人
local actors = GetActors ()//角色
local enemys = {}//敌人集
local index = 1
local target
... [/quote]
这个只是锁敌,其实很关键的一点是距离判定和攻击距离设定,我还在看 function OnATTACK_ST ()下的
IsInAttackSight()函数应该就是锁敌距离判定了。
IsInAttackSight()的function在Util.lua下
打错了
[[i] 本帖最后由 蜡烛鞭二郎 于 2008-1-18 10:23 编辑 [/i]]