返回列表 发帖

关于移植fuland的ai过程中的笔记……

本文是针对此次改版,ai的变化需要移植时的一个笔记性质的参考。
那啥,本人只是一个硬件工程师,软件啥的什么语法啊专业词汇啊,都不熟悉,说了外行话就无视吧。

第一步,文件的变化……

找到过去11-2版本以前的ai文件和11-3更新后的ai文件,进行初步的比较。

11-2的:
AI.lua14,066 字节2005-12-2211:22LUA 文件
Const.lua2,447 字节2005-12-2211:22LUA 文件
Util.lua2,663 字节2005-12-2211:22LUA 文件

11-3的:
AI.lua14,066 字节2005-9-279:15LUA 文件
AI_M.lua13,803 字节2008-1-1719:47LUA 文件
Const.lua3,111 字节2008-1-1719:47LUA 文件
Util.lua2,663 字节2005-6-289:41LUA 文件


就数量来说多了AI_M.lua这个文件,就大小来说Const.lua有了明显的变化,其中Const.lua只是一个用来放置参数编号的表。
就没有变化的AI.luaUtil.lua进行了逐行比较,没有任何变化,那么下一步的分析就放在AI_M.luaConst.lua上了。


第二步,Const.lua的变化……

打开2个Const.lua开始逐行比对
--  c function 无变化,这里是放置function

-- constants 多了V_MERTYPE = 12    -- 용병 종류一行,这个参数是佣兵种类的参数,具体设置在AI_M.lua中可以查到。

-- 호문클루스 종류 这个是生命体种类的参数,没有变化

-- 용병 종류 这个是佣兵种类等级的参数表如下:
弓箭手佣兵等级12345678910
代码12345678910
编码ARCHER01ARCHER02ARCHER03ARCHER04ARCHER05ARCHER06ARCHER07ARCHER08ARCHER09ARCHER10
枪兵佣兵等级12345678910
代码11121314151617181920
编码LANCER01LANCER02LANCER03LANCER04LANCER05LANCER06LANCER07LANCER08LANCER09LANCER10
剑士佣兵等级12345678910
代码21222324252627282930
编码SWORDMAN01SWORDMAN02SWORDMAN03SWORDMAN04SWORDMAN05SWORDMAN06SWORDMAN07SWORDMAN08SWORDMAN09SWORDMAN10


-- MOTION 无变化,这里是放置生命体或者佣兵的状态代码的

-- command 无变化,这是玩家的操作对应的代码

然后下面是对指令对应的韩文名的定义……

由此可见,Const.lua中针对11-3增加的佣兵部分变化不大,主要是增加了对AI_M.lua中的一部分代码的定义而已,并没有明显的指针等出现…………

第三步,AI_M.lua探秘……

其实一开始我就猜到一个问题,是不是也有相同的GetMyEnemy的相同function设定……(GetMyEnemy也就是自主寻敌部分,也就是有的人抱怨生命体不会主动攻击的原因,这里就是需要设置的地方。)
结果在全文件3/4处,我也没想过去研究第几行了,找到了这个function

这里要附加说明的,实际上在游戏中我们发现GetOwnerEnemy跟生命体的语句是完全一样的(重力社也知道偷懒啊)

语句如下:
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

-------------------------------------------
--  厚急傍屈 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


如果你懂lua,我想你已经看懂这两段的意思了,第一段是攻击模式的判定,根据你的佣兵编码(不是代码),编码在第二步我已经列表出来了。其中,GetMyEnemyA是跟随护主,GetMyEnemyB是主动寻敌。

简单地说,现在的默认设定是,三种1-10级的佣兵都是GetMyEnemyA,因此如果你想要某一类及某一登记的佣兵要主动攻击,那么就修改成GetMyEnemyB即可。

这里放出应该修改的行段
既是:
if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyA (myid)
else
  result = GetMyEnemyB (myid)
end


这里可以修改成:
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


意思是大于或等于4级的所有种类佣兵主动攻击,低于或等于3级的不主动攻击。

针对你的佣兵的级别你可以适量修改上面的佣兵编码来对应你的需求,或者找我定制。

如果你想所有等级的佣兵都主动攻击,那么请修改成

if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyB (myid)
else
  result = GetMyEnemyA (myid)
end

即可



这里总结一下:
4个文件AI.luaAI_M.luaConst.luaUtil.lua
其中AI.lua是生命体的ai程序,跟佣兵的ai没有任何关系,使用过去旧的没有问题。
AI_M.lua是佣兵的ai程序,跟生命体的ai没有任何关系,按自己需求修改即可。
Const.lua是编码及代码表,请移植的时候将佣兵相关的语句也要写进去。
Util.lua是部分公式,目前AI.luaAI_M.lua的语句都没有超出这个公示表的,因此使用过去旧的没有问题。

针对旧的版本你所使用的ai移植,比如你想保留旧有的生命体ai的设定,又不干扰现有的佣兵的ai,是完全可以做到的,你只需要移植11-3中的Const.lua的佣兵编码,保留过去的AI.luaUtil.lua就行了。

这里添加一个不知道是不是重力社就有的bug,也就是/hoai指令并不能切换user_ai和ai根目录中的AI_M.lua,所以你如果要修改佣兵的ai,请直接修改ai目录下的即可。我个人认为是因为目前/hoai指令只是绑定了ai头语句下关联的lua文件而已。


修改好的ai已经放置于我的空间,文件名生命体AI免调整11-3老狗移植版.rar MD5值:e12fd309d0b55851b1b4408b8287927b,是基于fuland的生命体ai移植的。
我的空间地址为fengli1943.ys168.com,我的qq为140317494。


[ 本帖最后由 喵喵の狗狗 于 2008-1-18 02:55 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

这些字是他们认识我 我却不认识他们....
哇,你这阴险的笨蛋小流氓.简直就像正一门心思朝着人生的黑暗面冲过去装成不良的样子就误以为自己很受欢迎了?说实话真是难看到极点了啊-
就连水蚤也算是食物链的一个组成部分,也比你更有生存价值吧?你要是不甘心的话,就发生光合作用吐出点氧气来啊
努力学日语ing
   

TOP

如果不懂,直接去我空间下载拉现成的就可以了 其实很简单的。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

我又想起来某个群...前几天在讨论FULAND是地名还是人

TOP

由于白痴重力社的ai的getmyenemy部分是完全照搬生命体的,而生命体没有普攻是远距离攻击的类型。

因此开启主动攻击后也就是getmyenemyB后,默认的攻击方式是近身攻击。

我很想说草拟大爷,这个问题我将明天完善。


感谢不灭同学帮忙进行debug。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

好久没看过过程式的代码了...用惯BASIC/PASCAL的人看这个应该会很爽...
留言后再慢慢看...

[ 本帖最后由 natineprince 于 2008-1-18 08:53 编辑 ]
爱游戏,爱RO,也爱写写小程序,我不是什么大神,也不是神教众,我是natineprince,我只是一名普通的RO玩家。

TOP

原帖由 南都夜夜 于 2008-1-18 02:02 发表
我又想起来某个群...前几天在讨论FULAND是地名还是人

FULAND

搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技
FULAND:我们是正规的搜索引擎优化公司,采用的是符合搜索引擎规则的优化技术。我们拒绝参与非法事件。涉嫌非法事件不仅有失到的风范,而且会带来严重后果--违反搜索引擎规则会遭受搜索引擎永久除名的惩罚。所以我们拒绝参与以下活动:作弊、关键字...
www.fuland.cn/ 13K 2008-1-16 - 百度快照


搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技孚优科技搜索引擎优化公司为客户网站排名提供专业周到的搜索引擎优化(SEO)服务,并积极推动搜索引擎优化在国内的发展,致力于网站优化、网站排名、网站推广方案和 ...
fuland.cn/ - 14k - 类似网页  

index002- 繁 - [ 转为简体网页 ]www.fuland.com.tw/ - 3k - 类似网页  






还是狗狗比腐烂好~~
在RO真正关闭以前,我不敢说我会每天都上.练级,打宝,都是一种娱乐,我不会象几年前一样给自己压力达到什么目的/程度了,有时候只要呆呆的ONLINE,就已经足够了
陪伴RO走最后一段路,这是我最大的希望.RO,就象是一个患了晚期癌症的亲人,无药可救,只能尽量陪伴
即使RO真正完结了,那些BGM还是会留下的,每次听到RO(非战斗地图)那悠扬的音乐,总会想起那些美好的回忆,对于我来说,足够了

TOP

啊喵……   我在你的空间下fuland这个目录下没找着你作的移植AI压缩包啊!  藏哪了……

TOP

顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰

TOP

原帖由 永生不灭 于 2008-1-18 08:55 发表
顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰

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
...索性整段获取敌人的代码去掉了...
这段去掉应该就不会攻击了吧...在代码的角度...

[ 本帖最后由 natineprince 于 2008-1-18 09:00 编辑 ]
爱游戏,爱RO,也爱写写小程序,我不是什么大神,也不是神教众,我是natineprince,我只是一名普通的RO玩家。

TOP

dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end

老狗试下把这段改成min_dis=0
看看会不会原地攻击
爱游戏,爱RO,也爱写写小程序,我不是什么大神,也不是神教众,我是natineprince,我只是一名普通的RO玩家。

TOP

原帖由 南都夜夜 于 2008-1-18 02:02 发表
我又想起来某个群...前几天在讨论FULAND是地名还是人

.......................无语
灰机灰了。

TOP

原帖由 natineprince 于 2008-1-18 09:03 发表
dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end

老狗试下把这段改成min_dis=0
看看会不会原地攻击

会不会不攻击啊...


其实楼上的是搜索引擎
在RO真正关闭以前,我不敢说我会每天都上.练级,打宝,都是一种娱乐,我不会象几年前一样给自己压力达到什么目的/程度了,有时候只要呆呆的ONLINE,就已经足够了
陪伴RO走最后一段路,这是我最大的希望.RO,就象是一个患了晚期癌症的亲人,无药可救,只能尽量陪伴
即使RO真正完结了,那些BGM还是会留下的,每次听到RO(非战斗地图)那悠扬的音乐,总会想起那些美好的回忆,对于我来说,足够了

TOP

原帖由 ||| 于 2008-1-18 09:05 发表

会不会不攻击啊...

我指远程系的...

搜索引擎?哦...了解了...那改掉这个就不会搜索...达到不主动打怪的目的了?

[ 本帖最后由 natineprince 于 2008-1-18 09:07 编辑 ]
爱游戏,爱RO,也爱写写小程序,我不是什么大神,也不是神教众,我是natineprince,我只是一名普通的RO玩家。

TOP

原帖由 fuland 于 2008-1-18 09:04 发表

.......................无语

某雪还在那里说啥隔座大山野战什么的...
我说FULAND是个人...
却有人说FULAND=福建...
-v-

TOP

返回列表