################## 複数の装備箇所を同時に使用する装備の作成 ################## # # # 両手持ちなど、複数の装備箇所を同時に使う装備を作成します。 # # 「その装備に必要な装備箇所」を設定することができます。 # # PLURAL_SLOT_EQUIP_HASHにハッシュとして設定します。 # # 「"属性名"=>(使用するスロット)」で設定してください。 # # # # 例えば「{"両手持ち"=>[0,1], "全身鎧"=>[2,3]}」と設定した場合、 # # 両手持ち属性のついた装備は一番上と上から二番目の装備欄を消費します。 # # (デフォルトでは武器と盾の欄) # # このとき、この両手持ちの装備は「武器」か「盾」のいずれかに設定して下さい。 # # 「全身鎧」属性のついた装備は、上から三番目と上から四番目の装備欄を使用。 # # (デフォルトでは兜と鎧の欄) # # このとき、全身鎧の装備は「兜」か「鎧」のいずれかに設定して下さい。 # # # # このように「使用するスロットの中に含まれる部位に装備するもの」 # # として設定しないと、装備することができません。 # # # ############################################################################## # ココから設定 module Annex # 特殊装備の属性とその装備が消費する装備欄スロットのハッシュ PLURAL_SLOT_EQUIP_HASH = { "武器:両手持ち" => [0, 1], # 武器:両手持ち は 武器と盾 を使用 "鎧:全身鎧" => [2, 3] # 鎧:全身鎧 は 兜と鎧 を使用 } end # ココまで設定 #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 装備固定判定 # equip_type : 装備タイプ #-------------------------------------------------------------------------- alias plutal_equip_equip_fix? equip_fix? def equip_fix?(equip_type) # 複数装備が指定されているならtrueを返す return true if check_equip_slot?(equip_type) # 呼び戻した値を返す return plutal_equip_equip_fix?(equip_type) end #-------------------------------------------------------------------------- # ◎ 追加:選ばれたスロットに装備が追加可能か # index: 装備位置 #-------------------------------------------------------------------------- def check_equip_slot?(index) # 武器を装備していて、その武器が複数装備欄を使用する装備で # なおかつその指定されているスロットが武器欄で無い場合にtrue if @weapon_id > 0 and equip_check($data_weapons[@weapon_id].element_set, index) and index != 0 return true end # 防具を装備していて、その防具が複数装備欄を使用する装備で # なおかつその指定されているスロットがその装備欄で無い場合にtrue if @armor1_id > 0 and equip_check($data_armors[@armor1_id].guard_element_set, index) and index != 1 return true end if @armor2_id > 0 and equip_check($data_armors[@armor2_id].guard_element_set, index) and index != 2 return true end if @armor3_id > 0 and equip_check($data_armors[@armor3_id].guard_element_set, index) and index != 3 return true end if @armor4_id > 0 and equip_check($data_armors[@armor4_id].guard_element_set, index) and index != 4 return true end # 以上すべての条件に合致しない場合はfalseを返す return false end #-------------------------------------------------------------------------- # ◎ 追加:装備の中に任意のスロットへの装備が可能かどうか # element_set: 属性 # index: 装備位置 #-------------------------------------------------------------------------- def equip_check(element_set, index) # PLUTAL_SLOT_EQUIP_HASHのキーで回す for name in Annex::PLURAL_SLOT_EQUIP_HASH.keys # 渡された属性配列にこの名前が含まれているか if include_element?(element_set, name) # その装備に必要なスロットの中に指定したスロットが含まれるなら配列を返す if Annex::PLURAL_SLOT_EQUIP_HASH[name].include?(index) return Annex::PLURAL_SLOT_EQUIP_HASH[name] end end end return false end #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列にその属性が含まれるか否か #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end end #============================================================================== # ■ Window_EquipRight #============================================================================== class Window_EquipRight < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ (再定義) #-------------------------------------------------------------------------- def refresh self.contents.clear @data = [] @data.push($data_weapons[@actor.weapon_id]) @data.push($data_armors[@actor.armor1_id]) @data.push($data_armors[@actor.armor2_id]) @data.push($data_armors[@actor.armor3_id]) @data.push($data_armors[@actor.armor4_id]) @item_max = @data.size # 装備の変更が可能ならsystem_color、装備の変更が不可能ならdesabled_colorで self.contents.font.color = @actor.equip_fix?(0) ? disabled_color : system_color self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon) self.contents.font.color = @actor.equip_fix?(1) ? disabled_color : system_color self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.armor1) self.contents.font.color = @actor.equip_fix?(2) ? disabled_color : system_color self.contents.draw_text(4, 32 * 2, 92, 32, $data_system.words.armor2) self.contents.font.color = @actor.equip_fix?(3) ? disabled_color : system_color self.contents.draw_text(4, 32 * 3, 92, 32, $data_system.words.armor3) self.contents.font.color = @actor.equip_fix?(4) ? disabled_color : system_color self.contents.draw_text(5, 32 * 4, 92, 32, $data_system.words.armor4) draw_item_name(@data[0], 92, 32 * 0) draw_item_name(@data[1], 92, 32 * 1) draw_item_name(@data[2], 92, 32 * 2) draw_item_name(@data[3], 92, 32 * 3) draw_item_name(@data[4], 92, 32 * 4) end end #============================================================================== # ■ Scene_Equip #============================================================================== class Scene_Equip #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- alias plutal_equip_refresh refresh def refresh # 呼び戻し plutal_equip_refresh # アイテムウィンドウがアクティブの場合 if @item_window.active # 現在選択中のアイテムを取得 item2 = @item_window.item # 何も選択さえていないなら return return if item2 == nil # 選択中のアイテムが複数の装備領域を使う場合のみ以下を実行 if item2.is_a?(RPG::Weapon) slot_array = @actor.equip_check(item2.element_set, @right_window.index) elsif item2.is_a?(RPG::Armor) slot_array = @actor.equip_check(item2.guard_element_set, @right_window.index) end return if slot_array == false # 現在の装備をバックアップ equip_array = backup_equips # 装備を変更 last_hp = @actor.hp last_sp = @actor.sp # 装備に必要な装備欄をすべてはずす for i in slot_array @actor.equip(i, 0) end # 装備をする @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id) # 装備変更後のパラメータを取得 new_atk = @actor.atk new_pdef = @actor.pdef new_mdef = @actor.mdef # 装備に必要な装備欄をすべてはずす for i in slot_array @actor.equip(i, equip_array[i]) end @actor.hp = last_hp @actor.sp = last_sp # レフトウィンドウに描画 @left_window.set_new_parameters(new_atk, new_pdef, new_mdef) end end #-------------------------------------------------------------------------- # ○ フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias plutal_equip_update_item update_item def update_item # C ボタンが押された場合 if Input.trigger?(Input::C) item = @item_window.item if item != nil # 選択中のアイテムが複数の装備領域を使う場合のみ以下を実行 if item.is_a?(RPG::Weapon) slot_array = @actor.equip_check(item.element_set, @right_window.index) elsif item.is_a?(RPG::Armor) slot_array = @actor.equip_check(item.guard_element_set, @right_window.index) end if slot_array != false # 装備に必要な装備欄をすべてはずす for i in slot_array @actor.equip(i, 0) end end end # 装備 SE を演奏 $game_system.se_play($data_system.equip_se) # アイテムウィンドウで現在選択されているデータを取得 item = @item_window.item # 装備を変更 @actor.equip(@right_window.index, item == nil ? 0 : item.id) # ライトウィンドウをアクティブ化 @right_window.active = true @item_window.active = false @item_window.index = -1 # ライトウィンドウ、アイテムウィンドウの内容を再作成 @right_window.refresh # すべてのアイテムウィンドウを再作成 @item_window1.refresh @item_window2.refresh @item_window3.refresh @item_window4.refresh @item_window5.refresh return end # 呼び戻し plutal_equip_update_item end #-------------------------------------------------------------------------- # ◎ 追加:現在の装備のバックアップ #-------------------------------------------------------------------------- def backup_equips # 現在の装備を配列にして保存 return [@actor.weapon_id, @actor.armor1_id, @actor.armor2_id, @actor.armor3_id, @actor.armor4_id] end end