返回列表 发帖

关于移植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的青睐。

可以改搜敌范围的,不过个人推荐不要随便改主动,很容易死机,比生命体还吃内存
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

哦 谢谢.我刚弄了一下
我是吧AI_M覆盖到 AI目录下了 然后就成功了
就是佣兵容易跑到视线外面容易发呆....不怎么好用...

TOP

启动自定义佣兵ai的指令是/merai
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

看不太明白啊...是不是去老狗空间下11-3那个rar 然后任一生命体里面的AI_M和 Const覆盖到ro目录下的USER_AI
然后再打开ro目录下的USER_AI 里面的 AI_M  把它修改掉成下面的?
可是我这样弄了还是没有主动攻击......请教下我是不是弄错了 = =!!!
这里可以修改成:
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

TOP

看的头晕`~~还是不明白`~~~有直接能用的最好了~~

TOP

只是保持数据的冗余性而已。你觉得不严谨大可删除。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

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

红字部分多余了把

TOP

能不能自动放技能呢

TOP

我挖出了脚本里面的乱码 显示出韩文了。。。。

8过  有米人会韩文 翻译下。。。。。

현재 이동중인 목적지와 같은 곳이면 처리하지 않는다

车轮印实在看8懂

TOP

我的佣兵完全不能控制走路,只能使用技能让他走上去释放 ALT+左右键都不行,生命体倒走上去了。

另外问问为什么装了杰的补丁使用补丁就一直AI跳框出错?我每次用完佣兵又改回去。

TOP

ms我的版本弓兵本来就可以远程==  昨天半夜在花区混了一下  3级的弓兵打花miss

TOP

我近距离都不能自动攻击 。。已经把A和B修改了- -

TOP

求弓兵远距离攻击AI_M

TOP

如果说要让佣兵攻击不在视野内的怪
是不是

IsOutOfSight

下的改称attack状态

或者是改哪里了

说实话  开个佣兵就是为了没空手工练的时候用的

TOP

返回列表