查看: 2548|回复: 1

[已经过期] 战斗中查看状态指令 Ver1.05 by 星潟 脚本求助

[复制链接]
梦石
0
星屑
1250
在线时间
135 小时
注册时间
2021-2-28
回帖
26
发表于 2022-3-4 10:12:01 | 显示全部楼层 |阅读模式

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

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

×
有没有大佬能帮我看下这个脚本,在RGD模式下使用会出现界面重叠,要如何解决?图片在附件


战斗中查看状态指令 Ver1.05 by 星潟#==============================================================================
# ■ RGSS3 战斗中查看状态指令 Ver1.05 by 星潟
#------------------------------------------------------------------------------
# RPG maker VXAce 中、没有查看当前能力值强化/弱化的功能,确认信息很不方便。
#
# 所以、使用了本脚本后,玩家可以最多查看22个自身状态、強化/弱体信息全部显示。
#
# 队伍指令中添加“查看状态”指令、显示敌我方当前能力值、状态和强化/弱化状态
# 一开始显示的查看角色状态、按下L键或R键可以切换到查看敌人。
# 在某个敌人或角色上点击确定即可查看状态。
# 详细状态显示中,按下确定键,可以在属性抗性、状态抗性间切换。
#
# 你可以设定敌人是否显示状态详情
# 也可以单独设定状态/强化/弱化是否显示。
#
# 可以设定本功能是否仅能用于测试模式。
#------------------------------------------------------------------------------
# Ver1.01 %表示に関する設定や、属性/ステート耐性の表示機能が追加されました。
# Ver1.02 操作性を向上させました。
# Ver1.03 隠れている敵を表示しないようにする機能を追加しました。
# Ver1.04 詳細モードで敵のHPが表示限界でも見えてしまう不具合を修正しました。
#         また、表示限界の適用を敵のみにする機能を追加しました。
# Ver1.05 システム側のTP表示設定が無効化されていてもTPが表示される不具合を修正。
#==============================================================================
module B_CONFIRM

  #是否限制脚本功能只能用于测试模式。
  #(true限制/false始终可用)

  TONLY = false

  #队伍指令中,“状态”指令的名称。

  WORD1 = "状态"

  #状态名称。

  WORD2 = "状态"

  #強化/弱体名称。

  WORD3 = ""

  #背景不透明度。

  BOPAC = 255

  #是否显示非参战队员的信息。
  #(true显示/false不显示)

  PTMT = false

  #是否显示队员详细信息。
  #(true显示/false不显示)

  PTDT = true

  #是否可以通过切换键显示敌人信息。
  #(true显示/false不显示)

  TROK = true

  #是否显示敌人详细信息。
  #(true显示/false不显示)

  TRDT = true

  #是否显示隐藏敌人的信息。

  HIDE = false

  #设定HP/MP/TP显示的最大值。
  #数值超过最大值时,显TEXT的文本。

  OVER = 10000

  #HP/MP/TP超过最大值时、取而代之显示的文本。

  TEXT = "?????"

  #当达到显示限制时是否只显示敌人。(?)
  #true只有敌人、false敌我双方。

  EN_O = true

  #是否启用第二页。
  #(true是/false否)

  P2   = true

  #详细信息中,添加能力的显示设定。
  #[添加能力ID(0~9の数字), 添加能力値名称(文字列),敌人是否显示(true/false)]
  # 显示顺序:添加能力名+文字+数字+%。
  
  XPRM = [
  [0, "命中率", true],
  [1, "闪避率", true],
  [2, "暴击率", true],
  [3, "暴击闪避率", true],
  [4, "魔法闪避率", true],
  [5, "魔法反射率", true],
  [6, "反击率", true],
  [7, "HP再生率", true],
  [8, "MP再生率", true],
  [9, "TP再生率", true]
  ]

  #添加能力数字后是否显示%。
  #(true是/false否)

  ADP  = true#false

  #详细信息中,特殊能力的显示设定。
  #[特殊能力ID(0~9数字), 特殊能力名称(字符), 敌人是否显示(true/false)]
  # 显示顺序:特殊能力名+文字+数字+%。

  SPRM = [
  [0, "受到伤害率", true],
  [1, "防御效果", true],
  [2, "回复效果", true],
  [3, "药理知识", true],
  [4, "MP消耗率", true],
  [5, "TP补充率", true],
  [6, "物攻抗性", true],
  [7, "魔法抗性", true],
  [9, "经验加成", true]
  ]

  #特殊能力数字后是否显示%。
  #(true是/false否)

  SPP  = true #false

  #详细信息中,属性有效度的显示设定。
  #[属性ID, 属性名后面的文字,是否显示敌人(true/false),是否取而代之显示100减去该
  # 值的数字],
  #显示顺序:属性名+文字+数字+%。

  ELEM = [
  [3, "有效度", false, false],
  [4, "有效度", false, false],
  [5, "有效度", false, false],
  [6, "有效度", false, false],
  [7, "有效度", false, false],
  [8, "有效度", false, false],
  [9, "有效度", false, false],
  [10, "有效度", false, false],
  ]

  #是否显示属性有效度数字后的%。
  #(true是/false否)

  ELP  = true #false

  #1行目に表示するステートの最大数を指定します。
  #(2行目までしか想定していません)

  MAX  = 11

  #详细信息中,状态有效度的显示设定。
  #[状态ID(如果使用0~-7、其绝对值代表能力值ID,如MP、物攻等),
  # 状态名后面的文字,是否显示敌人(true/false),是否取而代之显示100减去该
  # 值的数字],
  # 显示顺序:状态名+文字+数字+%。

  STAT = [
  [1, "几率", false, false],
  [2, "几率", false, false],
  [-3, "几率", false, false],
  [4, "几率", false, false],
  [5, "几率", false, false],
  [6, "几率", false, false],
  [7, "几率", false, false],
  [8, "几率", false, false],
  ]

  #是否显示状态有效度数字后的%。
  #(true是/false否)

  STP  = true#false

end

#テストモード限定化されており、なおかつテストモードの場合か
#テストモード限定化されていない場合は処理を行う。

if (B_CONFIRM::TONLY && ($TEST or $BTEST)) or !B_CONFIRM::TONLY

class Game_Troop < Game_Unit
  def unhidden_members
    B_CONFIRM::HIDE ? members : members.select {|e| !e.hidden?}
  end
end
class Game_Temp
  attr_accessor :b_confirm_limit_flag
end
class Window_Base < Window
  alias draw_current_and_max_values_overnumber draw_current_and_max_values
  def draw_current_and_max_values(x, y, width, current, max, color1, color2)

    #状況確認ウィンドウである場合のみ
    #現在値と最大値を必要に応じて読み替える。

    if (self.is_a?(Window_B_Confirm) or self.is_a?(Window_B_Confirm_Detail)) && $game_temp.b_confirm_limit_flag
      current = B_CONFIRM::TEXT if current >= B_CONFIRM::OVER
      max = B_CONFIRM::TEXT if max >= B_CONFIRM::OVER
    end

    #本来の処理を実行する。

    draw_current_and_max_values_overnumber(x, y, width, current, max, color1, color2)
  end
end
class Window_PartyCommand < Window_Command

  #--------------------------------------------------------------------------
  # コマンドリストの作成
  #--------------------------------------------------------------------------
  alias make_command_list_b_confirm make_command_list
  def make_command_list

    #本来の処理を実行する。

    make_command_list_b_confirm

    #状況確認コマンドを追加する。

    add_command(B_CONFIRM::WORD1,  :b_confirm)
  end
end
class Window_B_Confirm < Window_Selectable
  attr_accessor :end_flag
  attr_accessor :display_mode
  attr_accessor :last_actor
  def initialize(x, y, type, actor = nil)

    #各種データを取得する。

    @display_mode = type
    @last_actor = actor
    @end_flag = false

    #ウィンドウを作成する。

    super(x, y, window_width, window_height)

    #背景透過度を設定する。

    self.back_opacity = B_CONFIRM::BOPAC

    activate

    self.index = 0

    #描写を行う。

    refresh

  end
  #--------------------------------------------------------------------------
  # フレーム更新
  #--------------------------------------------------------------------------
  def update

    #ウィンドウを閉じている最中は何もしない。

    return if @end_flag

    super

    return if !self.active

    if Input.trigger?(:B)#キャンセルキーを押した場合

      #キャンセルのSEを鳴らす。

      Sound.play_cancel

      @end_flag = true
      @last_actor = nil
      @display_mode = 2

    elsif Input.trigger?(:C)#決定キーを押した場合

      #バトラーが指定されていない場合はウィンドウを閉じる。
      #バトラーが指定されている場合はウィンドウを切り替える。
      case @display_mode
      when 0
        actor = B_CONFIRM::PTMT ? $game_party.all_members[index] : $game_party.members[index]
      when 1
        actor = $game_troop.unhidden_members[index]
      end

      #バトラーがアクターであり、なおかつアクターの詳細表示が可能な場合
      #あるいはバトラーがエネミーであり、なおかつエネミーの詳細表示が可能な場合続行。

      return if actor.actor? && !B_CONFIRM::PTDT
      return if !actor.actor? && !B_CONFIRM::TRDT

      #OKのSEを鳴らす。

      Sound.play_ok

      @end_flag = true
      @last_actor = actor

    elsif (Input.trigger?(:L) or Input.trigger?(:R)) && B_CONFIRM::TROK

      #カーソルのSEを鳴らす。

      Sound.play_cursor

      #ウィンドウを作り直す準備を行う。

      @end_flag = true
      @last_actor = nil
      @display_mode = @display_mode == 0 ? 1 : 0

    end
  end
  #--------------------------------------------------------------------------
  # ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    Graphics.height
  end
  #--------------------------------------------------------------------------
  # 項目数の取得
  #--------------------------------------------------------------------------
  def item_max

    #バトラーが指定されていない場合は項目数は1個にする。

    return 1 if @last_actor != nil

    #アクターかエネミーのどちらを表示するかで処理を分岐し
    #それぞれ設定に適した値を返す。

    case @display_mode
    when 0
      B_CONFIRM::PTMT ? $game_party.all_members.size : $game_party.members.size
    when 1
      $game_troop.unhidden_members.size
    end
  end
  #--------------------------------------------------------------------------
  # 項目の高さを取得
  #--------------------------------------------------------------------------
  def item_height
    (height - standard_padding * 2) / 4
  end
  #--------------------------------------------------------------------------
  # 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(index)

    #バトラーが指定されているか否かで処理を分岐。

    if @last_actor == nil

      #アクターかエネミーのどちらを表示するかで設定に応じて処理を分岐。

      case @display_mode
      when 0
        actor = B_CONFIRM::PTMT ? $game_party.all_members[index] : $game_party.members[index]
      when 1
        actor = $game_troop.unhidden_members[index]
      end

      #項目の矩形を取得。

      rect = item_rect(index)

      #項目内のデータを描写していく。

      $game_temp.b_confirm_limit_flag = (!B_CONFIRM::EN_O or (B_CONFIRM::EN_O && @display_mode == 1))
      draw_actor_name(actor, rect.x, rect.y)
      contents.font.size = 20
      draw_actor_hp(actor, rect.x + 4, rect.y + line_height * 1)
      draw_actor_mp(actor, rect.x + 4, rect.y + line_height * 2)
      draw_actor_tp(actor, rect.x + 4, rect.y + line_height * 3) if $data_system.opt_display_tp
      self.contents.font.color = system_color
      draw_text(rect.x +  150, rect.y + line_height * 1, 96, line_height, B_CONFIRM::WORD2)
      draw_text(rect.x +  150, rect.y + line_height * 3, 96, line_height, B_CONFIRM::WORD3)
      self.contents.font.color = normal_color
      icons_width = (rect.width - rect.x - 150 - 96) / 24
      icons = (actor.state_icons)[0, icons_width]
      icons.each_with_index {|n, i| draw_icon(n, rect.x + 246 + 24 * i, rect.y + line_height * 1) }
      icons = (actor.state_icons)[icons_width, icons_width * 2]
      icons.each_with_index {|n, i| draw_icon(n, rect.x + 246 + 24 * i, rect.y + line_height * 2) } if icons != nil
      icons = (actor.buff_icons)[0, icons_width]
      icons.each_with_index {|n, i| draw_icon(n, rect.x + 246 + 24 * i, rect.y + line_height * 3) }

    end
  end
  #--------------------------------------------------------------------------
  # 決定ボタンが押されたときの処理(邪魔なので消す)
  #--------------------------------------------------------------------------
  def process_ok
  end
  #--------------------------------------------------------------------------
  # キャンセルボタンが押されたときの処理(邪魔なので消す)
  #--------------------------------------------------------------------------
  def process_cancel
  end
  #--------------------------------------------------------------------------
  # Lボタンが押されたときの処理(邪魔なので消す)
  #--------------------------------------------------------------------------
  def process_pageup
  end
  #--------------------------------------------------------------------------
  # Rボタンが押されたときの処理(邪魔なので消す)
  #--------------------------------------------------------------------------
  def process_pagedown
  end
end

class Window_B_Confirm_Detail < Window_Base
  attr_accessor :window_b_confirm
  attr_accessor :end_flag
  #--------------------------------------------------------------------------
  # 初期化
  #--------------------------------------------------------------------------
  def initialize(window_b_confirm)
    @page_data = 0
    @window_b_confirm = window_b_confirm
    @end_flag = false
    super(0, 0, window_width, window_height)

    #背景透過度を設定する。

    self.back_opacity = B_CONFIRM::BOPAC

    refresh
  end
  #--------------------------------------------------------------------------
  # ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    Graphics.height
  end
  #--------------------------------------------------------------------------
  # フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if Input.trigger?(:B)#キャンセルキーを押した場合

      #キャンセルのSEを鳴らす。

      Sound.play_cancel
      @end_flag = true

    elsif page_change?   #決定キー、左右キー、LRボタンを押した場合

      Sound.play_cursor
      @page_data = @page_data == 0 ? 1 : 0
      contents.clear
      refresh

    end
  end
  #--------------------------------------------------------------------------
  # ページ切り替えを行うか?
  #--------------------------------------------------------------------------
  def page_change?
    flag = false
    [:C, :L, :R, :LEFT, :RIGHT].each {|k|flag = true if Input.trigger?(k)}
    flag
  end
  #--------------------------------------------------------------------------
  # リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    #バトラーを取得。

    actor = @window_b_confirm.last_actor
   
    #項目内のデータを描写していく。
    draw_actor_name(actor, x, y)
    $game_temp.b_confirm_limit_flag = (!B_CONFIRM::EN_O or (B_CONFIRM::EN_O && !actor.actor?))
    contents.font.size = 24
    draw_actor_hp(actor, x + 4, y + line_height * 1)
    draw_actor_mp(actor, x + 4, y + line_height * 2)
    draw_actor_tp(actor, x + 4, y + line_height * 3) if $data_system.opt_display_tp
    self.contents.font.color = system_color
    draw_text(x + 150, y + line_height * 1, 96, line_height, B_CONFIRM::WORD2)
    draw_text(x + 150, y + line_height * 3, 96, line_height, B_CONFIRM::WORD3)
    self.contents.font.color = normal_color
    icons_width = (width - x - 162 - 96) / 24
    icons = (actor.state_icons)[0, icons_width]
    icons.each_with_index {|n, i| draw_icon(n, x + 246 + 24 * i, y + line_height * 1) }
    icons = (actor.state_icons)[icons_width, icons_width * 2]
    icons.each_with_index {|n, i| draw_icon(n, x + 246 + 24 * i, y + line_height * 2) } if icons != nil
    icons = (actor.buff_icons)[0, icons_width]
    icons.each_with_index {|n, i| draw_icon(n, x + 246 + 24 * i, y + line_height * 3) }
    draw_horz_line(line_height * 4)

    if @page_data == 0
      #设定文字排版
      6.times {|i|draw_actor_param(actor, x, y + line_height * (5 + i),(i + 2))}
      ex_xprms_draw(actor, x-20, y)
      ex_sprms_draw(actor, x, y)

    else

      ex_elem_draw(actor, x+50, y)
      ex_state_draw(actor, x+50, y)

    end
  end
  #--------------------------------------------------------------------------
  # 水平線の色を取得(Window_Statusからそのままコピー)
  #--------------------------------------------------------------------------
  def line_color
    color = normal_color
    color.alpha = 48
    color
  end
  #--------------------------------------------------------------------------
  # 水平線の描画(Window_Statusからそのままコピー)
  #--------------------------------------------------------------------------
  def draw_horz_line(y)
    line_y = y + line_height / 2 - 1
    contents.fill_rect(0, line_y, contents_width, 2, line_color)
  end
  #--------------------------------------------------------------------------
  # 追加能力値
  #--------------------------------------------------------------------------
  def ex_xprms_draw(actor, x, y)

    #追加能力値の描写対象がない場合は飛ばす。

    return if B_CONFIRM::XPRM.empty?

    #追加能力値を描写する。

    B_CONFIRM::XPRM.each_with_index do |xp, i|
      next if !actor.actor? && !xp[2]
      change_color(system_color)
      draw_text(x + 180, y + line_height * (5 + i), 120, line_height, xp[1])
      change_color(normal_color)
      draw_text(x + 280, y + line_height * (5 + i), 66, line_height, (actor.xparam(xp[0]) * 100).to_i.to_s + (B_CONFIRM::ADP ? "%" : ""), 2)
    end
  end
  #--------------------------------------------------------------------------
  # 特殊能力値
  #--------------------------------------------------------------------------
  def ex_sprms_draw(actor, x, y)

    #特殊能力値の描写対象がない場合は飛ばす。

    return if B_CONFIRM::SPRM.empty?

    #特殊能力値を描写する。

    B_CONFIRM::SPRM.each_with_index do |sp, i|
      next if !actor.actor? && !sp[2]
      change_color(system_color)
      draw_text(x + 344, y + line_height * (5 + i), 120, line_height, sp[1])
      change_color(normal_color)
      draw_text(x + 444, y + line_height * (5 + i), 66, line_height, (actor.sparam(sp[0]) * 100).to_i.to_s + (B_CONFIRM::SPP ? "%" : ""), 2)
    end
  end
  #--------------------------------------------------------------------------
  # 属性有効度
  #--------------------------------------------------------------------------
  def ex_elem_draw(actor, x, y)

    #属性有効度の描写対象がない場合は飛ばす。

    return if B_CONFIRM::ELEM.empty?

    #属性有効度を描写する。

    B_CONFIRM::ELEM.each_with_index do |elem, i|
      next if !actor.actor? && !elem[2]
      change_color(system_color)
      name = $data_system.elements[elem[0]]
      data = (actor.element_rate(elem[0]) * 100).to_i
      data = (elem[3] ? (100 - data) : data).to_s
      draw_text(x, y + line_height * (5 + i), 120, line_height, name + elem[1])
      change_color(normal_color)
      draw_text(x + 90, y + line_height * (5 + i), 66, line_height, data + (B_CONFIRM::ELP ? "%" : ""), 2)
    end
  end
  #--------------------------------------------------------------------------
  # ステート有効度
  #--------------------------------------------------------------------------
  def ex_state_draw(actor, x, y)

    #ステート有効度の描写対象がない場合は飛ばす。

    return if B_CONFIRM::STAT.empty?

    #ステート有効度を描写する。

    B_CONFIRM::STAT.each_with_index do |state, i|
      next if !actor.actor? && !state[2]
      change_color(system_color)
      x_data = i < B_CONFIRM::MAX ? 170 : 344
      if state[0] > 0
        name = $data_states[state[0]].name
        data = (actor.state_rate(state[0]) * 100).to_i
        data = (state[3] ? (100 - data) : data).to_s
      else
        state_id = state[0].abs
        name = Vocab.param(state_id)
        data = (actor.debuff_rate(state_id) * 100).to_i
        data = (state[3] ? (100 - data) : data).to_s
      end
      draw_text(x + x_data+ 110, y + line_height * (5 + i - (i < B_CONFIRM::MAX ? 0 : B_CONFIRM::MAX)), 120, line_height, name + state[1])
      change_color(normal_color)
      draw_text(x + x_data + 210, y + line_height * (5 + i - (i < B_CONFIRM::MAX ? 0 : B_CONFIRM::MAX)), 66, line_height, data + (B_CONFIRM::STP ? "%" : ""), 2)
    end
  end
end
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # パーティコマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_party_command_window_b_confirm create_party_command_window
  def create_party_command_window

    #本来の処理を実行。

    create_party_command_window_b_confirm

    #状況確認コマンド用のハンドラを追加。

    @party_command_window.set_handler(:b_confirm,  method(:command_b_confirm))
  end
  #--------------------------------------------------------------------------
  # コマンド[状況確認]
  #--------------------------------------------------------------------------
  def command_b_confirm

    #状況確認コマンドの処理内容を実行。

    b_confirm_execute
  end
  #--------------------------------------------------------------------------
  # 状況確認開始
  #--------------------------------------------------------------------------
  def b_confirm_execute

    #状況確認ウィンドウを作成。

    @b_confirm_window = Window_B_Confirm.new(0, 0, 0)

    #処理をループで処理。

    loop do

      #とりあえずアップデートは行う。

      update

      #状況確認ウィンドウがアクティブであり
      #なおかつ操作終了フラグが有効な場合は分岐。

      if @b_confirm_window.active && @b_confirm_window.end_flag

        #表示モードが2の時、ループを終了する。

        break if @b_confirm_window.display_mode == 2

        #操作終了フラグをfalseにする。

        @b_confirm_window.end_flag = false

        #最後にキャラクターを選択している場合

        if @b_confirm_window.last_actor != nil

          #状況確認ウィンドウのアクティブ状態を解除し
          #詳細ウィンドウを作成する。

          @b_confirm_window.deactivate
          @b_confirm_detail_window = Window_B_Confirm_Detail.new(@b_confirm_window)

        #最後にキャラクターを選択していない場合

        else

          #状況確認ウィンドウを解放する。

          @b_confirm_window.dispose

          #状況確認ウィンドウを作り直す。

          @b_confirm_window = Window_B_Confirm.new(0, 0, (@b_confirm_window.display_mode == 0 ? 0 : 1))

        end

      #詳細ウィンドウが存在し、なおかつ終了フラグが有効な場合。

      elsif @b_confirm_detail_window != nil && @b_confirm_detail_window.end_flag

        #詳細ウィンドウを解放し、nil扱いとする。

        @b_confirm_detail_window.dispose
        @b_confirm_detail_window = nil

        #最後に選択したアクターをnilとする。

        @b_confirm_window.last_actor = nil

        #状況確認ウィンドウをアクティブ化する。

        @b_confirm_window.activate
      end
    end

    #状況確認ウィンドウを解放する。

    @b_confirm_window.dispose

    #パーティコマンドウィンドウをアクティブにする。

    @party_command_window.activate
  end
end
end

RGD下

RGD下

非RGD下

非RGD下

点评

P1用RGD的活人不多, 个人建议修改标题帯RGD並@一下RGD的作者⑨姐姐, 不然换掉星潟的脚本  发表于 2022-3-4 20:10
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部