#============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数を扱うモジュールです。 #============================================================================== module Numset SORT_SE = ["026-Door03", 80, 150] # ソート時のSE end # 下もカスタマイズしたいならご自由に class Game_Party #-------------------------------------------------------------------------- # ● 整理コマンド #-------------------------------------------------------------------------- def sort_commands result = ["ID", "名称", "アイテム優先", "武器優先", "防具優先", "使用可優先", "#{$data_system.words.atk}", "#{$data_system.words.pdef}", "#{$data_system.words.mdef}", "#{$data_system.words.str}", "#{$data_system.words.dex}", "#{$data_system.words.agi}", "#{$data_system.words.int}", "回避率", "買値"] if RPG::Item.method_defined?("sell_price") result.push("売値") end return result end #-------------------------------------------------------------------------- # ● アイテム整理 #-------------------------------------------------------------------------- def item_sort @itemlist.sort!{|a, b| # クラス本体を取得 if a.is_a?(String) and a =~ /(\w)(\d+)/ case $1 when "I" true_a = $data_items[$2.to_i] when "W" true_a = $data_weapons[$2.to_i] when "A" true_a = $data_armors[$2.to_i] end else result_a = -1 end if a.is_a?(String) and b =~ /(\w)(\d+)/ case $1 when "I" true_b = $data_items[$2.to_i] when "W" true_b = $data_weapons[$2.to_i] when "A" true_b = $data_armors[$2.to_i] end else result_b = -1 end for command in @sort_log case command when "ID" result_a = true_a.id result_b = true_b.id when "名称" result_a = true_a.name result_b = true_b.name when "アイテム優先" result_a = (true_a.is_a?(RPG::Item) ? 1 : -1) result_b = (true_b.is_a?(RPG::Item) ? 1 : -1) when "武器優先" result_a = (true_a.is_a?(RPG::Weapon) ? 1 : -1) result_b = (true_b.is_a?(RPG::Weapon) ? 1 : -1) when "防具優先" result_a = (true_a.is_a?(RPG::Armor) ? 1 : -1) result_b = (true_b.is_a?(RPG::Armor) ? 1 : -1) when "使用可優先" result_a = (true_a.class.method_defined?("occasion") ? 1 : -1) if result_a == 1 result_a = (true_a.occasion >= 2 ? 1 : -1) end result_b = (true_b.class.method_defined?("occasion") ? 1 : -1) if result_b == 1 result_b = (true_b.occasion >= 2 ? 1 : -1) end when "買値" result_a = true_a.price result_b = true_b.price when "売値" result_a = true_a.prece_sell result_b = true_b.price_sell when "#{$data_system.words.atk}" result_a = (true_a.class.method_defined?("atk") ? -true_a.atk : 1) result_b = (true_b.class.method_defined?("atk") ? -true_b.atk : 1) when "#{$data_system.words.pdef}" result_a = (true_a.class.method_defined?("pdef") ? -true_a.pdef : 1) result_b = (true_b.class.method_defined?("pdef") ? -true_b.pdef : 1) when "#{$data_system.words.mdef}" result_a = (true_a.class.method_defined?("mdef") ? -true_a.mdef : 1) result_b = (true_b.class.method_defined?("mdef") ? -true_b.mdef : 1) when "#{$data_system.words.str}" result_a = (true_a.class.method_defined?("str_plus") ? -true_a.str_plus : 1) result_b = (true_b.class.method_defined?("str_plus") ? -true_b.str_plus : 1) when "#{$data_system.words.dex}" result_a = (true_a.class.method_defined?("dex_plus") ? -true_a.dex_plus : 1) result_b = (true_b.class.method_defined?("dex_plus") ? -true_b.dex_plus : 1) when "#{$data_system.words.agi}" result_a = (true_a.class.method_defined?("agi_plus") ? -true_a.agi_plus : 1) result_b = (true_b.class.method_defined?("agi_plus") ? -true_b.agi_plus : 1) when "#{$data_system.words.int}" result_a = (true_a.class.method_defined?("int_plus") ? -true_a.int_plus : 1) result_b = (true_b.class.method_defined?("int_plus") ? -true_b.int_plus : 1) when "回避率" result_a = (true_a.class.method_defined?("eva") ? true_a.eva : -1) result_b = (true_b.class.method_defined?("eva") ? true_b.eva : -1) end # どちらかが大きかった場合 if (result_a <=> result_b) != 0 break end end result_a <=> result_b } # 同じコマンドを続けて選ぶと…… if self.reverse @itemlist.reverse! end end end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク # ラスのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :itemlist # 所持道具の配列 attr_accessor :sort_log # ソートログ。一般的に。 attr_accessor :reverse # 逆配置記憶。 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias :base_initialize :initialize def initialize base_initialize size = $data_weapons.size + $data_armors.size + $data_items.size - 3 # 偶数にする size += 1 if (size % 2) == 1 @itemlist = Array.new(size) @sort_log = sort_commands @reverce = false end #-------------------------------------------------------------------------- # ● アイテムの増加 (減少) # item_id : アイテム ID # n : 個数 #-------------------------------------------------------------------------- def gain_item(item_id, n) # ハッシュの個数データを更新 if item_id > 0 @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min # アイテム表示配列を更新 if @itemlist.index("I#{item_id}") == nil # @itemlist.index(nil)がnilになる事はまずない @itemlist[@itemlist.index(nil)] = "I#{item_id}" elsif @items[item_id] == 0 @itemlist[@itemlist.index("I#{item_id}")] = nil end end end #-------------------------------------------------------------------------- # ● 武器の増加 (減少) # weapon_id : 武器 ID # n : 個数 #-------------------------------------------------------------------------- def gain_weapon(weapon_id, n) # ハッシュの個数データを更新 if weapon_id > 0 @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min # アイテム表示配列を更新 if @itemlist.index("W#{weapon_id}") == nil # @itemlist.index(nil)がnilになる事はまずない @itemlist[@itemlist.index(nil)] = "W#{weapon_id}" elsif @weapons[weapon_id] == 0 @itemlist[@itemlist.index("W#{weapon_id}")] = nil end end end #-------------------------------------------------------------------------- # ● 防具の増加 (減少) # armor_id : 防具 ID # n : 個数 #-------------------------------------------------------------------------- def gain_armor(armor_id, n) # ハッシュの個数データを更新 if armor_id > 0 @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min # アイテム表示配列を更新 if @itemlist.index("A#{armor_id}") == nil # @itemlist.index(nil)がnilになる事はまずない @itemlist[@itemlist.index(nil)] = "A#{armor_id}" elsif @armors[armor_id] == 0 @itemlist[@itemlist.index("A#{armor_id}")] = nil end end end end #============================================================================== # ■ Window_Item #------------------------------------------------------------------------------ #  アイテム画面、バトル画面で、所持アイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_Item < Window_Selectable include XRXS_Cursor2 #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @data = [] # アイテムを追加(戦闘中でも武器と防具を追加) for i in $game_party.itemlist if i == nil @data.push(nil) elsif i =~ /^(\w)(\d+)/ case $1 when "I" @data.push($data_items[$2.to_i]) when "W" @data.push($data_weapons[$2.to_i]) when "A" @data.push($data_armors[$2.to_i]) end end end # 項目数が 0 でなければ全項目を描画 @item_max = $game_party.itemlist.size if @item_max > 0 # ビットマップの大きさは固定なので…… if self.contents == nil self.contents = Bitmap.new(width - 32, row_max * 32) else self.contents.clear end for i in 0...@item_max draw_item(i) if @data[i] != nil end end end end #============================================================================== # ■ Window_ShopSell #------------------------------------------------------------------------------ #  ショップ画面で、売却のために所持アイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_ShopSell < Window_Selectable include XRXS_Cursor2 #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @data = [] for i in $game_party.itemlist if i == nil @data.push(nil) elsif i =~ /^(\w)(\d+)/ case $1 when "I" @data.push($data_items[$2.to_i]) when "W" @data.push($data_weapons[$2.to_i]) when "A" @data.push($data_armors[$2.to_i]) end end end # 項目数が 0 でなければ全項目を描画 @item_max = $game_party.itemlist.size if @item_max > 0 # ビットマップの大きさは固定なので…… if self.contents == nil self.contents = Bitmap.new(width - 32, row_max * 32) else self.contents.clear end for i in 0...@item_max draw_item(i) if @data[i] != nil end end end end #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ #  アイテム画面の処理を行うクラスです。 #============================================================================== class Scene_Item #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias :base_main :main def main @sort_window = Window_Command.new(192, $game_party.sort_commands) @sort_window.active = false @sort_window.visible = false @sort_window.z += 3 base_main @sort_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias :base_update :update def update # ウィンドウを更新 @sort_window.update base_update # ソートウィンドウがアクティブの場合: update_sort を呼ぶ if @sort_window.active update_sort return end end #-------------------------------------------------------------------------- # ● フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias :base_update_item :update_item def update_item if @item_window.index2 >= 0 # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 第二カーソルを消す @item_window.index2 = -1 @item_window.active = true end # C ボタンが押された場合 if Input.trigger?(Input::C) or Input.trigger?(Input::X) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # 入れ替え sav = $game_party.itemlist[@item_window.index] $game_party.itemlist[@item_window.index] = $game_party.itemlist[@item_window.index2] $game_party.itemlist[@item_window.index2] = sav # 第二カーソルを消す @item_window.index2 = -1 @item_window.refresh end else base_update_item # A ボタンが押された場合 if Input.trigger?(Input::A) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ソートウィンドウをアクティブにする @item_window.active = false @sort_window.active = true @sort_window.visible = true return end # X ボタンが押された場合 if Input.trigger?(Input::X) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @item_window.index2 = @item_window.index end end end #-------------------------------------------------------------------------- # ● フレーム更新 (ソートウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_sort # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # アイテムウィンドウをアクティブにする @item_window.active = true @sort_window.active = false @sort_window.visible = false return end # C ボタンが押された場合 if Input.trigger?(Input::C) # ソート SE を演奏 se = Numset::SORT_SE Audio.se_play("Audio/SE/#{se[0]}", se[1], se[2]) command = $game_party.sort_commands[@sort_window.index] first = $game_party.sort_log[0] # 優先順位の最上位に持っていく $game_party.sort_log.delete(command) $game_party.sort_log.unshift(command) # 順位に従ってソート size = $game_party.itemlist.size $game_party.itemlist.compact! if $game_party.sort_log[0] == first $game_party.reverse ^= true else $game_party.reverse = false end $game_party.item_sort $game_party.itemlist[size] = nil # リフレッシュ @item_window.refresh @item_window.update_help return end end end #============================================================================== # ■ Scene_Shop #------------------------------------------------------------------------------ #  ショップ画面の処理を行うクラスです。 #============================================================================== class Scene_Shop #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias :base_main :main def main @sort_window = Window_Command.new(192, $game_party.sort_commands) @sort_window.active = false @sort_window.visible = false @sort_window.z += 3 base_main @sort_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias :base_update :update def update # ウィンドウを更新 @sort_window.update base_update # ソートウィンドウがアクティブの場合: update_sort を呼ぶ if @sort_window.active update_sort return end end #-------------------------------------------------------------------------- # ● フレーム更新 (売却ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias :base_update_sell :update_sell def update_sell if @sell_window.index2 >= 0 # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 第二カーソルを消す @sell_window.index2 = -1 @sell_window.active = true end # C ボタンが押された場合 if Input.trigger?(Input::C) or Input.trigger?(Input::X) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # 入れ替え sav = $game_party.itemlist[@sell_window.index] $game_party.itemlist[@sell_window.index] = $game_party.itemlist[@sell_window.index2] $game_party.itemlist[@sell_window.index2] = sav # 第二カーソルを消す @sell_window.index2 = -1 @sell_window.refresh end else base_update_sell # A ボタンが押された場合 if Input.trigger?(Input::A) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ソートウィンドウをアクティブにする @sell_window.active = false @sort_window.active = true @sort_window.visible = true return end # X ボタンが押された場合 if Input.trigger?(Input::X) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @sell_window.index2 = @sell_window.index end end end #-------------------------------------------------------------------------- # ● フレーム更新 (ソートウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_sort # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # アイテムウィンドウをアクティブにする @sell_window.active = true @sort_window.active = false @sort_window.visible = false return end # C ボタンが押された場合 if Input.trigger?(Input::C) # ソート SE を演奏 se = Numset::SORT_SE Audio.se_play("Audio/SE/#{se[0]}", se[1], se[2]) command = $game_party.sort_commands[@sort_window.index] first = $game_party.sort_log[0] # 優先順位の最上位に持っていく $game_party.sort_log.delete(command) $game_party.sort_log.unshift(command) # 順位に従ってソート size = $game_party.itemlist.size $game_party.itemlist.compact! if $game_party.sort_log[0] == first $game_party.reverse ^= true else $game_party.reverse = false end $game_party.item_sort $game_party.itemlist[size] = nil # リフレッシュ @sell_window.refresh @sell_window.update_help return end end end