查看: 818|回复: 0

[原创发布] 敌人阵营互斗系统

[复制链接]
梦石
1
星屑
1184
在线时间
59 小时
注册时间
2023-9-8
回帖
19
发表于 2026-4-24 00:45:34 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
[pre lang="ruby"]#==============================================================================
# ★ 敌人阵营互斗系统 - Camp Battle System
#------------------------------------------------------------------------------
#   作者:ruigi
#  在敌人备注栏写入 <阵营: 文字> 即可定义该敌人的阵营。
#   - 不同阵营的敌人会优先互相攻击。
#   - 当场上仅剩单一阵营时,该阵营的敌人恢复攻击玩家。
#   - 无备注的敌人视为同一默认阵营,彼此不攻击。
#==============================================================================

#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 获取阵营(缓存)
  #--------------------------------------------------------------------------
  def camp
    if @camp.nil?
      @camp = ""
      if enemy.note =~ /<阵营:\s*(.+)>/i
        @camp = $1.to_s.strip
      end
    end
    @camp
  end
end

#==============================================================================
# ■ Game_Action
#==============================================================================
class Game_Action
  #--------------------------------------------------------------------------
  # ● 别名:生成目标(核心修改)
  #--------------------------------------------------------------------------
  alias camp_system_make_targets make_targets
  def make_targets
    # 仅当行动者是敌人时应用特殊规则
    if subject.is_a?(Game_Enemy)
      # 针对对手的技能(攻击、有害状态等)
      if item.for_opponent?
        # 获取活着的敌对阵营敌人
        enemy_targets = $game_troop.alive_members.select { |e| e.camp != subject.camp }
        if enemy_targets.empty?
          # 没有敌对阵营 → 攻击玩家队伍
          return make_targets_default
        else
          # 有敌对阵营 → 选择目标
          return make_enemy_vs_enemy_targets(enemy_targets)
        end
      # 针对友方的技能(治疗、增益等)
      elsif item.for_friend?
        # 只选择同阵营的活着的敌人
        ally_targets = $game_troop.alive_members.select { |e| e.camp == subject.camp }
        if ally_targets.empty?
          # 没有同阵营友军 → 只能选自己
          ally_targets = [subject]
        end
        return make_enemy_vs_friend_targets(ally_targets)
      end
    end
    # 其他情况(玩家行动、自身技能等)沿用默认逻辑
    camp_system_make_targets
  end

  #--------------------------------------------------------------------------
  # ● 新方法:敌人攻击敌人时的目标选择
  #--------------------------------------------------------------------------
  def make_enemy_vs_enemy_targets(target_array)
    if item.for_random?
      # 随机攻击 N 个目标
      Array.new(item.number_of_targets) { target_array.sample }
    elsif item.for_one?
      # 单体攻击:从敌对阵营中随机选一个
      [target_array.sample]
    else
      # 全体攻击:所有敌对阵营成员
      target_array
    end
  end

  #--------------------------------------------------------------------------
  # ● 新方法:敌人使用友方技能时的目标选择
  #--------------------------------------------------------------------------
  def make_enemy_vs_friend_targets(target_array)
    if item.for_all?
      # 全体友方:所有同阵营成员
      target_array
    elsif item.for_one? || item.for_random?
      # 单体友方(包括随机):从同阵营中随机选一个
      [target_array.sample]
    else
      # 其他情况(如使用者自身)交给默认逻辑
      camp_system_make_targets
    end
  end

  #--------------------------------------------------------------------------
  # ● 默认目标生成(供上面调用)
  #--------------------------------------------------------------------------
  def make_targets_default
    camp_system_make_targets
  end
end[/pre]

就像你玩半条命时走半路看见喝醋和xen星生物在干架一样
也可以玩电子斗蛐蛐了
74XZ~[Y$]05{1[1{2O6(}DN.png
@%XN39A4T[%SIVM2]%FO(}D.png
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部