Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #==============================================================================
- # ** 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
Advertisement
Add Comment
Please, Sign In to add comment