#============================================================================== # ■ XP-RGSS-71 アイテム画面-改 [Ver.1.0.0] by Claimh #------------------------------------------------------------------------------ # アイテム画面(戦闘以外)を改変します。 #------------------------------------------------------------------------------ # ◆アイテム分類 # アイテム : 通常アイテム # 装備品 : 武器・防具 # 貴重品 : 価格=0のアイテム # ◆捨てる # Aボタンでアイテムを捨てることができます。 #============================================================================== 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 case @item when RPG::Item; return $game_party.item_number(@item.id) when RPG::Weapon; return $game_party.weapon_number(@item.id) when RPG::Armor; return $game_party.armor_number(@item.id) end end # ターゲット def scope return 0 unless @item.is_a?(RPG::Item) return @item.scope end # ターゲット(味方)? def scope_actor? return (scope >= 3) end # ターゲット(味方全員)? def scope_all? return (scope == 4 or scope == 6) end # アイテム破棄 def lose(n) case @item when RPG::Item; return $game_party.lose_item(@item.id, n) when RPG::Weapon; return $game_party.lose_weapon(@item.id, n) when RPG::Armor; return $game_party.lose_armor(@item.id, n) end end # アイテム使用可能? def can_use? case @item when RPG::Item; return $game_party.item_can_use?(@item.id) 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 WLH = 32 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 64, 640, 64) self.contents = Bitmap.new(width - 32, height - 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) x = 4 + index % @column_max * ((self.width / @column_max - 32) + 32) self.contents.draw_text(x, 0, 128, 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 WLH = 32 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 128, 640, 352) @column_max = 2 @index = 0 @idx = [0, 0, 0] @bitmap = [] @ct = 0 all_refresh self.ct = @ct end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose super for b in @bitmap b.dispose unless b.nil? end 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 @data = [] for c in 0...MAX data_refresh(c) end end #-------------------------------------------------------------------------- # ● データリフレッシュ #-------------------------------------------------------------------------- def data_refresh(c) @data[c] = [] case c when 0 # アイテム for i in 1...$data_items.size next if ItemEx::USE_PRECIAS and $data_items[i].price == 0 @data[c].push(ItemExData.new($data_items[i])) if $game_party.item_number(i) > 0 end when 1 # 武器防具 for i in 1...$data_weapons.size @data[c].push(ItemExData.new($data_weapons[i])) if $game_party.weapon_number(i) > 0 end for i in 1...$data_armors.size @data[c].push(ItemExData.new($data_armors[i])) if $game_party.armor_number(i) > 0 end when 2 # 貴重品 for i in 1...$data_items.size next if !ItemEx::USE_PRECIAS or $data_items[i].price != 0 @data[c].push(ItemExData.new($data_items[i])) if $game_party.item_number(i) > 0 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) end end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(i, clear=false) itm = i_item(i) x = 4 + i % @column_max * ((self.width / @column_max - 32) + 32) y = i / @column_max * WLH if clear rect = Rect.new(x, y, self.contents.width / @column_max, WLH) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) end draw_item_name(itm.d, x, y, itm.can_use?) self.contents.draw_text(x + 240, y, 16, WLH, ":", 1) self.contents.draw_text(x + 256, y, 24, WLH, itm.number.to_s, 2) end #-------------------------------------------------------------------------- # ● アイテム名の描画 #-------------------------------------------------------------------------- def draw_item_name(item, x, y, enable) return if item == nil bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), enable ? 255 : 128) self.contents.font.color = normal_color self.contents.font.color.alpha = enable ? 255 : 128 self.contents.draw_text(x + 28, y, 212, WLH, item.name) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.item == nil ? "" : self.item.d.description) end end #============================================================================== # ■ Window_ItemNumber #============================================================================== class Window_ItemNumber < Window_Base WLH = 32 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, 300, WLH*2 + 32) self.contents = Bitmap.new(width - 32, height - 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 $game_system.se_play($data_system.cursor_se) refresh end end end end #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ #  アイテム画面の処理を行うクラスです。 #============================================================================== class Scene_Item #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(index=0) @index = index end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main start # 開始処理 Graphics.transition # トランジション実行 loop do Graphics.update # ゲーム画面を更新 Input.update # 入力情報を更新 update # フレーム更新 break if $scene != self # 画面が切り替わったらループを中断 end Graphics.update Graphics.freeze # トランジション準備 terminate # 終了処理 end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start @cmd_window = Window_ItemCmd.new @list_window = Window_ItemList.new @num_window = Window_ItemNumber.new(170, 240) @help_window = Window_Help.new @target_window = Window_Target.new # @target_window.visible = @target_window.active = false @list_window.active = false @num_window.active = false @list_window.help_window = @help_window @cmd_window.help_window = @list_window end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate @cmd_window.dispose @list_window.dispose @num_window.dispose @help_window.dispose @target_window.dispose end #---------------------------------------------------------------------------- # ● シーン終了 #---------------------------------------------------------------------------- def exit_scene $scene = Scene_Menu.new(@index) end #---------------------------------------------------------------------------- # ● フレーム更新 #---------------------------------------------------------------------------- def update if @cmd_window.active update_cmd elsif @list_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) $game_system.se_play($data_system.cancel_se) exit_scene elsif Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) @cmd_window.active = false @list_window.active = true end end #---------------------------------------------------------------------------- # ● フレーム更新 : list #---------------------------------------------------------------------------- def update_list @list_window.update if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @cmd_window.active = true @list_window.active = false @help_window.set_text("") elsif Input.trigger?(Input::C) if @list_window.item.nil? or !@list_window.item.can_use? $game_system.se_play($data_system.buzzer_se) return end @item = @list_window.item #start_target / use if @item.scope_actor? # 効果範囲が味方の場合 $game_system.se_play($data_system.decision_se) @list_window.active = false @target_window.x = (@list_window.index + 1) % 2 * 304 @target_window.visible = @target_window.active = true @target_window.index = @item.scope_all? ? -1 : 0 else # 効果範囲が味方以外の場合 if @item.d.common_event_id > 0 # コモンイベントが有効 $game_temp.common_event_id = @item.d.common_event_id # コモンイベントセット $game_system.se_play(@item.d.menu_se) if @item.d.consumable # 消耗品の場合 @item.lose(1) # 使用したアイテムを 1 減らす @list_window.draw_item(@list_window.index, true) end # マップ画面に切り替え $scene = Scene_Map.new return end $game_system.se_play($data_system.buzzer_se) # 効果ない end elsif Input.trigger?(Input::A) and ItemEx::USE_LOSE if @list_window.item.nil? or !@list_window.item.can_lose? $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @item = @list_window.item @num_window.set(@item.d, @item.number) @list_window.active = false @num_window.visible = @num_window.active = true end end #---------------------------------------------------------------------------- # ● フレーム更新 : num #---------------------------------------------------------------------------- def update_num @num_window.update if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @list_window.active = true @num_window.visible = @num_window.active = false elsif Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) @item.lose(@num_window.number) if @item.number > 0 @list_window.draw_item(@list_window.index, true) else @list_window.data_refresh(@cmd_window.index) end @list_window.active = true @num_window.visible = @num_window.active = false end end #---------------------------------------------------------------------------- # ● フレーム更新 : target #---------------------------------------------------------------------------- def update_target @target_window.update if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) if @item.number == 0 # アイテム切れなどで使用できなくなった場合 @list_window.data_refresh(@cmd_window.index) end @target_window.visible = @target_window.active = false @list_window.active = true elsif Input.trigger?(Input::C) if @item.number == 0 $game_system.se_play($data_system.buzzer_se) return end used = false if @target_window.index == -1 # ターゲットが全体 for i in $game_party.actors # パーティ全体にアイテムの使用効果を適用 used |= i.item_effect(@item.d) end elsif @target_window.index >= 0 # ターゲットが単体 target = $game_party.actors[@target_window.index] used = target.item_effect(@item.d) # ターゲットのアクターにアイテムの使用効果を適用 end unless used # アイテムを使わなかった場合 $game_system.se_play($data_system.buzzer_se) return end # アイテムを使った場合 $game_system.se_play(@item.d.menu_se) if @item.d.consumable # 消耗品の場合 @item.lose(1) # 使用したアイテムを 1 減らす @list_window.draw_item(@list_window.index, true) end @target_window.refresh if $game_party.all_dead? # 全滅の場合 $scene = Scene_Gameover.new # ゲームオーバー画面に切り替え elsif @item.d.common_event_id > 0 # コモンイベント ID が有効の場合 $game_temp.common_event_id = @item.d.common_event_id # コモンイベント呼び出し予約 $scene = Scene_Map.new # マップ画面に切り替え end end end end