找回密码
 注册
X系列官方授权正版
搜索
查看: 1673|回复: 2

[原创] [已解决]为什么我的船总是比敌人晚开火??

[复制链接]
发表于 2013-8-28 14:56:51 | 显示全部楼层 |阅读模式
本帖最后由 gqqnb 于 2013-8-28 17:01 编辑

我觉得用自问自答的方式比较能让别人搜到。(CCAV:他的目的是炒作自己)

命令飞船“攻击”一个特定敌人,会总是处于后手!“攻击所有敌人”的船总是比“攻击”(特定敌人)的船先开火!

具体现象是这样的。比如用脚本创建两艘M1猛禽,使用相同的装备,一个是xenon的,一个是我的。xenon的猛禽创建好后就处于“攻击所有敌人”的状态。我命令我的猛禽“攻击”xenon猛禽,炮塔指令是导弹防御。xenon猛禽的G光子炮在6点几千米时就开火了,我的猛禽还没有。一直等到xenon光子炮打中我的猛禽了,我的猛禽才开火。

原因在于!fight.attack.object和!turret.missiledefense.std。

下了“攻击”指令后,执行!fight.attack.object。

  1.         $dist = get distance between [THIS] and $victim
  2.         if $dist > $followdist1 + 200
  3.           $ret = [THIS]->follow $victim with precision $followdist m : timeout=60000 ms
  4.           if $ret != {FLRET_TARGETREACHED}
  5.             = wait randomly from 10 to 20 ms
  6.             continue
  7.           end
  8.         end
  9.         
  10.         [THIS]->set attack target to $victim
复制代码
如果飞船跟目标船只的距离大于我船大小+敌船大小+4000+100+300(对于猛禽来说,大小是1079。所以猛禽攻击猛禽,这个值是6558m),则继续跟踪。G光子炮的射程是6.63km,这个时候本来应该要开火了,但脚本还让船继续跟。

当飞船跟到目标船只,即距离为对方飞船大小时,设置attack target。对于猛禽来说,大小是1079,但实测中距离为3到5千米会算跟到,是follow  with precision 的问题。

然后看导弹防御,玩家的导弹防御脚本是!turret.missiledefense.std(电脑的是.adv,区别是adv的会自动换武器)。

  1.     $victim = [THIS]->find nearest missile aiming to me
  2.    
  3.     if not $victim
  4.       $victim = [THIS]->get attacker
  5.       if $victim
  6.         skip if [THIS]->is $victim in firing range of turret $turretid
  7.           $victim = null
  8.       end
  9.       
  10.       if not $victim
  11.         $victim = [THIS]->get attack target
  12.         
  13.         if [this] -> is in same sector as [playership]
  14.           if $victim
  15.             $dist= get distance between [this] and $victim
  16.             write to log file 2 append= [true] printf: fmt= 'Distance=%s, %s get attack target %s', $dist , [this], $victim,null,null
  17.           end
  18.         end
  19.         
  20.         if $victim
  21.           skip if [THIS]->is $victim in firing range of turret $turretid
  22.             $victim = null
  23.         end
  24.       end
  25.       
  26.       if not $victim
  27.         $cmd = [THIS]->get command
  28.         if $cmd == {COMMAND_KILL_ENEMIES_RANGE} OR $cmd == {COMMAND_KILL_ENEMIES_AND_LAND} OR $cmd == {COMMAND_KILL_ENEMIES}
  29.           $victim = [THIS]->find enemy in firing range of turret $turretid
  30.         end
  31.       end
  32.     end
复制代码
导弹防御先看有没有攻击自己的导弹,有没有人攻击自己(get attacker),然后看自己在攻击谁(get attack target)。所以,当时使用“攻击”指令时,两船正在相遇,没有攻击自己的人。然后飞船飞到3到5千米时,!fight.attack.object才设攻击目标,!turret.missiledefense.std才会开火。

那么,为什么xenon猛禽在6千米时就能开火呢?因为每艘船创建出来之后都有“默认动作”,M1的默认动作是“攻击所有敌人”。看!turret.missiledefense.std的代码片段的最后部分,如果飞船正在执行的是“攻击所有敌人”,那么炮台自动寻找敌人。所以在6千米时,尽管xenon猛禽自己还不知要攻击谁(没有attack target),它的炮台却开始攻击我的猛禽。

经查看,其他的炮塔指令也是一样,不会在“攻击”时早点开火。

这两个脚本都是默认脚本,我也不知道怎么改好。反正结论就是“攻击所有敌人”总是比“攻击”先开火!

在光子炮大战中,“攻击”者由于后发劣势,在第一回合就会被干掉三分之二的盾。



发表于 2014-6-25 14:05:42 | 显示全部楼层
楼主真热心啊,不过这时候大概没多少人玩RE了,有TC ,AP,现在还出了个重生. 大概只有我这种穷人还在玩老掉牙的RE.
回复

使用道具 举报

发表于 2015-12-14 12:04:49 | 显示全部楼层
X-child 发表于 2014-6-25 14:05
楼主真热心啊,不过这时候大概没多少人玩RE了,有TC ,AP,现在还出了个重生. 大概只有我这种穷人还在玩老掉牙 ...

不會的,玩遊戲的初衷就是爲了單純的快樂,如果帶著一顆雜念多多的心去玩,再怎麽喜新厭舊,能讓你感到釋懷麽?玩遊戲都一樣,你不是靠製作遊戲吃飯的,不需要感到某种不快!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站