Project1

标题: 自动战斗·同伴的AI [打印本页]

作者: 风雪优游    时间: 2007-12-31 04:38
标题: 自动战斗·同伴的AI
细心的人一定会发现,VX角色设定中恢复了2K的一个很有用的功能,自动战斗。

而自动战斗的好坏直接取决于VX的AI设置了。

玩XP的人都知道,XP的怪物AI实在不怎么样(明明有血还是会加血= =)
如果VX的AI也是这个水平,那么自动战斗……实在是鸡肋啊。

各位对自动战斗有什么看法?
作者: 风雪优游    时间: 2007-12-31 04:38
标题: 自动战斗·同伴的AI
细心的人一定会发现,VX角色设定中恢复了2K的一个很有用的功能,自动战斗。

而自动战斗的好坏直接取决于VX的AI设置了。

玩XP的人都知道,XP的怪物AI实在不怎么样(明明有血还是会加血= =)
如果VX的AI也是这个水平,那么自动战斗……实在是鸡肋啊。

各位对自动战斗有什么看法?
作者: cheyenne    时间: 2007-12-31 04:41
XP的怪物AI好像是靠数据库里面的设置实现的吧?
因为那个“治疗”的条件为无所以有血还会加……
VX的同伴AI不知道是怎么做的……
(其实有可能自动战斗就是默认随机普通攻击……)
作者: 光郎    时间: 2007-12-31 04:43
自动战斗的人要比我方等级高装备好。
新手师父,大将军,言情刺客等因剧情暂时加入的人。通常是不死+保证游戏可通过剧情战斗的存在。
作者: link006007    时间: 2007-12-31 05:00
XP的AI函数都是随机的, 当然没血会加血
脚本都给你了,不满意只好自己写咯

而且VX和XP好像没有太大变化  只是将很多XP里面SceneBatte4行动判定统一放在了Game_BattleAction里
作者: 玄天    时间: 2007-12-31 05:17
以下引用光郎于2007-12-30 20:43:37的发言:

自动战斗的人要比我方等级高装备好。
新手师父,大将军,言情刺客等因剧情暂时加入的人。通常是不死+保证游戏可通过剧情战斗的存在。

剧情人物而已,一般不会到最后的,就算再渣也不会体现出来
作者: 风雪优游    时间: 2007-12-31 08:50
=[]=那我准备除了主角以外的角色全部用自动战斗的想法基本上夭折了吧{/ll}
作者: 光郎    时间: 2007-12-31 15:52
很好的啊,主角又不是神,不能控制别人的行动。
要是像仙剑三那样有“全力进攻”“回复优先”“防御偷袭”等影响判定的指令就好了。
这样可以专心控制一人来战斗呢。
作者: veal    时间: 2007-12-31 16:10
RMVX的自动战斗是有AI的,不是XP那种随机行动
大概就是评估每个行动(普通攻击、每种特技对每个可能的目标等等)的价值,然后取价值最大的作为最终行动。
详见:
Game_Actor 670行
  #--------------------------------------------------------------------------
  # ● 戦闘行動の作成 (自動戦闘用)
  #--------------------------------------------------------------------------
  def make_action
    @action.clear
    return unless movable?
    action_list = []
    action = Game_BattleAction.new(self)
    action.set_attack
    action.evaluate
    action_list.push(action)
    for skill in skills
      action = Game_BattleAction.new(self)
      action.set_skill(skill.id)
      action.evaluate
      action_list.push(action)
    end
    max_value = 0
    for action in action_list
      if action.value > max_value
        @action = action
        max_value = action.value
      end
    end
  end

Game_BattleAction 288行
  #--------------------------------------------------------------------------
  # ● 行動の価値評価 (自動戦闘用)
  #    @value および @target_index を自動的に設定する。
  #--------------------------------------------------------------------------
  def evaluate
    if attack?
      evaluate_attack
    elsif skill?
      evaluate_skill
    else
      @value = 0
    end
    if @value > 0
      @value + rand(nil)
    end
  end
  #--------------------------------------------------------------------------
  # ● 通常攻撃の評価
  #--------------------------------------------------------------------------
  def evaluate_attack
    @value = 0
    for target in opponents_unit.existing_members
      value = evaluate_attack_with_target(target)
      if value > @value
        @value = value
        @target_index = target.index
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 通常攻撃の評価 (ターゲット指定)
  #     target : 対象バトラー
  #--------------------------------------------------------------------------
  def evaluate_attack_with_target(target)
    target.clear_action_results
    target.make_attack_damage_value(battler)
    return target.hp_damage.to_f / [target.hp, 1].max
  end
  #--------------------------------------------------------------------------
  # ● スキルの評価
  #--------------------------------------------------------------------------
  def evaluate_skill
    @value = 0
    unless battler.skill_can_use?(skill)
      return
    end
    if skill.for_opponent?
      targets = opponents_unit.existing_members
    elsif skill.for_user?
      targets = [battler]
    elsif skill.for_dead_friend?
      targets = friends_unit.dead_members
    else
      targets = friends_unit.existing_members
    end
    for target in targets
      value = evaluate_skill_with_target(target)
      if skill.for_all?
        @value += value
      elsif value > @value
        @value = value
        @target_index = target.index
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの評価 (ターゲット指定)
  #     target : 対象バトラー
  #--------------------------------------------------------------------------
  def evaluate_skill_with_target(target)
    target.clear_action_results
    target.make_obj_damage_value(battler, skill)
    if skill.for_opponent?
      return target.hp_damage.to_f / [target.hp, 1].max
    else
      recovery = [-target.hp_damage, target.maxhp - target.hp].min
      return recovery.to_f / target.maxhp
    end
  end

没实测过,不过八九不离十了吧{/gg}
作者: veal    时间: 2007-12-31 16:18
特别的是自动行动角色不会用物品..估计杂兵战用了某个珍贵药品的话会被主角打死吧
另外那句rand(nil)很强大..
作者: link006007    时间: 2007-12-31 20:22
以下引用veal于2007-12-31 8:10:55的发言:

RMVX的自动战斗是有AI的,不是XP那种随机行动
大概就是评估每个行动(普通攻击、每种特技对每个可能的目标等等)的价值,然后取价值最大的作为最终行动。

看来VX的AI强大了...
作者: veal    时间: 2007-12-31 21:02
嗯,的确这种回合制战斗的AI也是比较好设计的
作者: 柳柳    时间: 2008-1-11 10:46
以下引用veal于2007-12-31 8:18:43的发言:

特别的是自动行动角色不会用物品..估计杂兵战用了某个珍贵药品的话会被主角打死吧
另外那句rand(nil)很强大..


rand(nil) = =b

这个AI设计应该加一个设计器,有玩家自己制定。最简单的就是:

1、猛攻
2、防守
3、注重回复

…………

复杂点可以学习FF12的队友AI设计……
作者: 叮当    时间: 2008-1-11 17:07
这么说来… VX的程序员比XP更有脑子了 但是还是偷懒了…
作者: 精灵使者    时间: 2008-1-11 17:44
精灵设计敌人的ai仔细调整了每个技能的概率、技能的发动时机(hp发动/定时发动)等等……
其实,好多ai应该精确一些比较好。
作者: v2sam    时间: 2008-1-11 19:31
有精确到 HP<10% 就逃跑 if逃跑失败就自杀的AI么? 哈哈哈哈{/cy}

以上纯水,VX试用版组件限制数量搞得很多事情无法落实.{/ll}
作者: 精灵使者    时间: 2008-1-11 22:06
以下引用v2sam于2008-1-11 11:31:58的发言:

有精确到 HP<10% 就逃跑 if逃跑失败就自杀的AI么? 哈哈哈哈

以上纯水,VX试用版组件限制数量搞得很多事情无法落实.

rmxp就可以办到。
你可以设置逃跑的时候附加战斗不能……然后设定为hp低于10%的时候发动
作者: Eclair    时间: 2008-1-12 07:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风雪优游    时间: 2008-1-13 07:10
好奇中……实在没办法就用事件做同伴AI吧- -
作者: link006007    时间: 2008-1-13 07:15
以下引用Eclair于2008-1-11 23:10:56的发言:
撒..小小的失望下...
看到标题偶当作优游的处女脚本呢...

同...LZ也是标题党   当时就是以为这样进来的
作者: veal    时间: 2008-1-13 08:56
还能要求VX怎样..每个人的游戏都不同,用模拟伤害的方法已经是最大限度地实现自动战斗了,剩下的只能根据每个游戏的特定情况自己写了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1