#=============================================================================== # Item Storage # Author game_guy # Version 1.2 #------------------------------------------------------------------------------- # Intro: # Okay. Well if you've played the Elder Scrolls Series or Fallout then you'd # know that it has an item storage system. What it does is lets you open up # closets, chests, ect and store and take items out of it. # # Features: # Store and Take Items Out of Chests, Closets, ect # Have Seperate Chests, Closets, ect # Easy to Use # Stores Chests into Game System Instead of Variables # Have Max Amount of Items In Chest # Set Default Items in Chest # # Instructions: # First lets go over the syntaxes. # # Calling the Item Storage: # $scene = Scene_Chest.new(chest_id, max_items) # chest_id is the number chest you want open # max_items is the max amount of any item the chest can hold # you can just use this to # $scene = Scene_Chest.new(chest_id) # because in the config this ChestMaxItems is the default so if you dont use # the long one, it'll use the default. # # Adding/Removing Items from Chest: # This feature is still being worked on. But what it will allow you to do # is add an item or remove it whithout actually opening the chest. # # Okay so thats done with the syntaxes. Now onto the configuration. # Go down to Begin Config and do all your configuration there. # # Credits: # game_guy ~ for making it # MightyLink ~ requesting the system #=============================================================================== module GameGuy #============================================================================ # ChestMaxItems = The max amount of any item a chest can hold. So example # Its 9999 so it can have 9999 of any item. #============================================================================ ChestMaxItems = 9999 def self.chest_items(id) case id #========================================================================== # Config Chest Items # Use this # when chest_id then return [[id, amount, type], [id, amount, type]] # id = item, weapon, or armor id # amount = the amount # type = 0, 1, or 2 0 = item, 1 = weapon, 2 = armor # Example: # when 1 then return [[1, 3, 0], [1, 1, 1]] # This has 3 potions, and 1 bronze sword. So when this is called # $scene = Scene_Chest.new(1) # it will have those items in the chest already. #========================================================================== when 1 then return [[1, 999, 0], [1, 1, 1]] when 2 then return [[1, 10, 0], [1, 1, 2], [1, 2, 1]] when 3 then return [[1, 10, 2], [3, 1, 1], [9, 1, 1]] end return [] end end #============================================================================== # Game_System #------------------------------------------------------------------------------ # Modded it so it makes it store every chest. #============================================================================== class Game_System attr_accessor :chests alias gg_add_item_storage initialize def initialize @chests = [] return gg_add_item_storage end def add_chest(chest) @chests[chest] = $chest end end #============================================================================== # Game_Chest #------------------------------------------------------------------------------ # Holds all the data for a single chest. #============================================================================== class Game_Chest attr_accessor :max def initialize(max) @max = max @items = {} @weapons = {} @armors = {} end def item_amount(item_id) return @items.include?(item_id) ? @items[item_id] : 0 end def weapon_amount(weapon_id) return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0 end def armor_amount(armor_id) return @armors.include?(armor_id) ? @armors[armor_id] : 0 end def add_item(item_id, n) if item_id > 0 @items[item_id] = [[item_amount(item_id) + n, 0].max, @max].min end end def add_weapon(weapon_id, n) if weapon_id > 0 @weapons[weapon_id] = [[weapon_amount(weapon_id) + n, 0].max, @max].min end end def add_armor(armor_id, n) if armor_id > 0 @armors[armor_id] = [[armor_amount(armor_id) + n, 0].max, @max].min end end def take_item(item_id, n) add_item(item_id, -n) end def take_weapon(weapon_id, n) add_weapon(weapon_id, -n) end def take_armor(armor_id, n) add_armor(armor_id, -n) end end #============================================================================== # Window_Chest_Choices #------------------------------------------------------------------------------ # The choices for the chest when the scene is opened. #============================================================================== class Window_Chest_Choices < Window_Selectable def initialize super(0, 0, 640, 64) self.contents = Bitmap.new(width - 32, height - 32) @item_max = 3 @column_max = 3 @commands = ["Store Items", "Take Items", "Exit"] self.z = 200 refresh self.index = 0 end def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end def draw_item(index) x = 4 + index * 215 self.contents.draw_text(x, 0, 128, 32, @commands[index], 1) end end #============================================================================== # Window_Chest_Item #------------------------------------------------------------------------------ # Displays all items in the chest. #============================================================================== class Window_Chest_Item < Window_Selectable def initialize super(320, 64, 320, 416) @column_max = 1 refresh self.index = 0 if $game_temp.in_battle self.y = 64 self.height = 256 self.back_opacity = 160 end end def item return @data[self.index] end def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] for i in 1...$data_items.size if $chest.item_amount(i) > 0 @data.push($data_items[i]) end end unless $game_temp.in_battle for i in 1...$data_weapons.size if $chest.weapon_amount(i) > 0 @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $chest.armor_amount(i) > 0 @data.push($data_armors[i]) end end end @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end end def draw_item(index) item = @data[index] case item when RPG::Item number = $chest.item_amount(item.id) when RPG::Weapon number = $chest.weapon_amount(item.id) when RPG::Armor number = $chest.armor_amount(item.id) end x = 4 + index % @column_max * (288 + 32) y = index / @column_max * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) self.contents.draw_text(x + 216, y, 16, 32, ":", 1) self.contents.draw_text(x + 224, y, 48, 32, number.to_s, 2) end def update_help @help_window.set_text(self.item == nil ? "" : self.item.description) end end #============================================================================== # Window_Party_Item #------------------------------------------------------------------------------ # Displays all items the party has. #============================================================================== class Window_Party_Item < Window_Selectable def initialize super(0, 64, 320, 416) @column_max = 1 refresh self.index = 0 if $game_temp.in_battle self.y = 64 self.height = 256 self.back_opacity = 160 end end def item return @data[self.index] end def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] for i in 1...$data_items.size if $game_party.item_number(i) > 0 @data.push($data_items[i]) end end unless $game_temp.in_battle for i in 1...$data_weapons.size if $game_party.weapon_number(i) > 0 @data.push($data_weapons[i]) end end for i in 1...$data_armors.size if $game_party.armor_number(i) > 0 @data.push($data_armors[i]) end end end @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end end def draw_item(index) item = @data[index] case item when RPG::Item number = $game_party.item_number(item.id) when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) end x = 4 + index % @column_max * (288 + 32) y = index / @column_max * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 212, 32, item.name, 0) self.contents.draw_text(x + 216, y, 16, 32, ":", 1) self.contents.draw_text(x + 224, y, 48, 32, number.to_s, 2) end def update_help @help_window.set_text(self.item == nil ? "" : self.item.description) end end #============================================================================== # Scene_Chest #------------------------------------------------------------------------------ # The scene that controls storing and taking items. #============================================================================== class Scene_Chest def initialize(chest=1, max=GameGuy::ChestMaxItems) @chestid = chest if $game_system.chests[chest] == nil $chest = Game_Chest.new(max) items = GameGuy.chest_items(chest) for i in 0...items.size item = items[i][2] case item when 0 $chest.add_item(items[i][0], items[i][1]) when 1 $chest.add_weapon(items[i][0], items[i][1]) when 2 $chest.add_armor(items[i][0], items[i][1]) else $chest.add_item(items[i][0], items[i][1]) end end else $chest = $game_system.chests[chest] end end def main @help_window = Window_Help.new @help_window.visible = false @command_window = Window_Chest_Choices.new @party_window = Window_Party_Item.new @party_window.active = false @chest_window = Window_Chest_Item.new @chest_window.active = false Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end @help_window.dispose @command_window.dispose @party_window.dispose @chest_window.dispose end def update @help_window.update @command_window.update @party_window.update @chest_window.update if @command_window.active update_command return end if @party_window.active update_party return end if @chest_window.active update_chest return end end def update_command if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) $game_system.add_chest(@chestid) $scene = Scene_Map.new return end if Input.trigger?(Input::C) case @command_window.index when 0 $game_system.se_play($data_system.decision_se) @party_window.active = true @party_window.help_window = @help_window @command_window.active = false @help_window.z = 500 @help_window.visible = true when 1 $game_system.se_play($data_system.decision_se) @chest_window.active = true @chest_window.help_window = @help_window @command_window.active = false @help_window.z = 500 @help_window.visible = true when 2 $game_system.se_play($data_system.cancel_se) $game_system.add_chest(@chestid) $scene = Scene_Map.new end return end end def update_party if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @command_window.active = true @help_window.visible = false @party_window.help_window = nil @party_window.active = false return end if Input.repeat?(Input::C) @item = @party_window.item unless @item.is_a?(RPG::Item) or @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor) $game_system.se_play($data_system.buzzer_se) return end case @item when RPG::Item amount = $chest.item_amount(@item.id) if amount < $chest.max $game_system.se_play($data_system.decision_se) $chest.add_item(@item.id, 1) $game_party.lose_item(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end when RPG::Weapon amount = $chest.weapon_amount(@item.id) if amount < $chest.max $game_system.se_play($data_system.decision_se) $chest.add_weapon(@item.id, 1) $game_party.lose_weapon(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end when RPG::Armor amount = $chest.armor_amount(@item.id) if amount < $chest.max $game_system.se_play($data_system.decision_se) $chest.add_armor(@item.id, 1) $game_party.lose_armor(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end end @party_window.refresh @chest_window.refresh return end end def update_chest if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @command_window.active = true @help_window.visible = false @chest_window.help_window = nil @chest_window.active = false return end if Input.repeat?(Input::C) @item = @chest_window.item unless @item.is_a?(RPG::Item) or @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor) $game_system.se_play($data_system.buzzer_se) return end case @item when RPG::Item amount = $game_party.item_number(@item.id) if amount < 99 $game_system.se_play($data_system.decision_se) $chest.take_item(@item.id, 1) $game_party.gain_item(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end when RPG::Weapon amount = $game_party.weapon_number(@item.id) if amount < 99 $game_system.se_play($data_system.decision_se) $chest.take_weapon(@item.id, 1) $game_party.gain_weapon(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end when RPG::Armor amount = $game_party.armor_number(@item.id) if amount < 99 $game_system.se_play($data_system.decision_se) $chest.take_armor(@item.id, 1) $game_party.gain_armor(@item.id, 1) else $game_system.se_play($data_system.buzzer_se) return end end @party_window.refresh @chest_window.refresh return end end end