查看: 2494|回复: 4

[已经解决] 两个脚本冲突了

[复制链接]
梦石
0
星屑
2245
在线时间
1015 小时
注册时间
2015-10-17
回帖
1077
发表于 2017-7-25 20:55:36 | 显示全部楼层 |阅读模式

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

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

×
下面两个脚本冲突了,看下能解决不,谢谢

[pre lang="ruby"]module BattleManager
  class << self

    alias :rev_init_members :init_members
    def init_members
      @revive_input = []
      @revive_input_start = []
      @revive_actor_index = []
    end

    def revive_input_set(actor)
      @revive_input.push(true)
      $game_party.members.each_with_index do |v,i|
        if v.id == actor.id
          @revive_actor_index.push(i)
          break
        end  
      end  
    end

    def revive_input
      @revive_input[0]
    end

    def revive_input_start
      @revive_input_start[0]
    end

    def setup_revive_input
      @revive_input.shift
      @actor_index = @revive_actor_index.shift
      actor.make_actions
      if actor.auto_battle?
        actor.make_auto_battle_actions
        inject_revive_actor
      else
        @revive_input_start.push(true)
        SceneManager.scene.start_actor_command_selection
      end
    end

    def inject_revive_actor
      actor.make_speed
      @action_battlers.push(actor)
      @action_battlers.sort! {|a,b| b.speed - a.speed }
    end

    alias :rev_next_command :next_command
    def next_command
      if revive_input_start
        inject_revive_actor
        @revive_input_start.shift
        return false
      end  
      rev_next_command
    end

    alias :rev_prior_command :prior_command
    def prior_command
      return false if revive_input_start
      rev_prior_command
    end

    def in_turn?
      return false if revive_input_start
      @phase == :turn
    end

  end
end

class Scene_Battle < Scene_Base

  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      if BattleManager.revive_input
          BattleManager.setup_revive_input
          return
      end  
      @subject = BattleManager.next_subject  
    end
    return turn_end unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
    end
    process_action_end unless @subject.current_action
  end

  def prior_command
    if BattleManager.prior_command
      start_actor_command_selection
    elsif BattleManager.revive_input_start
        @actor_command_window.activate
    else  
        start_party_command_selection
    end
  end  

end  

class Game_Actor

  def revive
                @hp = 1 if @hp == 0
    return if !$game_party.in_battle
    BattleManager.revive_input_set(self)
        end

end[/pre]


[pre lang="ruby"]# @taroxd metadata 1.0
# @require taroxd_core
# @id target_ext
# @DISPLAY 使用目标的扩展
# @help 设置技能、物品的使用目标。
# 使用方法:
#   在技能/物品的备注栏写下类似于下面例子的备注,设置可选择的全体目标。
#
#   该脚本不影响菜单中使用技能/物品。
#
#   用 a 指代使用者,用 b 或 self 指代目标。
#
#   例1:存活队员中 hp 最小者。
#   <target>
#     select: alive?
#     min_by: hp_rate
#   </target>
#
#   例2:所有 hp 大于 50 的队员
#   <target>
#     select: hp > 50
#   </target>
#
#   例3:除自己之外的全体队友
#   <target>
#     select: alive? && b != a
#   </target>
#
#   例4:无视生死
#   <target></target>

module Taroxd::TargetExt

  RE_OUTER = /<target>(.*?)<\/target>/mi # 整体设置
  SEPARATOR = ':'                        # 每一行中的分隔符

  # 实例方法,用于选择目标的窗口中

  # virtual
  # 返回可以选择的所有目标
  def targets_to_select
    []
  end

  # 返回设置的目标
  # 若 actor 未初始化,或没有设置目标,返回 nil
  def selectable_targets
    actor = BattleManager.actor
    return unless actor
    item = actor.input.item
    return unless item
    item.get_targets(actor, targets_to_select)
  end

  # 由于父类可能未定义,不调用 super
  def enable?(battler)
    targets = selectable_targets
    !targets || targets.include?(battler)
  end

  def current_item_enabled?
    super && enable?(targets_to_select[index])
  end

  # 模块方法,用于读取备注

  def self.parse_note(note)
    note =~ RE_OUTER ? parse_settings($1) : false
  end

  private

  # lambda do |battlers, a|
  #   battlers.select { |b| b.instance_eval { alive? && b != a } }
  # end
  def self.parse_settings(settings)
    eval %(
      lambda do |battlers, a|
        battlers#{extract_settings(settings)}
      end
    )
  end

  def self.extract_settings(settings)
    settings.each_line.map { |line|
      method, _, block = line.partition(SEPARATOR).map(&:strip)
      if method.empty?
        ''
      elsif block.empty?
        ".#{method}"
      else
        ".#{method} { |b| b.instance_eval { #{block} } }"
      end
    }.join
  end

end

class RPG::UsableItem < RPG::BaseItem

  # 缓存并返回生成的 lambda。
  # 如果不存在,返回伪值。
  def get_target_lambda
    @get_target = Taroxd::TargetExt.parse_note(@note) if @get_target.nil?
    @get_target
  end

  # 返回目标的数组。a:使用者。
  # 如果没有设置,返回 nil。
  def get_targets(a, battlers = nil)
    return unless get_target_lambda
    battlers ||= (for_friend? ? a.friends_unit : a.opponents_unit).members
    Array(get_target_lambda.call(battlers, a))
  end

end

class Game_Action

  def_chain :targets_for_opponents do |old|
    targets = item.get_targets(@subject)
    if !targets
      old.call
    elsif item.for_random?
      Array.new(item.number_of_targets) { random_target(targets) }
    elsif item.for_one?
      num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
      target = if @target_index < 0
        random_target(targets)
      else
        eval_smooth_target(opponents_unit, @target_index)
      end
      Array.new(num, target)
    else
      targets
    end
  end

  def_chain :targets_for_friends do |old|
    targets = item.get_targets(@subject)
    if !targets
      old.call
    elsif item.for_user?
      [subject]
    else
      if item.for_one?
        if @target_index < 0
          [random_target(targets)]
        else
          [eval_smooth_target(friends_unit, @target_index)]
        end
      else
        targets
      end
    end
  end

  private

  def eval_smooth_target(unit, index)
    unit[index] || unit[0]
  end

  def random_target(targets)
    tgr_rand = rand * targets.sum(&:tgr)
    targets.each do |target|
      tgr_rand -= target.tgr
      return target if tgr_rand < 0
    end
    targets.first
  end
end

class Game_BattlerBase
  # 如果设置了目标,必须存在目标才可使用
  def_and :usable_item_conditions_met? do |item|
    targets = item.get_targets(self)
    !targets || !targets.empty?
  end
end

class Game_Battler < Game_BattlerBase
  # 如果设置了目标,删除是否死亡的测试
  def_chain :item_test do |old, user, item|
    if item.get_target_lambda
      return true if $game_party.in_battle
      return true if item.for_opponent?
      return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
      return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
      return true if item_has_any_valid_effects?(user, item)
      false
    else
      old.call(user, item)
    end
  end
end

class Window_BattleActor < Window_BattleStatus

  include Taroxd::TargetExt

  def targets_to_select
    $game_party.battle_members
  end

  def draw_actor_name(actor, x, y, width = 112)
    change_color(hp_color(actor), enable?(actor))
    draw_text(x, y, width, line_height, actor.name)
  end
end

class Window_BattleEnemy < Window_Selectable

  include Taroxd::TargetExt

  def targets_to_select
    $game_troop.alive_members
  end

  def draw_item(index)
    enemy = $game_troop.alive_members[index]
    change_color(normal_color, enable?(enemy))
    name = enemy.name
    draw_text(item_rect_for_text(index), name)
  end
end[/pre]
梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2017-7-26 09:52:56 | 显示全部楼层
目测第一个脚本的第6行加个rev_init_members

评分

参与人数 1星屑 +200 收起 理由
RaidenInfinity + 200 认可答案

查看全部评分

笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

梦石
0
星屑
2245
在线时间
1015 小时
注册时间
2015-10-17
回帖
1077
 楼主| 发表于 2017-7-26 11:50:32 | 显示全部楼层
本帖最后由 fjm 于 2017-7-26 11:52 编辑
魔法丶小肉包 发表于 2017-7-26 09:52
目测第一个脚本的第6行加个rev_init_members


是这样加吗,这样的话还是有冲突

@revive_input = []
      @rev_init_members= []
      @revive_input_start = []

点评

fjm
感谢肉包,完美解决了  发表于 2017-7-26 16:47
不是,我是说第5行和第6行之间加一行就写rev_init_members  发表于 2017-7-26 12:57
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部