#============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset SELL_RATE = "売却" # 売値操作属性 PRICE_BEGIN = 10 # 安くなり始める価格 PRICE_PERCENT = 0.2 # 1つにつき安くなる価格(%) end #============================================================================== # ■ RPG #------------------------------------------------------------------------------ #  データを集めたクラスです。 #============================================================================== module RPG class Weapon def price_sell rate = 100 for ele in element_set elename = $data_system.elements[ele] if elename =~ /^#{Numset::SELL_RATE}([+-]?([1-9]\d*|0)\.?\d*)([%%])?/ if $3 != nil rate_p += $1.to_i else rate_a += $1.to_i end end end return price * rate_p / 200 + rate_a end end class Armor def price_sell rate = 100 for ele in guard_element_set elename = $data_system.elements[ele] if elename =~ /^#{Numset::SELL_RATE}([+-]?([1-9]\d*|0)\.?\d*)([%%])?/ if $3 != nil rate_p += $1.to_i else rate_a += $1.to_i end end end return price * rate_p / 200 + rate_a end end class Item def price_sell rate = 100 for ele in element_set elename = $data_system.elements[ele] if /^#{Numset::SELL_RATE}([+-]?([1-9]\d*|0)\.?\d*)([%%])?/ === elename if $3 != nil rate_p += $1.to_i else rate_a += $1.to_i end end end return price * rate_p / 200 + rate_a end end end #============================================================================== # ■ Window_ShopSell #------------------------------------------------------------------------------ #  ショップ画面で、売却のために所持アイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_ShopSell < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] for i in 1...$data_items.size if $game_party.item_number(i) > 0 if $data_items[i].price_sell > 0 @data.push($data_items[i]) end end end for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 if $data_items[i].price_sell > 0 @data.push($data_weapons[i]) end end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 if $data_items[i].price_sell > 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 end #============================================================================== # ■ Window_ShopNumber #------------------------------------------------------------------------------ #  ショップ画面で、購入または売却するアイテムの個数を入力するウィンドウです。 #============================================================================== class Window_ShopNumber < Window_Base attr_writer :number # 書き込みのみ定義 #-------------------------------------------------------------------------- # ● アイテム、最大個数、価格の設定 #-------------------------------------------------------------------------- def set(item, max, price) @item = item @max = max @price = price @number = 1 @mode = mode 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 @mode == "buy" total_price = $scene.total_price elsif @mode == "sell" 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 #============================================================================== # ■ Scene_Shop #------------------------------------------------------------------------------ #  ショップ画面の処理を行うクラスです。 #============================================================================== class Scene_Shop #-------------------------------------------------------------------------- # ● 合計金額計算 #-------------------------------------------------------------------------- def total_price base = @number_window.number * @item.price if @number_window.number >= Numset::PRICE_BEGIN base -= (@item.price * Numset::PRICE_PERCENT * @number_window.number ** 2 / 100) end return base.round 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) for i in 1..99 @number_window.number = i # どうせ今使ってないのでこれも有り。 if total_price > $game_party.gold @number_window.number -= 1 break end end # 最大購入可能個数を計算 max = @item.price == 0 ? 99 : @number_window.number max = [max, 99 - number].min # ウィンドウの状態を個数入力モードへ @buy_window.active = false @buy_window.visible = false @number_window.set(@item, max, @item.price, "buy") @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("") return end # C ボタンが押された場合 if Input.trigger?(Input::C) # アイテムを取得 @item = @sell_window.item # ステータスウィンドウのアイテムを設定 @status_window.item = @item # アイテムが無効の場合 if @item == nil # ブザー 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_sell, "sell") @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(total_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 # 売却する # 売却処理 $game_party.gain_gold(@number_window.number * @item.price_sell) 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