[XP] Improved Shop

Started by gerrtunk, November 07, 2010, 09:12:09 am

Previous topic - Next topic

gerrtunk

November 07, 2010, 09:12:09 am Last Edit: February 18, 2013, 01:52:28 pm by KK20
Improved shop
Authors: gerrtunk
Version: 2
Type: Misc System
Key Term: Custom Shop System



Introduction
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.



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.



Screenshots




Demo
http://www.megaupload.com/?d=DW5CMJ16


Script

Spoiler: ShowHide
[
=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




Instructions
In the script.


Compatibility
Any other shop script.


Credits and Thanks
No.


Author's Notes

I will add more things when i need them in my projects(or i have time), so it will be updated. Again, feedback, bugs,retc, i will listen.

gerrtunk

At last it dont give me any error, and i can post the template.

ForeverZer0

Nice job. ;)

* Moves to database *
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Jragyn

Lol, I wrote a script that does this same functionality, but is compatible with both XP/VX.
I just havent been able to upload it cuz I been away. Darn. XD


--J
A bright light can either illuminate or blind, but how will you know which until you open your eyes?

LiTTleDRAgo

request :

could you make an option to use gold or value of a variable as the price?
also, all your script didnt appear on the database

http://chaos-project.com/index.php?option=com_scriptdatabase&view=scriptdatabase&Itemid=29

ForeverZer0

Its because he erased the "Key Term".  I didn't even catch that when I moved it... :facepalm:

The template, especially the header and topic name, must be followed exactly, they are not guidelines.  The Script Index is automated to organize itself by these terms, and if you omit them, the script doesn't show up.

* Fixes post *
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

gerrtunk

July 30, 2011, 06:58:04 pm #6 Last Edit: July 30, 2011, 07:05:42 pm by gerrtunk
Quote from: LiTTleDRAgo on July 27, 2011, 10:10:22 am
request :

could you make an option to use gold or value of a variable as the price?
also, all your script didnt appear on the database

http://chaos-project.com/index.php?option=com_scriptdatabase&view=scriptdatabase&Itemid=29


You mean the price, the discount or what?

A short way to do that is to call this script call:

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

LiTTleDRAgo

I meant player will use the value of variable as his gold

ex =

when buying a skill he needs AP, not gold
and the AP is stored in $game_variables[1]

sorry for my bad english

gerrtunk

Quote from: LiTTleDRAgo on July 31, 2011, 10:44:12 am
I meant player will use the value of variable as his gold

ex =

when buying a skill he needs AP, not gold
and the AP is stored in $game_variables[1]

sorry for my bad english


I will add that option to the successor of this script, my Merchant script, thats more complex, but iwill akle time.

gerrtunk

Script updated to 2.0!

Quote from: LiTTleDRAgo on July 31, 2011, 10:44:12 am
I meant player will use the value of variable as his gold

ex =

when buying a skill he needs AP, not gold
and the AP is stored in $game_variables[1]

sorry for my bad english


On now all my shop scripts will be called improved shop, and in the new version 2 you can do that.