#============================================================================== # Zenith RGSS11 買取屋 ver1.02 #   by 水夜 #  http://zenith.ifdef.jp/ #------------------------------------------------------------------------------ # 特定の商品を独自の価格で買い取ってくれるお店。 #============================================================================== #============================================================================== # □ カスタマイズポイント #============================================================================== module ZENITH11 # 買取価格個別設定 ( ID => 買取価格 ) # # アイテム BUYER_PRICE_I = {28=>1000, 31=>500, 32=>300} # 武器 BUYER_PRICE_W = {} # 防具 BUYER_PRICE_A = {} # 買取レート n (上で設定しなかった場合、価格×n の値段で買い取ってくれる) BUYER_RATE = 1 end #============================================================================== # □ カスタマイズポイント終了 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :buyer_calling # 買取屋呼び出しフラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias zenith11_initialize initialize def initialize @buyer_calling = false zenith11_initialize end end #============================================================================== # ■ Window_BuyerCommand #------------------------------------------------------------------------------ #  買取屋画面で、用件を選択するウィンドウです。 #============================================================================== class Window_BuyerCommand < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 64, 480, 64) self.contents = Bitmap.new(width - 32, height - 32) @item_max = 2 @column_max = 2 @commands = ["買い取ってもらう", "やめる"] 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 * 240 self.contents.draw_text(x, 0, 208, 32, @commands[index]) end end #============================================================================== # ■ Window_Buyer #------------------------------------------------------------------------------ #  買取屋画面で、買い取ってもらえる商品の一覧を表示するウィンドウです。 #============================================================================== class Window_Buyer < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # shop_goods : 商品 #-------------------------------------------------------------------------- def initialize(shop_goods) super(0, 128, 368, 352) @shop_goods = shop_goods refresh self.index = 0 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] for goods_item in @shop_goods case goods_item[0] when 0 item = $data_items[goods_item[1]] when 1 item = $data_weapons[goods_item[1]] when 2 item = $data_armors[goods_item[1]] end if item != nil @data.push(item) 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) price = ZENITH11::BUYER_PRICE_I[item.id] when RPG::Weapon number = $game_party.weapon_number(item.id) price = ZENITH11::BUYER_PRICE_W[item.id] when RPG::Armor number = $game_party.armor_number(item.id) price = ZENITH11::BUYER_PRICE_A[item.id] end if price == nil price = (item.price * ZENITH11::BUYER_RATE).round end # 所持数が 0 でなければ通常文字色に、 # そうでなければ無効文字色に設定 if number > 0 self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 y = index * 32 rect = Rect.new(x, y, self.width - 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, 88, 32, price.to_s, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.item == nil ? "" : self.item.description) end end #============================================================================== # ■ Scene_Buyer #------------------------------------------------------------------------------ #  買取屋画面の処理を行うクラスです。 #============================================================================== class Scene_Buyer #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # ヘルプウィンドウを作成 @help_window = Window_Help.new # コマンドウィンドウを作成 @command_window = Window_BuyerCommand.new # ゴールドウィンドウを作成 @gold_window = Window_Gold.new @gold_window.x = 480 @gold_window.y = 64 # ダミーウィンドウを作成 @dummy_window = Window_Base.new(0, 128, 640, 352) # 購入ウィンドウを作成 @buy_window = Window_Buyer.new($game_temp.shop_goods) @buy_window.active = false @buy_window.visible = false @buy_window.help_window = @help_window # 個数入力ウィンドウを作成 @number_window = Window_ShopNumber.new @number_window.active = false @number_window.visible = false # ステータスウィンドウを作成 @status_window = Window_ShopStatus.new @status_window.visible = false # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @help_window.dispose @command_window.dispose @gold_window.dispose @dummy_window.dispose @buy_window.dispose @number_window.dispose @status_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 @help_window.update @command_window.update @gold_window.update @dummy_window.update @buy_window.update @number_window.update @status_window.update # コマンドウィンドウがアクティブの場合: update_command を呼ぶ if @command_window.active update_command return end # 購入ウィンドウがアクティブの場合: update_buy を呼ぶ if @buy_window.active update_buy return end # 個数入力ウィンドウがアクティブの場合: update_number を呼ぶ if @number_window.active update_number 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 # 買い取ってもらう # 決定 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) # マップ画面に切り替え $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 # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # アイテムの所持数を取得 case @item when RPG::Item number = $game_party.item_number(@item.id) price = ZENITH11::BUYER_PRICE_I[@item.id] when RPG::Weapon number = $game_party.weapon_number(@item.id) price = ZENITH11::BUYER_PRICE_W[@item.id] when RPG::Armor number = $game_party.armor_number(@item.id) price = ZENITH11::BUYER_PRICE_A[@item.id] end if price == nil price = (@item.price * ZENITH11::BUYER_RATE).round end # 1 個も所持していない場合 if number == 0 # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) max = number # ウィンドウの状態を個数入力モードへ @buy_window.active = false @buy_window.visible = false @number_window.set(@item, max, price) @number_window.active = true @number_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 # ウィンドウの状態を買取モードへ @buy_window.active = true @buy_window.visible = true 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 @item when RPG::Item $game_party.lose_item(@item.id, @number_window.number) price = ZENITH11::BUYER_PRICE_I[@item.id] when RPG::Weapon $game_party.lose_weapon(@item.id, @number_window.number) price = ZENITH11::BUYER_PRICE_W[@item.id] when RPG::Armor $game_party.lose_armor(@item.id, @number_window.number) price = ZENITH11::BUYER_PRICE_A[@item.id] end if price == nil price = (@item.price * ZENITH11::BUYER_RATE).round end $game_party.gain_gold(@number_window.number * price) # 各ウィンドウをリフレッシュ @gold_window.refresh @buy_window.refresh @status_window.refresh # ウィンドウの状態を買取モードへ @buy_window.active = true @buy_window.visible = true return end end end class Scene_Map #-------------------------------------------------------------------------- # ● ショップの呼び出し #-------------------------------------------------------------------------- alias zenith11_call_shop call_shop def call_shop if $game_temp.buyer_calling # ショップ呼び出しフラグをクリア $game_temp.shop_calling = false # 買取屋呼び出しフラグをクリア $game_temp.buyer_calling = false # プレイヤーの姿勢を矯正 $game_player.straighten # 買取屋画面に切り替え $scene = Scene_Buyer.new else zenith11_call_shop end end end class Interpreter #-------------------------------------------------------------------------- # ● ラベル #-------------------------------------------------------------------------- alias zenith11_command_118 command_118 def command_118 # 「買取屋」ラベルの直後が「ショップの処理」の場合 if @list[@index + 1] != nil and @parameters[0] == "買取屋" and @list[@index + 1].code == 302 # 買取屋呼び出しフラグ $game_temp.buyer_calling = true end zenith11_command_118 end end