=begin ====================================================== Shared Storage v2.40 by Adiktuzmiko Date Created: 09/25/2014 Date Last Updated: 10/03/2015 Requires: N/A Difficulty: Easy ====================================================== Overview ====================================================== This script allows you to have shared storages where you can put/take items. The storage is accessible to all save files of your game or even another game as long as you set them to use the same storage file. You can modify most of the properties of each window involved in the scene, and also where to put the storage file. You could also set a different max item limit for the storage than that of the normal limit for the party inventory All window settings and limitations can now be set separately for each storage. Any storage opened that doesn't have it's own settings will use the default. Allows multiple storages in one file ====================================================== Usage ====================================================== Put this script into your scripts editor and modify the settings below Then to open up the storage window Script call: SceneManager.open_shared_storage(number) Where number is the number of the storage that you will open. If you want to open multiple storages that can be switched right on the scene via button inputs (configurable below) you can use SceneManager.open_shared_storage(min,max) where: min => storage to open right away, also the minimum that can be switched max => the maximum storage number that can be switched into example: If I want to open storages 3,4,5 and 6 SceneManager.open_shared_storage(3,6) I don't know the limit of how many storages you can make, possibly hundreds or thousands. If you want to directly modify the contents of a storage (like if you want a certain storage to start with an item already in it) you can do this $shared_storage[[storage_number,item_class,item_id]] = amount ADIK::SHARED_STORAGE.save_storage item_class could be "RPG::Item", "RPG::Weapon", "RPG::Armor" the "" is important by the way For gold, $shared_storage[[:gold,storage_number]] = amount ADIK::SHARED_STORAGE.save_storage Take note that you must do it only ONCE per item that you wanna add to the storage. Better do it during the title screen script, test play so that it runs, then delete the script lines afterward I'd also advice only doing it when you're going to ship the game already, else you might actually need to redo it before shipping out your game. On configuring multiple storages: Important: The 0 indexed setting will be the one used by default by any storage that you open that doesn't have it's own settings defined. So don't remove it. Copy paste the setting constants and modify the index to the storage number that you want, then modify the values For example: This would be the settings for the custom window of storage number 1 CUSTOM_WINDOW[1] = blahblah Do that for every setting that you want to change for a particular storage ====================================================== Compatibility ====================================================== Aliases DataManager's load_game and save_game_without_rescue methods, Scene_Title's start method Inherits Window_Selectable, Window_HorzCommand, Window_Base and Scene_Base ====================================================== Terms and Conditions ====================================================== View it here: http://lescripts.wordpress.com/terms-and-conditions/ ====================================================== =end module ADIK module SHARED_STORAGE # Primary folder where the save data will be placed # based on the default paths in your computer # set to nil if you don't want to use this DATA_PATH = 'CURRENT' #~ Heres a list of parameters you can set the DATA_PATH into #~ #~ AppData = Contains the full path to the Application Data directory of the logged-in user #~ LOCALAPPDATA = This variable is the temporary files of Applications. #~ CURRENT = Folder where the game is run from #~ !!!The following might require your game to run in admin mode!!! #~ ProgramFiles = This variable points to Program Files directory #~ CommonProgramFiles = This variable points to Common Files directory #Enter each subfolder paths after the primary folder here #The script automatically creates the folder path specified #FOLDER = [FOLDER1,FOLDER2,and so on] FOLDER = ["Storage"] #Filename for the storage file NAME = "storage.rvdata2" #Does it autosave when you put items into it? #If False, then it only saves the storage once #the player saves his game #You'd pretty much want to set this to false #unless you're also autosaving the game AUTOSAVE = true #Tag to make items not placeable in storage NON_STORAGE_TAG = // #Important: Do not remove! #====================================================== BACKGROUND = [] #====================================================== #Background picture for the scene #Must be inside your Graphics\System folder BACKGROUND[0] = "" #Important: Do not remove! #====================================================== SS_CATEGORY_WINDOW = [] SS_CATEGORY_FONT = [] #====================================================== #Settings for the Deposit/Withdraw window #x,y,width,height,Windowskin,Deposit Text, Withdraw Text SS_CATEGORY_WINDOW[0] = [0,0,164,32,"Window.png","Deposit","Withdraw"] #Font name, font size, color (based on windowskin) SS_CATEGORY_FONT[0] = [Font.default_name,24,0] #Important: Do not remove! #====================================================== CATEGORY_WINDOW = [] CATEGORY_FONT = [] #====================================================== #Settings for the Item/Weapon/Armor/Key Item window #x,y,width,height,Windowskin,Item text, weapon text, armor text, key item text, gold text #set text to nil if you don't want it to show CATEGORY_WINDOW[0] = [164,0,380,32,"Window.png","Item","Weapon","Armor","Key Item","Gold"] #Font name, font size, color (based on windowskin) CATEGORY_FONT[0] = [Font.default_name,24,0] #Important: Do not remove! #====================================================== PLAYER_WINDOW = [] PLAYER_FONT = [] #====================================================== #Settings for the Player Item Header window #x,y,width,height,Windowskin, Player inventory text PLAYER_WINDOW[0] = [0,48,226,48,"Window.png","Player Inventory"] #Font name, font size, color (based on windowskin) PLAYER_FONT[0] = [Font.default_name,18,1] #Important: Do not remove! #====================================================== STORAGE_WINDOW = [] STORAGE_FONT = [] #====================================================== #Settings for the Storage Header window #x,y,width,height,Windowskin, Storage text STORAGE_WINDOW[0] = [318,48,226,48,"Window.png","Storage"] #Font name, font size, color (based on windowskin) STORAGE_FONT[0] = [Font.default_name,18,1] #Important: Do not remove! #====================================================== ITEM_LIST_PLAYER_WINDOW = [] ITEM_LIST_PLAYER_FONT = [] #====================================================== #Settings for the player item window #x,y,width,height,Windowskin #You could set width and height to 0 to "remove" #the window ITEM_LIST_PLAYER_WINDOW[0] = [0,208,272,208,"Window.png"] #Font name, font size, color (based on windowskin) ITEM_LIST_PLAYER_FONT[0] = [Font.default_name,24,0] #Important: Do not remove! #====================================================== ITEM_LIST_STORAGE_WINDOW = [] ITEM_LIST_STORAGE_FONT = [] #====================================================== #Settings for the storage item window #x,y,width,height,Windowskin #You could set width and height to 0 to "remove" #the window ITEM_LIST_STORAGE_WINDOW[0]= [272,208,272,208,"Window.png"] #Font name, font size, color (based on windowskin) ITEM_LIST_STORAGE_FONT[0] = [Font.default_name,24,0] #Important: Do not remove! #====================================================== NUMBER_MAX = [] #====================================================== #Maximum digits for item number selection NUMBER_MAX[0] = 2 #Important: Do not remove! #====================================================== MAX_ITEM_NUMBER = [] #====================================================== #Formula for obtaining the maximum number #that each item can be placed in the storage MAX_ITEM_NUMBER[0] = "$game_party.max_item_number(item)" MAX_ITEM_NUMBER[1] = "SceneManager.scene.get_item_limit" #Important: Do not remove! #====================================================== ITEM_NUMBER_WINDOW = [] ITEM_NUMBER_FONT = [] #====================================================== #Settings for item number window #x,y,width,height,Windowskin ITEM_NUMBER_WINDOW[0] = [240,156,32,32,"Window.png"] #Font name, font size, color (based on windowskin) ITEM_NUMBER_FONT[0] = [Font.default_name,18,0] #Important: Do not remove! #====================================================== HELP_WINDOW = [] HELP_FONT = [] #====================================================== #Settings for help window #x,y,width,height,Windowskin HELP_WINDOW[0] = [0,96,Graphics.width,64,"Window.png"] #Font name, font size, color (based on windowskin) HELP_FONT[0] = [Font.default_name,18,0] #Important: Do not remove! #====================================================== CUSTOM_WINDOW = [] CUSTOM_FONT = [] CUSTOM_TEXT = [] #====================================================== #Settings for Custom Window #x,y,width,height,Windowskin #You could set width and height to 0 to "remove" #the window CUSTOM_WINDOW[0] = [226,48,96,48,"Window.png"] #Font name, font size, color (based on windowskin) CUSTOM_FONT[0] = [Font.default_name,18,0] #Formula/Method to determine what is shown on the custom #window CUSTOM_TEXT[0] = "$game_actors[1].name" CUSTOM_TEXT[1] = "SceneManager.scene.get_remaining_slots" #Important: Do not remove! #====================================================== GOLD_WINDOW = [] GOLD_FONT = [] #====================================================== #Settings for Gold Window of storage #x,y,width,height,Windowskin,Text #You could set width and height to 0 to "remove" #the window GOLD_WINDOW[0] = [272,160,272,48,"Window.png","Gold: "] #Font name, font size, color (based on windowskin) GOLD_FONT[0] = [Font.default_name,18,0] #Important: Do not remove! #====================================================== GOLD_P_WINDOW = [] GOLD_P_FONT = [] #====================================================== #Settings for Gold Window ofparty #x,y,width,height,Windowskin,Text #You could set width and height to 0 to "remove" #the window GOLD_P_WINDOW[0] = [0,160,272,48,"Window.png","Gold: "] #Font name, font size, color (based on windowskin) GOLD_P_FONT[0] = [Font.default_name,18,0] #Important: Do not remove! #====================================================== GOLD_LIMIT = [] GOLD_P_LIMIT = [] #====================================================== #Limit for storage gold GOLD_LIMIT[0] = "$game_party.max_gold" GOLD_P_LIMIT[0] = "$game_party.max_gold" #Important: Do not remove! #====================================================== GOLD_NUMBER_WINDOW = [] GOLD_NUMBER_FONT = [] #====================================================== #Settings for gold number window #x,y,width,height,Windowskin GOLD_NUMBER_WINDOW[0] = [240,156,32,32,"Window.png"] #Font name, font size, color (based on windowskin) GOLD_NUMBER_FONT[0] = [Font.default_name,18,0] #Key input for next storage NEXT_KEY = :c #Key input for prev storage PREV_KEY = :z #====================================================== # Do not edit below this line #====================================================== #====================================================== # Do not edit below this line #====================================================== #====================================================== # Do not edit below this line #====================================================== #========================================================================# def self.check_storage @path = "" if not DATA_PATH == 'CURRENT' @path = ENV[DATA_PATH] + "\\" end FOLDER.each do |path| @path += path + "\\" Dir.mkdir(@path) if !FileTest.exist?(@path) end @path += NAME begin load_storage rescue $shared_storage = {} save_storage end end def self.save_storage File.open(@path, "wb") do |file| Marshal.dump($shared_storage, file) end end def self.load_storage File.open(@path, "rb") do |file| $shared_storage = Marshal.load(file) end end end end class Scene_Title alias shared_storage_start start def start shared_storage_start #loads storage from disk (or create it if it isn't yet) #everytime you go to the title screen ADIK::SHARED_STORAGE.check_storage end end class Window_SS_Category < Window_HorzCommand def initialize(x, y) super(x,y) categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::SS_CATEGORY_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::SS_CATEGORY_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) end def col_max return 2 end def window_width categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[0] if categ.nil? return categ[2] end def window_heigth categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[0] if categ.nil? return categ[3] end def make_command_list categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[0] if categ.nil? add_command(categ[5], :deposit, true) add_command(categ[6], :withdraw, true) end end class Window_Category_SS < Window_HorzCommand def initialize(x, y) super(x,y) categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::CATEGORY_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) end def col_max count = 0 categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if categ.nil? [5,6,7,8,9].each {|x| count+=1 unless categ[x].nil? } return count end def window_width categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if categ.nil? return categ[2] end def window_heigth categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if categ.nil? return categ[3] end def make_command_list categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if categ.nil? add_command(categ[5], :item, true) unless categ[5].nil? add_command(categ[6], :weapon, true) unless categ[6].nil? add_command(categ[7], :armor, true) unless categ[7].nil? add_command(categ[8], :key_item, true) unless categ[8].nil? add_command(categ[9], :gold, true) unless categ[9].nil? end def process_ok if current_item_enabled? if current_symbol == :gold Input.update deactivate call_ok_handler else Sound.play_ok Input.update deactivate call_ok_handler end else Sound.play_buzzer end end end class Window_ItemList_SS_Player < Window_Selectable #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(x, y, width, height) super @category = :none @data = [] categ = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) end #-------------------------------------------------------------------------- # * Set Category #-------------------------------------------------------------------------- def category=(category) return if @category == category @category = category refresh self.oy = 0 select_last end #-------------------------------------------------------------------------- # * Get Digit Count #-------------------------------------------------------------------------- def col_max return 1 end #-------------------------------------------------------------------------- # * Get Number of Items #-------------------------------------------------------------------------- def item_max @data ? @data.size : 0 end #-------------------------------------------------------------------------- # * Get Item #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # * Get Activation State of Selection Item #-------------------------------------------------------------------------- def current_item_enabled? enable?(@data[index]) end #-------------------------------------------------------------------------- # * Include in Item List? #-------------------------------------------------------------------------- def include?(item) return false if item.nil? return false if item.note =~ ADIK::SHARED_STORAGE::NON_STORAGE_TAG case @category when :item item.is_a?(RPG::Item) && !item.key_item? when :weapon item.is_a?(RPG::Weapon) when :armor item.is_a?(RPG::Armor) when :key_item item.is_a?(RPG::Item) && item.key_item? else false end end #-------------------------------------------------------------------------- # * Display in Enabled State? #-------------------------------------------------------------------------- def enable?(item) if SceneManager.scene.ss_category == :withdraw false else SceneManager.scene.can_store(item) end end #-------------------------------------------------------------------------- # * Create Item List #-------------------------------------------------------------------------- def make_item_list @data = $game_party.all_items.select {|item| include?(item) } @data.push(nil) if include?(nil) end #-------------------------------------------------------------------------- # * Restore Previous Selection Position #-------------------------------------------------------------------------- def select_last select(@data.index($game_party.last_item.object) || 0) end #-------------------------------------------------------------------------- # * Draw Item #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if item rect = item_rect(index) rect.width -= 4 draw_item_name(item, rect.x, rect.y, enable?(item)) draw_item_number(rect, item) end end #-------------------------------------------------------------------------- # * Draw Number of Items #-------------------------------------------------------------------------- def draw_item_number(rect, item) draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2) end #-------------------------------------------------------------------------- # * Update Help Text #-------------------------------------------------------------------------- def update_help @help_window.set_item(item) end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh make_item_list create_contents draw_all_items end def process_ok if current_item_enabled? Input.update deactivate call_ok_handler else Sound.play_buzzer end end end class Window_ItemList_SS_Storage < Window_Selectable #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(x, y, width, height) super @category = :none @data = [] categ = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) end def process_ok if current_item_enabled? Input.update deactivate call_ok_handler else Sound.play_buzzer end end #-------------------------------------------------------------------------- # * Set Category #-------------------------------------------------------------------------- def category=(category) return if @category == category @category = category refresh self.oy = 0 select_last end #-------------------------------------------------------------------------- # * Get Digit Count #-------------------------------------------------------------------------- def col_max return 1 end #-------------------------------------------------------------------------- # * Get Number of Items #-------------------------------------------------------------------------- def item_max @data ? @data.size : 0 end #-------------------------------------------------------------------------- # * Get Item #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # * Get Activation State of Selection Item #-------------------------------------------------------------------------- def current_item_enabled? enable?(@data[index]) end #-------------------------------------------------------------------------- # * Include in Item List? #-------------------------------------------------------------------------- def include?(item) return false if item.nil? case @category when :item item.is_a?(RPG::Item) && !item.key_item? when :weapon item.is_a?(RPG::Weapon) when :armor item.is_a?(RPG::Armor) when :key_item item.is_a?(RPG::Item) && item.key_item? else false end end #-------------------------------------------------------------------------- # * Display in Enabled State? #-------------------------------------------------------------------------- def enable?(item) if SceneManager.scene.ss_category == :deposit false else SceneManager.scene.can_store(item) end end #-------------------------------------------------------------------------- # * Create Item List #-------------------------------------------------------------------------- def make_item_list @data = [] $shared_storage.each_key do |key| next if key[0] != @storage_number case key[1] when "RPG::Item" item = $data_items[key[2]] @data.push(item) if include?(item) when "RPG::Weapon" item = $data_weapons[key[2]] @data.push(item) if include?(item) when "RPG::Armor" item = $data_armors[key[2]] @data.push(item) if include?(item) end end end def set_number(sn) @storage_number = sn end #-------------------------------------------------------------------------- # * Restore Previous Selection Position #-------------------------------------------------------------------------- def select_last select(@data.index($game_party.last_item.object) || 0) end #-------------------------------------------------------------------------- # * Draw Item #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if item rect = item_rect(index) rect.width -= 4 draw_item_name(item, rect.x, rect.y, enable?(item)) draw_item_number(rect, item) end end #-------------------------------------------------------------------------- # * Draw Number of Items #-------------------------------------------------------------------------- def draw_item_number(rect, item) draw_text(rect, sprintf(":%2d", $shared_storage[[@storage_number,item.class.to_s,item.id]]), 2) end #-------------------------------------------------------------------------- # * Update Help Text #-------------------------------------------------------------------------- def update_help @help_window.set_item(item) end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh make_item_list create_contents draw_all_items end end class Window_Player_Header < Window_Base def initialize(x, y, width, height) super categ = ADIK::SHARED_STORAGE::PLAYER_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::PLAYER_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ1 = ADIK::SHARED_STORAGE::PLAYER_FONT[$shared_storage_number] categ1 = ADIK::SHARED_STORAGE::PLAYER_FONT[0] if categ1.nil? contents.font.name = categ1[0] contents.font.size = categ1[1] contents.font.color = text_color(categ1[2]) contents.draw_text(0,0,categ[2],categ1[1],categ[5],1) end end class Window_Storage_Header < Window_Base def initialize(x, y, width, height) super categ = ADIK::SHARED_STORAGE::STORAGE_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::STORAGE_WINDOW[0] if categ.nil? self.windowskin = Cache.system(categ[4]) categ1 = ADIK::SHARED_STORAGE::STORAGE_FONT[$shared_storage_number] categ1 = ADIK::SHARED_STORAGE::STORAGE_FONT[0] if categ1.nil? contents.font.name = categ1[0] contents.font.size = categ1[1] contents.font.color = text_color(categ1[2]) contents.draw_text(0,0,categ[2],categ1[1],categ[5],1) end end class Window_NumberInput_SS < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize categ = ADIK::SHARED_STORAGE::ITEM_NUMBER_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_NUMBER_WINDOW[0] if categ.nil? super(categ[0],categ[1],categ[2],categ[3]) @number = 0 @digits_max = 1 @index = 0 @item = nil self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::ITEM_NUMBER_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::ITEM_NUMBER_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) self.openness = 0 deactivate end #-------------------------------------------------------------------------- # * Start Input Processing #-------------------------------------------------------------------------- def start(item,category) @digits_max = ADIK::SHARED_STORAGE::NUMBER_MAX[$shared_storage_number] @digits_max = ADIK::SHARED_STORAGE::NUMBER_MAX[0] if @digits_max.nil? @index = @digits_max - 1 @item = item @category = category update_placement create_contents refresh open activate end #-------------------------------------------------------------------------- # * Update Window Position #-------------------------------------------------------------------------- def update_placement self.width = @digits_max * 20 + padding * 2 self.height = fitting_height(1) end #-------------------------------------------------------------------------- # * Move Cursor Right # wrap : Wraparound allowed #-------------------------------------------------------------------------- def cursor_right(wrap) if @index < @digits_max - 1 || wrap @index = (@index + 1) % @digits_max end end #-------------------------------------------------------------------------- # * Move Cursor Left # wrap : Wraparound allowed #-------------------------------------------------------------------------- def cursor_left(wrap) if @index > 0 || wrap @index = (@index + @digits_max - 1) % @digits_max end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super process_cursor_move process_digit_change process_handling update_cursor end #-------------------------------------------------------------------------- # * Cursor Movement Processing #-------------------------------------------------------------------------- def process_cursor_move return unless active last_index = @index cursor_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT) cursor_left (Input.trigger?(:LEFT)) if Input.repeat?(:LEFT) Sound.play_cursor if @index != last_index end #-------------------------------------------------------------------------- # * Change Processing for Digits #-------------------------------------------------------------------------- def process_digit_change return unless active if Input.repeat?(:UP) || Input.repeat?(:DOWN) Sound.play_cursor place = 10 ** (@digits_max - 1 - @index) n = @number / place % 10 @number -= n * place n = (n + 1) % 10 if Input.repeat?(:UP) n = (n + 9) % 10 if Input.repeat?(:DOWN) @number += n * place if @category == :deposit item = @item numb = ADIK::SHARED_STORAGE::MAX_ITEM_NUMBER[$shared_storage_number] numb = ADIK::SHARED_STORAGE::MAX_ITEM_NUMBER[0] if numb.nil? numb = eval(numb) begin numb -= $shared_storage[[$shared_storage_number,@item.class.to_s,@item.id]] rescue end @number = [@number,$game_party.item_number(@item),numb].min else amount = $shared_storage[[$shared_storage_number,@item.class.to_s,@item.id]] limit = $game_party.max_item_number(@item)- $game_party.item_number(@item) @number = [@number,amount,limit].min end refresh end end #-------------------------------------------------------------------------- # * Handling Processing for OK and Cancel #-------------------------------------------------------------------------- def process_handling return unless active return process_ok if Input.trigger?(:C) return process_cancel if Input.trigger?(:B) end #-------------------------------------------------------------------------- # * Processing When OK Button Is Pressed #-------------------------------------------------------------------------- def process_ok Sound.play_ok SceneManager.scene.set_number(@number) deactivate close end #-------------------------------------------------------------------------- # * Processing When Cancel Button Is Pressed #-------------------------------------------------------------------------- def process_cancel SceneManager.scene.set_number(0) deactivate close end #-------------------------------------------------------------------------- # * Get Rectangle for Displaying Item #-------------------------------------------------------------------------- def item_rect(index) Rect.new(index * 20, 0, 20, line_height) end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh contents.clear change_color(normal_color) s = sprintf("%0*d", @digits_max, @number) @digits_max.times do |i| rect = item_rect(i) rect.x += 1 draw_text(rect, s[i,1], 1) end end #-------------------------------------------------------------------------- # * Update Cursor #-------------------------------------------------------------------------- def update_cursor cursor_rect.set(item_rect(@index)) end end class Window_NumberInput_Gold < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize categ = ADIK::SHARED_STORAGE::GOLD_NUMBER_WINDOW[$shared_storage_number] categ = ADIK::SHARED_STORAGE::GOLD_NUMBER_WINDOW[0] if categ.nil? super(categ[0],categ[1],categ[2],categ[3]) @number = 0 @digits_max = 1 @index = 0 @item = nil self.windowskin = Cache.system(categ[4]) categ = ADIK::SHARED_STORAGE::GOLD_NUMBER_FONT[$shared_storage_number] categ = ADIK::SHARED_STORAGE::GOLD_NUMBER_FONT[0] if categ.nil? contents.font.name = categ[0] contents.font.size = categ[1] contents.font.color = text_color(categ[2]) self.openness = 0 deactivate end #-------------------------------------------------------------------------- # * Start Input Processing #-------------------------------------------------------------------------- def start(category) if category == :deposit if ADIK::SHARED_STORAGE::GOLD_LIMIT[$shared_storage_number].nil? @digits_max = eval(ADIK::SHARED_STORAGE::GOLD_LIMIT[0]).to_s.length else @digits_max = eval(ADIK::SHARED_STORAGE::GOLD_LIMIT[$shared_storage_number]).to_s.length end else if ADIK::SHARED_STORAGE::GOLD_P_LIMIT[$shared_storage_number].nil? @digits_max = eval(ADIK::SHARED_STORAGE::GOLD_P_LIMIT[0]).to_s.length else @digits_max = eval(ADIK::SHARED_STORAGE::GOLD_P_LIMIT[$shared_storage_number]).to_s.length end end @index = @digits_max - 1 @category = category update_placement create_contents refresh open activate end #-------------------------------------------------------------------------- # * Update Window Position #-------------------------------------------------------------------------- def update_placement self.width = @digits_max * 20 + padding * 2 self.height = fitting_height(1) end #-------------------------------------------------------------------------- # * Move Cursor Right # wrap : Wraparound allowed #-------------------------------------------------------------------------- def cursor_right(wrap) if @index < @digits_max - 1 || wrap @index = (@index + 1) % @digits_max end end #-------------------------------------------------------------------------- # * Move Cursor Left # wrap : Wraparound allowed #-------------------------------------------------------------------------- def cursor_left(wrap) if @index > 0 || wrap @index = (@index + @digits_max - 1) % @digits_max end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super process_cursor_move process_digit_change process_handling update_cursor end #-------------------------------------------------------------------------- # * Cursor Movement Processing #-------------------------------------------------------------------------- def process_cursor_move return unless active last_index = @index cursor_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT) cursor_left (Input.trigger?(:LEFT)) if Input.repeat?(:LEFT) Sound.play_cursor if @index != last_index end #-------------------------------------------------------------------------- # * Change Processing for Digits #-------------------------------------------------------------------------- def process_digit_change return unless active if Input.repeat?(:UP) || Input.repeat?(:DOWN) Sound.play_cursor place = 10 ** (@digits_max - 1 - @index) n = @number / place % 10 @number -= n * place n = (n + 1) % 10 if Input.repeat?(:UP) n = (n + 9) % 10 if Input.repeat?(:DOWN) @number += n * place if @category == :deposit numb = ADIK::SHARED_STORAGE::GOLD_LIMIT[$shared_storage_number] numb = ADIK::SHARED_STORAGE::GOLD_LIMIT[0] if numb.nil? numb = eval(numb) begin numb -= $shared_storage[[:gold,$shared_storage_number]] end @number = [@number,$game_party.gold,numb].min else numb = ADIK::SHARED_STORAGE::GOLD_P_LIMIT[$shared_storage_number] numb = ADIK::SHARED_STORAGE::GOLD_P_LIMIT[0] if numb.nil? numb = eval(numb) begin numb -= $game_party.gold end @number = [@number,$shared_storage[[:gold,$shared_storage_number]],numb].min end refresh end end #-------------------------------------------------------------------------- # * Handling Processing for OK and Cancel #-------------------------------------------------------------------------- def process_handling return unless active return process_ok if Input.trigger?(:C) return process_cancel if Input.trigger?(:B) end #-------------------------------------------------------------------------- # * Processing When OK Button Is Pressed #-------------------------------------------------------------------------- def process_ok Sound.play_ok SceneManager.scene.adjust_gold(@number) deactivate close end #-------------------------------------------------------------------------- # * Processing When Cancel Button Is Pressed #-------------------------------------------------------------------------- def process_cancel SceneManager.scene.set_number(0) deactivate close end #-------------------------------------------------------------------------- # * Get Rectangle for Displaying Item #-------------------------------------------------------------------------- def item_rect(index) Rect.new(index * 20, 0, 20, line_height) end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh contents.clear change_color(normal_color) s = sprintf("%0*d", @digits_max, @number) @digits_max.times do |i| rect = item_rect(i) rect.x += 1 draw_text(rect, s[i,1], 1) end end #-------------------------------------------------------------------------- # * Update Cursor #-------------------------------------------------------------------------- def update_cursor cursor_rect.set(item_rect(@index)) end end class Custom_Text_SS < Window_Base def update_text category = ADIK::SHARED_STORAGE::CUSTOM_WINDOW[SceneManager.scene.storage_number] category = ADIK::SHARED_STORAGE::CUSTOM_WINDOW[0] if category.nil? return if category[2] == 0 or category[3] == 0 contents.clear category = ADIK::SHARED_STORAGE::CUSTOM_TEXT[SceneManager.scene.storage_number] category = ADIK::SHARED_STORAGE::CUSTOM_TEXT[0] if category.nil? contents.draw_text(0,0,contents.width,contents.font.size,eval(category).to_s,1) end end class Gold_Window_SS < Window_Base def update_text category = ADIK::SHARED_STORAGE::GOLD_WINDOW[SceneManager.scene.storage_number] category = ADIK::SHARED_STORAGE::GOLD_WINDOW[0] if category.nil? return if category[2] == 0 or category[3] == 0 contents.clear $shared_storage[[:gold,SceneManager.scene.storage_number]] = 0 if $shared_storage[[:gold,SceneManager.scene.storage_number]].nil? text = category[5].to_s + $shared_storage[[:gold,SceneManager.scene.storage_number]].to_s contents.draw_text(0,0,contents.width,contents.font.size,text,0) end end class Gold_Window_P < Window_Base def update_text category = ADIK::SHARED_STORAGE::GOLD_P_WINDOW[SceneManager.scene.storage_number] category = ADIK::SHARED_STORAGE::GOLD_P_WINDOW[0] if category.nil? return if category[2] == 0 or category[3] == 0 contents.clear text = category[5].to_s + $game_party.gold.to_s contents.draw_text(0,0,contents.width,contents.font.size,text,0) end end class Scene_SharedStorage < Scene_Base attr_accessor :ss_category attr_accessor :category attr_accessor :storage_number attr_accessor :storage_number_max attr_accessor :storage_number_min def start super @storage_number = $shared_storage_number @background_sprite = Sprite.new begin @background_sprite.bitmap = Cache.system(ADIK::SHARED_STORAGE::BACKGROUND[@storage_number]) rescue @background_sprite.bitmap = Cache.system(ADIK::SHARED_STORAGE::BACKGROUND[0]) end create_ss_category_window create_category_window create_header_windows create_window_item_list_ss_player create_window_item_list_ss_storage create_help_window create_custom_text_window create_gold_window @ss_category_window.activate end def terminate @background_sprite.dispose super end def create_custom_text_window category = ADIK::SHARED_STORAGE::CUSTOM_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::CUSTOM_WINDOW[0] if category.nil? @custom_text_window = Custom_Text_SS.new(category[0],category[1],category[2],category[3]) @custom_text_window.x = category[0] @custom_text_window.y = category[1] @custom_text_window.width = category[2] @custom_text_window.height = category[3] @custom_text_window.windowskin = Cache.system(category[4]) category = ADIK::SHARED_STORAGE::CUSTOM_FONT[@storage_number] category = ADIK::SHARED_STORAGE::CUSTOM_FONT[0] if category.nil? @custom_text_window.contents.font.name = category[0] @custom_text_window.contents.font.size = category[1] @custom_text_window.contents.font.color = @help_window.text_color(category[2]) @custom_text_window.update_text end def create_gold_window category = ADIK::SHARED_STORAGE::GOLD_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::GOLD_WINDOW[0] if category.nil? @gold_window_ss = Gold_Window_SS.new(category[0],category[1],category[2],category[3]) @gold_window_ss.x = category[0] @gold_window_ss.y = category[1] @gold_window_ss.width = category[2] @gold_window_ss.height = category[3] @gold_window_ss.windowskin = Cache.system(category[4]) category = ADIK::SHARED_STORAGE::GOLD_FONT[@storage_number] category = ADIK::SHARED_STORAGE::GOLD_FONT[0] if category.nil? @gold_window_ss.contents.font.name = category[0] @gold_window_ss.contents.font.size = category[1] @gold_window_ss.contents.font.color = @help_window.text_color(category[2]) @gold_window_ss.update_text category = ADIK::SHARED_STORAGE::GOLD_P_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::GOLD_P_WINDOW[0] if category.nil? @gold_window_p = Gold_Window_P.new(category[0],category[1],category[2],category[3]) @gold_window_p.x = category[0] @gold_window_p.y = category[1] @gold_window_p.width = category[2] @gold_window_p.height = category[3] @gold_window_p.windowskin = Cache.system(category[4]) category = ADIK::SHARED_STORAGE::GOLD_P_FONT[@storage_number] category = ADIK::SHARED_STORAGE::GOLD_P_FONT[0] if category.nil? @gold_window_p.contents.font.name = category[0] @gold_window_p.contents.font.size = category[1] @gold_window_p.contents.font.color = @help_window.text_color(category[2]) @gold_window_p.update_text end def create_help_window @help_window = Window_Help.new category = ADIK::SHARED_STORAGE::HELP_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::HELP_WINDOW[0] if category.nil? @help_window.x = category[0] @help_window.y = category[1] @help_window.width = category[2] @help_window.height = category[3] @help_window.windowskin = Cache.system(category[4]) category = ADIK::SHARED_STORAGE::HELP_FONT[@storage_number] category = ADIK::SHARED_STORAGE::HELP_FONT[0] if category.nil? @help_window.contents.font.name = category[0] @help_window.contents.font.size = category[1] @help_window.contents.font.color = @help_window.text_color(category[2]) @list_storage_window.help_window = @help_window @list_player_window.help_window = @help_window end def create_header_windows category = ADIK::SHARED_STORAGE::PLAYER_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::PLAYER_WINDOW[0] if category.nil? @player_header = Window_Player_Header.new(category[0],category[1],category[2],category[3]) category = ADIK::SHARED_STORAGE::STORAGE_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::STORAGE_WINDOW[0] if category.nil? @storage_header = Window_Storage_Header.new(category[0],category[1],category[2],category[3]) end def create_ss_category_window category = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::SS_CATEGORY_WINDOW[0] if category.nil? @ss_category_window = Window_SS_Category.new(category[0],category[1]) @ss_category_window.set_handler(:cancel, method(:return_scene)) @ss_category_window.set_handler(:deposit, method(:on_deposit)) @ss_category_window.set_handler(:withdraw, method(:on_withdraw)) end def create_category_window category = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::CATEGORY_WINDOW[0] if category.nil? @category_window = Window_Category_SS.new(category[0],category[1]) @category_window.set_handler(:cancel, method(:return_ss_category)) @category_window.set_handler(:item, method(:on_item)) @category_window.set_handler(:weapon, method(:on_weapon)) @category_window.set_handler(:armor, method(:on_armor)) @category_window.set_handler(:key_item, method(:on_key_item)) @category_window.set_handler(:gold, method(:on_gold)) @category_window.deactivate end def create_window_item_list_ss_player category = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::ITEM_LIST_PLAYER_WINDOW[0] if category.nil? @list_player_window = Window_ItemList_SS_Player.new(category[0],category[1],category[2],category[3]) @list_player_window.set_handler(:cancel, method(:return_list)) @list_player_window.set_handler(:ok, method(:on_player_ok)) @list_player_window.deactivate end def create_window_item_list_ss_storage category = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_WINDOW[@storage_number] category = ADIK::SHARED_STORAGE::ITEM_LIST_STORAGE_WINDOW[0] if category.nil? @list_storage_window = Window_ItemList_SS_Storage.new(category[0],category[1],category[2],category[3]) @list_storage_window.set_handler(:cancel, method(:return_list)) @list_storage_window.set_handler(:ok, method(:on_player_ok)) @list_storage_window.set_number(@storage_number) @list_storage_window.deactivate end def on_deposit @ss_category = :deposit @category_window.activate end def on_withdraw @ss_category = :withdraw @category_window.activate end def return_ss_category @ss_category_window.activate end def return_list @category_window.activate end def select_window @list_player_window.category = @category @list_storage_window.category = @category if @ss_category == :deposit @list_player_window.refresh @list_storage_window.refresh @list_player_window.activate else @list_player_window.refresh @list_storage_window.refresh @list_storage_window.activate end end def on_item @category = :item select_window end def on_weapon @category = :weapon select_window end def on_armor @category = :armor select_window end def on_key_item @category = :key_item select_window end def on_gold @category = :gold if @ss_category == :deposit if $game_party.gold < 1 Sound.play_buzzer @category_window.activate return end else $shared_storage[[:gold,SceneManager.scene.storage_number]] = 0 if $shared_storage[[:gold,SceneManager.scene.storage_number]].nil? if $shared_storage[[:gold,SceneManager.scene.storage_number]] == 0 Sound.play_buzzer @category_window.activate return end end Sound.play_ok @number_g_window = Window_NumberInput_Gold.new @number_g_window.start(@ss_category) end def adjust_gold(amount) if @ss_category == :deposit $shared_storage[[:gold,SceneManager.scene.storage_number]] += amount $game_party.gain_gold(-amount) else $game_party.gain_gold(amount) $shared_storage[[:gold,SceneManager.scene.storage_number]] -= amount end @gold_window_ss.update_text @gold_window_p.update_text ADIK::SHARED_STORAGE.save_storage if ADIK::SHARED_STORAGE::AUTOSAVE @category_window.activate end def on_player_ok if has_item_to_pick Sound.play_ok @number_window = Window_NumberInput_SS.new @number_window.start(get_item,@ss_category) else Sound.play_buzzer select_window end end def has_item_to_pick if @ss_category == :deposit return @list_player_window.item_max > 0 else return @list_storage_window.item_max > 0 end end def get_item if @ss_category == :deposit return @list_player_window.item else return @list_storage_window.item end end def can_store(item) if @ss_category == :deposit numb = ADIK::SHARED_STORAGE::MAX_ITEM_NUMBER[@storage_number] numb = ADIK::SHARED_STORAGE::MAX_ITEM_NUMBER[0] if numb.nil? numb = eval(numb) begin numb -= $shared_storage[[@storage_number,item.class.to_s,item.id]] rescue end return numb > 0 else numb = $game_party.item_number(item) return numb < $game_party.max_item_number(item) end end def set_number(number) @number = number item = get_item if @ss_category == :deposit if number > 0 $shared_storage[[@storage_number,item.class.to_s,item.id]] = 0 if $shared_storage[[@storage_number,item.class.to_s,item.id]].nil? $game_party.lose_item(item,number) $shared_storage[[@storage_number,item.class.to_s,item.id]] += number @list_player_window.refresh @list_storage_window.refresh ADIK::SHARED_STORAGE.save_storage if ADIK::SHARED_STORAGE::AUTOSAVE end else if number > 0 $game_party.gain_item(item,number) $shared_storage[[@storage_number,item.class.to_s,item.id]] -= number if $shared_storage[[@storage_number,item.class.to_s,item.id]] == 0 $shared_storage.delete([@storage_number,item.class.to_s,item.id]) end @list_player_window.refresh @list_storage_window.refresh ADIK::SHARED_STORAGE.save_storage if ADIK::SHARED_STORAGE::AUTOSAVE end end @custom_text_window.update_text select_window end def update super return if @storage_number_max.nil? if Input.trigger?(ADIK::SHARED_STORAGE::NEXT_KEY) if @storage_number < @storage_number_max @storage_number += 1 else @storage_number = @storage_number_min end SceneManager.next_storage(@storage_number,@storage_number_min,@storage_number_max) elsif Input.trigger?(ADIK::SHARED_STORAGE::PREV_KEY) if @storage_number > @storage_number_min @storage_number -= 1 else @storage_number = @storage_number_max end SceneManager.next_storage(@storage_number,@storage_number_min,@storage_number_max) end end end module DataManager class <