This script add a lost feature from old rpgmakers: the option to select if you
wanted to buy, sell or both.
Also adds the option of modifing the price based in %. Buy and sell discount are
separated, so you can make any combination.
In 2.0, you can define any currency to use for shop(exp, gold, variable...) and
add items that if you cant add to your inventory and that modifiy a switch,
variable or call a common event.
Using this feature you can create easily any set of shops that tells skills or sells
specialized things, or whatever you need, with autocalled common events and
custom currencys, and some extra features.
-------FULL FEATURES------------- Classic feature: the option to select if you wanted to buy, sell or both.
Prices modifications for selling and buying
Shops interfaces: You can make any number of different shops interface and
a default one, and then changue all values for they:
-Gold type by total exp, gold or variable.
-Gold name.
-Customizte the used commands buy, sell, exit and his names.
-Option to not show numbers or select item number
-Option to exit when a buy is done
-Windowskin
-Title/Introduction
Special things: These items are special exceptions, where you can define
some unique behaviors:
-Actor & class buy restrictions
-Active switch, modifiy variable or call common evenet when buyed
-Switch that define if can buy or not a thing and other for things that when
adquired cant be used more.
Capture:Demo(example and divided):http://www.megaupload.com/?d=DW5CMJ16
Script code(all in one):=begin
#==============================================================================
# Improved Shop
# By gerkrt/gerrtunk
# Version: 2.0
# License: GPL, credits
#==============================================================================
This script add a lost feature from old rpgmakers: the option to select if you
wanted to buy, sell or both.
Also adds the option of modifing the price based in %. Buy and sell discount are
separated, so you can make any combination.
In 2.0, you can define any currency to use for shop(exp, gold, variable...) and
add items that if you cant add to your inventory and that modifiy a switch,
variable or call a common event.
Using this feature you can create easily any set of shops that tells skills or sells
specialized things, or whatever you need, with autocalled common events and
custom currencys, and some extra features.
-------FULL FEATURES-------------
Classic feature: the option to select if you wanted to buy, sell or both.
Prices modifications for selling and buying
Shops interfaces: You can make any number of different shops interface and
a default one, and then changue all values for they:
-Gold type by total exp, gold or variable.
-Gold name.
-Customizte the used commands buy, sell, exit and his names.
-Option to not show numbers or select item number
-Option to exit when a buy is done
-Windowskin
-Title/Introduction
Special things: These items are special exceptions, where you can define
some unique behaviors:
-Actor & class buy restrictions
-Active switch, modifiy variable or call common evenet when buyed
-Switch that define if can buy or not a thing and other for things that when
adquired cant be used more.
--------DISCOUNTS, TYPE AND GOLD TYPE---------
Before calling a shop, call this script:
$game_temp.type = 1
$game_temp.buy_discount = 1.2
$game_temp.sell_discount = 0.8
$game_temp.gold_type = :gold
These is a call example.
$game_temp.type : When 2 player can only sell. When 1 player can only buy. When 0
can do both. Note that this ONLY works with default interface or the interfaces
that have the 3 commands.
$game_temp.buy_discount : When you buy items the price is multiplied with this number.
$game_temp.sell_discount : When you sell items the price is multiplied with this number.
Note that 0.2 , the . is like a ,.
After the sop call, these values are restored to default ones. This means that
you can call a shop wiyhout adding the script call and that it will use:
Type = Buy & Sell
Buy & Sell discounts = 1
As a final option, you can put the discount or type using the values of
a event variable calling this script:
v = $game_variables[1]
$game_temp.sell_discount = v
or whatever type, buy, etc. This way its settled the value of the var 1 to that
--------CUSTOM SHOPS---------
The main idea of these options is that you can create or configurate the normal
shop to do some special things, for example:
-A travel shop that when you exit, you travel automatically. You have the code
in the configuration already. Just call a shop with items 5,6,7,8 and changuing
the interface to :travel
-----INTERFACES------
A shop interface defines some basic things used in some shop. For example, the
currency type used, the vocabulary of the commands, etc. In this way, you can use
a different interface for each thing.
To add a interface paste the code each time:
:travel => {
:gold_type => [:var, 6],
:gold_word => 'Potatos',
:commands_used => [[:buy, 'Travel'], [:exit, 'Exit']],
:dont_show_number => true,
:exit_when_buy => false,
:windowskin => 'greenieskin',
:title => 'Travel merchant: Where you want to go?'
},
Where the :travel is a unique code used each time, and just respect the sintax
with the , {}, etc.
gold type: The currency used. Can be :gold, normal gold, :exp, will sum all party
actors exp and use it as his gold, and :var. var means that the gold value is
setted using a event variable you control, so, you can create any custom gold.
Note that for variables the syntax is different: [:var, 6], where 6 is the variable
id.
gold word: The word used in the money window of the shop.
commands used: Using this you can customitze a shop to be what you want. What you
do here is define the commands of the shop and the name thats drawn in the game.
The posibles commands codes to configure are :buy, :sell, :exit.
Then what you have to do is to add any of the three to the list, thats limited
in the []:
[[:code, 'name'], [:code2, 'name2'], [:code3, 'name3'], ]
dont_show_number: Use this if you dont want to show or select the item number and
it will buy automatically 1. It cant be used when selling.
:exit_when_buy: This make than when you buy the first item, the shop automatically
closes, so, you can only buy or active a single thing.
windowskin : special windowskin used for all the windows
title : text used for the description or introduction of a shop
To call a interface just use this call script:
$game_temp.shop_interface = :travel
Where travel is the interface name you write, that have to be new each time.
After the shop call, interface selection is reseted to default.
Note that exist a default interface. This is called always when no explicit interface
has been declared.
Finally you can desactive any option making they => false
-----SPECIAL THINGS----
Special things are items that are a exception from normal ones, that will work like
always. You have to use special things in order to create for example a skill learn
shop where each of his items call a common event and that event have a 'learn X skill'
in it.
Note althought that exist A LOT of options that you can use to create your custom.
Finally, you can use special things only with buy options.
shops:
# South Amband
5 => {
# variable di, valor
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => nil,
:can_be_adquired_by_class => false,
:can_be_adquired_by_actor => [1],
},
variable: this makes that when you buy that item, the variable X its added the Z
value, where: [X,Z],
switch: active switch of id 1 when buyed
switch_can_buy: the switch that have to be active to can buy the item
common_event: common event id called when buy. Using this you can call a script
call in it or whatever you want!
switch_adquired: when this switch is active, the thing cant be buyed more. Use it
for things that you want to buy only 1 time.
can_be_adquired_by_class: List of classes that can buy this item. Note that
it will search for a all the party actors. [id1, id2, id3]
can_be_adquired_by_actor: List of actors that can buy this item. Note that
it will search for a all the party actors. [id1, id2, id3]
Desactivating that options: Put they to => false. Then they wont do a thing.
The syntax to add more things is:
# New comment
23 => {
# variable di, valor
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => nil,
:can_be_adquired_by_class => false,
:can_be_adquired_by_actor => [1],
},
Where the 23 is the item id you want to use as a special thing, and the
# New comment the textthat you can modify to organitze the configuration(just dont
erase the #!).
Each time copy paste this, using a , as a separator and mantaining the starting
and final {] of the general and each thing config.
=end
module Wep
# Custom interfaces
Shop_interfaces = {
:travel => {
:gold_type => [:var, 6],
:gold_word => 'Potatos',
:commands_used => [[:buy, 'Travel'], [:exit, 'Exit']],
:dont_show_number => true,
:exit_when_buy => true,
:windowskin => false,
:title => 'Travel merchant: Where you want to go?'
},
# Its called when no interface specified. Traditional one.
:default => {
:gold_type => :gold,
:gold_word => 'Gold',
:commands_used => [[:buy, 'Buy'], [:sell, 'Sell'], [:exit, 'Exit']],
:dont_show_number => false,
:exit_when_buy => false,
:windowskin => false,
:title => false
}
}
# Things to use
Things = {
# South Amband
5 => {
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => false,
:can_be_adquired_by_class => false,
:can_be_adquired_by_actor => [1],
},
# Fantastica
6 => {
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => false,
:can_be_adquired_by_class => [1],
:can_be_adquired_by_actor => [1],
},
# Ridinia
7 => {
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => false,
:can_be_adquired_by_class => [1],
:can_be_adquired_by_actor => [1],
},
# Wepcondia
8 => {
:variable => [2,10],
:switch => 1,
:switch_can_buy => 5,
:common_event => 1,
:switch_adquired => false,
:can_be_adquired_by_class => [1],
:can_be_adquired_by_actor => [1],
},
}
end
#==============================================================================
# ** Window_ShopBuy
#------------------------------------------------------------------------------
# This window displays buyable goods on the shop screen.
#==============================================================================
class Window_ShopBuy < Window_Selectable
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
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
# Only push the ones that arent adquired and if item
if item.is_a? RPG::Item and Wep::Things[item.id] != nil and
Wep::Things[item.id][:switch_adquired] != false and
$game_switches[Wep::Things[item.id][:switch_adquired]]
# Or if the switch to buy isnt active
elsif item.is_a? RPG::Item and Wep::Things[item.id] != nil and
Wep::Things[item.id][:switch_can_buy] != false and not
$game_switches[Wep::Things[item.id][:switch_can_buy]]
else
@data.push(item)
end
end
end
# If item count is not 0, make a bit map and draw all items
@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
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
# Get items in possession
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
# If price is less than money in possession, and amount in possession is
# not 99, then set to normal text color. Otherwise set to disabled color
if item.price * $game_temp.buy_discount <= $game_party.shop_gold and number < 99
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
rebajado = item.price * $game_temp.buy_discount
rebajado = rebajado.to_i
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)
# When dont show numbers, number more to the right
if $game_temp.act_shop_interface[:dont_show_number]
self.contents.draw_text(x + 480, y, 88, 32, rebajado.to_s, 2)
else
self.contents.draw_text(x + 240, y, 88, 32, rebajado.to_s, 2)
end
end
end
#==============================================================================
# ** Window_ShopCommand
#------------------------------------------------------------------------------
# This window is used to choose your business on the shop screen.
#==============================================================================
class Window_ShopCommand < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 64, 480, 64)
self.contents = Bitmap.new(width - 32, height - 32)
@column_max = 3
#Excepciones de tipo
cums = Wep::Shop_interfaces[$game_temp.shop_interface][:commands_used]
# Make custom commmands
@commands = []
for cu in cums
@commands.push cu[1]
end
@item_max = @commands.size
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
x = 4 + index * 160
#Excepciones de tipo
case $game_temp.type
when 1
#Canvio de color de fuente y retorno de la misma
if index == 1
self.contents.font.color = disabled_color
end
if index == 2
self.contents.font.color = normal_color
end
when 2
#Canvio de color de fuente y retorno de la misma
if index == 0
self.contents.font.color = disabled_color
end
if index == 1...2
self.contents.font.color = normal_color
end
end
#p @commands, index
self.contents.draw_text(x, 0, 128, 32, @commands[index])
end
end
class Scene_Shop
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Make help window
@help_window = Window_Help.new
# Make command window
@command_window = Window_ShopCommand.new
# Make gold window
@gold_window = Window_GoldShop.new
@gold_window.x = 480
@gold_window.y = 64
# Make dummy window
@dummy_window = Window_Base.new(0, 128, 640, 352)
# Make buy window
@buy_window = Window_ShopBuy.new($game_temp.shop_goods)
@buy_window.active = false
@buy_window.visible = false
@buy_window.help_window = @help_window
# Make sell window
@sell_window = Window_ShopSell.new
@sell_window.active = false
@sell_window.visible = false
@sell_window.help_window = @help_window
# Make quantity input window
@number_window = Window_ShopNumber.new
@number_window.active = false
@number_window.visible = false
# Make status window
@status_window = Window_ShopStatus.new
@status_window.visible = false
# If dont show number
if Wep::Shop_interfaces[$game_temp.shop_interface][:dont_show_number]
@number_window.visible = false
@status_window.visible = false
@buy_window.width = 640
@buy_window.z = @status_window.z + 80
end
# Windoskin
if Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin]
@sell_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@number_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@status_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@buy_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@help_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@gold_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@command_window.windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
@dummy_window .windowskin = RPG::Cache.windowskin( Wep::Shop_interfaces[$game_temp.shop_interface][:windowskin])
end
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@help_window.dispose
@command_window.dispose
@gold_window.dispose
@dummy_window.dispose
@buy_window.dispose
@sell_window.dispose
@number_window.dispose
@status_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update (when command window is active)
#--------------------------------------------------------------------------
def update_command
# Set title
if Wep::Shop_interfaces[$game_temp.shop_interface][:title]
@help_window.set_text (Wep::Shop_interfaces[$game_temp.shop_interface][:title])
end
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Reset shop variables
$game_temp.type = 0
$game_temp.buy_discount = 1
$game_temp.sell_discount = 1
$game_temp.shop_interface = :default
# Switch to map screen
$scene = Scene_Map.new
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Trasnlate command index as command code used
case $game_temp.act_shop_interface[:commands_used][@command_window.index][0]
when :buy
command_buy
when :sell
command_sell
when :exit
command_exit
return
end
end
end
#--------------------------------------------------------------------------
# * Command buy: execute command buy
#--------------------------------------------------------------------------
def command_buy
if $game_temp.type== 0 or $game_temp.type== 1
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Change windows to buy mode
@command_window.active = false
@dummy_window.visible = false
@buy_window.active = true
@buy_window.visible = true
@buy_window.refresh
@status_window.visible = true
else
$game_system.se_play($data_system.cancel_se)
return
end
end
#--------------------------------------------------------------------------
# * Command sell: execute command sell
#--------------------------------------------------------------------------
def command_sell
if $game_temp.type== 0 or $game_temp.type== 2
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Change windows to sell mode
@command_window.active = false
@dummy_window.visible = false
@sell_window.active = true
@sell_window.visible = true
@sell_window.refresh
else
$game_system.se_play($data_system.cancel_se)
return
end
end
#--------------------------------------------------------------------------
# * Command exit: execute command exit
#--------------------------------------------------------------------------
def command_exit
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Reset shop variables
$game_temp.type = 0
$game_temp.buy_discount = 1
$game_temp.sell_discount = 1
$game_temp.shop_interface = :default
# Switch to map screen
$scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# * Check item class restriction
#--------------------------------------------------------------------------
def item_class_restriction
# If its special one and cant be purchased by actors or classes
if Wep::Things[@item.id] != nil
class_valid = true
if Wep::Things[@item.id][:can_be_adquired_by_class]
for adq_class in Wep::Things[@item.id][:can_be_adquired_by_class]
class_valid = false unless $game_party.include_class?(adq_class)
end
end
unless class_valid
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return false
end
end
return true
end
#--------------------------------------------------------------------------
# * Check item actor restriction
#--------------------------------------------------------------------------
def item_actor_restriction
# If its special one and cant be purchased by actors or classes
if Wep::Things[@item.id] != nil
actor_valid = true
if Wep::Things[@item.id][:can_be_adquired_by_actor]
for adq_actor in Wep::Things[@item.id][:can_be_adquired_by_actor]
actor_valid = false unless $game_party.include_actor?(adq_actor)
end
end
unless actor_valid
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return false
end
end
return true
end
#--------------------------------------------------------------------------
# * Frame Update (when buy window is active)
#--------------------------------------------------------------------------
def update_buy
# Set status window item
@status_window.item = @buy_window.item
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Change windows to initial mode
@command_window.active = true
@dummy_window.visible = true
@buy_window.active = false
@buy_window.visible = false
@status_window.visible = false
@status_window.item = nil
# Erase help text
@help_window.set_text("")
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get item
@item = @buy_window.item
# If item is invalid, or price is higher than money possessed
if @item == nil or @item.price > $game_party.shop_gold
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# If dont show number, automatically gain 1 item and skip number
if Wep::Shop_interfaces[$game_temp.shop_interface][:dont_show_number]
# Buy process only if normal
unless Wep::Things[@item.id] != nil
modificado = @item.price * $game_temp.buy_discount
$game_party.shop_lose_gold(modificado.to_i)
case @item
when RPG::Item
$game_party.gain_item(@item.id, 1)
when RPG::Weapon
$game_party.gain_weapon(@item.id, 1)
when RPG::Armor
$game_party.gain_armor(@item.id, 1)
end
# Special items
else
# Check items restrictions
return unless item_actor_restriction
return unless item_class_restriction
modificado = @item.price * $game_temp.buy_discount
$game_party.shop_lose_gold(modificado.to_i)
# Modifiy var
if Wep::Things[@item.id][:variable]
$game_variables[Wep::Things[@item.id][:variable][0]] += Wep::Things[@item.id][:variable][1]
end
# Mod sw
if Wep::Things[@item.id][:switch]
$game_switches[Wep::Things[@item.id][:switch]] = true
end
# Call comm ev
if Wep::Things[@item.id][:common_event]
$game_temp.common_event_id = Wep::Things[@item.id][:common_event]
end
end
# Refresh each window
@gold_window.refresh
@buy_window.refresh
@status_window.refresh
# End execution and play se
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Or exit if configurated
if Wep::Shop_interfaces[$game_temp.shop_interface][:exit_when_buy]
$scene = Scene_Map.new
end
return
end
# Get items in possession count
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
# If 99 items are already in possession
if number == 99
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Calculate maximum amount possible to buy
rebaja = @item.price*$game_temp.buy_discount
max = @item.price == 0 ? 99 : $game_party.shop_gold / rebaja.to_i
max = [max, 99 - number].min
# Change windows to quantity input mode
@buy_window.active = false
@buy_window.visible = false
descuento = @item.price * $game_temp.buy_discount
@number_window.set(@item, max, descuento.to_i)
@number_window.active = true
@number_window.visible = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when sell window is active)
#--------------------------------------------------------------------------
def update_sell
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Change windows to initial mode
@command_window.active = true
@dummy_window.visible = true
@sell_window.active = false
@sell_window.visible = false
@status_window.item = nil
# Erase help text
@help_window.set_text("")
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get item
@item = @sell_window.item
# Set status window item
@status_window.item = @item
# If item is invalid, or item price is 0 (unable to sell)
if @item == nil or @item.price == 0
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Get items in possession count
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
# Maximum quanitity to sell = number of items in possession
max = number
# Change windows to quantity input mode
@sell_window.active = false
@sell_window.visible = false
descuento = (@item.price * $game_temp.vend_desc) / 2
@number_window.set(@item, max, descuento.to_i)
@number_window.active = true
@number_window.visible = true
@status_window.visible = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when quantity input window is active)
#--------------------------------------------------------------------------
def update_number
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Set quantity input window to inactive / invisible
@number_window.active = false
@number_window.visible = false
# Branch by command window cursor position
case @command_window.index
when 0 # buy
# Change windows to buy mode
@buy_window.active = true
@buy_window.visible = true
when 1 # sell
# Change windows to sell mode
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
end
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Play shop SE
$game_system.se_play($data_system.shop_se)
# Set quantity input window to inactive / invisible
@number_window.active = false
@number_window.visible = false
# Branch by command window cursor position
case @command_window.index
when 0 # buy
# Buy process only if normal
unless Wep::Things[@item.id] != nil
modificado = @number_window.number * @item.price * $game_temp.buy_discount
$game_party.shop_lose_gold(modificado.to_i)
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
# Special items
else
# Check items restrictions
return unless item_actor_restriction
return unless item_class_restriction
modificado = @number_window.number * @item.price * $game_temp.buy_discount
$game_party.shop_lose_gold(modificado.to_i)
# Modifiy var
if Wep::Things[@item.id][:variable]
$game_variables[Wep::Things[@item.id][:variable][0]] += Wep::Things[@item.id][:variable][1]
end
# Mod sw
if Wep::Things[@item.id][:switch]
$game_switches[Wep::Things[@item.id][:switch]] = true
end
# Call comm ev
if Wep::Things[@item.id][:common_event]
$game_temp.common_event_id = Wep::Things[@item.id][:common_event]
end
end
# Refresh each window
@gold_window.refresh
@buy_window.refresh
@status_window.refresh
# Change windows to buy mode
@buy_window.active = true
@buy_window.visible = true
# Or exit if configurated
if Wep::Shop_interfaces[$game_temp.shop_interface][:exit_when_buy]
$scene = Scene_Map.new
end
when 1 # sell
# Sell process
modificado = (@item.price * $game_temp.vend_desc) / 2
$game_party.shop_gain_gold(@number_window.number * modificado.to_i)
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
# Refresh each window
@gold_window.refresh
@sell_window.refresh
@status_window.refresh
# Change windows to sell mode
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
end
return
end
end
end
class Game_Temp
attr_accessor :type # 2: Sell/1: Buy/0: Both
attr_accessor :buy_discount # Buy discount +- %
attr_accessor :sell_discount # Sell discount +- %
attr_accessor :shop_interface # Sell discount +- %
alias gt_init initialize
def initialize
gt_init
@type = 0
@shop_interface = :default
@buy_discount = 1
@sell_discount = 1
end
# Return shop interface
def act_shop_interface
Wep::Shop_interfaces[$game_temp.shop_interface]
end
end
class Game_Actor
attr_reader :actor_id
end
class Game_Party
#--------------------------------------------------------------------------
# * Seeks if at least a actor in the party have the actor id
#--------------------------------------------------------------------------
def include_actor?(id)
f=false
for a in @actors
f=true if a.actor_id == id
end
f
end
#--------------------------------------------------------------------------
# * Seeks if at least a actor in the party have the class id
#--------------------------------------------------------------------------
def include_class?(id)
f=false
for a in @actors
f=true if a.class_id == id
end
f
end
#--------------------------------------------------------------------------
# * Shop gold
# gold method used only in shop
#--------------------------------------------------------------------------
def shop_gold
type = Wep::Shop_interfaces[$game_temp.shop_interface][:gold_type]
# Normal gold
if type == :gold
return @gold
# Experience
elsif type == :exp
v = 0
@actors.each {|a| v += a.exp}
return v
# Event variable
else
return $game_variables[Wep::Shop_interfaces[$game_temp.shop_interface][:gold_type][1]]
end
end
#--------------------------------------------------------------------------
# * Shop Gain Gold (or lose)
# n : amount of gold
#--------------------------------------------------------------------------
def shop_gain_gold(n)
type = Wep::Shop_interfaces[$game_temp.shop_interface][:gold_type]
# Normal gold
if type == :gold
@gold = [[@gold + n, 0].max, 9999999].min
# Experience
elsif type == :exp
# Divide actor number by n
ratio = (n/@actors.size).to_i
# Modify each exp
@actors.each {|a| a.exp += ratio}
# Event variable
else
vid = Wep::Shop_interfaces[$game_temp.shop_interface][:gold_type][1]
$game_variables[vid] = [[$game_variables[vid] + n, 0].max, 9999999].min
end
end
#--------------------------------------------------------------------------
# * Shop Lose Gold
# n : amount of gold
#--------------------------------------------------------------------------
def shop_lose_gold(n)
# Reverse the numerical value and call it gain_gold
shop_gain_gold(-n)
end
end
#==============================================================================
# ** Window_GoldShop
#------------------------------------------------------------------------------
# This window displays amount of gold in shops
#==============================================================================
class Window_GoldShop < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, 160, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
word = Wep::Shop_interfaces[$game_temp.shop_interface][:gold_word].to_s
cx = contents.text_size(word).width
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120-cx-2, 32, $game_party.shop_gold.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(124-cx, 0, cx, 32, word, 2)
end
end
module Wep
Scripts_list = [] unless defined? Scripts_list
Scripts_list.push ('Improved Shop')
end
FAQI will listen for any crtic, suggerence, bug, feature, etc...