#============================================================================== # ■ RGSS3 装備拡張&装備拡張画面 Ver1.09 by 星潟 #------------------------------------------------------------------------------ # Scene_Equip等を大幅に変更し、装備拡張を実現します。 # なるべく、素材スクリプト欄の上側に挿入してください。 # 相当な量の設定項目がありますのでご注意下さい。 # また、SHIFTキーで装備解除を行えるようになっています。(無効にする事も出来ます) # 最強装備・全て外す等を選択する為のコマンドウィンドウについては # 「不要・画面描写上の無駄・無駄な操作が増える」と判断した為、消去しています。 # # このスクリプト導入時、以下のイベントスクリプトが使用可能になります。 # # ch_eq(a, b, c) # # =>アクターナンバーaの装備スロットb番をアイテムcに変更する。 # (装備スロットは武器を0番とする) # # ar_eq(a) # # =>アクターナンバーaの装備を全て解除する。 # # また、導入後は導入前のセーブデータを使用する事が基本的に出来なくなります。 # この為、未配布のゲームに導入される事を強くお勧めします。 # # # スクリプト製作者から二言ほど。 # # いらぬお節介でしょうが、表示項目を増やせるからといって # 増やせるだけ増やせばいいというものではありません。 # プレイして下さる方の事を考えた上で、必要な物を取捨選択して下さい。 # # また、本スクリプトを配布している場所にも書いてあると思いますが # 不具合報告は受け付けますが、要望については基本的に受け付けません。 # 更に変更したい場合は、自力でスクリプトを書き換えてください。 # # Ver1.01 不要な記述二点を消去しました。 # 設定項目に変更はないので、基本カスタマイズ項目を丸ごと # 旧Verから上書きしていただければ、Ver1.00での設定は生かせます。 # # Ver1.02 属性有効度・ステート有効度の表示不具合を修正しました。 # # Ver1.03 大量のスロットを用意した際、一定数以上は表示されなくなる不具合を修正。 # スロットタイプの判定を大きく修正し、動作を軽量化。 # 装備タイプの名称決定方式を変更。 # 旧Verから上書きしていただければ、装備タイプの名称以外は生かせます。 # # Ver1.04 通常アイテムが含まれていた場合にエラーが出る致命的不具合の修正。 # # Ver1.05 特殊能力値の表示を変更しました。 # # Ver1.06 装備解除処理を変更しました。 # また、競合の都合上コマンドウィンドウの追加処理を行いました。 # (ただし実際には表示されません) # # Ver1.07 プチ軽量化を行いしました。 # 指定した能力の装備後の状態の優劣判定を逆転させる機能を追加しました。 # デフォルトでMP消費率・物理ダメージ率・魔法ダメージ率を設定しています。 # その他、物理ダメージ率・魔法ダメージ率の設定名を変更しました。 # # Ver1.08 一部処理を差し戻し。 # # Ver1.09 ステート無効関連・ページ送り関連の処理が異常だった為修正しました。 # 装備項目増加前のセーブデータをロードした場合でも # 装備変更時にエラーにならないように対策しました。 # 640×480の画面サイズも想定し、設定を見直しました。 #============================================================================== module EQ_EX #============================================================================== #★★★基本カスタマイズ項目はここからです★★★ #============================================================================== #============================================================================== #★装備拡張の為の設定を行います★ #============================================================================== #装備タイプ設定の為に使用する設定用ワード #<装備タイプ:5>、<装備タイプ:8>等と防具のメモ欄に書き込むことで #その防具の装備タイプを内部的に変更する事が出来ます。 #なお、盾だろうと鎧だろうと、メモ欄の装備タイプが優先されます。 WORD = "装備タイプ" #通常時の腕装備(デフォルトでは武器・盾) SLT_ARM1 = [0, 1] #二刀流時の腕装備(デフォルトでは武器・武器) SLT_ARM2 = [0, 0] #防具(デフォルトでは頭・身体・装飾品) SLT_ARMOR = [2, 3, 5, 6, 4, 4, 8, 8, 7, 7] #装備タイプ別の名称を5番から順番に指定します。 #(1番:盾〜4番:装飾品で、それ以降の追加スロットについての名称設定です) SLT_NAME = ["肩","足","魔法書","技術書","宝珠","紋章","特殊"] #============================================================================== #★装備ステータスウィンドウにおける表示項目をページ別に設定します★ #============================================================================== #使用数ページ数の定義と、各ページに表示するステータス項目設定を行ってください。 # 0〜7 基本能力値(最大HP〜運) # # 8〜17 追加能力値(命中率〜TP再生率) # # 18〜27 特殊能力値(狙われ率〜経験値効率) # # 1001〜2000 ステータス有効度(ステートID順 例.戦闘不能……1001 混乱……1005) # # 2001〜3000 属性有効度(属性ID順 例.物理……2001 炎……2003) # # 3001〜3008 弱体有効度(最大HP〜運) #ページ最大数 ESP_MAX = 6 #装備ステータスウィンドウ表示項目設定 ページ1 ES_MAX = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] #装備ステータスウィンドウ表示項目設定 ページ2 ES_MAX2 = [12, 13, 14, 15, 16, 17, 18, 19] #装備ステータスウィンドウ表示項目設定 ページ3 ES_MAX3 = [20, 21, 22, 23, 24, 25, 26, 27] #装備ステータスウィンドウ表示項目設定 ページ4 ES_MAX4 = [2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010] #装備ステータスウィンドウ表示項目設定 ページ5 ES_MAX5 = [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008] #装備ステータスウィンドウ表示項目設定 ページ6 ES_MAX6 = [3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008] #装備ステータスウィンドウの各項目の装備後のデータにおいて #高い場合と低い場合、どちらを優位と見なすか #(デフォルトではMP消費率、物理ダメージ率、魔法ダメージ率を対象) ES_REV = [22,24,25] #============================================================================== #★装備ステータスウィンドウについて、表示形式を決定します★ #============================================================================== #装備ステータスウィンドウフォントサイズ ESFS = 20 #装備ステータスウィンドウ桁数(横) ES_CLM = 3 #装備ステータスウィンドウ桁数(縦)(名前欄も1行と見なす) ES_LM = 5 #装備ステータスウィンドウ桁数(横)2ページ目 ES_CLM2 = 2 #装備ステータスウィンドウ桁数(縦)2ページ目(名前欄も1行と見なす) ES_LM2 = 5 #装備ステータスウィンドウ桁数(横)3ページ目 ES_CLM3 = 2 #装備ステータスウィンドウ桁数(縦)3ページ目(名前欄も1行と見なす) ES_LM3 = 5 #装備ステータスウィンドウ桁数(横)4ページ目 ES_CLM4 = 2 #装備ステータスウィンドウ桁数(縦)4ページ目(名前欄も1行と見なす) ES_LM4 = 5 #装備ステータスウィンドウ桁数(横)5ページ目 ES_CLM5 = 2 #装備ステータスウィンドウ桁数(縦)5ページ目(名前欄も1行と見なす) ES_LM5 = 5 #装備ステータスウィンドウ桁数(横)6ページ目 ES_CLM6 = 2 #装備ステータスウィンドウ桁数(縦)6ページ目(名前欄も1行と見なす) ES_LM6 = 5 #ステータスの項目名描画開始位置と現在値描画開始位置の間 SNWD1 = 84 #ステータスの項目名矢印の位置 SNWD2 = 117 #ステータスの項目名描画開始位置と変更値描画開始位置の間 SNWD3 = 140 #ページ切り替えに使用するキーを設定します。使用しない場合はnilにして下さい。 ESP_KEY = :CTRL #============================================================================== #★装備品表示ウィンドウについて、表示形式を決定します★ #============================================================================== #装備品ウィンドウフォントサイズ EQFS = 20 #装備品ウィンドウ桁数(横) EW_LM = 2 #装備品ウィンドウ桁数(縦) EW_CLM = 6 #装備品の項目名描画開始位置とアイテム名描画開始位置の間 ENWD = 50 #装備解除に使用するキーを設定します。使用しない場合はnilにして下さい。 ER_KEY = :SHIFT end #============================================================================== #★ステータスの名前を追加定義します★ #============================================================================== module Vocab #命中率の名称を定義します。 X_0 = "命中率" #回避率の名称を定義します。 X_1 = "回避率" #会心率の名称を定義します。 X_2 = "会心率" #会心回避率の名称を定義します。 X_3 = "会回率" #魔法回避率の名称を定義します。 X_4 = "魔回率" #魔法反射率の名称を定義します。 X_5 = "魔反率" #反撃率の名称を定義します。 X_6 = "反撃率" #HP再生率の名称を定義します。 X_7 = "H自回" #MP再生率の名称を定義します。 X_8 = "M自回" #TP再生率の名称を定義します。 X_9 = "T自回" #狙われ率の名称を定義します。 X_10 = "狙われ率" #防御効果率の名称を定義します。 X_11 = "防御強化" #回復効果率の名称を定義します。 X_12 = "回復強化" #薬の知識の名称を定義します。 X_13 = "薬の知識" #MP消費率の名称を定義します。 X_14 = "M消費率" #TPチャージ率の名称を定義します。 X_15 = "TP増幅" #物理ダメージ率の名称を定義します。 X_16 = "物理D率" #魔法ダメージ率の名称を定義します。 X_17 = "魔法D率" #床ダメージ率の名称を定義します。 X_18 = "床D軽減" #経験値効率の名称を定義します。 X_19 = "経験増幅" #MP下降の名称を定義します。 Xd_0 = "HP下降" #MP下降の名称を定義します。 Xd_1 = "MP下降" #攻撃下降の名称を定義します。 Xd_2 = "攻撃下降" #防御下降の名称を定義します。 Xd_3 = "防御下降" #魔法下降の名称を定義します。 Xd_4 = "魔法下降" #魔防下降の名称を定義します。 Xd_5 = "魔防下降" #敏捷下降の名称を定義します。 Xd_6 = "敏捷下降" #運下降の名称を定義します。 Xd_7 = "運下降" end #============================================================================== #★★★基本カスタマイズ項目はここまでです。お疲れ様でした★★★ #============================================================================== module Vocab def self.xparam(param_id) case param_id when 0 X_0 when 1 X_1 when 2 X_2 when 3 X_3 when 4 X_4 when 5 X_5 when 6 X_6 when 7 X_7 when 8 X_8 when 9 X_9 end end def self.sparam(param_id) case param_id when 0 X_10 when 1 X_11 when 2 X_12 when 3 X_13 when 4 X_14 when 5 X_15 when 6 X_16 when 7 X_17 when 8 X_18 when 9 X_19 end end def self.debuff_rate(param_id) case param_id when 0 Xd_0 when 1 Xd_1 when 2 Xd_2 when 3 Xd_3 when 4 Xd_4 when 5 Xd_5 when 6 Xd_6 when 7 Xd_7 end end def self.etype(etype_id) return $data_system.terms.etypes[etype_id] if etype_id < 5 EQ_EX::SLT_NAME[etype_id - 5] end end class RPG::EquipItem < RPG::BaseItem def etype_id @true_etype_id ||= /<#{EQ_EX::WORD}[::](\d+)>/ =~ note ? $1.to_i : @etype_id end end class Game_System #-------------------------------------------------------------------------- # ロード後の処理 #-------------------------------------------------------------------------- alias on_after_load_equips_nil_break on_after_load def on_after_load on_after_load_equips_nil_break $data_actors.size.times {|i| a = $game_actors[i] a.equips_nil_break if a} end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 装備スロットの配列を取得 #-------------------------------------------------------------------------- def equip_slots (dual_wield? ? EQ_EX::SLT_ARM2 : EQ_EX::SLT_ARM1) + EQ_EX::SLT_ARMOR end #-------------------------------------------------------------------------- # 装備品オブジェクトの配列取得 #-------------------------------------------------------------------------- def equips_nil_break equip_slots.size.times {|i| @equips[i] = Game_BaseItem.new unless @equips[i]} end end #============================================================================== # ■ Window_SEI #------------------------------------------------------------------------------ #  装備画面で、装備中のアイテムと、選択中のアイテムを表示するウィンドウです。 #============================================================================== class Window_SEI < Window_Base attr_accessor :actor # 装備種類 attr_accessor :e_type # 装備種類 attr_accessor :equip1 # 装備中アイテム attr_accessor :equip2 # 装備対象アイテム #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, window_width, window_height) @equip1 = nil @equip2 = nil @e_type = nil refresh end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height 48 end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear draw_item(0, 0, @equip1, @equip2) end #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- def draw_item(x, y, item1, item2) if e_type != nil draw_e_type(4, y, @e_type) draw_e_item_name(70, y, item1) draw_right_arrow(contents_width / 2 + 24, y) draw_current_item_param(contents_width / 2 + 48, y, item2) end end #-------------------------------------------------------------------------- # 装備スロットの名前を取得 #-------------------------------------------------------------------------- def slot_name(index) @actor ? Vocab::etype(@actor.equip_slots[index]) : "" end #-------------------------------------------------------------------------- # 装備スロットの名前を描画 #-------------------------------------------------------------------------- def draw_e_type(x, y, e_type) change_color(system_color) draw_text(x, y, 60, line_height, slot_name(e_type)) end #-------------------------------------------------------------------------- # 現在の装備品を描画 #-------------------------------------------------------------------------- def draw_e_item_name(x, y, equip1) draw_item_name(equip1, x, y, enabled = true) end #-------------------------------------------------------------------------- # 選択中の装備品を描画 #-------------------------------------------------------------------------- def draw_current_item_param(x, y, equip2) draw_item_name(equip2, x, y, enabled = true) end #-------------------------------------------------------------------------- # 右向き矢印を描画 #-------------------------------------------------------------------------- def draw_right_arrow(x, y) change_color(system_color) draw_text(x, y, 22, line_height, "→", 1) end end #============================================================================== # ■ Window_EquipStatus #------------------------------------------------------------------------------ #  装備画面で、アクターの能力値変化を表示するウィンドウです。 #============================================================================== class Window_EquipStatus < Window_Base attr_reader :item_window # アイテムウィンドウ attr_accessor :page_data # アイテムウィンドウ #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_exeq initialize def initialize(x, y) @page_data = 0 initialize_exeq(x, y) end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height fitting_height(visible_line_number) end #-------------------------------------------------------------------------- # 桁数の取得 #-------------------------------------------------------------------------- def col_max case @page_data when 0;EQ_EX::ES_CLM when 1;EQ_EX::ES_CLM2 when 2;EQ_EX::ES_CLM3 when 3;EQ_EX::ES_CLM4 when 4;EQ_EX::ES_CLM5 when 5;EQ_EX::ES_CLM6 end end #-------------------------------------------------------------------------- # 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number case @page_data when 0;EQ_EX::ES_LM when 1;EQ_EX::ES_LM2 when 2;EQ_EX::ES_LM3 when 3;EQ_EX::ES_LM4 when 4;EQ_EX::ES_LM5 when 5;EQ_EX::ES_LM6 end end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear draw_actor_name(@actor, 4, 0) if @actor case @page_data when 0;data = EQ_EX::ES_MAX when 1;data = EQ_EX::ES_MAX2 when 2;data = EQ_EX::ES_MAX3 when 3;data = EQ_EX::ES_MAX4 when 4;data = EQ_EX::ES_MAX5 when 5;data = EQ_EX::ES_MAX6 end lm = 0 vlm = 0 plm = visible_line_number pclm = col_max self.contents.font.size = EQ_EX::ESFS data.each {|p_i| vlm += 1 if vlm == plm vlm = 1 lm += 1 end draw_item((window_width - 32) / pclm * lm, line_height * (vlm), p_i)} end #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- def draw_item(x, y, param_id) draw_param_name(x + 4, y, param_id) draw_current_param(x + EQ_EX::SNWD1, y, param_id) if @actor draw_right_arrow(x + EQ_EX::SNWD2, y) draw_new_param(x + EQ_EX::SNWD3, y, param_id) if @temp_actor end #-------------------------------------------------------------------------- # 能力値の名前を描画 #-------------------------------------------------------------------------- def draw_param_name(x, y, param_id) change_color(system_color) if param_id > 3000 pid = param_id - 3001 d = Vocab::debuff_rate(pid) elsif param_id > 2000 pid = param_id - 2000 d = $data_system.elements[pid] elsif param_id > 1000 pid = param_id - 1000 d = $data_states[pid].name elsif param_id > 17 pid = param_id - 18 d = Vocab::sparam(pid) elsif param_id > 7 pid = param_id - 8 d = Vocab::xparam(pid) else d = Vocab::param(param_id) end draw_text(x, y, 80, line_height, d) end #-------------------------------------------------------------------------- # 現在の能力値を描画 #-------------------------------------------------------------------------- def draw_current_param(x, y, param_id) change_color(normal_color) if param_id > 3000 pid = param_id - 3001 d = ((@actor.debuff_rate(pid) * -1 + 1) * 100).round elsif param_id > 2000 pid = param_id - 2000 d = ((@actor.element_rate(pid) * -1 + 1) * 100).round elsif param_id > 1000 pid = param_id - 1000 d = @actor.state_resist?(pid) ? "無効" : ((@actor.state_rate(pid) * -1 + 1) * 100).round elsif param_id > 17 pid = param_id - 18 d = ((@actor.sparam(pid) * 100)).round elsif param_id > 7 pid = param_id - 8 d = (@actor.xparam(pid) * 100).round else d = @actor.param(param_id) end draw_text(x-32, y, 64, line_height, d, 2) end #-------------------------------------------------------------------------- # 右向き矢印を描画 #-------------------------------------------------------------------------- def draw_right_arrow(x, y) change_color(system_color) draw_text(x, y, 22, line_height, "→", 1) end #-------------------------------------------------------------------------- # 装備変更後の能力値を描画 #-------------------------------------------------------------------------- def draw_new_param(x, y, param_id) rev = EQ_EX::ES_REV.include?(param_id) if param_id > 3000 pid = param_id - 3001 d1 = @temp_actor.debuff_rate(pid) * -1 + 1 d2 = @actor.debuff_rate(pid) * -1 + 1 c = param_change_color((d1 - d2) * (rev ? -1 : 1)) d3 = (d1 * 100).round elsif param_id > 2000 pid = param_id - 2000 d1 = @temp_actor.element_rate(pid) * -1 + 1 d2 = @actor.element_rate(pid) * -1 + 1 c = param_change_color((d1 - d2) * (rev ? -1 : 1)) d3 = (d1 * 100).round elsif param_id > 1000 pid = param_id - 1000 if @temp_actor.state_resist?(pid) if @actor.state_resist?(pid) c = normal_color else c = rev ? power_down_color : power_up_color end d3 = "無効" else d1 = @temp_actor.state_rate(pid) * -1 + 1 d2 = @actor.state_rate(pid) * -1 + 1 if @actor.state_resist?(pid) c = rev ? power_up_color : power_down_color else c = param_change_color((d1 - d2) * (rev ? -1 : 1)) end d3 = (d1 * 100).round end elsif param_id > 17 pid = param_id - 18 d1 = @temp_actor.sparam(pid) d2 = @actor.sparam(pid) c = param_change_color((d1 - d2) * (rev ? -1 : 1)) d3 = (d1 * 100).round elsif param_id > 7 pid = param_id - 8 d1 = @temp_actor.xparam(pid) d2 = @actor.xparam(pid) c = param_change_color((d1 - d2) * (rev ? -1 : 1)) d3 = (d1 * 100).round else d1 = @temp_actor.param(param_id) d2 = @actor.param(param_id) c = param_change_color((d1 - d2) * (rev ? -1 : 1)) d3 = d1 end change_color(c) draw_text(x-32, y, 64, line_height, d3, 2) end end #============================================================================== # ■ Window_EquipSlot #------------------------------------------------------------------------------ #  装備画面で、アクターが現在装備しているアイテムを表示するウィンドウです。 #============================================================================== class Window_EquipSlot < Window_Selectable attr_reader :index # 装備種類 #-------------------------------------------------------------------------- # 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number EQ_EX::EW_CLM + 1 end #-------------------------------------------------------------------------- # 桁数の取得 #-------------------------------------------------------------------------- def col_max EQ_EX::EW_LM end #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) return unless @actor self.contents.font.size = EQ_EX::EQFS rect = item_rect_for_text(index) change_color(system_color, enable?(index)) draw_text(rect.x, rect.y, 60, line_height, slot_name(index)) draw_item_name(@actor.equips[index], rect.x + EQ_EX::ENWD, rect.y, enable?(index)) end #-------------------------------------------------------------------------- # 装備品の解除 #-------------------------------------------------------------------------- def process_release if !@actor.equip_change_ok?(index) Sound.play_buzzer return false end return if @actor.equips[index] == nil Sound.play_equip @actor.change_equip(index, nil) refresh @item_window.refresh @status_window.refresh end #-------------------------------------------------------------------------- # ステータスウィンドウページチェンジ #-------------------------------------------------------------------------- def p_change return unless self.active Sound.play_cursor if @status_window.page_data == EQ_EX::ESP_MAX - 1 @status_window.page_data = 0 else @status_window.page_data += 1 end @status_window.refresh end alias refresh_ex_eq refresh def refresh create_contents refresh_ex_eq end end #============================================================================== # ■ Scene_Equip #------------------------------------------------------------------------------ #  装備画面の処理を行うクラスです。 #============================================================================== class Scene_Equip < Scene_MenuBase #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- def start super create_help_window create_status_window create_command_window create_sei_window create_slot_window create_item_window @command_window.x = Graphics.width * 2 @command_window.deactivate @command_window.visible = false @command_window.close end #-------------------------------------------------------------------------- # 装備品及び現在選択中の装備品表示用ウィンドウの作成 #-------------------------------------------------------------------------- def create_sei_window @sei_window = Window_SEI.new(0, @help_window.height + @status_window.height) @sei_window.viewport = @viewport @sei_window.visible = false @sei_window.actor = @actor end #-------------------------------------------------------------------------- # ステータスウィンドウの作成 #-------------------------------------------------------------------------- def create_status_window @status_window = Window_EquipStatus.new(0, @help_window.height) @status_window.viewport = @viewport @status_window.actor = @actor end #-------------------------------------------------------------------------- # スロットウィンドウの作成 #-------------------------------------------------------------------------- def create_slot_window wx = 0 wy = @status_window.y + @status_window.height ww = Graphics.width @slot_window = Window_EquipSlot.new(wx, wy, ww) @slot_window.height = Graphics.height - wy @slot_window.viewport = @viewport @slot_window.help_window = @help_window @slot_window.status_window = @status_window @slot_window.actor = @actor @slot_window.set_handler(:ok, method(:on_slot_ok)) @slot_window.set_handler(:release, method(:off_slot_ok)) @slot_window.set_handler(:pagechange, method(:p_change)) @slot_window.set_handler(:cancel, method(:return_scene)) @slot_window.set_handler(:pagedown, method(:next_actor)) @slot_window.set_handler(:pageup, method(:prev_actor)) @slot_window.activate @slot_window.select(0) end #-------------------------------------------------------------------------- # アイテムウィンドウの作成 #-------------------------------------------------------------------------- def create_item_window wx = 0 wy = @slot_window.y + @sei_window.height ww = Graphics.width wh = Graphics.height - wy @item_window = Window_EquipItem.new(wx, wy, ww, wh) @item_window.viewport = @viewport @item_window.help_window = @help_window @item_window.status_window = @status_window @item_window.actor = @actor @item_window.set_handler(:ok, method(:on_item_ok)) @item_window.set_handler(:cancel, method(:on_item_cancel)) @item_window.set_handler(:pagechange, method(:p_change)) @slot_window.item_window = @item_window @item_window.visible = false end #-------------------------------------------------------------------------- # スロット[決定] #-------------------------------------------------------------------------- def on_slot_ok @item_window.visible = true @sei_window.visible = true @slot_window.visible = false @item_window.activate @item_window.select(0) @sei_window.e_type = @slot_window.index @sei_window.equip1 = @slot_window.item @sei_window.equip2 = @item_window.item @sei_window.refresh end #-------------------------------------------------------------------------- # スロット[解除] #-------------------------------------------------------------------------- def off_slot_ok end #-------------------------------------------------------------------------- # スロット[解除] #-------------------------------------------------------------------------- def p_change end #-------------------------------------------------------------------------- # 更新 #-------------------------------------------------------------------------- def update super @sei_window.equip1 = @slot_window.item @sei_window.equip2 = @item_window.item @sei_window.refresh end #-------------------------------------------------------------------------- # スロット[キャンセル] #-------------------------------------------------------------------------- def on_slot_cancel @slot_window.unselect return_scene end #-------------------------------------------------------------------------- # アイテム[決定] #-------------------------------------------------------------------------- def on_item_ok Sound.play_equip @actor.change_equip(@slot_window.index, @item_window.item) @slot_window.activate @slot_window.visible = true @sei_window.visible = false @item_window.visible = false @slot_window.refresh @item_window.unselect @item_window.refresh end #-------------------------------------------------------------------------- # アイテム[キャンセル] #-------------------------------------------------------------------------- def on_item_cancel @slot_window.activate @slot_window.visible = true @sei_window.visible = false @item_window.visible = false @item_window.unselect end #-------------------------------------------------------------------------- # アクターの切り替え #-------------------------------------------------------------------------- def on_actor_change @status_window.actor = @actor @slot_window.actor = @actor @item_window.actor = @actor @sei_window.actor = @actor @slot_window.activate end end class Window_EquipItem < Window_ItemList #-------------------------------------------------------------------------- # アイテムをリストに含めるかどうか #-------------------------------------------------------------------------- alias include_exeq? include? def include?(item) return true if item == nil return false unless item.is_a?(RPG::EquipItem) return include_exeq?(item) if item.etype_id < 5 return false if @slot_id < 0 return false unless item.etype_id == @actor.equip_slots[@slot_id] @actor.equippable?(item) end #-------------------------------------------------------------------------- # ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help super if @actor && @status_window temp_actor = Marshal.load(Marshal.dump(@actor)) temp_actor.force_change_equip(@slot_id, item) @status_window.set_temp_actor(temp_actor) end end #-------------------------------------------------------------------------- # ステータスウィンドウページチェンジ #-------------------------------------------------------------------------- def p_change return unless self.active Sound.play_cursor if @status_window.page_data == EQ_EX::ESP_MAX - 1 @status_window.page_data = 0 else @status_window.page_data += 1 end @status_window.refresh end end class Window_Selectable < Window_Base #-------------------------------------------------------------------------- # 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- alias process_handling_exeq process_handling def process_handling process_handling_exeq return process_release if handle?(:release) && Input.trigger?(EQ_EX::ER_KEY) return p_change if handle?(:pagechange) && Input.trigger?(EQ_EX::ESP_KEY) end end class Game_Interpreter #-------------------------------------------------------------------------- # 装備の変更 #-------------------------------------------------------------------------- def ch_eq(actor_number, slot_number, item_id) actor = $game_actors[actor_number] actor.change_equip_by_id(slot_number, item_id) if actor end #-------------------------------------------------------------------------- # 装備の全解除 #-------------------------------------------------------------------------- def ar_eq(actor_number) actor = $game_actors[actor_number] actor.equip_slots.size.times {|i| actor.change_equip_by_id(i, 0)} if actor end end #============================================================================== # ■ Game_BattlerBase #------------------------------------------------------------------------------ #  バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ # のクラスは Game_Battler クラスのスーパークラスとして使用されます。 #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # 装備可能判定 #-------------------------------------------------------------------------- alias equippable_exeq? equippable? def equippable?(item) return equippable_exeq?(item) unless item return equippable_exeq?(item) if item.etype_id < 5 return false unless item.is_a?(RPG::EquipItem) return false if equip_type_sealed?(item.etype_id) return equip_wtype_ok?(item.wtype_id) if item.is_a?(RPG::Weapon) return equip_atype_ok?(item.atype_id) if item.is_a?(RPG::Armor) return false end end