#◆◇◆◇◆ 裏・売却ショップ ver 1.01 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 使用方法 通常は価格が0のアイテムは売却できませんが、 それを(それのみを)売却できるショップを実行できます。 裏・売却ショップに移行させるには イベントのスクリプトで $game_system.ex_shop = true を実行してください。 解除する場合は $game_system.ex_shop = false を実行してください。 その後でショップの処理を行うと、 そのショップが裏・売却ショップになります。 また、裏売却価格は イベントのスクリプトで アイテム→ $data_items[i].nwe_price = 10 武器→ $data_weapons[i].nwe_price = 10 防具→ $data_armors[i].nwe_price = 10 を実行してください。 [i]の部分がIDになり、 そこでIDを指定し、価格を設定してください。 なお、裏売却価格が 設定されていないアイテムはリストに追加されません。 また、$game_system.ex_shopを実行中は 購入が出来ません。 =end #============================================================================== # □ カスタマイズポイント #============================================================================== module MINTO # 裏・売却ショップを有効化 MINTO::RGSS["ex_shop"] = true end if MINTO::RGSS["ex_shop"] #============================================================================== # ■ RPG::Weapon #============================================================================== module RPG class Weapon alias initialize_MINT_EX_SHOP initialize def initialize # 元の処理を実行 initialize_MINT_EX_SHOP @nwe_price = 0 end attr_accessor :nwe_price end end #============================================================================== # ■ RPG::Armor #============================================================================== module RPG class Armor alias initialize_MINT_EX_SHOP initialize def initialize # 元の処理を実行 initialize_MINT_EX_SHOP @nwe_price = 0 end attr_accessor :nwe_price end end #============================================================================== # ■ RPG::Item #============================================================================== module RPG class Item alias initialize_MINT_EX_SHOP initialize def initialize # 元の処理を実行 initialize_MINT_EX_SHOP @nwe_price = 0 end attr_accessor :nwe_price end end #============================================================================== # ■ Game_System #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :ex_shop # 裏ショップフラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_MINT_EX_SHOP initialize def initialize # 元の処理を実行 initialize_MINT_EX_SHOP @ex_shop = false end end #============================================================================== # ■ Window_ShopNumber #============================================================================== class Window_ShopNumber < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_MINT_EX_SHOP initialize def initialize # 元の処理を実行 initialize_MINT_EX_SHOP @nwe_price = 0 end #-------------------------------------------------------------------------- # ● アイテム、最大個数、価格の設定 #-------------------------------------------------------------------------- def set(item, max, price, nwe_price) @item = item @max = max @nwe_price = nwe_price if $game_system.ex_shop @price = nwe_price else @price = price end @number = 1 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear draw_item_name(@item, 4, 96) self.contents.font.color = normal_color self.contents.draw_text(272, 96, 32, 32, "×") self.contents.draw_text(308, 96, 24, 32, @number.to_s, 2) self.cursor_rect.set(304, 96, 32, 32) # 合計価格と通貨単位を描画 domination = $data_system.words.gold cx = contents.text_size(domination).width if $game_system.ex_shop total_price = @nwe_price * @number else total_price = @price * @number end self.contents.font.color = normal_color self.contents.draw_text(4, 160, 328-cx-2, 32, total_price.to_s, 2) self.contents.font.color = system_color self.contents.draw_text(332-cx, 160, cx, 32, domination, 2) end end #============================================================================== # ■ Window_ShopSell #============================================================================== class Window_ShopSell < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] if $game_system.ex_shop for i in 1...$data_items.size if $game_party.item_number(i) > 0 && $data_items[i].nwe_price != nil @data.push($data_items[i]) end end for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 && $data_weapons[i].nwe_price != nil @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 && $data_armors[i].nwe_price != nil @data.push($data_armors[i]) end end else for i in 1...$data_items.size if $game_party.item_number(i) > 0 @data.push($data_items[i]) end end for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 @data.push($data_armors[i]) end end end # 項目数が 0 でなければビットマップを作成し、全項目を描画 @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] case item when RPG::Item number = $game_party.item_number(item.id) when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) end # 売却可能なら通常文字色に、そうでないなら無効文字色に設定 self.contents.font.color = normal_color if item.price > 0 || $game_system.ex_shop self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) self.contents.draw_text(x + 240, y, 16, 32, ":", 1) self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2) end end #============================================================================== # ■ Scene_Shop #============================================================================== class Scene_Shop #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 #@help_window.update @command_window.update if @command_window.active #@gold_window.update #@dummy_window.update @buy_window.update if @buy_window.active @sell_window.update if @sell_window.active @number_window.update if @number_window.active #@status_window.update # コマンドウィンドウがアクティブの場合: update_command を呼ぶ if @command_window.active update_command return end # 購入ウィンドウがアクティブの場合: update_buy を呼ぶ if @buy_window.active update_buy return end # 売却ウィンドウがアクティブの場合: update_sell を呼ぶ if @sell_window.active update_sell return end # 個数入力ウィンドウがアクティブの場合: update_number を呼ぶ if @number_window.active update_number return end if $game_system.ex_shop # ウィンドウの状態を売却モードへ @command_window.active = false @dummy_window.visible = false @sell_window.active = true @sell_window.visible = true @sell_window.refresh return end end #-------------------------------------------------------------------------- # ● フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_command # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # マップ画面に切り替え $scene = Scene_Map.new return end # C ボタンが押された場合 if Input.trigger?(Input::C) # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # 購入する if $game_system.ex_shop # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ウィンドウの状態を購入モードへ @command_window.active = false @dummy_window.visible = false @buy_window.active = true @buy_window.visible = true @buy_window.refresh @status_window.visible = true when 1 # 売却する # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ウィンドウの状態を売却モードへ @command_window.active = false @dummy_window.visible = false @sell_window.active = true @sell_window.visible = true @sell_window.refresh when 2 # やめる # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # マップ画面に切り替え $scene = Scene_Map.new end return end end #-------------------------------------------------------------------------- # ● フレーム更新 (購入ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_buy # ステータスウィンドウのアイテムを設定 @status_window.item = @buy_window.item # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # ウィンドウの状態を初期モードへ @command_window.active = true @dummy_window.visible = true @buy_window.active = false @buy_window.visible = false @status_window.visible = false @status_window.item = nil # ヘルプテキストを消去 @help_window.set_text("") return end # C ボタンが押された場合 if Input.trigger?(Input::C) # アイテムを取得 @item = @buy_window.item # アイテムが無効の場合、または価格が所持金より上の場合 if @item == nil or @item.price > $game_party.gold # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # アイテムの所持数を取得 case @item when RPG::Item number = $game_party.item_number(@item.id) when RPG::Weapon number = $game_party.weapon_number(@item.id) when RPG::Armor number = $game_party.armor_number(@item.id) end # すでに 99 個所持している場合 if number == 99 # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # 最大購入可能個数を計算 max = @item.price == 0 ? 99 : $game_party.gold / @item.price max = [max, 99 - number].min # ウィンドウの状態を個数入力モードへ @buy_window.active = false @buy_window.visible = false @number_window.set(@item, max, @item.price, @item.nwe_price) @number_window.active = true @number_window.visible = true end end #-------------------------------------------------------------------------- # ● フレーム更新 (売却ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_sell # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # ウィンドウの状態を初期モードへ @command_window.active = true @dummy_window.visible = true @sell_window.active = false @sell_window.visible = false @status_window.item = nil # ヘルプテキストを消去 @help_window.set_text("") if $game_system.ex_shop # マップ画面に切り替え $scene = Scene_Map.new end return end # C ボタンが押された場合 if Input.trigger?(Input::C) # アイテムを取得 @item = @sell_window.item # ステータスウィンドウのアイテムを設定 @status_window.item = @item # アイテムが無効の場合、または価格が 0 (売却不可) の場合 if @item == nil || @item.price == 0 && !$game_system.ex_shop # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アイテムの所持数を取得 case @item when RPG::Item number = $game_party.item_number(@item.id) when RPG::Weapon number = $game_party.weapon_number(@item.id) when RPG::Armor number = $game_party.armor_number(@item.id) end # 最大売却個数 = アイテムの所持数 max = number # ウィンドウの状態を個数入力モードへ @sell_window.active = false @sell_window.visible = false @number_window.set(@item, max, @item.price / 2, @item.nwe_price) @number_window.active = true @number_window.visible = true @status_window.visible = true end end #-------------------------------------------------------------------------- # ● フレーム更新 (個数入力ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_number # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # 個数入力ウィンドウを非アクティブ・不可視に設定 @number_window.active = false @number_window.visible = false # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # 購入する # ウィンドウの状態を購入モードへ @buy_window.active = true @buy_window.visible = true when 1 # 売却する # ウィンドウの状態を売却モードへ @sell_window.active = true @sell_window.visible = true @status_window.visible = false end return end # C ボタンが押された場合 if Input.trigger?(Input::C) # ショップ SE を演奏 $game_system.se_play($data_system.shop_se) # 個数入力ウィンドウを非アクティブ・不可視に設定 @number_window.active = false @number_window.visible = false # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # 購入する # 購入処理 $game_party.lose_gold(@number_window.number * @item.price) case @item when RPG::Item $game_party.gain_item(@item.id, @number_window.number) when RPG::Weapon $game_party.gain_weapon(@item.id, @number_window.number) when RPG::Armor $game_party.gain_armor(@item.id, @number_window.number) end # 各ウィンドウをリフレッシュ @gold_window.refresh @buy_window.refresh @status_window.refresh # ウィンドウの状態を購入モードへ @buy_window.active = true @buy_window.visible = true when 1 # 売却する # 売却処理 if $game_system.ex_shop $game_party.gain_gold(@number_window.number * (@item.nwe_price)) else $game_party.gain_gold(@number_window.number * (@item.price / 2)) end case @item when RPG::Item $game_party.lose_item(@item.id, @number_window.number) when RPG::Weapon $game_party.lose_weapon(@item.id, @number_window.number) when RPG::Armor $game_party.lose_armor(@item.id, @number_window.number) end # 各ウィンドウをリフレッシュ @gold_window.refresh @sell_window.refresh @status_window.refresh # ウィンドウの状態を売却モードへ @sell_window.active = true @sell_window.visible = true @status_window.visible = false end return end end end end