Demo – Version 2.7 > (Demo uses old version)
#------------------------------------------------------------------------------# # Galv's Shop Upgrade #------------------------------------------------------------------------------# # For: RPGMAKER VX ACE # Version 2.8 # Thanks Nicke for scrolling help #------------------------------------------------------------------------------# # 2013-02-27 - Version 2.8 - added script for variables to count stock # 2013-02-17 - Version 2.7 - added images to display with equip comparison # 2013-02-16 - Version 2.6 - added ability to specify which stat a class uses # in weapon comparisons. # 2013-02-12 - Version 2.5 - bug fix for changing text # 2013-02-12 - Version 2.4 - added a stock feature to limit items in shops # - added pose for trying to buy out of stock # 2013-01-24 - Version 2.3 - fixed bug with displaying item mana gain # 2013-01-22 - Version 2.2 - added compatability with YEA Equip Dynamic Stats # 2013-01-16 - Version 2.1 - added changeable windowskin for shop # 2013-01-15 - Version 2.0 - fixed a bug with talking when viewing details # 2013-01-15 - Version 1.9 - animated actors when item is equippable # added more settings for equip status window # 2013-01-15 - Version 1.8 - added pose for trying to view details on no item # 2013-01-15 - Version 1.7 - added pose for when details window is open # - added sound effect option for open/close details # 2013-01-15 - Version 1.6 - added state resist feature to equips # 2013-01-15 - Version 1.5 - added 'details' to show item features + stats # 2013-01-12 - Version 1.4 - more poses added: too many items, farewell # 2013-01-12 - Version 1.3 - more poses added: greet, cant buy, cant sell # 2013-01-12 - Version 1.2 - changed name to "Galv's Shop Upgrade" # added variable that controls selling rate # modified shop window positions # changed the 'better/worse' item status display # 2013-01-07 - Version 1.1 - added background scrolling # 2013-01-05 - Version 1.0 - release #------------------------------------------------------------------------------# # This script overwrites much of the default shop. # It adds a background and shopkeeper images, uses a variable to contol selling # price and rearranges the shop windows. # # The shopkeeper can change graphic throughout the shopping process to be used # to make them smile or anything else your imagination thinks of. # It also adds text that displays for shopkeeper talk during this process. # # This script does not include graphics for you to use. You'll need to create # your own. # # The script can also keep track of stock in different shops, even if you sell # items to the shop, it will add that item to it's buy list. # #------------------------------------------------------------------------------# # INSTRUCTIONS: #------------------------------------------------------------------------------# # Put script under Materials and above Main # Images go in /Graphics/Pictures/ folder. # #------------------------------------------------------------------------------# # SCRIPT CALLS to change images #------------------------------------------------------------------------------# # # $game_system.shopkeeper = "ImageName" # Changes shopkeeper image # # $game_system.shopback = "ImageName" # Changes background image # # $game_system.shop_windowskin = "ImageName" # Change windowskin for shop # # /Graphics/System/ folder # #------------------------------------------------------------------------------# # ADVANCED SCRIPT CALL to change shopkeeper talk (x is the line in settings) #------------------------------------------------------------------------------# # # $game_system.shop_talk[x] = "New shopkeeper saying here" # #------------------------------------------------------------------------------# # The reason I say this is advanced is because it's used in the tiny script call # box, you may need to use additional code. An example below: # # $game_system.shop_talk[0] = "This will " + # "change the text for the initial welcome # message." # # See below in SHOPKEEPER TALK each quote will be numbered to use here. #------------------------------------------------------------------------------# #------------------------------------------------------------------------------# # SCRIPT CALLS to control SHOP STOCK #------------------------------------------------------------------------------# # # shop(shop_id) # Use this script call to set the next shop processing event # # to be a certain shop number. If you do not use this script # # call before a shop event, the shop will not use stock. # # add_stock(shop_id,type,item_id,amount) # Add a number of items to the shop # # number you specify. # # rem_stock(shop_id,type,item_id,amount) # Remove a number of items from the # # shop number you specify. # # bulk_fill(shop_id,type,amount,[id,id,id]) # Add items to a shop in bulk. # # # # If you do NOT add an item as stock (using the above script call) to a shop # # that includes that item in the shop processing event - that item will be # # unlimited. # # count_stock(shop_id,type,item_id) # Use in control variables to get # # number of an item in stock # # NOTE: This does not detect shop processing items that are unlimited. It # # will return 0 unless you set stock amount for it. # #------------------------------------------------------------------------------# # EXPLANATION of the above script calls #------------------------------------------------------------------------------# # shop_id # This is a number you choose to use for a certain shop. You can use this # number for any shop anywhere and it will keep track of what items are sold # and bought from it. You can have as many different shop id's as you likd. # # type # 0 = an item 1 = a weapon 2 = an armor # # item_id or id # The id of the item/weapon/armor in your database. # # amount # How many of the item you wish to add or remove from the chosen shop id. # #------------------------------------------------------------------------------# # EXAMPLES #------------------------------------------------------------------------------# # # add_stock(2,0,1,20) # Will add 20 of item 1 to shop number 2 # add_stock(6,1,10,2) # Will add 2 of weapon 10 to shop number 6 # rem_stock(6,1,10,2) # Will remove 2 of weapon 10 from shop number 6 # # bulk_fill(1,0,20,[1,2,3,4,5,6]) # Will add 20 of each item inside square # # brackets to shop number 1 # # bulk_fill(3,2,1,[12,22,13]) # Will add 1 of each armor inside square # # brackets to shop number 3 # # shop(3) # The next shop processing will use shop number 3 # #------------------------------------------------------------------------------# #------------------------------------------------------------------------------# # NOTETAG for CLASS #------------------------------------------------------------------------------# # # <primary_params: x,y> # The weapon and armor paramater a class will use # # to compare if the weapon(x) or armor(y) is better # # for that actor to equip or not. # # Not including this notetag in a class will use the default 2,3 (ATK and DEF) # # Parameter ID's are: # # 0 - MaxHP 1 - MaxMP 2 - ATK 3 - DEF # 4 - MAT 5 - MDF 6 - AGI 7 - LUK # #------------------------------------------------------------------------------# ($imported ||= {})["Galvs_Shopkeepers"] = true module Galv_Shopkeeper #------------------------------------------------------------------------------# # SCRIPT SETTINGS #------------------------------------------------------------------------------# #-------------------# # SHOPKEEPER IMAGES # #-------------------# SHOPKEEPER_IMAGE = "shopkeeper" # Shopkeeper will change to an image using the current shopkeeper file name # with the below extentions added (eg. Graphics/Pictures/shopkeeper_happy.png) GREET = "_happy" # image extension greeting when you enter shop FAREWELL = "_happy" # image extension when you leave the shop BUY = "_happy" # image extension when you buy an item SELL = "_happy" # image extension when you sell an item DONT_BUY = "_annoyed" # image extension when you don't buy something DONT_SELL = "_annoyed" # image extension when you don't sell something CANT_BUY = "_annoyed" # image extension when you can't afford something CANT_SELL = "_annoyed" # image extension when you can't sell an item MAX_ITEMS = "_annoyed" # image extension when you can't hold more of an item SOLD_OUT = "_happy" # image extension when can't buy sold out item SHOW_DETAILS = "_happy" # image extension when show details window is open NO_DETAILS = "_annoyed" # image extension when no item when 'd' pressed #-------------------# # BACKGROUND IMAGE # #-------------------# SHOP_BACKGROUND = "shop_background" # background image behind shopkeeper BACKGROUND_SCROLL_X = 0 # speed background scroll horizontally BACKGROUND_SCROLL_Y = 0 # speed background scroll vertically WINDOWSKIN = "Window" # windowskin used by shop #-----------------# # SHOPKEEPER TALK # #-----------------# # These are defaults. You can change them using script calls during game. TALK = [ # don't touch "Welcome! Take a look around!", # 0: when entering a shop "Thank you for your purchase!", # 1: when purchase an item "I'll make good use of this.", # 2: when sell an item "Do you need anything else?", # 3: when in root menu after shopping "Just window shopping, huh?", # 4: when in root menu but didn't buy "Are you wasting my time or what?", # 5: when in root menu but didn't sell "You don't have enough money!", # 6: when try to buy too pricey item "I can't buy that...", # 7: when try to sell something you cant "You can't carry any more of that!",# 8: when try to buy when items maxed "Thank you, come back again soon!", # 9: when leaving a shop "You can't view details of that!", # 10: when pressing 'd' on no item. "We are all sold out of those!", # 11: when item is sold out ] # don't touch #---------------# # OTHER OPTIONS # #---------------# ITEM_COUNT_TEXT = "In Inventory" # Text that appears before item amount HOW_MANY_TEXT = "How Many?" # Text for when determining how many STOCK_TEXT = "In Stock" # Text to display how many items in stock # only displays if a limit is set. NO_STOCK = "Sold Out" # Displayed if limit of 0 is reached STOCK_COLOR = 6 # Color of stock text. FRAME_TIME = 75 # time that above text and images stay active before # returning to default image and no talk. # (60 = 1 second) SALE_VAR = 1 # variable that controls sale price as a % of item's # price. Default is 50, use control variables to change # this during the game. Make this 0 to not use this # feature. DETAILS_KEY = :Z # :Z is "D". Press "D" in the shop to show the item # selected's details. D_IMAGE = "shop_detail" # The image used to show what key to press for details # This image goes in /Graphics/System/ SE1 = ["Book2", 85, 100] # Sound effect played when opening details SE2 = ["Blow1", 85, 150] # Sound effect played when closing details ACTORS_SHOWN = 4 # Number of actors shown in the equip status window ACTORS_X = 15 # x position of first actor in the equip status window ACTORS_SPACE = 70 # space between each actor in equip status window # Settings to fit 6 actors here nicely are: # ACTORS_SHOWN = 6, ACTORS_X = 5, ACTORS_SPACE = 50 #---------------# # EQUIP COMPARE # #---------------# SHOW_COMPARE_IMAGE = true # if true: shop will display only an image behind # the characters shown when viewing equipment SHOW_PARAM_CHANGE = true # shows by how much the primary parameter changes SHOW_PARAM_NAME = true # shows which paramater it is changing IMAGE_OVER = false # false: images are under the characters # true: images are on top of them. # Below images are taken from /Graphics/System/ E_INCREASE = "shop_up" # Image displayed when equip is better E_DECREASE = "shop_down" # Image displayed when equip is worse E_SAME = "" # Image displayed when euqip is same #------------------------------------------------------------------------------# # END SCRIPT SETTINGS #------------------------------------------------------------------------------# end module Shop_Stock def check_stock(item) if item.is_a?(RPG::Item); itype = 0 elsif item.is_a?(RPG::Weapon); itype = 1 else; itype = 2; end return -1 if item.nil? return -1 if $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]].nil? if $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]] >= 0 return $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]] else return -1 end end end class Game_Interpreter def shop(shop_id) $game_system.shop_selected = shop_id end def count_stock(shop_id,type,item_id) # type 0 = item, 1 = weapon, 2 = armor if $game_system.shop_stock[shop_id].nil? || $game_system.shop_stock[shop_id][[type,item_id]].nil? return 0 else return $game_system.shop_stock[shop_id][[type,item_id]] end end def add_stock(shop_id,type,item_id,amount) # type 0 = item, 1 = weapon, 2 = armor $game_system.shop_stock[shop_id] ||= {} $game_system.shop_stock[shop_id][[type,item_id]] ||= 0 $game_system.shop_stock[shop_id][[type,item_id]] += amount end def rem_stock(shop_id,type,item_id,amount) # type 0 = item, 1 = weapon, 2 = armor return if $game_system.shop_stock[shop_id].nil? return if $game_system.shop_stock[shop_id][[type,item_id]].nil? $game_system.shop_stock[shop_id][[type,item_id]] -= amount if $game_system.shop_stock[shop_id][[type,item_id]] < 0 $game_system.shop_stock[shop_id][[type,item_id]] = 0 end end def reset_shop_settings $game_system.shopkeeper = Galv_Shopkeeper::SHOPKEEPER_IMAGE $game_system.shopback = Galv_Shopkeeper::SHOP_BACKGROUND $game_system.shop_windowskin = Galv_Shopkeeper::WINDOWSKIN $game_system.shop_talk = Array.new(Galv_Shopkeeper::TALK) end def bulk_fill(*args) array = [*args] shop_id = array[0] type = array[1] amount = array[2] ids = array[3] $game_system.shop_stock[shop_id] ||= {} ids.each do |i| $game_system.shop_stock[shop_id][[type,i]] ||= 0 $game_system.shop_stock[shop_id][[type,i]] += amount end end end # Game_Interpreter class Game_System attr_accessor :shop_selected attr_accessor :shop_stock attr_accessor :shopback attr_accessor :shopkeeper attr_accessor :shop_talk attr_accessor :shop_spose attr_accessor :shop_windowskin alias galv_shopkeeper_system_initialize initialize def initialize galv_shopkeeper_system_initialize @shopback = Galv_Shopkeeper::SHOP_BACKGROUND @shopkeeper = Galv_Shopkeeper::SHOPKEEPER_IMAGE @shop_talk = Array.new(Galv_Shopkeeper::TALK) @shop_windowskin = Galv_Shopkeeper::WINDOWSKIN @shop_spose = nil @shop_selected = 0 @shop_stock = {0=>{}} end end # Game_System class Scene_Shop < Scene_MenuBase alias galv_shopkeeper_scene_shop_prepare prepare def prepare(goods, purchase_only) galv_shopkeeper_scene_shop_prepare(goods, purchase_only) return if $game_system.shop_stock[$game_system.shop_selected].nil? stock_change end def stock_change temp_list = $game_system.shop_stock[$game_system.shop_selected].keys @goods.each do |i| if temp_list.include?([i[0],i[1]]) temp_list.delete([i[0],i[1]]) end end temp_list.each do |i| if $game_system.shop_stock[$game_system.shop_selected][[i[0],i[1]]] != 0 @goods << [i[0],i[1],0,0] end end end alias galv_shopkeeper_scene_shop_start start def start galv_shopkeeper_scene_shop_start @shoptime = 0 @has_shopped = false create_talk_window create_desc_window create_shop_background create_shopkeeper create_images @leave_shop = false @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::GREET) rescue Cache.picture($game_system.shopkeeper) @shoptime = Galv_Shopkeeper::FRAME_TIME end def create_desc_window b = @buy_window @desc_window = Window_ItemDesc.new(b.x, b.y, b.width, b.height) @desc_window.viewport = @viewport @desc_window.hide end def create_talk_window @talk_window = Window_Help.new @talk_window.viewport = @viewport @talk_window.set_text($game_system.shop_talk[0]) @help_window.hide end def create_itemcount_window wy = @dummy_window.y ww = Graphics.width - 304 wh = @gold_window.height @itemcount_window = Window_ItemCount.new(0, wy, ww, wh) @itemcount_window.viewport = @viewport @itemcount_window.hide end # OVERWRITE def create_dummy_window wy = @command_window.y + @command_window.height wh = Graphics.height - wy - @gold_window.height * 2 @dummy_window = Window_Base.new(0, wy, Graphics.width, wh) @dummy_window.viewport = @viewport end # OVERWRITE def create_buy_window wy = @dummy_window.y wh = @dummy_window.height @buy_window = Window_ShopBuy.new(0, wy, wh, @goods) @buy_window.viewport = @viewport @buy_window.help_window = @help_window @buy_window.status_window = @status_window @buy_window.count_window = @itemcount_window @buy_window.desc_window = @desc_window @buy_window.hide @buy_window.set_handler(:ok, method(:on_buy_ok)) @buy_window.set_handler(:cancel, method(:on_buy_cancel)) @buy_window.x = Graphics.width - @buy_window.width end # OVERWRITE def create_sell_window wy = @category_window.y + @category_window.height wh = Graphics.height - wy @sell_window = Window_ShopSell.new(0, wy, @buy_window.width, wh) @sell_window.viewport = @viewport @sell_window.help_window = @help_window @sell_window.status_window = @itemcount_window @sell_window.hide @sell_window.set_handler(:ok, method(:on_sell_ok)) @sell_window.set_handler(:cancel, method(:on_sell_cancel)) @category_window.item_window = @sell_window @sell_window.x = Graphics.width - @buy_window.width end alias galv_shopkeeper_create_number_window create_number_window def create_number_window galv_shopkeeper_create_number_window @number_window.x = Graphics.width - @number_window.width end # OVERWRITE def create_status_window wx = @number_window.x wy = @dummy_window.y + @dummy_window.height ww = @number_window.width wh = Graphics.height - @dummy_window.height - @dummy_window.y @status_window = Window_ShopStatus.new(wx, wy, ww, wh) @status_window.viewport = @viewport @status_window.hide create_itemcount_window end alias galv_shopkeeper_create_dummy_window create_dummy_window def create_dummy_window galv_shopkeeper_create_dummy_window @dummy_window.hide end def create_shopkeeper @keeper = Sprite.new @keeper.bitmap = Cache.picture($game_system.shopkeeper) @keeper.y = Graphics.height - @keeper.bitmap.height end def create_images @dkey = Sprite.new @dkey.opacity = 0 @dkey.bitmap = Cache.system(Galv_Shopkeeper::D_IMAGE) rescue Cache.system("") @dkey.y = Graphics.height - @dkey.bitmap.height end def create_shop_background @shopback = Plane.new @shopback.bitmap = Cache.picture($game_system.shopback) end alias galv_shopkeer_sell_on_category_ok on_category_ok def on_category_ok galv_shopkeer_sell_on_category_ok @dkey.opacity = 255 end # OVERWRITE def on_category_cancel @command_window.activate @category_window.hide @sell_window.hide if @has_shopped == true @talk_window.set_text($game_system.shop_talk[3]) @keeper.bitmap = Cache.picture($game_system.shopkeeper) else @talk_window.set_text($game_system.shop_talk[5]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::DONT_SELL) end show_talk @has_shopped = false end # OVERWRITE def on_buy_cancel @command_window.activate @buy_window.hide @itemcount_window.hide @status_window.hide @status_window.item = nil @itemcount_window.item = nil @help_window.clear if @has_shopped == true @talk_window.set_text($game_system.shop_talk[3]) @keeper.bitmap = Cache.picture($game_system.shopkeeper) else @talk_window.set_text($game_system.shop_talk[4]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::DONT_BUY) end show_talk @has_shopped = false @dkey.opacity = 0 end # OVERWRITE def on_sell_cancel @sell_window.unselect @category_window.activate @status_window.item = nil @itemcount_window.item = nil @itemcount_window.hide @help_window.clear @dkey.opacity = 0 end alias galv_shopkeeper_command_buy command_buy def command_buy galv_shopkeeper_command_buy @keeper.bitmap = Cache.picture($game_system.shopkeeper) @itemcount_window.show hide_talk @dkey.opacity = 255 @desc_window.y = @buy_window.y @desc_window.height = @buy_window.height end alias galv_shopkeeper_command_sell command_sell def command_sell galv_shopkeeper_command_sell @keeper.bitmap = Cache.picture($game_system.shopkeeper) hide_talk @desc_window.y = @sell_window.y @desc_window.height = @sell_window.height end alias galv_shopkeeper_do_buy do_buy def do_buy(number) @has_shopped = true galv_shopkeeper_do_buy(number) remove_stock(@item,number) @talk_window.set_text($game_system.shop_talk[1]) show_talk @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::BUY) rescue Cache.picture($game_system.shopkeeper) @shoptime = Galv_Shopkeeper::FRAME_TIME end def remove_stock(item,number) return if $game_system.shop_stock[$game_system.shop_selected].nil? || $game_system.shop_selected == 0 if item.is_a?(RPG::Item); itype = 0 elsif item.is_a?(RPG::Weapon); itype = 1 else; itype = 2; end return if $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]].nil? $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]] -= number end alias galv_shopkeeper_do_sell do_sell def do_sell(number) @has_shopped = true galv_shopkeeper_do_sell(number) add_stock(@item,number) stock_change @talk_window.set_text($game_system.shop_talk[2]) show_talk @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::SELL) rescue Cache.picture($game_system.shopkeeper) @shoptime = Galv_Shopkeeper::FRAME_TIME end def add_stock(item,number) return if $game_system.shop_selected == 0 if item.is_a?(RPG::Item); itype = 0 elsif item.is_a?(RPG::Weapon); itype = 1 else; itype = 2; end @goods.each do |i| if i[0] == itype && i[1] == item.id && $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]].nil? return end end $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]] ||= 0 $game_system.shop_stock[$game_system.shop_selected][[itype,item.id]] += number end # OVERWRITE def on_number_ok Sound.play_shop case @command_window.current_symbol when :buy do_buy(@number_window.number) when :sell do_sell(@number_window.number) @itemcount_window.hide end end_number_input @gold_window.refresh @status_window.refresh @itemcount_window.refresh @dkey.opacity = 255 end alias galv_shopkeeper_on_number_cancel on_number_cancel def on_number_cancel galv_shopkeeper_on_number_cancel case @command_window.current_symbol when :sell @itemcount_window.hide end @dkey.opacity = 255 end alias galv_shopkeeper_on_sell_ok on_sell_ok def on_sell_ok @number_window.trans = :sell galv_shopkeeper_on_sell_ok @itemcount_window.show @dkey.opacity = 0 end alias galv_shopkeeper_on_buy_ok on_buy_ok def on_buy_ok @number_window.trans = :buy galv_shopkeeper_on_buy_ok @dkey.opacity = 0 end def end_shopanim SceneManager.return if @leave_shop == true @keeper.bitmap = Cache.picture($game_system.shopkeeper) hide_talk unless @command_window.active end def show_talk @talk_window.show @help_window.hide end def hide_talk @talk_window.hide @help_window.show end def update super @shoptime -= 1 end_shopanim if @shoptime == 0 if @shoptime.odd? @shopback.ox += Galv_Shopkeeper::BACKGROUND_SCROLL_X @shopback.oy += Galv_Shopkeeper::BACKGROUND_SCROLL_Y end check_button other_poses if $game_system.shop_spose != nil end def check_button if @desc_window.visible if Input.trigger?(Galv_Shopkeeper::DETAILS_KEY) || Input.trigger?(:B) case @command_window.current_symbol when :buy @buy_window.show.activate when :sell @sell_window.show.activate end RPG::SE.new(Galv_Shopkeeper::SE2[0], Galv_Shopkeeper::SE2[1], Galv_Shopkeeper::SE2[2]).play @desc_window.hide @keeper.bitmap = Cache.picture($game_system.shopkeeper) end elsif @buy_window.active || @sell_window.active if Input.trigger?(Galv_Shopkeeper::DETAILS_KEY) case @command_window.current_symbol when :buy return if @buy_window.item.nil? @buy_window.hide.deactivate @desc_window.refresh(@buy_window.item,0) when :sell if @sell_window.item.nil? $game_system.shop_spose = 3 return other_poses end @sell_window.hide.deactivate @desc_window.refresh(@sell_window.item,1) end @shoptime = 0 RPG::SE.new(Galv_Shopkeeper::SE1[0], Galv_Shopkeeper::SE1[1], Galv_Shopkeeper::SE1[2]).play @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::SHOW_DETAILS) rescue Cache.picture($game_system.shopkeeper) hide_talk @desc_window.show end end end def other_poses case $game_system.shop_spose when 0 @talk_window.set_text($game_system.shop_talk[6]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::CANT_BUY) rescue Cache.picture($game_system.shopkeeper) when 1 @talk_window.set_text($game_system.shop_talk[7]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::CANT_SELL) rescue Cache.picture($game_system.shopkeeper) when 2 @talk_window.set_text($game_system.shop_talk[8]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::MAX_ITEMS) rescue Cache.picture($game_system.shopkeeper) when 3 @talk_window.set_text($game_system.shop_talk[10]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::NO_DETAILS) rescue Cache.picture($game_system.shopkeeper) when 4 @talk_window.set_text($game_system.shop_talk[11]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::SOLD_OUT) rescue Cache.picture($game_system.shopkeeper) end show_talk @shoptime = Galv_Shopkeeper::FRAME_TIME $game_system.shop_spose = nil end def return_scene @talk_window.set_text($game_system.shop_talk[9]) @keeper.bitmap = Cache.picture($game_system.shopkeeper + Galv_Shopkeeper::FAREWELL) rescue Cache.picture($game_system.shopkeeper) show_talk @shoptime = Galv_Shopkeeper::FRAME_TIME @leave_shop = true $game_system.shop_selected = 0 end def terminate super @keeper.dispose @keeper.bitmap.dispose @shopback.dispose @dkey.bitmap.dispose @dkey.dispose end # OVERWRITE def selling_price if $game_variables[Galv_Shopkeeper::SALE_VAR] > 0 ((@item.price * 0.01) * $game_variables[Galv_Shopkeeper::SALE_VAR]).round else @item.price / 2 end end end # Scene_Shop < Scene_MenuBase class Scene_Title < Scene_Base alias galv_shopkeeper_command_new_game command_new_game def command_new_game galv_shopkeeper_command_new_game $game_variables[Galv_Shopkeeper::SALE_VAR] = 50 if $game_variables[Galv_Shopkeeper::SALE_VAR] > 0 end end # Scene_Title < Scene_Base class Window_ItemCount < Window_Base def initialize(x, y, width, height) super(x, y, width, height) @item = nil refresh end def refresh contents.clear draw_possession(4, 0) end def item=(item) @item = item refresh end def draw_possession(x, y) rect = Rect.new(x, y, contents.width - 4 - x, line_height) change_color(system_color) draw_text(rect, Galv_Shopkeeper::ITEM_COUNT_TEXT) change_color(normal_color) draw_text(rect, $game_party.item_number(@item), 2) end end # Window_ItemCount < Window_Base class Window_ShopNumber < Window_Selectable attr_accessor :trans alias galv_shopkeeper_number_initialize initialize def initialize(x, y, height) galv_shopkeeper_number_initialize(x, y, height) @trans = :buy draw_how_many draw_stock end alias galv_shopkeeper_number_refresh refresh def refresh galv_shopkeeper_number_refresh draw_how_many draw_stock end def draw_how_many change_color(system_color) draw_text(4, 4, contents.width, line_height, Galv_Shopkeeper::HOW_MANY_TEXT) change_color(normal_color) end def draw_stock return if $game_system.shop_stock[$game_system.shop_selected].nil? @stock = check_stock(@item) if @stock > 0 text = @stock.to_s + " " + Galv_Shopkeeper::STOCK_TEXT elsif @stock == 0 text = Galv_Shopkeeper::NO_STOCK elsif @stock < 0 text = "" end change_color(text_color(Galv_Shopkeeper::STOCK_COLOR)) draw_text(4, 4, contents.width, line_height, text + " ",2) if @trans != :sell change_color(normal_color) end def change_number(amount) if @stock > 0; stock = @stock else stock = @max end if @trans == :buy @number = [[@number + amount, @max, stock].min, 1].max elsif @trans == :sell @number = [[@number + amount, @max].min, 1].max end end include Shop_Stock end # Window_ShopNumber < Window_Selectable class Window_ShopStatus < Window_Base alias galv_shopkeeper_window_status_initialize initialize def initialize(x, y, width, height) @walk = 0 @step = 0 # 0 is left, 1 is right @animtime = 0 @e_images = {} galv_shopkeeper_window_status_initialize(x, y, width, height) end # OVERWRITE def refresh contents.clear draw_equip_info(Galv_Shopkeeper::ACTORS_X + 5, 40) if @item.is_a?(RPG::EquipItem) end def update super @animtime += 1 if @animtime == 10 case @walk when 1; @walk -= 1 when -1; @walk += 1 when 0 if @step == 1 @walk = -1 @step = 0 else @walk = 1 @step = 1 end end refresh @animtime = 0 end end # OVERWRITE def draw_equip_info(x, y) status_members.each_with_index do |actor, i| draw_actor_equip_info(x + (i * Galv_Shopkeeper::ACTORS_SPACE), y, actor) end end # OVERWRITE def page_size return Galv_Shopkeeper::ACTORS_SHOWN end # OVERWRITE def draw_actor_equip_info(x, y, actor) enabled = actor.equippable?(@item) change_color(normal_color, enabled) item1 = current_equipped_item(actor, @item.etype_id) if Galv_Shopkeeper::IMAGE_OVER draw_character(actor.character_name, actor.character_index, x + 10, y + 11, enabled) draw_actor_param_change(x - 10, y + 10, actor, item1) if enabled else draw_actor_param_change(x - 10, y + 10, actor, item1) if enabled draw_character(actor.character_name, actor.character_index, x + 10, y + 11, enabled) end if Galv_Shopkeeper::SHOW_PARAM_NAME draw_text(x - 8, y - 40, 40, line_height, Vocab::param(@p_id),1) if enabled end end def draw_character(character_name, character_index, x, y,enabled) return unless character_name bitmap = Cache.character(character_name) sign = character_name[/^[\!\$]./] if sign && sign.include?('$') cw = bitmap.width / 3 ch = bitmap.height / 4 else cw = bitmap.width / 12 ch = bitmap.height / 8 end n = character_index step = 0 step = @walk if enabled src_rect = Rect.new((n%4*3+1+step)*cw, (n/4*4)*ch, cw, ch) contents.blt(x - cw / 2, y - ch, bitmap, src_rect) end # OVERWRITE def draw_actor_param_change(x, y, actor, item1) @p_id = pid(actor.class_id) rect = Rect.new(x, y - 2, 40, line_height) change = @item.params[@p_id] - (item1 ? item1.params[@p_id] : 0) change_color(param_change_color(change)) draw_e_image(rect.x,rect.y,actor.id,change) if Galv_Shopkeeper::SHOW_COMPARE_IMAGE contents.font.size = 20 draw_text(rect, sprintf("%+d", change), 1) if Galv_Shopkeeper::SHOW_PARAM_CHANGE contents.font.size = 20 end def pid(cid) primary_param = $data_classes[cid].primary_params @item.is_a?(RPG::Weapon) ? type = primary_param[0] : primary_param[1] end def draw_e_image(x,y,actor_id,change) if change > 0 bitmap = Cache.system(Galv_Shopkeeper::E_INCREASE) elsif change < 0 bitmap = Cache.system(Galv_Shopkeeper::E_DECREASE) else bitmap = Cache.system(Galv_Shopkeeper::E_SAME) end src_rect = Rect.new(0, 0, 100, 100) contents.blt(x, 0, bitmap, src_rect) end end # Window_ShopStatus < Window_Base class Window_ShopBuy < Window_Selectable # OVERWRITE def initialize(x, y, height, shop_goods) super(x, y, window_width, height) @shop_goods = shop_goods @money = 0 @max_items_reached = false refresh select(0) end def count_window=(count_window) @count_window = count_window end def desc_window=(desc_window) @desc_window = desc_window end # OVERWRITE def update_help @help_window.set_item(item) if @help_window @status_window.item = item if @status_window @count_window.item = item if @count_window @desc_window.item = item if @desc_window end # OVERWRITE def current_item_enabled? if $game_party.item_max?(item) @max_items_reached = true else @max_items_reached = false end if check_stock(item) == 0 @item_sold_out = true else @item_sold_out = false end enable?(@data[index]) end def enable?(item) item && price(item) <= @money && !$game_party.item_max?(item) && check_stock(item) != 0 end # OVERWRITE def draw_item(index) item = @data[index] stock = check_stock(item) rect = item_rect(index) draw_item_name(item, rect.x, rect.y, enable?(item)) rect.width -= 4 if stock == 0 draw_text(rect, Galv_Shopkeeper::NO_STOCK, 2) else draw_text(rect, price(item), 2) end end def process_ok if current_item_enabled? Sound.play_ok Input.update deactivate call_ok_handler else if @item_sold_out == true $game_system.shop_spose = 4 elsif @max_items_reached == false $game_system.shop_spose = 0 else $game_system.shop_spose = 2 end Sound.play_buzzer end end include Shop_Stock end # class Window_ShopBuy < Window_Selectable class Window_ShopSell < Window_ItemList def col_max return 1 end def process_ok if current_item_enabled? Sound.play_ok Input.update deactivate call_ok_handler else $game_system.shop_spose = 1 Sound.play_buzzer end end def status_window=(status_window) @status_window = status_window end def update_help @help_window.set_item(item) if @help_window @status_window.item = item if @status_window end end # Window_ShopSell < Window_ItemList class Window_ItemDesc < Window_Base def initialize(x, y, width, height) super(x, y, width, height) @item = nil @shop_type = 0 end def refresh(item,type) @item = item contents.clear return if item.nil? @shop_type = type draw_item_name(@item, 0, 0) draw_currency_value(get_price, Vocab::currency_unit, 0, 0, contents.width) equip_stats if @item.is_a?(RPG::EquipItem) item_stats if @item.is_a?(RPG::Item) end def get_price if @shop_type == 0 return @item.price else if $game_variables[Galv_Shopkeeper::SALE_VAR] > 0 return ((@item.price * 0.01) * $game_variables[Galv_Shopkeeper::SALE_VAR]).round else return @item.price / 2 end end end def stat_col contents.width / 2 end def equip_stats y_offset = -15 draw_equip_stats(0, line_height * 2 + y_offset, 0) # HP draw_equip_stats(stat_col, line_height * 2 + y_offset, 1) # MP draw_equip_stats(0, line_height * 3 + y_offset, 2) # ATK draw_equip_stats(stat_col, line_height * 3 + y_offset, 3) # DEF draw_equip_stats(0, line_height * 4 + y_offset, 4) # MAT draw_equip_stats(stat_col, line_height * 4 + y_offset, 5) # MDF draw_equip_stats(0, line_height * 5 + y_offset, 6) # AGI draw_equip_stats(stat_col, line_height * 5 + y_offset, 7) # LUK draw_icons(100, line_height * 6 , width = 96) # States end def item=(item) @item = item refresh end def draw_equip_stats(x, y, param_id) draw_param_name(x + 4, y, param_id) draw_param(x + 94, y, param_id) end def draw_icons(x, y, width = 96) icons = [] # atk icons2 = [] # resistances @item.features.each do |f| if f.code == 32 icons << $data_states[f.data_id].icon_index elsif f.code == 14 icons2 << $data_states[f.data_id].icon_index end end if icons != [] change_color(system_color) draw_text(0, line_height * 6, 120, line_height, "Inflicts") change_color(normal_color) icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) } elsif icons2 != [] change_color(system_color) draw_text(0, line_height * 6, 120, line_height, "Resists") change_color(normal_color) icons2.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) } end end def draw_param_name(x, y, param_id) change_color(system_color) draw_text(x, y, 80, line_height, Vocab::param(param_id)) end def draw_param(x, y, param_id) if @item.params[param_id] > 0 change_color(power_up_color) elsif @item.params[param_id] < 0 change_color(power_down_color) else change_color(normal_color) end draw_text(x, y, 32, line_height, @item.params[param_id].to_s, 2) end def item_stats x = 0 y = 0 line = 1 y_offset = 15 width = contents.width rem_states = [] add_states = [] add_buffs = [] rem_buffs = [] if @item.damage.type != 0 change_color(system_color) case @item.damage.type when 1; vocab = Vocab::hp_a + " Damage" when 2; vocab = Vocab::mp_a + " Damage" when 3; vocab = Vocab::hp_a + " Restore" when 4; vocab = Vocab::mp_a + " Restore" when 5; vocab = Vocab::hp_a + " Drain" when 6; vocab = Vocab::mp_a + " Drain" end draw_text(0, line_height * line + y_offset, width, line_height, vocab, 0) change_color(normal_color) draw_text(0, line_height * line + y_offset, width, line_height, @item.damage.formula.to_s, 2) line += 1 end @item.effects.each do |e| next if line == 6 change_color(system_color) case e.code when 11; vocab = Vocab::hp_a; vocab2 = Vocab::hp when 12; vocab = Vocab::mp_a; vocab2 = Vocab::mp when 13; vocab = Vocab::tp_a; vocab2 = Vocab::tp end case e.code when 11, 12 draw_text(0, line_height * line + y_offset, width, line_height, vocab + " (" + vocab2 + ")", 0) v1 = (e.value1 * 100).to_i v2 = e.value2.to_i if e.value1 == 0 check_color(v2) draw_text(0, line_height * line + y_offset, width, line_height, v2.to_s, 2) elsif e.value2 == 0 check_color(v1) draw_text(0, line_height * line + y_offset, width, line_height, v1.to_s + "%", 2) else check_color(v1) draw_text(0, line_height * line + y_offset, width, line_height, v2.to_s + " + " + v1.to_s + "%", 2) end line += 1 when 13 draw_text(0, line_height * line + y_offset, width, line_height, vocab + " (" + vocab2 + ")", 0) check_color(e.value1) draw_text(0, line_height * line + y_offset, width, line_height, e.value1.to_i.to_s + "%", 2) line += 1 when 21 #add state add_states << e.data_id unless e.data_id == 0 when 22 #remove state rem_states << e.data_id unless e.data_id == 0 when 31, 32 #add buff/debuffs add_buffs << (64 + e.data_id) if e.code == 31 add_buffs << (64 + e.data_id + 16) if e.code == 32 when 33, 34 rem_buffs << (64 + e.data_id) if e.code == 33 rem_buffs << (64 + e.data_id + 16) if e.code == 34 when 42 #grow stat change_color(system_color) name = $data_system.terms.params[e.data_id] + " Increase" draw_text(0, line_height * line + y_offset, width, line_height, name, 0) change_color(normal_color) draw_text(0, line_height * line + y_offset, width, line_height, e.value1.to_i.to_s, 2) line += 1 when 43 #learn skill change_color(system_color) skill = $data_skills[e.data_id].name draw_text(0, line_height * line + y_offset, width, line_height, "Learn", 0) change_color(normal_color) draw_text(0, line_height * line + y_offset, width, line_height, skill, 2) line += 1 end end if add_states != [] && line < 6 || add_buffs != [] && line < 6 x = 90 icons = [] add_states.each do |s| icons << $data_states[s].icon_index end add_buffs.each do |b| icons << b end change_color(system_color) draw_text(0, line_height * line + y_offset, width, line_height, "Applies") change_color(normal_color) icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, line_height * line + y_offset) } line += 1 end if rem_states != [] && line < 6 || rem_buffs != [] && line < 6 x = 90 icons2 = [] rem_states.each do |s| icons2 << $data_states[s].icon_index end rem_buffs.each do |b| icons2 << b end change_color(system_color) draw_text(0, line_height * line + y_offset, width, line_height, "Removes") change_color(normal_color) icons2.each_with_index {|n, i| draw_icon(n, x + 24 * i, line_height * line + y_offset) } line += 1 end end def check_color(amount) if amount < 0 change_color(power_down_color) else change_color(normal_color) end end end # Window_ItemDesc < Window_Base class Window_Base < Window alias galv_shopkeeper_windowbase_initialize initialize def initialize(x, y, width, height) galv_shopkeeper_windowbase_initialize(x, y, width, height) if SceneManager.scene_is?(Scene_Shop) self.windowskin = Cache.system($game_system.shop_windowskin) end end end # Window_Base < Window class RPG::Class def primary_params if @primary_params.nil? if @note =~ /<primary_params:[ ](.*),(.*)>/i @primary_params = [$1.to_i,$2.to_i] else @primary_params = [2,3] end end @primary_params end end # RPG::Class #------------------------------------------------------------------------------# # COMPATABILITY PATCH FOR YANFLY'S EQUIP DYNAMIC STATS SCRIPT #------------------------------------------------------------------------------# # If you don't use this script from Yanfly, you can remove this. # #------------------------------------------------------------------------------# if $imported["YEA-EquipDynamicStats"] class Window_ShopStatus < Window_Base def draw_actor_param_change(x, y, actor, item1) rect = Rect.new(x, y, 40, line_height) change = actor_param_change_value(actor, item1) change_color(param_change_color(change)) text = change.group text = "+" + text if change >= 0 draw_text(rect, sprintf("%+d", change), 1) end end # Window_ShopStatus class Window_ItemDesc < Window_Base def draw_equip_stats(x, y, param_id) draw_param_name(x + 4, y, param_id) draw_param(x + 30, y, param_id) end def draw_param(x, y, param_id) a = @item.params[param_id] + $game_variables[@item.var_params[param_id]] b = @item.per_params[param_id] if a > 0 || b > 0; change_color(power_up_color) elsif a < 0 || b < 0; change_color(power_down_color) else; change_color(normal_color); end a != 0 && b != 0 ? plus = "+" : plus = "" if b != 0; perc = "%"; b = (b *= 100).to_i.to_s; else; perc = ""; b = ""; end if b == "" && a == 0; a = 0; elsif b != "" && a == 0; a = ""; end draw_text(x, y, 100, line_height, a.to_s + plus + b.to_s + perc, 2) end end # Window_ItemDesc < Window_Base end
sooo uh… marry me?
So I tried using this with your Menu Layout 1.5 and Group Manager 1.3 and it gives me a
“Script ‘Cache’ line 106: RGSSError occured. failed to create bitmap” error message.
I think the menu layout is the conflicting one or maybe both.
could something else be stopping it? I copied the scripts from the demo (the ones listed in Materials)
maybe I missed some? could you help me out and tell me what it could be.
Thought they’d look amazing together. :[
I just tested all three scripts you mentioned together with no problems.
When exactly does the error occur?
Also… are you starting a new game after you added the scripts?
yeah I start a new game, the error occurs when I try talking to a shop keeper.
I’ve used the regular method of calling the shop processing menu as well as copying the NPC’s from the demo and both times give me the same error.
Can you test if it’s a script compatibility with other scripts you may be using? I cannot replicate this by testing the 3 scripts you mention – they work fine for me. If you can pinpoint which script is conflicting I might be able to help.
they are the only scripts I’m using :[
I just tried applying them backwards (as in, putting the ones from mine into the shop demo) and they worked fine..
could it be the sprites I’m using for the chars? they are bigger than the default sprites. I have Mack characters.
Nevermind I just tried importing my character into the demo file and they worked as well… I dont understand whats conflicting in my game tho :[
I’m sorry for spamming the thread like this but I fixed it, apparently you have to have a face graphic for the characters your using. I had none because I prefer without them but I used the defaults and it worked just fine.
That’s how the menu layout script works… it uses a portrait based on the face used. I am actually unsure why it would crash when talking to the shopkeeper and not when you opened your menu… but I’m glad you worked it out.
You make awsome scripts(like this one) so I’ll ask you for using this scripts for my big projekt.
I work with friends on a projekt, a RPG that calls Noshuma.
and sorry for my bad english
This script is free to use in your project with credit :)
ok. I ask, because there is a copyright on your scripts
Hi Galv,
thank you for your early Reply about “invader, yes you are right :)
by the way does Galv’s shop upgrade script
can be enable or disable by a switch??
No sorry, it takes over the shop scene
I put in my rpg but it worked
There;s a glitch backing out of the ‘sell’ menu – the main original menu does not reappear.
Does it happen in the demo? Or is it a script conflict?
Hi Galv. Thanks for the great script. Is it possible to set one primary parameter for each individual weapon or armor as opposed to one general set of weapon/armor parameters for a class? I have armor for the body give defense, while helmets give magic defense. If this isn’t possible in the script’s current state, would it be an easy enough add-on that you might consider it? Thanks again.
Sorry, that’s a good idea but I don’t have time to do requests.
What exactly is that Yanfly patch? I was using Yanfly’s Equip Dynamic Stats script and everytime I put a weapon or armor that ever had a parameter tag (the error repeated itself even after I removed the tag AND changed the database number) in a shop, it would crash with a “no explicit conversion from nil to integer” parameter error. I removed Yanfly’s script and it worked again, so I put it back in and then removed your compatibility patch and now everything works together. I tried putting Yanfly above and below the Galv Shop, error on both. What was the reason for that compatibility path? It seems to work just fine without it.
I don’t recall, it was written one and a half years ago… :/
My guess is it had to do with displaying the data that script created. As for your error – did you start a new test game after adding scripts?
Here’s some things to try.
https://galvs-scripts.com/errors-using-scripts/
Hmmm. I dont know if you have answered this question before so soz big time if you have. But is there a way to change the shopkeeper so i can have a different NPC manage the shop in each town and junk?
Heh. Totes forgot i could just download the demo and figure it out mahself. Soz for makin it seem like i wanted to easy answer from you. Must be da Murican in me.
Haha, yes there is and yep in the script instructions it tells you how and the demo has examples of it working :)
Hey Galv, i am using this script in my game but i was wondering if it was possible to remove the key items section from the sell part of the menu?
Not without script changes and unfortunately I don’t have time to do requests. I recommend asking in a forum :)
Hey Galv!Your pretty cool!I’m fluent with Ruby and your scripts inspired me!
I have an amazing knowledge of the databse and all that stuff in RMVXAce and I never knew how to code.Your scripts inspired me and it took ages but I learnt the language fully.
Thanks for being a life changer :)
Kind of you to say, thank you. Good luck with your projects!
Just wondering if there was a way to limit what the shopkeeper will buy with this script? Like how can it set it so you’re only able to sell specific items to a shop? Sorry if this a noob question, I’m just starting out.
Sorry, not with this script. That would need to be coded in
I found small script that does the trick and does not seem to conflict with yours. I did however notice that each time I talk to the shop keeper and trigger shop processing it adds an additional amount of items to the stock as specified by my “add_stock(1,0,10,15)”
For example if I talk to the shop keeper it will show 15 of item 10 in stock, but then if i esc out and talk to him again, the stock will increase to 30. Any ideas?
^ Ignore this, I’m dumb.
My only real question…Is there a way to manipulate the price an item is sold at by inputting an algorithm?
So like depending on circumstances, the item may cost more or less each time you go to the shop?
In the script settings:
SALE_VAR = 1 # variable that controls sale price as a % of item’s
# price. Default is 50, use control variables to change
# this during the game. Make this 0 to not use this
# feature.
That’s the only option in this script. You could change the percent using control variables.
Hello galv when I enter the shop it does just fine but when I try to exit the shop it hangs my game, background doesn’t exit, shop doesn’t exit and my game just remains like that. I don’t know what is wrong
Here’s a link with a list of things you can do to error trap: https://galvs-scripts.com/errors-using-scripts/
I know this might be a little late, but RPG Maker requires you to have an item in the shop processing window. Is there a way to make it so that this script ignores whatever item is included there as a placeholder?
Not as part of this plugin, sorry.