Main Menu
  • Welcome to The RPG Maker Resource Kit.

[XP] Item Storage

Started by game_guy, May 02, 2009, 01:14:51 AM

0 Members and 1 Guest are viewing this topic.

game_guy

Item Storage
Authors: game_guy
Version: 1.2
Type: Item Storage
Key Term: Misc System


Introduction

If you've ever played any of the Elder Scrolls series or Fallout series than of
course then you would have noticed the awesome item storage. This script does that


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


Screenshots

[spoiler]Chest 1

Chest 1 Storage

Chest 2

Chest 2 Storage
[/spoiler]


Demo

MediaFire


Script

[SPOILER]
#===============================================================================
# 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
[/SPOILER]


Instructions

New and improved instructions in the script.


Compatibility

Not tested with SDK.


Credits and Thanks


  • game_guy ~ making the system
  • MightyLink ~ requesting the system


Author's Notes

Enjoy and give credits!

modern algebra

It looks good, but I would suggest maybe making that also set a limit on how much the party can hold. Why would anyone want to store all their stuff if they could carry it around with them?

game_guy

I'm updating stuff right now. I'm making it where the chest can hold over 1000 items and even hold gold so when the party reaches its limits its gonna have to dump some somewhere right?

Falcon

Sounds cool, I remember someone made a script like this a very long time ago. This could work as a bank script, right?

I don't think you should bother to make an item limiting script, but you should throw in links to some.

game_guy

I've already started to put it in here. The party can only normally hold 99 items so when they want to overstock they can store some in a chest or closet.

basicna

lol it  Great. hey Thanks

BlueEagle7

Fantastic script, exactly what I've been looking for.

Is there a way to add items directly to the chest by event script command? For example, instead of giving the player the items, have the items waiting for them in the chest and they have to physically take the items OUT the first time.

I've tried
$chest(1).gain_item(29, 1)

but it doesn't know the gain-item method.

game_guy

Try
$game_variables[1] = Chest.new # change the one with the chest number
$game_variables[1].gain_item(29, 1)

This can only be used as long as you havent opened a chest using variable 1

Izayoi

Hello,
this script is a great one ! But i've got a problem ;

I don't know why it doesn't work... do you have an idea ? Please ?

JFloyd

Quote from: Izayoi on July 23, 2009, 10:31:28 AM
Hello,
this script is a great one ! But i've got a problem ;

I don't know why it doesn't work... do you have an idea ? Please ?
I do believe you have to find the text that it uses, and match it with the one in the script called main.
Don't quote me though.

Falcon

That's probably because you're using illegal RMXP.

Mr_Wiggles

Great script but how the heck do i put items in the chests ive tried
$game_variables[2] = $chest
$game_variables[2].gain_item(1, 10)

and ive never opend the chest once, and its in a seprate event,
i get error:
NoMethodError occured while runnin script.
undefined method `gain_item' for 0:fixnum

also would it be possible to put more then one type of weapon in a chest too?
[spoiler]
METALFRESH is a paint contractor that specializes in refinishing metal and vinyl siding. We paint metal buildings as well as siding on homes.

We also

    Refinish decks
    Do custom interior painting
    Strip wallpaper
    Refinish cedar siding
    Metal front doors and sidelights
    Metal garage and service doors
    Grained fiberglass doors

    If your structure is *RUSTED *FADED *CHALKING *IN NEED OF COLOR CHANGE, we can fix it with a guarentee!

northern Illinois and southern Wisconsin.

http://metalfreshcoatings.com

[/spoiler]

game_guy

Updated script. Much much more compatible then older version. You can also have items in the chests from the start. Check the new demo out as well.

Mr_Wiggles

#13
Sweet you fixed to problems i was having, adding items and preventing them from taking after they have reached the max they can carry. nice script
oh question can you make it to where they push a key and it takes all of that item they have selected? because i edited max carried and if a box has 100 of the same item in it you'd be holding the space bar down for about 20 - 30 seconds, manly i just think it would be a convenience
[spoiler]
METALFRESH is a paint contractor that specializes in refinishing metal and vinyl siding. We paint metal buildings as well as siding on homes.

We also

    Refinish decks
    Do custom interior painting
    Strip wallpaper
    Refinish cedar siding
    Metal front doors and sidelights
    Metal garage and service doors
    Grained fiberglass doors

    If your structure is *RUSTED *FADED *CHALKING *IN NEED OF COLOR CHANGE, we can fix it with a guarentee!

northern Illinois and southern Wisconsin.

http://metalfreshcoatings.com

[/spoiler]

game_guy

I'll make it where you press the Z key, and it'll take the all of the selected item out that it can

JBabz

Another epic win by game_guy