#============================================================================== # ** ExCommand_BarterShop ~ Item Version of Exchange Shop ~ (MACKIE) #------------------------------------------------------------------------------ # This script allows you to exchange specific items, such as "coins" or # "medals," for other items when running [Shop Processing]. #============================================================================== # The ID of the switch used to enable the exchange shop. # When set to ON, [Shop Processing] will replace the regular shop with the # exchange shop ("Purchase Only" is also available here). This switch is turned # OFF automatically after the player is finished shopping. EXCMD_BTRSHOP_SID = 26 # Exchange shop command names. # From left to right: [Buy] [Sell] [Finished] EXCMD_BTRSHOP_VOCAB = ["Exchange", "Sell", "Finished"] # The exchange "item" used by the exchange shop. # Specify the item representing shop "credits" here. # Format is [Item ID, term for "credits", exchange rate] # Item price = original price ÷ exchange rate, rounded to 1. # (Example) If the exchange rate is 100, and an item costs 1650G normally, you # will need to exchange 17 "credits" (100G each) to obtain the item. EXCMD_BTRSHOP_ITEM = [31, "A", 100] # Notebox string identifier for specifying a product's exchange rate. # Items without this designation will use the default exchange rate above. # (For more information, see below) EXCMD_BTRSHOP_SIGNATURE = "*BARTER_RATE" # The ID of the variable that will store the shop identification number. # When an ID is assigned to this variable, [Shop Processing] will adjust the # exchange rate set per item, per shop. This way, it is possible for the same # item to have separate rates at each shop. (For more information, see below) EXCMD_BTRSHOP_VID = 11 # * Setting the exchange rate of items: # Format is "EXCMD_BTRSHOP_SIGNATURE [exchange rate] [shop ID: exchange rate]" # "|" acts aa a separator for each shop ID - exchange rate pairing. # (Example 1) *BARTER_RATE[20] => the item's exchange rate is 20. # (Example 2) *BARTER_RATE[1:20|2:15|3:25] => the item's exchange rate is # 20 in shop 1, 15 in shop 2, and 25 in shop 3 # (Example 3) *BARTER_RATE[20][2:10|3:15] => the item's exchange rate is # 10 in shop 2, 15 in shop 3, and 20 anywhere else. # # Priority is set as follows: shop ID rate > item rate > default shop rate # * Event procedure for creating the exchange shop: # 1) Set the exchange rate for individual items, if necessary. # 2) To create an exchange shop, run the following operations: # * Control Switches: [EXCMD_BTRSHOP_SID] = ON # * Control Variables: [EXCMD_BTRSHOP_VID] = exchange shop ID (if used) # * [Shop Processing...] (select items) #------------------------------------------------------------------------------ class Game_Party #-------------------------------------------------------------------------- # * Get Exchange Item #-------------------------------------------------------------------------- def barter_item return $data_items[EXCMD_BTRSHOP_ITEM[0]] end #-------------------------------------------------------------------------- # * Get Exchange Item Number #-------------------------------------------------------------------------- def barter_item_number return $game_party.item_number(barter_item) end #-------------------------------------------------------------------------- # * Get Exchange Rate #-------------------------------------------------------------------------- def barter_rate(item) rate = 0 shop_id = $game_variables[EXCMD_BTRSHOP_VID] sig = EXCMD_BTRSHOP_SIGNATURE reg = /#{Regexp.quote sig}(?:\[\d+\])?\[((\d+:\d+\|?)+)\]/ note = item.note.clone note.gsub!(/\r\n/, "") if shop_id > 0 and note.scan(reg).to_a[0] for s in $~[1].split(/\s*\|\s*/) r = s.split(/\s*:\s*/) rate = r[1].to_i if r[0].to_i == shop_id break if rate > 0 end end if rate == 0 if note[/#{Regexp.quote sig}\[(\d+)\]/].to_a[0] rate = $1.to_i else rate = (item.price / EXCMD_BTRSHOP_ITEM[2]).round end end return rate > 0 ? rate : 1 end end class Window_Base alias _excbshop_initialize initialize unless $@ #-------------------------------------------------------------------------- # * Object Initialization (Definition added) # x : window x-coordinate # y : window y-coordinate # width : window width # height : window height #-------------------------------------------------------------------------- def initialize(x, y, width, height) _excbshop_initialize(x, y, width, height) self.currency = Vocab::gold end #-------------------------------------------------------------------------- # * Set Currency #-------------------------------------------------------------------------- def currency=(currency) @currency = currency end #-------------------------------------------------------------------------- # * Determine if the Currency Value is Gold #-------------------------------------------------------------------------- def gold? return @currency == Vocab::gold end #-------------------------------------------------------------------------- # * Draw number with currency unit (Redefined) # value : Number (gold, etc) # x : draw spot x-coordinate # y : draw spot y-coordinate # width : Width #-------------------------------------------------------------------------- def draw_currency_value(value, x, y, width) cx = contents.text_size(@currency).width self.contents.font.color = normal_color self.contents.draw_text(x, y, width - cx - 2, WLH, value, 2) self.contents.font.color = system_color self.contents.draw_text(x, y, width, WLH, @currency, 2) end end class Window_Gold alias _excbshop_refresh refresh unless $@ #-------------------------------------------------------------------------- # * Refresh (Definition added) #-------------------------------------------------------------------------- def refresh _excbshop_refresh if $game_switches[EXCMD_BTRSHOP_SID] self.contents.clear value = gold? ? $game_party.gold : $game_party.barter_item_number draw_currency_value(value, 4, 0, 120) end end end class Window_ShopBuy alias _excbshop_refresh refresh unless $@ alias _excbshop_draw_item draw_item unless $@ #-------------------------------------------------------------------------- # * Refresh (Definition added) #-------------------------------------------------------------------------- def refresh unless $game_switches[EXCMD_BTRSHOP_SID] _excbshop_refresh else @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 and item != $game_party.barter_item # No exchange items @data.push(item) end end @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end end #-------------------------------------------------------------------------- # * Draw Item (Definition added) # index : item number #-------------------------------------------------------------------------- def draw_item(index) unless $game_switches[EXCMD_BTRSHOP_SID] _excbshop_draw_item(index) else item = @data[index] number = $game_party.item_number(item) barter_number = $game_party.barter_item_number barter_rate = $game_party.barter_rate(item) enabled = (barter_rate <= barter_number and number < 99) rect = item_rect(index) self.contents.clear_rect(rect) draw_item_name(item, rect.x, rect.y, enabled) rect.width -= 4 self.contents.draw_text(rect, barter_rate, 2) end end end class Scene_Shop alias _excbshop_start start unless $@ alias _excbshop_terminate terminate unless $@ alias _excbshop_create_command_window create_command_window unless $@ alias _excbshop_update_command_selection update_command_selection unless $@ alias _excbshop_update_buy_selection update_buy_selection unless $@ alias _excbshop_update_sell_selection update_sell_selection unless $@ alias _excbshop_decide_number_input decide_number_input unless $@ #-------------------------------------------------------------------------- # * Determine if this is an Exchange Shop #-------------------------------------------------------------------------- def barter? return $game_switches[EXCMD_BTRSHOP_SID] end #-------------------------------------------------------------------------- # * Start processing (Redefined) #-------------------------------------------------------------------------- def start _excbshop_start if barter? @gold_window.currency = EXCMD_BTRSHOP_ITEM[1] @number_window.currency = EXCMD_BTRSHOP_ITEM[1] @gold_window.refresh end end #-------------------------------------------------------------------------- # * Termination Processing (Definition added) #-------------------------------------------------------------------------- def terminate _excbshop_terminate $game_switches[EXCMD_BTRSHOP_SID] = false end #-------------------------------------------------------------------------- # * Create Command Window (Definition added) #-------------------------------------------------------------------------- def create_command_window unless barter? _excbshop_create_command_window else s1 = EXCMD_BTRSHOP_VOCAB[0] s2 = EXCMD_BTRSHOP_VOCAB[1] s3 = EXCMD_BTRSHOP_VOCAB[2] @command_window = Window_Command.new(384, [s1, s2, s3], 3) @command_window.y = 56 if $game_temp.shop_purchase_only @command_window.draw_item(1, false) end end end #-------------------------------------------------------------------------- # * Update Command Selection (Definition added) #-------------------------------------------------------------------------- def update_command_selection _excbshop_update_command_selection if Input.trigger?(Input::C) and barter? unless $game_temp.shop_purchase_only if @command_window.index == 1 # 売却する @gold_window.currency = Vocab::gold @number_window.currency = Vocab::gold @gold_window.refresh end end end end #-------------------------------------------------------------------------- # * Update Buy Item Selection (Definition added) #-------------------------------------------------------------------------- def update_buy_selection unless barter? _excbshop_update_buy_selection else @status_window.item = @buy_window.item if Input.trigger?(Input::B) Sound.play_cancel @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 if Input.trigger?(Input::C) @item = @buy_window.item barter_number = $game_party.barter_item_number barter_rate = $game_party.barter_rate(@item) number = $game_party.item_number(@item) if @item == nil or barter_rate > barter_number or number == 99 Sound.play_buzzer else Sound.play_decision max = barter_number / barter_rate max = [max, 99 - number].min @buy_window.active = false @buy_window.visible = false @number_window.set(@item, max, barter_rate) @number_window.active = true @number_window.visible = true end end end end #-------------------------------------------------------------------------- # * Update Sell Item Selection (Definition added) #-------------------------------------------------------------------------- def update_sell_selection _excbshop_update_sell_selection if Input.trigger?(Input::B) and barter? @gold_window.currency = EXCMD_BTRSHOP_ITEM[1] @number_window.currency = EXCMD_BTRSHOP_ITEM[1] @gold_window.refresh end end #-------------------------------------------------------------------------- # * Confirm Number Input (Definition added) #-------------------------------------------------------------------------- def decide_number_input unless barter? _excbshop_decide_number_input else Sound.play_shop @number_window.active = false @number_window.visible = false barter_rate = $game_party.barter_rate(@item) number = @number_window.number case @command_window.index when 0 # Buy (Exchange) $game_party.lose_item($game_party.barter_item, number * barter_rate) $game_party.gain_item(@item, number) @gold_window.refresh @buy_window.refresh @status_window.refresh @buy_window.active = true @buy_window.visible = true when 1 # Sell $game_party.gain_gold(number * (@item.price / 2)) $game_party.lose_item(@item, number) @gold_window.refresh @sell_window.refresh @status_window.refresh @sell_window.active = true @sell_window.visible = true @status_window.visible = false end end end end