#============================================================================== # ■ VX-RGSS-22 アイテム画面-改 [Ver.1.0.0] by Claimh #------------------------------------------------------------------------------ # アイテム画面(戦闘以外)を改変します。 #------------------------------------------------------------------------------ # ◆アイテム分類 # アイテム : 通常アイテム # 装備品 : 武器・防具 # 貴重品 : 価格=0のアイテム # ◆捨てる # Xボタンでアイテムを捨てることができます。 #============================================================================== module ItemEx # アイテム分類で貴重品の項を使用する USE_PRECIAS = true # 捨てるあり USE_LOSE = true # 貴重品の放棄を許可する USE_LOSE_PRE = true end #============================================================================== # ■ ItemExData #------------------------------------------------------------------------------ # RPG::Item/Weapon/Armor用の共通クラス #============================================================================== class ItemExData # 初期化 def initialize(d) @item = d end # RPG::Item/Weapon/Armorデータ参照 def d return @item end # アイテム所持数 def number return $game_party.item_number(@item) end # アイテム破棄 def lose(n) $game_party.lose_item(@item, n) end # アイテム使用可能? def can_use? case @item when RPG::Item; return $game_party.item_can_use?(@item) when RPG::Weapon; return false when RPG::Armor; return false end end # アイテム破棄可能? def can_lose? return (ItemEx::USE_LOSE_PRE or @item.price != 0) end end #============================================================================== # ■ Window_ItemCmd #============================================================================== class Window_ItemCmd < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, WLH+32, 544, WLH+32) @commands = ["アイテム", "装備品"] @commands.push("貴重品") if ItemEx::USE_PRECIAS @item_max = @column_max = @commands.size refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) rect.x += 4 rect.width -= 8 self.contents.draw_text(rect.x, 0, rect.width, WLH, @commands[index]) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.ct = @index end end #============================================================================== # ■ Window_ItemList #============================================================================== class Window_ItemList < Window_Selectable MAX = ItemEx::USE_PRECIAS ? 3 : 2 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 112, 544, 306) @column_max = 2 @index = 0 @idx = [0, 0, 0] @ct = 0 all_refresh self.ct = @ct end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose super for b in @bitmap b.dispose unless b.nil? end end #-------------------------------------------------------------------------- # ● ウィンドウ内容の作成 #-------------------------------------------------------------------------- def create_contents end #-------------------------------------------------------------------------- # ● カテゴリ変更 #-------------------------------------------------------------------------- def ct=(c) save_idx @ct = c self.contents = @bitmap[c] @item_max = @data[c].size @idx[c] = @item_max - 1 if @idx[c] >= @item_max @idx[c] = 0 if @idx[c] < 0 load_idx end #-------------------------------------------------------------------------- # ● index保存 #-------------------------------------------------------------------------- def save_idx @idx[@ct] = self.index end def load_idx self.index = @idx[@ct] end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return i_item(@index) end def i_item(i) return @data[@ct][i] end #-------------------------------------------------------------------------- # ● 全リフレッシュ #-------------------------------------------------------------------------- def all_refresh @bitmap = [] @data = [] for c in 0...MAX data_refresh(c) end end #-------------------------------------------------------------------------- # ● データリフレッシュ #-------------------------------------------------------------------------- def data_refresh(c) @data[c] = [] for d in $game_party.items case c when 0 # アイテム next if !d.is_a?(RPG::Item) next if ItemEx::USE_PRECIAS and d.price == 0 @data[c].push(ItemExData.new(d)) when 1 # 武器防具 next if !d.is_a?(RPG::Weapon) and !d.is_a?(RPG::Armor) @data[c].push(ItemExData.new(d)) when 2 # 貴重品 next if !d.is_a?(RPG::Item) next if !ItemEx::USE_PRECIAS or d.price != 0 @data[c].push(ItemExData.new(d)) end if d.is_a?(RPG::Item) and d.id == $game_party.last_item_id @idx[c] = @data[c].size - 1 load_idx if @ct == c end end @bitmap[c].dispose unless @bitmap[c].nil? @item_max = @data[c].size @bitmap[c] = Bitmap.new(width - 32, @item_max > 0 ? (row_max*WLH) : WLH) refresh(c) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(c) self.ct = c for i in 0...@item_max draw_item(i, false) end end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(i, clear=true) itm = i_item(i) rect = item_rect(i) x = rect.x + 4 y = rect.y if clear self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) end rect.width -= 4 draw_item_name(itm.d, rect.x, rect.y, itm.can_use?) self.contents.draw_text(rect, sprintf(":%2d", itm.number), 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.item == nil ? "" : self.item.d.description) end end #============================================================================== # ■ Window_ItemNumber #============================================================================== class Window_ItemNumber < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, 300, WLH*2 + 32) @item = nil @max = 1 @number = 1 self.visible = false self.z += 10 self.opacity = 200 end #-------------------------------------------------------------------------- # ● アイテム、最大個数の設定 #-------------------------------------------------------------------------- def set(item, max) @item = item @max = max @number = 1 self.visible = true refresh end #-------------------------------------------------------------------------- # ● 入力された個数の設定 #-------------------------------------------------------------------------- def number return @number end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.draw_text(0, 0, 200, WLH, "捨てる数:") draw_item_name(@item, 4, WLH) self.contents.font.color = normal_color self.contents.draw_text(212, WLH, 20, WLH, "×") self.contents.draw_text(244, WLH, 20, WLH, @number.to_s, 2) self.cursor_rect.set(240, WLH, 28, WLH) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if self.active last_number = @number if Input.repeat?(Input::RIGHT) and @number < @max @number += 1 end if Input.repeat?(Input::LEFT) and @number > 1 @number -= 1 end if Input.repeat?(Input::UP) and @number < @max @number = [@number + 10, @max].min end if Input.repeat?(Input::DOWN) and @number > 1 @number = [@number - 10, 1].max end if @number != last_number Sound.play_cursor refresh end end end end #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ #  アイテム画面の処理を行うクラスです。 #============================================================================== class Scene_Item < Scene_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(index=0) @index = index end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_menu_background @viewport = Viewport.new(0, 0, 544, 416) @cmd_window = Window_ItemCmd.new @cmd_window.viewport = @viewport @item_window = Window_ItemList.new @item_window.viewport = @viewport @num_window = Window_ItemNumber.new(122, 200) @help_window = Window_Help.new @help_window.viewport = @viewport @target_window = Window_MenuStatus.new(0, 0) hide_target_window # @target_window.visible = @target_window.active = false @item_window.active = false @num_window.active = false @item_window.help_window = @help_window @cmd_window.help_window = @item_window end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_menu_background @viewport.dispose @cmd_window.dispose @item_window.dispose @num_window.dispose @help_window.dispose @target_window.dispose end #-------------------------------------------------------------------------- # ● 元の画面へ戻る #-------------------------------------------------------------------------- def return_scene $scene = Scene_Menu.new(@index) end #---------------------------------------------------------------------------- # ● フレーム更新 #---------------------------------------------------------------------------- def update if @cmd_window.active update_cmd elsif @item_window.active update_list elsif @num_window.active update_num elsif @target_window.active update_target end end #---------------------------------------------------------------------------- # ● フレーム更新 : cmd #---------------------------------------------------------------------------- def update_cmd @cmd_window.update if Input.trigger?(Input::B) Sound.play_cancel return_scene elsif Input.trigger?(Input::C) Sound.play_decision @cmd_window.active = false @item_window.active = true end end #---------------------------------------------------------------------------- # ● フレーム更新 : list #---------------------------------------------------------------------------- def update_list @item_window.update if Input.trigger?(Input::B) Sound.play_cancel @cmd_window.active = true @item_window.active = false @help_window.set_text("") elsif Input.trigger?(Input::C) if @item_window.item.nil? or !@item_window.item.can_use? Sound.play_buzzer return end @item = @item_window.item.d if @item != nil $game_party.last_item_id = @item.id end if $game_party.item_can_use?(@item) Sound.play_decision determine_item else Sound.play_buzzer end elsif Input.trigger?(Input::X) and ItemEx::USE_LOSE if @item_window.item.nil? or !@item_window.item.can_lose? Sound.play_buzzer return end Sound.play_decision @item = @item_window.item @num_window.set(@item.d, @item.number) @item_window.active = false @num_window.visible = @num_window.active = true end end #---------------------------------------------------------------------------- # ● フレーム更新 : num #---------------------------------------------------------------------------- def update_num @num_window.update if Input.trigger?(Input::B) Sound.play_cancel @item_window.active = true @num_window.visible = @num_window.active = false elsif Input.trigger?(Input::C) Sound.play_decision @item.lose(@num_window.number) if @item.number > 0 @item_window.draw_item(@item_window.index, true) else @item_window.data_refresh(@cmd_window.index) $game_party.last_item_id = 0 end @item_window.active = true @num_window.visible = @num_window.active = false end end #-------------------------------------------------------------------------- # ● ターゲット選択の更新 #-------------------------------------------------------------------------- def update_target @target_window.update if Input.trigger?(Input::B) Sound.play_cancel if $game_party.item_number(@item) == 0 # アイテムを使い切った場合 @item_window.data_refresh(@cmd_window.index) # ウィンドウの内容を再作成 end hide_target_window elsif Input.trigger?(Input::C) if not $game_party.item_can_use?(@item) Sound.play_buzzer else determine_target end end end end