查看: 1358|回复: 0

[已经过期] 角色离队时,副将自动卸下来

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

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

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

×
本帖最后由 fjm 于 2022-4-7 19:55 编辑

角色离队时,副将有时候忘记卸下来,就没有了,问下怎样让角色离队时,副将自动解除,卸下来,谢谢


[pre lang="ruby"]#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム [Ver.1.0.0]             by Claimh
#------------------------------------------------------------------------------
# ・アクターごとに精霊をパートナーにすることができます。
# ・パートナーになるとパラメータ上昇、スキル習得など
#   (パートナーのパラメータ、特徴が加算されます)
# ・精霊はパートナーになっている状態で戦闘に参加することでレベルが上昇します
# ・精霊のデータはデータベース上のアクターとして作成してください。
#------------------------------------------------------------------------------
# ☆精霊加入
#  $game_party.add_spirit(精霊ID)
# ☆精霊脱退
#  $game_party.del_spirit(精霊ID)
# ☆精霊パートナー化
#  Spirits.add_partner(アクターID, 精霊ID)
# ☆精霊パートナー解消
#  Spirits.remove_partner(アクターID, 精霊ID)
# ☆精霊パートナー最大数変更
#  $game_actors[アクターID].max_spirits = n
#==============================================================================

module Spirits
  AFNTY=[{0=>3}]; MAX=[1] # 変更禁止
### 精霊設定 ##################################################################
  # 精霊 ※精霊ID:0 は使用禁止
  SPIRIT_ACTOR = {
  # 精霊ID => アクターID
    1  => 300,
    2  => 301,
    3  => 302,
    4  => 303,
    5  => 304,
    6  => 305,
    7  => 306,
    8  => 307,
    9  => 308,
    10  => 309,
    11  => 310,
    12  => 311,
    13  => 312,
    14  => 313,
    15  => 314,
    16  => 315,
    17  => 316,
    18  => 317,
    19  => 318,
    20  => 319,
    21  => 320,
    22  => 321,
    23  => 322,
    24  => 323,
    25  => 324,
   
    }


### 初期状態設定 ##############################################################
  # 初期状態で加入している精霊
  # START_V = [精霊ID, …]
  START_V = [1]

  # 初期状態のパートナー
  #  (注) 初期メンバーおよび初期精霊以外は設定不可
  # START_P = {アクターID => 精霊ID, …}
  START_P = {1=>12}#{4=>1}  #{1=>3, 2=>4, 3=>2, 4=>1}


### パートナー数設定 ##########################################################
  # 最大パートナー数(初期値)
  # MAX[アクターID] = 最大数
  MAX[1] = 1
  MAX[2] = 1
  MAX[3] = 1
  MAX[4] = 1
  MAX[5] = 3
  MAX[6] = 3
  MAX[7] = 3
  MAX[8] = 3
  MAX[9] = 3
  MAX[10] = 3
  MAX[11] = 3
  MAX[12] = 3
  MAX[13] = 3
  MAX[14] = 3
  MAX[15] = 3
  MAX[16] = 3
  MAX[17] = 3
  MAX[18] = 3
  MAX[19] = 1
  MAX[20] = 1
  MAX[21] = 1
  MAX[22] = 1
  MAX[23] = 1
  MAX[24] = 1
  MAX[25] = 1
  MAX[26] = 1
  MAX[27] = 1
  MAX[28] = 1
  MAX[29] = 1
  MAX[30] = 1
  MAX[31] = 1
  MAX[32] = 1
  MAX[33] = 1
  MAX[34] = 1
  MAX[35] = 1
  MAX[36] = 1
  MAX[37] = 1
  MAX[38] = 1
  MAX[39] = 1
  MAX[40] = 1
  MAX[41] = 1
  MAX[42] = 1
  MAX[43] = 1
  MAX[44] = 1
  MAX[45] = 1
  MAX[46] = 1
  MAX[47] = 1
  MAX[48] = 1
  MAX[49] = 1
  MAX[50] = 1
  MAX[51] = 1
  MAX[52] = 1
  MAX[53] = 1
  MAX[54] = 1
  MAX[55] = 1
  MAX[56] = 1
  MAX[57] = 1
  MAX[58] = 1
  MAX[59] = 1
  MAX[60] = 1
  MAX[61] = 1
  MAX[62] = 1
  MAX[63] = 1
  MAX[64] = 1
  MAX[65] = 1
  MAX[66] = 1
  MAX[67] = 1
  MAX[68] = 1
  MAX[69] = 1
  MAX[70] = 1
  MAX[71] = 1
  MAX[72] = 1
  MAX[73] = 1
  MAX[74] = 1
  MAX[75] = 1
  MAX[76] = 1
  MAX[77] = 1
  MAX[78] = 1
  MAX[79] = 1
  MAX[80] = 1
  MAX[81] = 1
  MAX[82] = 1
  MAX[83] = 1
  MAX[84] = 1
  MAX[85] = 1
  MAX[86] = 1
  MAX[87] = 1
  MAX[88] = 1
  MAX[89] = 1
  MAX[90] = 1
  MAX[91] = 1
  MAX[92] = 1
  MAX[93] = 1
  MAX[94] = 1
  MAX[95] = 1
  MAX[96] = 1
  MAX[97] = 1
  MAX[98] = 1
  MAX[99] = 1
  MAX[100] = 1
  MAX[101] = 1
  MAX[102] = 1
  MAX[103] = 1
  MAX[104] = 1
  MAX[105] = 1
  MAX[106] = 1
  MAX[107] = 1
  MAX[108] = 1
  MAX[109] = 1
  MAX[110] = 1
  MAX[111] = 1
  MAX[112] = 1
  MAX[113] = 1
  MAX[114] = 1
  MAX[115] = 1
  MAX[116] = 1
  MAX[117] = 1
  MAX[118] = 1
  MAX[119] = 1
  MAX[120] = 1
  MAX[121] = 1
  MAX[122] = 1
  MAX[123] = 1
  MAX[124] = 1
  MAX[125] = 1
  MAX[126] = 1
  MAX[127] = 1
  MAX[128] = 1
  MAX[129] = 1
  MAX[130] = 1
  MAX[131] = 1
  MAX[132] = 1
  MAX[133] = 1
  MAX[134] = 1
  MAX[135] = 1
  MAX[136] = 1
  MAX[137] = 1
  MAX[138] = 1
  MAX[139] = 1
  MAX[140] = 1
  MAX[141] = 1
  MAX[142] = 1
  MAX[143] = 1
  MAX[144] = 1
  MAX[145] = 1
  MAX[146] = 1
  MAX[147] = 1
  MAX[148] = 1
  MAX[149] = 1
  MAX[150] = 1
  MAX[151] = 3
  MAX[152] = 3
  MAX[153] = 3
  MAX[154] = 3
  MAX[155] = 3
  MAX[156] = 3
  MAX[157] = 3
  MAX[158] = 3
  MAX[159] = 3
  MAX[160] = 3
  MAX[161] = 3
  MAX[162] = 3
  MAX[163] = 3
  MAX[164] = 3
  MAX[165] = 3
  MAX[166] = 3
  MAX[167] = 3
  MAX[168] = 3
  MAX[169] = 3
  MAX[170] = 3
  MAX[171] = 3
  MAX[172] = 3
  MAX[173] = 3
  MAX[174] = 3
  MAX[175] = 3
  MAX[176] = 3
  MAX[177] = 3
  MAX[178] = 3
  MAX[179] = 3
  MAX[180] = 3
  MAX[181] = 3
  MAX[182] = 3
  MAX[183] = 3
  MAX[184] = 3
  MAX[185] = 3
  MAX[186] = 3
  MAX[187] = 3
  MAX[188] = 3
  MAX[189] = 3
  MAX[190] = 3
  MAX[191] = 3
  MAX[192] = 3
  MAX[193] = 3
  MAX[194] = 3
  MAX[195] = 3
  MAX[196] = 3
  MAX[197] = 3
  MAX[198] = 3
  MAX[199] = 3
  MAX[200] = 3
  MAX[201] = 3
  MAX[202] = 3
  MAX[203] = 3
  MAX[204] = 3
  MAX[205] = 3
  MAX[206] = 3
  MAX[207] = 3
  MAX[208] = 3
  MAX[209] = 3
  MAX[210] = 3
  MAX[211] = 3
  MAX[212] = 3
  MAX[213] = 3
  MAX[214] = 3
  MAX[215] = 3
  MAX[216] = 3
  MAX[217] = 3
  MAX[218] = 3
  MAX[219] = 3
  MAX[220] = 3
  MAX[221] = 3
  MAX[222] = 3
  MAX[223] = 3
  MAX[224] = 3
  MAX[225] = 3
  MAX[226] = 3
  MAX[227] = 3
  MAX[228] = 3
  MAX[229] = 3
  MAX[230] = 3
  MAX[231] = 3
  MAX[232] = 3
  MAX[233] = 3
  MAX[234] = 3
  MAX[235] = 3
  MAX[236] = 3
  MAX[237] = 3
  MAX[238] = 3
  MAX[239] = 3
  MAX[240] = 3
  MAX[241] = 3
  MAX[242] = 3
  MAX[243] = 3
  MAX[244] = 3
  MAX[245] = 3
  MAX[246] = 3
  MAX[247] = 3
  MAX[248] = 3
  MAX[249] = 3
  MAX[250] = 3
  MAX[251] = 3
  MAX[252] = 3
  MAX[253] = 3
  MAX[254] = 3
  MAX[255] = 3
  MAX[256] = 3
  MAX[257] = 3
  MAX[258] = 3
  MAX[259] = 3
  MAX[260] = 3
  

### 相性設定 ##################################################################
  # 5段階で各アクターと各精霊の相性を設定できます。
  #---------------------------------------------------
  #   5   : 非常に良い(能力上昇:1.5倍)
  #   4   : やや良い  (能力上昇:1.2倍)
  #   3   : 普通      (能力上昇:1.0倍)
  #   2   : やや悪い  (能力上昇:0.8倍)
  #   1   : 非常に悪い(能力上昇:0.5倍)
  #   0   : パートナーにできない
  #---------------------------------------------------
  # [アクターID] = {精霊ID=>相性, …}
  #AFNTY[1] = {1=>3, 2=>2, 3=>5, 4=>1}
  #AFNTY[2] = {1=>3, 2=>3, 3=>1, 4=>5}
  #AFNTY[3] = {1=>1, 2=>5, 3=>3, 4=>4}
#AFNTY[4] = {1=>5, 2=>1, 3=>3, 4=>4}
# AFNTY[8] = {0=>0} # 全ての精霊をパートナーにできない


### 精霊レベル設定 ############################################################
  # レベル上昇あり
  USE_LV = true

  # 経験値入手対象
  #   0 : 戦闘メンバーのパートナーとなっている精霊のみ
  #   1 : 全メンバーのパートナーとなっている精霊のみ
  #   2 : 全精霊
  EXP_TARGET = 2

  # 経験値入出種別
  #   0 : 戦闘回数でLvUP
  #   1 : アクターと同じEXP
  EXP_TYPE = 1


### 閾値設定 ##################################################################
  # 各能力の閾値設定
  #   追加パラメータ = データベース上のパラメータ - PRM_BASE
  PRM_BASE = [
    0,   # 最大HP
    0,   # 最大MP
    0,    # 攻撃力
    0,    # 防御力
    0,    # 魔法力
    0,    # 魔法防御
    0,    # 敏捷性
    0     # 運
  ]


### ステータス画面表示設定 ####################################################
  # 特徴ステータス表示と表示順序(上から順)
  STS = {
    :status => true,   # ステータス表示(LVあり用)
    :stskl  => true,  # ステータス表示(LVなし用)
    :skills => true,   # 習得スキル
    :feater => true   # 特徴
  }


### 入替え画面表示設定 ########################################################
  # 特徴ステータス表示と表示順序(上から順)
  SHOW_ST = {
    :text   => false,  # 解説
    :status => true,   # 能力パラメータ
    :skills => true,   # 習得スキル
    :rate   => false,  # 耐性(属性有効度, 弱体有効度, ステート有効度, ステート無効化)
    :param  => false,#false,     # 能力値(通常. 追加, 特殊)
    :attack => false,  # 攻撃(属性、ステート, 速度補正, 追加回数)
    :skill  => false,  # スキル(タイプ追加・封印, 追加・封印)
    :equip  => false,  # 装備(武器タイプ, 防具タイプ, 固定, 封印, スロットタイプ)
    :other  => false   # その他(行動回数追加, 特殊フラグ, パーティ能力)
  }

  # スキル表示時の列数(1-2)
  SKILL_NUM = 2
  
end
[/pre]



[pre lang="ruby"]

#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム <入替画面>             by Claimh
#==============================================================================

#==============================================================================
# ■ Window_MenuCommand
#==============================================================================
class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 独自コマンドの追加用
  #--------------------------------------------------------------------------
  alias add_original_commands_partner add_original_commands
  def add_original_commands
    add_original_commands_partner
    add_command("部下", :partner, partner_enable?) # if $game_switches[1]
  end
  #--------------------------------------------------------------------------
  # ● コマンド追加?[パートナー設定]
  #--------------------------------------------------------------------------
  def add_spirits?
    $game_party.members.size > 0 and $game_party.spirit_num > 0 #and $game_switches[1]
  end
  #--------------------------------------------------------------------------
  # ● コマンド可能?[パートナー設定]
  #--------------------------------------------------------------------------
  def partner_enable?
    $game_party.spirit_num > 0 # and $game_switches[1]
  end
end

#==============================================================================
# ■ Scene_Menu
#==============================================================================
class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_command_window_partner create_command_window
  def create_command_window
    create_command_window_partner
    @command_window.set_handler(:partner, method(:command_personal))
  end
  #--------------------------------------------------------------------------
  # ● コマンド[パートナー設定]
  #--------------------------------------------------------------------------
  def command_partner
    SceneManager.call(Scene_EditPartner)
  end
  #--------------------------------------------------------------------------
  # ● 個人コマンド[決定]
  #--------------------------------------------------------------------------
  alias on_personal_ok_partner on_personal_ok
  def on_personal_ok
    if @command_window.current_symbol == :partner
      command_partner
    else
      on_personal_ok_partner
    end
  end
end



#==============================================================================
# ■ Window_SptActor
#==============================================================================
class Window_SptActor < Window_Base
  attr_accessor :index   # 入れ替え対象index
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(actor)
    @actor  = actor
    @spirit = nil
    @index  = 0
    @diff_on = false
    super(0, 0, Graphics.width, fitting_height(9))
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 描画エリア
  #--------------------------------------------------------------------------
  def redraw_area
    Rect.new(100, line_height, 150, contents.height - line_height)
  end
  #--------------------------------------------------------------------------
  # ● 差分描画on/off
  #--------------------------------------------------------------------------
  def diff_on
    @diff_on = true
    part_refresh
  end
  def diff_off
    @diff_on = false
    @spirit = nil
    part_refresh
  end
  #--------------------------------------------------------------------------
  # ● アクター設定
  #--------------------------------------------------------------------------
  def actor=(a)
    return if @actor == a
    @actor = a
    @spirit = nil
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 精霊設定
  #--------------------------------------------------------------------------
  def spirit=(s)
    return if @spirit == s
    @spirit = s
    part_refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    return if @actor.nil?
    draw_actor_name(@actor, 0, 0)
    draw_actor_face(@actor, 140, 0)
    draw_status_vocab
    part_refresh(false)
    change_color(system_color)
    draw_text(contents_width - 200, 0, 200, line_height, "部下")
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def part_refresh(clear=true)
    contents.fill_rect(redraw_area, Color.new(0,0,0,0)) if clear
    return if @actor.nil?
    draw_actor_status
  end
  #--------------------------------------------------------------------------
  # ● 顔グラフィックの描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_face(face_name, face_index, x, y, enabled = true)
    bitmap = Cache.face(face_name)
    h = line_height
    hh = (96 - h) / 2
    rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96 + hh, 96, h)
    contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # ● ステータス描画
  #--------------------------------------------------------------------------
  def draw_status_vocab
    8.times do |i|
      draw_param_vocab(20, i * line_height + line_height, i)
    end
  end
  #--------------------------------------------------------------------------
  # ● パラメータVcab描画
  #--------------------------------------------------------------------------
  def draw_param_vocab(x, y, param_id)
    change_color(system_color)
    draw_text(x, y, 120, line_height, Vocab::param(param_id))
  end
  #--------------------------------------------------------------------------
  # ● ステータス描画
  #--------------------------------------------------------------------------
  def draw_actor_status
    8.times do |i|
      draw_actor_param(@actor, @spirit, 10, i * line_height + line_height, i, 300)
    end
  end
  #--------------------------------------------------------------------------
  # ● パラメータ描画
  #--------------------------------------------------------------------------
  def draw_actor_param(actor, spirit, x, y, param_id, width)
    now = actor.param(param_id)
    change_color(normal_color)
    draw_text(x+90, y, 60, line_height, now, 2)
    return if !@diff_on or (spirit.nil? and @actor.partners[@index].nil?)
    # 差分描画
    draw_actor_new_param(actor, spirit, x, y, param_id, width)
  end
  #--------------------------------------------------------------------------
  # ● パラメータ描画
  #--------------------------------------------------------------------------
  def draw_actor_new_param(actor, spirit, x, y, param_id, width)
    now = actor.param(param_id)
    spirit_id = spirit.nil? ? 0 : spirit.spirit_id
    new = @actor.v_chg_param(spirit_id, @index, param_id)
    change_color(system_color)
    draw_text(x+150, y, 32, line_height, "→")
    change_color(param_change_color(new - now))
    draw_text(x+170, y, 60, line_height, new, 2)
  end
end


#==============================================================================
# ■ Window_SptListBase
#==============================================================================
class Window_SptListBase < Window_Selectable
  attr_accessor :info_window         # help_window2
  #--------------------------------------------------------------------------
  # ● ウィンドウのアクティブ化
  #--------------------------------------------------------------------------
  def activate
    select(0) if @index < 0
    super
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def item
    i_item(index)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def i_item(index)
    @data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # ● 選択項目の有効状態を取得
  #--------------------------------------------------------------------------
  def current_item_enabled?
    enable?(item)
  end
  #--------------------------------------------------------------------------
  # ● 許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def enable?(item)
    item.nil?
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = i_item(index)
    rect = item_rect(index)
    if item
      enabled = enable?(item)
      rect.x += draw_actor_line_graphic(item, rect.x, rect.y, enabled)
      draw_spirit_name(item, rect.x, rect.y, enabled)
    else
      draw_empty_text(rect)
    end
  end
  #--------------------------------------------------------------------------
  # ● 空項目の描画
  #--------------------------------------------------------------------------
  def draw_empty_text(rect)
  end
  #--------------------------------------------------------------------------
  # ● アクター設定
  #--------------------------------------------------------------------------
  def actor=(a)
    return if @actor == a
    @actor = a
    data_refresh
  end
  #--------------------------------------------------------------------------
  # ● カーソルを右に移動
  #--------------------------------------------------------------------------
  def cursor_right(wrap = false)
    @help_window.next_page
  end
  #--------------------------------------------------------------------------
  # ● カーソルを左に移動
  #--------------------------------------------------------------------------
  def cursor_left(wrap = false)
    @help_window.prev_page
  end
end

#==============================================================================
# ■ Window_SptPartner
#==============================================================================
class Window_SptPartner < Window_SptListBase
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, height, actor)
    @actor = actor
    @data  = actor.partners
    y = line_height
    super(x, y, Graphics.width - x, height - y)
    self.z += 10
    self.opacity = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def data_refresh
    @data  = @actor.partners
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    @actor.max_spirits
  end
  #--------------------------------------------------------------------------
  # ● 許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def enable?(item)
    return false if item_max == 0
    super(item) or !item.partner_locked
  end
  #--------------------------------------------------------------------------
  # ● 空項目の描画
  #--------------------------------------------------------------------------
  def draw_empty_text(rect)
    draw_text(rect.x, rect.y, contents_width-8, line_height, "-- 空缺 --", 1)
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.spirit = item
    @info_window.index = @index unless @info_window.nil?
  end
end

#==============================================================================
# ■ Window_SptSpiritList
#==============================================================================
class Window_SptSpiritList < Window_SptListBase
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, actor)
    @actor = actor
    @data = $game_party.spirit_stay_members + [nil]
    super(x, y, Graphics.width - x, Graphics.height - y)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def data_refresh
    @data = $game_party.spirit_stay_members + [nil]
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    (@data ? @data.size : 0)
  end
  #--------------------------------------------------------------------------
  # ● 許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def enable?(item)
    super(item) or @actor.can_partner(item.spirit_id)
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.spirit = item
    @info_window.spirit = item unless @info_window.nil?
  end
end



#==============================================================================
# ■ Window_SptSpirit
#==============================================================================
class Window_SptSpirit < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(y, width)
    @spirit = nil
    @page = 0
    @data = Spirits.status
    @max = @data.size
    @skill_start = @data.index(:skills)
    super(0, y, width, Graphics.height - y)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 1ページに表示するスキル数
  #--------------------------------------------------------------------------
  def page_skills
    ((contents.height - (line_height * 2)) / line_height) * sr
  end
  def sr
    Spirits::SKILL_NUM
  end
  #--------------------------------------------------------------------------
  # ● ページ切り替え
  #--------------------------------------------------------------------------
  def page=(n)
    @page = [0, [@max-1, n].min].max
    refresh
  end
  def next_page
    self.page = @page + 1
  end
  def prev_page
    self.page = @page - 1
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の幅を計算
  #--------------------------------------------------------------------------
  def contents_width
    super + (@spirit.nil? ? 0 : 10)
  end
  #--------------------------------------------------------------------------
  # ● 精霊設定
  #--------------------------------------------------------------------------
  def spirit=(s)
    return if @spirit == s
    @spirit = s
    is_skill = @data[@page] == :skills
    data_refresh
    refresh
    self.page = @data.index(:skills) if is_skill
  end
  #--------------------------------------------------------------------------
  # ● データリフレッシュ
  #--------------------------------------------------------------------------
  def data_refresh
    @data = Spirits.status
    @skill_start = @data.index(:skills)
    unless @spirit.nil?
      n = @spirit.skills.size
      if n > page_skills
        (n / page_skills).times {|i| @data.insert(@skill_start, :skills) }
      end
    end
    @max = @data.size
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents_width != contents.width ? create_contents : contents.clear
    self.ox = 0
    return if @spirit.nil?
    self.ox = (@page == 0 ? 0 : (@page == (@max-1) ? 10 : 5))
    draw_spirit_name(@spirit, self.ox, 0)
    draw_actor_level(@spirit, self.ox + 170, 0) if Spirits::USE_LV
    draw_actor_face(@spirit, self.ox + contents_width - 100, 0)
    case @data[@page]
    when :text    # description
      draw_actor_nickname(@spirit, self.ox + 100, line_height)
      draw_text_ex(self.ox, line_height * 2, @spirit.description)
    when :status  # status
      draw_actor_status
    when :skills  # skill
      i = @page - @skill_start
      n = page_skills
      draw_actor_skills(@spirit.skills[i*n, n])
    else    # feature
      draw_feature_status
    end
  end
  #--------------------------------------------------------------------------
  # ● 顔グラフィックの描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_face(face_name, face_index, x, y, enabled = true)
    bitmap = Cache.face(face_name)
    h = line_height * 2
    hh = (96 - h) / 2
    rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96 + hh, 96, h)
    contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # ● 能力値の描画
  #--------------------------------------------------------------------------
  def draw_actor_status
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "部下实力")
    change_color(normal_color)
    8.times do |i|
      x = self.ox + i % 2 * contents_width / 2
      y = i / 2 * line_height + line_height * 2
      draw_spirit_param(@spirit, x, y, i)
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの描画
  #--------------------------------------------------------------------------
  def draw_actor_skills(skills)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "计谋战技")
    change_color(normal_color)
    skills.each_with_index do |skill, i|
      x = self.ox + i % sr * contents_width / sr
      y = i / sr * line_height + line_height * 2
      draw_item_name(skill, x, y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 特徴の描画
  #--------------------------------------------------------------------------
  def draw_feature_status
    ft = Spirits::Features.new(@spirit)
    case @data[@page]
    when :rate;   draw_feature_rate(ft)
    when :param;  draw_feature_param(ft)
    when :attack; draw_feature_attack(ft)
    when :skill;  draw_feature_skill(ft)
    when :equip;  draw_feature_equip(ft)
    when :other;  draw_feature_other(ft)
    end
  end
  #--------------------------------------------------------------------------
  # ● 特徴テキストの描画
  #--------------------------------------------------------------------------
  def draw_feature_text(features, x, y, w=contents_width, col_max=2)
    features.each_with_index do |ft, i|
      ww = w / col_max
      xx = x + i % col_max * ww
      yy = y + i / col_max * line_height
      draw_text(xx, yy, ww, line_height, ft[0])
      draw_text(xx, yy, ww, line_height, ft[1], 2) unless ft[1].nil?
    end
  end
  #--------------------------------------------------------------------------
  # ● 特徴:耐性の描画
  #--------------------------------------------------------------------------
  def draw_feature_rate(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "耐性")
    change_color(normal_color)
    draw_feature_text(ft.rate, self.ox, line_height * 2)
  end
  #--------------------------------------------------------------------------
  # ● 特徴:能力の描画
  #--------------------------------------------------------------------------
  def draw_feature_param(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "能力特性")
    change_color(normal_color)
    draw_feature_text(ft.param, self.ox, line_height * 2)
  end
  #--------------------------------------------------------------------------
  # ● 特徴:攻撃の描画
  #--------------------------------------------------------------------------
  def draw_feature_attack(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "攻击特性")
    change_color(normal_color)
    draw_feature_text(ft.attack, self.ox, line_height * 2)
  end
  #--------------------------------------------------------------------------
  # ● 特徴:スキルの描画
  #--------------------------------------------------------------------------
  def draw_feature_skill(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "技能特性")
    change_color(normal_color)
    draw_feature_text(ft.skill, self.ox, line_height * 2)
  end
  #--------------------------------------------------------------------------
  # ● 特徴:装備の描画
  #--------------------------------------------------------------------------
  def draw_feature_equip(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "装备特性")
    change_color(normal_color)
    draw_feature_text(ft.equip, self.ox, line_height * 2)
  end
  #--------------------------------------------------------------------------
  # ● 特徴:その他の描画
  #--------------------------------------------------------------------------
  def draw_feature_other(ft)
    change_color(system_color)
    draw_text(self.ox, line_height, 100, line_height, "特性")
    change_color(normal_color)
    draw_feature_text(ft.other, self.ox, line_height * 2)
  end
end



#==============================================================================
# ■ Scene_EditPartner
#==============================================================================
class Scene_EditPartner < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_actor_window
    create_partner_window
    create_sptlist_window
    create_spirit_window
    @sptlist_window.info_window = @actor_window
    @sptlist_window.help_window = @spirit_window
    @partner_window.info_window = @actor_window
    @partner_window.help_window = @spirit_window
  end
  #--------------------------------------------------------------------------
  # ● アクターウィンドウ作成
  #--------------------------------------------------------------------------
  def create_actor_window
    @actor_window = Window_SptActor.new(@actor)
  end
  #--------------------------------------------------------------------------
  # ● パートナーリストウィンドウ作成
  #--------------------------------------------------------------------------
  def create_partner_window
    @partner_window = Window_SptPartner.new(@actor_window.width-200, @actor_window.height, @actor)
    @partner_window.set_handler(:ok,       method(:partner_ok))
    @partner_window.set_handler(:cancel,   method(:return_scene))
    @partner_window.set_handler(:pagedown, method(:next_actor))
    @partner_window.set_handler(:pageup,   method(:prev_actor))
    @partner_window.activate
  end
  #--------------------------------------------------------------------------
  # ● パートナーウィンドウ : OK
  #--------------------------------------------------------------------------
  def partner_ok
    @actor_window.diff_on
    @sptlist_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 精霊リストウィンドウ作成
  #--------------------------------------------------------------------------
  def create_sptlist_window
    @sptlist_window = Window_SptSpiritList.new(@partner_window.x, @actor_window.height, @actor)
    @sptlist_window.set_handler(:ok,       method(:sptlist_ok))
    @sptlist_window.set_handler(:cancel,   method(:sptlist_cancel))
  end
  #--------------------------------------------------------------------------
  # ● 精霊リストウィンドウ : OK
  #--------------------------------------------------------------------------
  def sptlist_ok
    if @sptlist_window.item.nil?
      unless @partner_window.item.nil?
        @actor.change_partner(0, @partner_window.index)
      end
    else
      @actor.change_partner(@sptlist_window.item.spirit_id, @partner_window.index)
      @sptlist_window.item.change_partner(@actor.id)
    end
    unless @partner_window.item.nil?
      @partner_window.item.change_partner(0)
    end
    @sptlist_window.data_refresh
    @partner_window.data_refresh
    @partner_window.activate
    @actor_window.diff_off
  end
  #--------------------------------------------------------------------------
  # ● 精霊リストウィンドウ : Cancel
  #--------------------------------------------------------------------------
  def sptlist_cancel
    @partner_window.activate
    @actor_window.diff_off
  end
  #--------------------------------------------------------------------------
  # ● 精霊ウィンドウ作成
  #--------------------------------------------------------------------------
  def create_spirit_window
    @spirit_window = Window_SptSpirit.new(@actor_window.height, @partner_window.x)
  end
  #--------------------------------------------------------------------------
  # ● アクターの切り替え
  #--------------------------------------------------------------------------
  def on_actor_change
    @actor_window.actor   = @actor
    @partner_window.actor = @actor
    @sptlist_window.actor = @actor
    @partner_window.select(0)
    @sptlist_window.select(0)
    @partner_window.activate
  end
end
[/pre]



[pre lang="ruby"]
#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム <database>             by Claimh
#==============================================================================

#==============================================================================
# ■ Spirits
#==============================================================================
module Spirits
  #--------------------------------------------------------------------------
  # ● 精霊パートナー化
  #--------------------------------------------------------------------------
  def self.add_partner(actor_id, spirit_id)
    return unless $game_party.include_spirit?(spirit_id)
    return unless $game_actors[actor_id].can_join_partner(spirit_id)
    s_act_id = self.actor_id(spirit_id)
    return unless $game_actors[s_act_id].can_join_partner(actor_id)
    $game_actors[actor_id].add_partner(spirit_id)
    $game_actors[s_act_id].add_partner(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊パートナー解消
  #--------------------------------------------------------------------------
  def self.remove_partner(actor_id, spirit_id)
    $game_actors[actor_id].remove_partner(spirit_id)
    $game_actors[self.actor_id(spirit_id)].remove_partner(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊パートナー固定化
  #--------------------------------------------------------------------------
  def self.lock_partner(spirit_id)
    spirit = $game_actors[self.actor_id(spirit_id)]
    return unless spirit.has_partner?
    spirit.lock_partner
  end
  #--------------------------------------------------------------------------
  # ● 精霊パートナー固有化解除
  #--------------------------------------------------------------------------
  def self.unlock_partner(spirit_id)
    spirit = $game_actors[self.actor_id(spirit_id)]
    return unless spirit.has_partner?
    spirit.unlock_partner
  end
  #--------------------------------------------------------------------------
  # ● 精霊?
  #--------------------------------------------------------------------------
  def self.spirit?(actor_id)
    SPIRIT_ACTOR.has_value?(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊ID => アクターID
  #--------------------------------------------------------------------------
  def self.actor_id(spirit_id)
    SPIRIT_ACTOR[spirit_id].nil? ? 0 : SPIRIT_ACTOR[spirit_id]
  end
  #--------------------------------------------------------------------------
  # ● アクターID => 精霊ID
  #--------------------------------------------------------------------------
  def self.spirit_id(actor_id)
    id = SPIRIT_ACTOR.index(actor_id)
    id.nil? ? 0 : id
  end
  #--------------------------------------------------------------------------
  # ● パートナー最大数
  #--------------------------------------------------------------------------
  def self.max(actor_id)
    MAX[actor_id].nil? ? MAX[0] : MAX[actor_id]
  end
  #--------------------------------------------------------------------------
  # ● 相性
  #--------------------------------------------------------------------------
  def self.affinity(actor_id, spirit_id)
    if AFNTY[actor_id].nil?
      return AFNTY[0][0]
    elsif AFNTY[actor_id][spirit_id].nil?
      return AFNTY[actor_id][0].nil? ? AFNTY[0][0] : AFNTY[actor_id][0]
    else
      return AFNTY[actor_id][spirit_id]
    end
  end
  #--------------------------------------------------------------------------
  # ● 相性計算
  #--------------------------------------------------------------------------
  def self.affinity_param(param, actor_id, spirit_id)
    prm = [0, 0.5, 0.8, 1.0, 1.2, 1.5]  # 相性補正
    n = affinity(actor_id, spirit_id)
    p "[#{actor_id}, #{spirit_id}] => #{n}" if n.nil?
    (param * prm[affinity(actor_id, spirit_id)]).truncate
  end
  #--------------------------------------------------------------------------
  # ● 有効ステータス表示
  #--------------------------------------------------------------------------
  def self.sts
    STS.select {|key, v| v}.keys
  end
  #--------------------------------------------------------------------------
  # ● 有効ステータス表示
  #--------------------------------------------------------------------------
  def self.status
    SHOW_ST.select {|key, v| v}.keys
  end
end

#==============================================================================
# ■ Spirits::Features      : 特徴情報抽出
#==============================================================================
class Spirits::Features
  #--------------------------------------------------------------------------
  # ● 定数(特徴)
  #--------------------------------------------------------------------------
  FEATURE_ELEMENT_RATE  = 11              # 属性有効度
  FEATURE_DEBUFF_RATE   = 12              # 弱体有効度
  FEATURE_STATE_RATE    = 13              # ステート有効度
  FEATURE_STATE_RESIST  = 14              # ステート無効化
  FEATURE_PARAM         = 21              # 通常能力値
  FEATURE_XPARAM        = 22              # 追加能力値
  FEATURE_SPARAM        = 23              # 特殊能力値
  FEATURE_ATK_ELEMENT   = 31              # 攻撃時属性
  FEATURE_ATK_STATE     = 32              # 攻撃時ステート
  FEATURE_ATK_SPEED     = 33              # 攻撃速度補正
  FEATURE_ATK_TIMES     = 34              # 攻撃追加回数
  FEATURE_STYPE_ADD     = 41              # スキルタイプ追加
  FEATURE_STYPE_SEAL    = 42              # スキルタイプ封印
  FEATURE_SKILL_ADD     = 43              # スキル追加
  FEATURE_SKILL_SEAL    = 44              # スキル封印
  FEATURE_EQUIP_WTYPE   = 51              # 武器タイプ装備
  FEATURE_EQUIP_ATYPE   = 52              # 防具タイプ装備
  FEATURE_EQUIP_FIX     = 53              # 装備固定
  FEATURE_EQUIP_SEAL    = 54              # 装備封印
  FEATURE_SLOT_TYPE     = 55              # スロットタイプ
  FEATURE_ACTION_PLUS   = 61              # 行動回数追加
  FEATURE_SPECIAL_FLAG  = 62              # 特殊フラグ
  FEATURE_COLLAPSE_TYPE = 63              # 消滅エフェクト
  FEATURE_PARTY_ABILITY = 64              # パーティ能力
  #--------------------------------------------------------------------------
  # ● パーティ能力定数
  #--------------------------------------------------------------------------
  ABILITY_ENCOUNTER_HALF    = 0           # エンカウント半減
  ABILITY_ENCOUNTER_NONE    = 1           # エンカウント無効
  ABILITY_CANCEL_SURPRISE   = 2           # 不意打ち無効
  ABILITY_RAISE_PREEMPTIVE  = 3           # 先制攻撃率アップ
  ABILITY_GOLD_DOUBLE       = 4           # 獲得金額二倍
  ABILITY_DROP_ITEM_DOUBLE  = 5           # アイテム入手率二倍
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(spirit)
    @obj = spirit
  end
  #--------------------------------------------------------------------------
  # ● 属性耐性
  #--------------------------------------------------------------------------
  def element_rate
    fts = @obj.features(FEATURE_ELEMENT_RATE)
    fts.collect {|ft| ["#{$data_system.elements[ft.data_id]}属性耐性", sprintf("%d %", ft.value)] }
  end
  #--------------------------------------------------------------------------
  # ● 弱体耐性
  #--------------------------------------------------------------------------
  def debuff_rate
    fts = @obj.features(FEATURE_DEBUFF_RATE)
    fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}弱体耐性", sprintf("%d %", ft.value)] }
  end
  #--------------------------------------------------------------------------
  # ● ステート耐性
  #--------------------------------------------------------------------------
  def state_rate
    fts = @obj.features(FEATURE_STATE_RATE)
    fts.collect {|ft| ["#{$data_states[ft.data_id].name}耐性", sprintf("%d %", ft.value)] }
  end
  #--------------------------------------------------------------------------
  # ● ステート無効化
  #--------------------------------------------------------------------------
  def state_regist
    fts = @obj.features(FEATURE_STATE_RESIST)
    fts.collect {|ft| ["#{$data_states[ft.data_id].name}无效化", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 耐性情報取得
  #--------------------------------------------------------------------------
  def rate
    element_rate + debuff_rate + state_rate + state_regist
  end
  #--------------------------------------------------------------------------
  # ● 通常能力情報取得
  #--------------------------------------------------------------------------
  def nparam
    fts = @obj.features(FEATURE_PARAM)
    fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}", sprintf("%+d %", ft.value * 100)] }
  end
  #--------------------------------------------------------------------------
  # ● 追加能力情報取得
  #--------------------------------------------------------------------------
  def xparam
    txt = ["命中率", "闪避", "会心一击", "会心闪避",
           "兵法闪避", "策反", "反击",
           "#{$data_system.terms.basic[2]}恢复",
           "#{$data_system.terms.basic[4]}恢复",
           "#{$data_system.terms.basic[6]}恢复"]
    fts = @obj.features(FEATURE_XPARAM)
    fts.collect {|ft| ["#{txt[ft.data_id]}", sprintf("%+d %  ", ft.value * 100)] }
  end
  #--------------------------------------------------------------------------
  # ● 特殊能力情報取得
  #--------------------------------------------------------------------------
  def sparam
    txt = ["被攻击率", "防御効果率", "回复効果率", "草药知识",
            "#{$data_system.terms.basic[4]}消费率",
            "#{$data_system.terms.basic[6]}消费率",
           "武力伤害率", "计谋伤害率", "地图伤害率", "经验获得率"]
    fts = @obj.features(FEATURE_SPARAM)
    fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}", sprintf("%+d %  ", ft.value * 100)] }
  end
  #--------------------------------------------------------------------------
  # ● 能力情報取得
  #--------------------------------------------------------------------------
  def param
    nparam + xparam + sparam
  end
  #--------------------------------------------------------------------------
  # ● 攻撃属性情報取得
  #--------------------------------------------------------------------------
  def atk_element
    fts = @obj.features(FEATURE_ATK_ELEMENT)
    fts.collect {|ft| ["攻击时 属性", $data_system.elements[ft.data_id]] }
  end
  #--------------------------------------------------------------------------
  # ● 攻撃ステート情報取得
  #--------------------------------------------------------------------------
  def atk_state
    fts = @obj.features(FEATURE_ATK_STATE)
    fts.collect {|ft| ["攻击时 状态附加", $data_states[ft.data_id].name] }
  end
  #--------------------------------------------------------------------------
  # ● 攻撃速度補正情報取得
  #--------------------------------------------------------------------------
  def atk_speed
    fts = @obj.features(FEATURE_ATK_SPEED)
    fts.collect {|ft| ["攻击速度修正", ft.value.to_s] }
  end
  #--------------------------------------------------------------------------
  # ● 攻撃回数情報取得
  #--------------------------------------------------------------------------
  def atk_times
    fts = @obj.features(FEATURE_ATK_TIMES)
    fts.collect {|ft| ["#{ft.value}回攻击", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 攻撃情報取得
  #--------------------------------------------------------------------------
  def attack
    atk_element + atk_state + atk_speed + atk_times
  end
  #--------------------------------------------------------------------------
  # ● スキルタイプ追加情報取得
  #--------------------------------------------------------------------------
  def skill_add_type
    fts = @obj.features(FEATURE_STYPE_ADD)
    fts.collect {|ft| ["タイプ「#{$data_system.skill_types[ft.data_id]}」追加", nil] }
  end
  #--------------------------------------------------------------------------
  # ● スキルタイプ封印情報取得
  #--------------------------------------------------------------------------
  def skill_seal_type
    fts = @obj.features(FEATURE_STYPE_SEAL)
    fts.collect {|ft| ["タイプ「#{$data_system.skill_types[ft.data_id]}」封印", nil] }
  end
  #--------------------------------------------------------------------------
  # ● スキル追加情報取得
  #--------------------------------------------------------------------------
  def skill_add
    fts = @obj.features(FEATURE_SKILL_ADD)
    fts.collect {|ft| ["「#{$data_skills[ft.data_id].name}」追加", nil] }
  end
  #--------------------------------------------------------------------------
  # ● スキル封印情報取得
  #--------------------------------------------------------------------------
  def skill_seal
    fts = @obj.features(FEATURE_SKILL_SEAL)
    fts.collect {|ft| ["「#{$data_skills[ft.data_id].name}」封印", nil] }
  end
  #--------------------------------------------------------------------------
  # ● スキル情報取得
  #--------------------------------------------------------------------------
  def skill
    skill_add_type + skill_seal_type # + skill_add + skill_seal
  end
  #--------------------------------------------------------------------------
  # ● 武器タイプ装備情報取得
  #--------------------------------------------------------------------------
  def equip_wtype
    fts = @obj.features(FEATURE_EQUIP_WTYPE)
    fts.collect {|ft| ["「#{$data_sytem.weapon_types[ft.data_id]}」装備", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 防具タイプ装備情報取得
  #--------------------------------------------------------------------------
  def equip_atype
    fts = @obj.features(FEATURE_EQUIP_ATYPE)
    fts.collect {|ft| ["「#{$data_sytem.armor_types[ft.data_id]}」装備", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 装備固定情報取得
  #--------------------------------------------------------------------------
  def equip_fix
    fts = @obj.features(FEATURE_EQUIP_FIX)
    fts.collect {|ft| ["「#{$data_sytem.terms.etypes[ft.data_id]}」装備固定化", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 装備封印情報取得
  #--------------------------------------------------------------------------
  def equip_seal
    fts = @obj.features(FEATURE_EQUIP_SEAL)
    fts.collect {|ft| ["「#{$data_sytem.terms.etypes[ft.data_id]}」装備封印", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 装備情報取得
  #--------------------------------------------------------------------------
  def equip
    equip_wtype + equip_atype + equip_fix + equip_seal
  end
  #--------------------------------------------------------------------------
  # ● 行動回数追加情報取得
  #--------------------------------------------------------------------------
  def action_plus
    fts = @obj.features(FEATURE_ACTION_PLUS)
    fts.collect {|ft| ["「#{[ft.value]}」回行動", nil] }
  end
  #--------------------------------------------------------------------------
  # ● 特殊フラグ情報取得
  #--------------------------------------------------------------------------
  def special_flag
    str = []
    str.push(["自动战斗", nil]) if @obj.auto_battle?
    str.push(["自动防御", nil]) if @obj.guard?
    str.push(["援军", nil]) if @obj.substitute?
    str.push(["#{$data_system.terms.basic[6]}装备", nil]) if @obj.substitute?
    str
  end
  #--------------------------------------------------------------------------
  # ● パーティー能力情報取得
  #--------------------------------------------------------------------------
  def party_ability
    fts = @obj.features(FEATURE_PARTY_ABILITY)
    str = []
    str.push(["遇敌率减半", nil])   if fts.any? {|ft| ft.code_id == ABILITY_ENCOUNTER_HALF }
    str.push(["不会遇敌", nil])   if fts.any? {|ft| ft.code_id == ABILITY_ENCOUNTER_NONE }
    str.push(["不会被偷袭", nil])       if fts.any? {|ft| ft.code_id == ABILITY_CANCEL_SURPRISE }
    str.push(["偷袭几率", nil])   if fts.any? {|ft| ft.code_id == ABILITY_RAISE_PREEMPTIVE }
    str.push(["获得金双倍", nil])       if fts.any? {|ft| ft.code_id == ABILITY_GOLD_DOUBLE }
    str.push(["掉宝双倍", nil]) if fts.any? {|ft| ft.code_id == ABILITY_DROP_ITEM_DOUBLE }
    str
  end
  #--------------------------------------------------------------------------
  # ● その他情報取得
  #--------------------------------------------------------------------------
  def other
    action_plus + special_flag + party_ability
  end
  #--------------------------------------------------------------------------
  # ● 全特徴取得
  #--------------------------------------------------------------------------
  def all
    Spirits.status.inject([]) do |r, st|
      case st
      when :rate;   r += self.rate
      when :param;  r += self.param
      when :attack; r += self.attack
      when :skill;  r += self.skill
      when :equip;  r += self.equip
      when :other;  r += self.other
      end
    end
   end
end


#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  attr_reader :max_spirits        # 最大精霊数
  attr_reader :partner_locked     # 固定パートナー
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias setup_spirit setup
  def setup(actor_id)
    @partners = []
    @max_spirits = Spirits.max(actor_id)
    @parent_id = 0
    @partner_locked = false
    @is_spirit = Spirits.spirit?(actor_id)
    setup_spirit(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊?
  #--------------------------------------------------------------------------
  def spirit?
    @is_spirit
  end
  #--------------------------------------------------------------------------
  # ● 最大精霊数変更
  #--------------------------------------------------------------------------
  def max_spirits=(num)
    @max_spirits = [1, num].max unless spirit?
  end
  #--------------------------------------------------------------------------
  # ● 精霊ID
  #--------------------------------------------------------------------------
  def spirit_id
    spirit? ? Spirits.spirit_id(@actor_id) : 0
  end
  #--------------------------------------------------------------------------
  # ● 精霊付与可能?
  #--------------------------------------------------------------------------
  def can_partner(spirit_id)
    spirit? ? false : (Spirits.affinity(@actor_id, spirit_id) != 0)
  end
  #--------------------------------------------------------------------------
  # ● 精霊交換可能?
  #--------------------------------------------------------------------------
  def can_change_partner(index)
    return false if spirit?
    return true  if @partners[index] == 0
    $game_actors[@partners[index]].partner_locked
  end
  #--------------------------------------------------------------------------
  # ● 精霊付与可能?
  #--------------------------------------------------------------------------
  def can_join_partner(partner_id=0)
    return (@parent_id == 0) if spirit?
    return false unless can_partner(partner_id)
    (@partners.size < @max_spirits)
  end
  #--------------------------------------------------------------------------
  # ● パートナー追加
  #--------------------------------------------------------------------------
  def add_partner(partner_id)
    if spirit?
      @parent_id = partner_id
    else
      return if @max_spirits == partner_num
      @partners.push(partner_id) unless @partners.include?(partner_id)
    end
  end
  #--------------------------------------------------------------------------
  # ● パートナー削除
  #--------------------------------------------------------------------------
  def remove_partner(partner_id)
    if spirit?
      @parent_id = 0
      unlock_partner
    else
      @partners.delete(partner_id)
    end
  end
  #--------------------------------------------------------------------------
  # ● パートナー変更
  #--------------------------------------------------------------------------
  def change_partner(partner_id, index=0)
    if spirit?
      @parent_id = partner_id
    else
      @partners[index] = partner_id
    end
  end
  #--------------------------------------------------------------------------
  # ● 仮想パートナー変更 パラメータ取得
  #--------------------------------------------------------------------------
  def v_chg_param(partner_id, index, param_id)
    return 0 if spirit?
    now_partner = @partners[index]
    change_partner(partner_id, index)
    prm = self.param(param_id)
    change_partner(now_partner, index)
    prm
  end
  #--------------------------------------------------------------------------
  # ● パートナー有り?
  #--------------------------------------------------------------------------
  def has_partner?
    spirit? ? (@parent_id != 0) : (!@partners.empty?)
  end
  def has_spirit?
    spirit? ? false : (!@partners.empty?)
  end
  #--------------------------------------------------------------------------
  # ● 精霊パートナー固定化
  #--------------------------------------------------------------------------
  def lock_partner
    return unless spirit?
    @partner_locked = true
  end
  #--------------------------------------------------------------------------
  # ● 精霊パートナー固有化解除
  #--------------------------------------------------------------------------
  def unlock_partner
    @partner_locked = false
  end
  #--------------------------------------------------------------------------
  # ● パートナー参照
  #--------------------------------------------------------------------------
  def partners
    return (has_partner? ? [$game_actors[@parent_id]] : []) if spirit?
    @partners.collect {|id| id.nil? ? nil : $game_actors[Spirits.actor_id(id)]}
  end
  def partners_objs
    partners.compact
  end
  #--------------------------------------------------------------------------
  # ● パートナー数参照
  #--------------------------------------------------------------------------
  def partner_num
    @partners.size
  end
  #--------------------------------------------------------------------------
  # ● 追加スキルの取得
  #--------------------------------------------------------------------------
  def added_skills
    has_spirit? ? partners_objs.inject(super) {|r, s| r |= s.skillids} : super
  end
  #--------------------------------------------------------------------------
  # ● スキルID郡 取得
  #--------------------------------------------------------------------------
  def skillids
    @skills
  end
  
  #--------------------------------------------------------------------------
  # ● 通常能力値の取得
  #--------------------------------------------------------------------------
  def param(param_id)
    super(param_id) - (spirit? ? Spirits::PRM_BASE[param_id] : 0)
end
   alias org_param param
  def param(param_id)
    org = org_param(param_id)
    if has_spirit?
      partners_objs.each do |s|
        org += Spirits.affinity_param(s.org_param(param_id), @actor_id, s.spirit_id)
      end
    end
    org
  end

  #--------------------------------------------------------------------------
  # ● 特徴を保持する全オブジェクトの配列取得
  #--------------------------------------------------------------------------
  alias org_feature_objects feature_objects
  def feature_objects
    org = org_feature_objects
    partners_objs.collect {|s| s.org_feature_objects }.each {|obj| org += obj} if has_spirit?
    org
  end
  #--------------------------------------------------------------------------
  # ● 控えメンバーの経験獲得率を取得
  #--------------------------------------------------------------------------
  alias reserve_members_exp_rate_spirits reserve_members_exp_rate
  def reserve_members_exp_rate
    spirit? ? 1 : reserve_members_exp_rate_spirits
  end
end


#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_spirits initialize
  def initialize
    initialize_spirits
    @spirits = []
  end
  #--------------------------------------------------------------------------
  # ● 初期パーティのセットアップ
  #--------------------------------------------------------------------------
  alias setup_starting_members_spirits setup_starting_members
  def setup_starting_members
    setup_starting_members_spirits
    @spirits = Spirits::START_V
    Spirits::START_P.each_pair do |aid, sid|
      if @actors.include?(aid) and @spirits.include?(sid)
        $game_actors[aid].add_partner(sid)
        $game_actors[Spirits.actor_id(sid)].add_partner(aid)
        $game_actors[aid].recover_all
      else
        p "START_P[#{aid} => #{sid}] is bad arg."
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 精霊を加える
  #--------------------------------------------------------------------------
  def include_spirit?(spirit_id)
    @spirits.include?(spirit_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊を加える
  #--------------------------------------------------------------------------
  def add_spirit(spirit_id)
    @spirits.push(spirit_id) unless include_spirit?(spirit_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊を外す
  #--------------------------------------------------------------------------
  def remove_spirit(spirit_id)
    members.each {|actor| actor.remove_partner(spirit_id)}
    @spirits.delete(spirit_id)
  end
  #--------------------------------------------------------------------------
  # ● 精霊リスト
  #--------------------------------------------------------------------------
  def spirit_members
    @spirits.collect {|id| spirit(id)}
  end
  #--------------------------------------------------------------------------
  # ● 待機 精霊リスト
  #--------------------------------------------------------------------------
  def spirit_stay_members
    spirit_members.select {|spirit| !spirit.has_partner?}
  end
  #--------------------------------------------------------------------------
  # ● 精霊数
  #--------------------------------------------------------------------------
  def spirit_num
    @spirits.size
  end
  #--------------------------------------------------------------------------
  # ● 精霊データ
  #--------------------------------------------------------------------------
  def spirit(spirit_id)
    $game_actors[Spirits.actor_id(spirit_id)]
  end
end



#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● 歩行グラフィックの描画
  #--------------------------------------------------------------------------
  def draw_line_character(character_name, character_index, x, y, enabled=true)
    return unless character_name
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    y += (line_height - ch) / 2 if ch < line_height
    n = character_index
    src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, [ch, line_height].min)
    contents.blt(x, y, bitmap, src_rect, enabled ? 255 : translucent_alpha)
    cw
  end
  #--------------------------------------------------------------------------
  # ● アクターの歩行グラフィック描画
  #--------------------------------------------------------------------------
  def draw_actor_line_graphic(actor, x, y, enabled=true)
    draw_line_character(actor.character_name, actor.character_index, x, y, enabled)
  end
  #--------------------------------------------------------------------------
  # ● パートナー名描画
  #--------------------------------------------------------------------------
  def draw_partner_name(actor, x, y)
    change_color(system_color)
    draw_text(x, y, contents_width, line_height, actor.spirit? ? "将领" : "副将")
    x += 100
    change_color(normal_color)
    if actor.has_partner?
      actor.partners.each_with_index {|s, i| draw_actor_line_graphic(s, x + 48 * i, y)}
    else
      draw_text(x, y, contents_width, line_height, "―――")
    end
  end
  #--------------------------------------------------------------------------
  # ● 名前の描画
  #--------------------------------------------------------------------------
  def draw_spirit_name(actor, x, y, enabled=true, width = 112)
    change_color(normal_color, enabled)
    draw_text(x, y, width, line_height, actor.name)
  end
  #--------------------------------------------------------------------------
  # ● 能力値の描画
  #--------------------------------------------------------------------------
  def draw_spirit_param(actor, x, y, param_id)
    change_color(system_color)
    draw_text(x, y, 120, line_height, Vocab::param(param_id))
    prm = actor.param(param_id)
    change_color(param_change_color(prm))
    if prm == 0
      draw_text(x + 100, y, 56, line_height, "----", 2)
    else
      draw_text(x + 100, y, 56, line_height, sprintf("%+d", prm), 2)
    end
  end
end


class << BattleManager
  #--------------------------------------------------------------------------
  # ● 経験値の獲得とレベルアップの表示
  #--------------------------------------------------------------------------
  alias gain_exp_spirits gain_exp
  def gain_exp
    gain_exp_spirits
    gain_spirit_exp if Spirits::USE_LV
  end
  #--------------------------------------------------------------------------
  # ● 精霊の経験値獲得
  #--------------------------------------------------------------------------
  def gain_spirit_exp
    case Spirits::EXP_TARGET
    when 0
      $game_party.battle_members.each do |actor|
        actor.partners.compact.each do |spirit|
          spirit.gain_exp(spirit_exp)
        end
      end
    when 1
      $game_party.all_members.each do |actor|
        actor.partners.compact.each do |spirit|
          spirit.gain_exp(spirit_exp)
        end
      end
    when 2
      $game_party.spirit_members.each do |spirit|
        spirit.gain_exp(spirit_exp)
      end
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 精霊用経験値
  #--------------------------------------------------------------------------
  def spirit_exp
    Spirits::EXP_TYPE == 0 ? 1 : $game_troop.exp_total
  end
end


if defined?(BtlrFv)
class << BattleManager
  #--------------------------------------------------------------------------
  # ● 獲得した経験値の表示
  #--------------------------------------------------------------------------
  alias display_result_spirit display_result
  def display_result
    display_result_spirit
    gain_spirit_exp if Spirits::USE_LV
  end
end
end # BtlrFv[/pre]
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部