<TheoAllen's Chest System>
Version: <1.1>
Author: <TheoAllen>
Date: <June>, <28>, <2013>
Version History
- <Version 1.0b> 01.06.2013 - Public release by TheoAllen in Indonesian.
- <Version 1.0b> 28.06.2013 - Script translated to english by AbsoluteIce.
- <Version 1.1> 30.06.2013 - Script updated with the ability to change 'stash' into whatever you want.
Planned Future Versions
- For now, none, unless TheoAllen updates this script.
Description
This script lets you open a chest. It lets you take out, or fill in items from your inventory into that chest.
Similar to the western RPG game, Elder Scrolls.
Features
- The ability to put items and take out items from a chest.
Screenshots
(https://rmrk.net/proxy.php?request=http%3A%2F%2F1.bp.blogspot.com%2F-nDcumkdd4nQ%2FUajuLTVZfaI%2FAAAAAAAAAc0%2FqOL5UnvA3cc%2Fs400%2Fchest1.jpg&hash=23e5694f58b0978e59039175964620c5df96bf16)
(https://rmrk.net/proxy.php?request=http%3A%2F%2F4.bp.blogspot.com%2F-GoW64knSiI8%2FUajud0mA3AI%2FAAAAAAAAAc8%2FrvMa2hEm9zE%2Fs400%2Fchest2.jpg&hash=0fd65f3deb71ac1344e0e0568c92befb46c45883)
Instructions
Put this script below materials, and above main in the script section.
Use a comment on the event in this format before you do a script call to initialize the chest starting items.
<item: id, amount>
<weapon: id, amount>
<armor: id, amount>
Script
# =============================================================================
# TheoAllen - Chest System
# Version : 1.1
# Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com
# (This script is translated by AbsoluteIce)
# =============================================================================
($imported ||= {})[:Theo_ChestSystem] = true
# =============================================================================
# CHANGE LOGS:
# -----------------------------------------------------------------------------
# 2013.06.28 - Add custom chest name
# 2013.06.01 - Adjust control and GUI
# 2013.05.24 - Finished script
# 2013.05.23 - Started Script
# =============================================================================
=begin
Introduction :
This script lets you open a chest. It lets you take out, or fill in items
from your inventory. Similar to the western RPG game, Elder Scrolls.
How to use :
Put this below materials, and above main in the script section.
Use a comment on the event in this format before you do a script call to
initialize the chest starting items.
<item: id, amount>
<weapon: id, amount>
<armor: id, amount>
Explanation of Id's :
id >> id of the item
amount >> number of items
After using the comment, use this script call :
open_chest
For custom name chest, you can use this script call. For example :
open_chest("Garbage")
open_chest("Eric's Chest")
note : every comment in every event is read once. Make sure you put it before
the script call.
Terms of use :
Credit me, TheoAllen. You're free to edit by your own as long as you don't
claim it's yours. If you want to use for a commercial project, share the
profit with me. And don't forget to give me free copy of the game
=end
# =============================================================================
# Configuration :
# =============================================================================
module THEO
module CHEST
# =========================================================================
# Vocabs
# -------------------------------------------------------------------------
AMOUNT_VOCAB = "Amount :" # Vocab for said amount.
ALL_VOCAB = "All" # Vocab for all categories.
INV_VOCAB = "Inventory" # Vocab for inventory.
ST_VOCAB = "Stash" # Vocab for stash/storage.
# =========================================================================
# =========================================================================
TRIGGER_GAIN_ALL = :CTRL
# -------------------------------------------------------------------------
# Trigger to take all items. If you write :CTRL, thus all items
# will be taken if you press CTRL + Confirm (z)
# =========================================================================
# =========================================================================
SHOW_AMOUNT_MIN = 10
# -------------------------------------------------------------------------
# minimum amount for viewing the window amount.
# =========================================================================
end
end
# =============================================================================
# End of Configuration (Don't edit if you don't know what you're doing)
# =============================================================================
module THEO
module CHEST
module REGEXP
ITEM_REGEX = /<(?:ITEM|item):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
WEAPON_REGEX = /<(?:WEAPON|weapon):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
ARMOR_REGEX = /<(?:ARMOR|armor):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
end
end
end
class Scene_Chest < Scene_MenuBase
include THEO::CHEST
def initialize(key,st_vocab)
$game_party.init_chest_cursors
@last_active = :stash
@key = key
@st_vocab = st_vocab
end
def start
super
create_header_windows
create_footer_window
create_main_windows
create_amount_window
prepare
end
def create_header_windows
create_help_window
create_category_window
end
def create_main_windows
create_inventory_window
create_stash_window
end
def create_help_window
@help = Window_Help.new
@help.viewport = @viewport
end
def create_category_window
@category = Window_ChestCategory.new
@category.viewport = @viewport
@category.y = @help.height
@category.set_handler(:ok, method(:on_category_ok))
@category.set_handler(:cancel, method(:return_scene))
end
def create_footer_window
create_inv_footer
create_st_footer
end
def create_inv_footer
@inv_footer = Window_ChestFooter.new(INV_VOCAB,$game_party,0)
@inv_footer.viewport = @viewport
end
def create_st_footer
@st_footer = Window_ChestFooter.new(@st_vocab,$game_chests[@key],1)
@st_footer.viewport = @viewport
end
def create_inventory_window
x = 0
y = @help.height + @category.height
w = Graphics.width/2
h = Graphics.height - y - @inv_footer.height
@inventory = Window_Inventory.new(x,y,w,h)
@inventory.viewport = @viewport
@inventory.set_handler(:ok, method(:item_inventory_ok))
@inventory.set_handler(:cancel, method(:on_inventory_cancel))
@inventory.help_window = @help
@category.item_window = @inventory
end
def create_stash_window
x = Graphics.width / 2
y = @inventory.y
w = x
h = @inventory.height
@stash = Window_Stash.new(x,y,w,h,@key)
@stash.viewport = @viewport
@stash.set_handler(:ok, method(:item_stash_ok))
@stash.set_handler(:cancel, method(:on_stash_cancel))
@stash.help_window = @help
@category.stash_window = @stash
end
def create_amount_window
@amount = Window_ChestAmount.new
@amount.viewport = @viewport
end
# for future plan ~
def refresh_all_footers
@inv_footer.refresh
@st_footer.refresh
end
def prepare
unselect_all
@category.show
@category.activate
@item_phase = false
deactivate_item_windows
hide_amount
end
def deactivate_item_windows
@inventory.deactivate
@stash.deactivate
end
def on_category_ok
@category.deactivate
activate_itemlist
@item_phase = true
end
def item_inventory_ok
unless @inventory.item
@inventory.activate
return
end
if @inventory.item_number < SHOW_AMOUNT_MIN
store_items(1)
@inventory.activate
refresh_itemlist
else
@last_active = :inventory
input_amount(@inventory)
end
end
def item_stash_ok
unless @stash.item
@stash.activate
return
end
if @stash.item_number < SHOW_AMOUNT_MIN
gain_items(1)
@stash.activate
refresh_itemlist
else
@last_active = :stash
input_amount(@stash)
end
end
def on_stash_cancel
@last_active = :stash
memorize_st
prepare
end
def on_inventory_cancel
@last_active = :inventory
memorize_inv
prepare
end
def input_amount(window)
memorize_all
if window.equal?(@stash)
@inventory.unselect
else
@stash.unselect
end
@amount.open
@amount.item_window = window
deactivate_item_windows
end
def hide_amount
Sound.play_cancel
@amount.close
end
def update
super
select_item_phase if @item_phase
input_amount_phase if @amount.open?
end
def select_item_phase
gain_all_items if trigger_gain_all_item?
switch_window if Input.repeat?(:RIGHT) || Input.repeat?(:LEFT)
end
def input_amount_phase
activate_itemlist if Input.trigger?(:B)
if @amount.item_window.equal?(@stash) && Input.trigger?(:C)
gain_items(@amount.amount)
elsif @amount.item_window.equal?(@inventory) && Input.trigger?(:C)
store_items(@amount.amount)
end
end
def switch_window
if @inventory.active
switch_stash
elsif @stash.active
switch_inventory
end
end
def switch_inventory
memorize_st
@stash.deactivate
@stash.unselect
@inventory.activate
inv_select
end
def switch_stash
@stash.activate
st_select
memorize_inv
@inventory.deactivate
@inventory.unselect
end
def gain_all_items
if @stash.active
@stash.data.each do |item|
gain_items(@stash.item_number(item),item)
end
@stash.select(0)
else
@inventory.data.each do |item|
store_items(@inventory.item_number(item),item)
end
@inventory.select(0)
end
refresh_itemlist
end
def trigger_gain_all_item?
Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL) && Input.trigger?(:C)
end
def gain_items(amount, item = @stash.item)
$game_party.gain_item(item,amount)
$game_chests[@key].lose_item(item,amount)
on_amount_confirm if @amount.open?
end
def store_items(amount, item = @inventory.item)
$game_chests[@key].gain_item(item,amount)
$game_party.lose_item(item,amount)
on_amount_confirm if @amount.open?
end
def refresh_itemlist
@stash.refresh
@inventory.refresh
end
def on_amount_confirm
Sound.play_ok
refresh_itemlist
unselect_all
activate_itemlist
end
def activate_itemlist
hide_amount
case @last_active
when :stash
activate_stash
when :inventory
activate_inventory
end
@item_phase = true
end
def activate_inventory
@inventory.activate
@stash.unselect
inv_select
end
def activate_stash
@stash.activate
@inventory.unselect
st_select
end
def memorize_inv
$game_party.last_inv = @inventory.index
end
def memorize_st
$game_party.last_st = @stash.index
end
def inv_select
@inventory.index = [[$game_party.last_inv,@inventory.item_max-1].min,0].max
end
def st_select
@stash.index = [[$game_party.last_st,@stash.item_max-1].min,0].max
end
def unselect_all
@inventory.unselect
@stash.unselect
end
def memorize_all
memorize_inv
memorize_st
end
end
class Window_ChestCategory < Window_ItemCategory
attr_reader :stash_window
def col_max
return 4
end
def update
super
@stash_window.category = current_symbol if @stash_window
end
def make_command_list
add_command(THEO::CHEST::ALL_VOCAB, :all)
add_command(Vocab::item, :item)
add_command(Vocab::weapon, :weapon)
add_command(Vocab::armor, :armor)
end
def stash_window=(stash_window)
@stash_window = stash_window
update
end
end
class Window_Inventory < Window_ItemList
attr_reader :data
def col_max
return 1
end
def current_item_enabled?
return true
end
def include?(item)
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 :all
item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
else
false
end
end
def draw_item(index)
item = @data[index]
if item
rect = item_rect(index)
rect.width -= 4
draw_item_name(item, rect.x, rect.y, true,contents.width)
draw_item_number(rect, item)
end
end
def item_number(item = @data[index])
$game_party.item_number(item)
end
def process_ok
return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
super
end
end
class Window_Stash < Window_ItemList
attr_reader :data
def initialize(x, y, width, height, key)
@key = key
super(x,y,width,height)
@category = :none
@data = []
end
def col_max
return 1
end
def current_item_enabled?
return true
end
def include?(item)
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 :all
item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
else
false
end
end
def make_item_list
@data = $game_chests[@key].all_items.select {|item| include?(item) }
@data.push(nil) if include?(nil)
end
def draw_item(index)
item = @data[index]
if item
rect = item_rect(index)
rect.width -= 4
draw_item_name(item, rect.x, rect.y, true,contents.width)
draw_item_number(rect, item)
end
end
def draw_item_number(rect, item)
draw_text(rect, sprintf(":%2d", $game_chests[@key].item_number(item)), 2)
end
def item_number(item = @data[index])
$game_chests[@key].item_number(item)
end
def process_ok
return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
super
end
end
class Window_ChestAmount < Window_Base
attr_accessor :item_window
attr_reader :amount
def initialize
super(0,0,window_width,window_height)
self.openness = 0
reset_amount
update_position
refresh
end
def reset_amount
@amount = 0
refresh
end
def open
super
reset_amount
end
def update_position
self.x = (Graphics.width / 2) - (self.width / 2)
self.y = (Graphics.height / 2) - (self.height / 2)
end
def refresh
contents.clear
draw_text(0,0,contents.width,24,THEO::CHEST::AMOUNT_VOCAB,)
draw_text(0,0,contents.width,24,@amount,2)
end
def window_width
return 200
end
def window_height
return 24+24
end
def update
super
if open?
increment if Input.repeat?(:RIGHT)
decrement if Input.repeat?(:LEFT)
ten_increment if Input.repeat?(:UP)
ten_decrement if Input.repeat?(:DOWN)
end
end
def increment
change_amount(1)
end
def decrement
change_amount(-1)
end
def ten_increment
change_amount(10)
end
def ten_decrement
change_amount(-10)
end
def change_amount(modifier)
@amount = [[@amount+modifier,0].max,max_amount].min
refresh
end
def show
super
reset_amount
end
def max_amount
@item_window.item_number rescue 0
end
end
class Window_ChestFooter < Window_Base
include THEO::CHEST
def initialize(vocab,object,x)
w = Graphics.width/2
h = fitting_height(1)
y = Graphics.height - h
x = (Graphics.width/2) * x
@vocab = vocab
super(x,y,w,h)
@object = object
refresh
end
def refresh
contents.clear
cx = text_size(@vocab).width
draw_text(0,0,contents.width,line_height,@vocab,1)
#draw_text(cx,0,contents.width-cx,line_height,@object.all_items.size,2)
end
end
module DataManager
class << self
alias pre_create_chest create_game_objects
alias pre_chest_save_contents make_save_contents
alias pre_extract_chests extract_save_contents
end
def self.create_game_objects
pre_create_chest
create_chest_object
end
def self.create_chest_object
$game_chests = Game_Chest.new
end
def self.make_save_contents
contents = pre_chest_save_contents
contents[:chest] = $game_chests
contents
end
def extract_save_contents(contents)
pre_extract_chests(contents)
$game_chests = contents[:chest]
end
end
class Game_Chest
def initialize
@data = {}
@explored = {}
end
def[](key)
(@data[key] ||= Game_Stash.new)
end
def explored
@explored
end
end
class Game_Stash
attr_accessor :items_stash
attr_accessor :weapons_stash
attr_accessor :armors_stash
def initialize
@items_stash = {}
@weapons_stash = {}
@armors_stash = {}
end
def refresh
evaluate(@items_stash)
evaluate(@weapons_stash)
evaluate(@armors_stash)
end
def evaluate(stash)
stash.keys.each do |key|
stash.delete(key) if stash[key] <= 0
end
end
def items
@items_stash.keys.collect {|id| $data_items[id] }
end
def weapons
@weapons_stash.keys.collect {|id| $data_weapons[id] }
end
def armors
@armors_stash.keys.collect {|id| $data_armors[id] }
end
def all_items
items + weapons + armors
end
def item_number(item)
if item.is_a?(RPG::Item)
return @items_stash[item.id] ||= 0
elsif item.is_a?(RPG::Weapon)
return @weapons_stash[item.id] ||= 0
elsif item.is_a?(RPG::Armor)
return @armors_stash[item.id] ||= 0
end
refresh
end
def gain_item(item, amount)
return unless item
stash = pick_stash(item)
stash[item.id] = 0 if stash[item.id].nil?
stash[item.id] += amount
refresh
end
def lose_item(item,amount)
gain_item(item,-amount)
end
def pick_stash(item)
if item.is_a?(RPG::Item)
return @items_stash
elsif item.is_a?(RPG::Weapon)
return @weapons_stash
elsif item.is_a?(RPG::Armor)
return @armors_stash
end
end
end
class Game_Party
attr_accessor :last_inv
attr_accessor :last_st
alias pre_chest_init initialize
def initialize
pre_chest_init
init_chest_cursors
end
def init_chest_cursors
@last_inv = 0
@last_st = 0
end
end
class Game_Interpreter
def open_chest(st_vocab = THEO::CHEST::ST_VOCAB,key = [@map_id,@event_id])
if st_vocab.is_a?(Numeric)
key = st_vocab
st_vocab = THEO::CHEST::ST_VOCAB
end
SceneManager.call_chest(key,st_vocab)
end
alias pre_chest_command_108 command_108
def command_108
pre_chest_command_108
read_chest_comments
end
def read_chest_comments
map = @map_id
event = @event_id
key = [map,event]
return if $game_chests.explored[key]
@comments.each do |comment|
case comment
when THEO::CHEST::REGEXP::ITEM_REGEX
x = $1.scan(/\d+/)
$game_chests[key].items_stash[x[0].to_i] = x[1].to_i
when THEO::CHEST::REGEXP::WEAPON_REGEX
x = $1.scan(/\d+/)
$game_chests[key].weapons_stash[x[0].to_i] = x[1].to_i
when THEO::CHEST::REGEXP::ARMOR_REGEX
x = $1.scan(/\d+/)
$game_chests[key].armors_stash[x[0].to_i] = x[1].to_i
end
end
$game_chests.explored[key] = next_event_code != 108
end
end
module SceneManager
def self.call_chest(key,st_vocab = THEO::CHEST::ST_VOCAB)
@stack.push(@scene)
@scene = Scene_Chest.new(key,st_vocab)
end
end
Credits
Thanks
- I'd like to thank TheoAllen for giving me permission to translate this script. I'll be sure to translate more if I have the time. :)
Support
Either post on this thread, or pm TheoAllen on RMRK.
Known Compatibility Issues
None that I know of as of now.
Demo
http://www.mediafire.com/?3rly4flbrx5t4ht (http://www.mediafire.com/?3rly4flbrx5t4ht)
Author's Notes
Again, i'd like to thank TheoAllen for giving me the permission to translate this script. I'll be sure to translate more of his scripts if I have the time :)
Questions
Q1:
- "Is there a way to make it say something other than "Stash"?"
Use a script call, for example, you want to change stash into garbage, so you use [/list]
open_chest("Garbage")Terms of Use
Credit the creator, TheoAllen. You're free to edit by your own as long as you don't claim it's yours.
If you want to use for a commercial project, share the profit with him. And don't forget to give him a free copy of the game.[/list]
It looks like a great script. Thanks TheoAllen for writing it and thanks for translating it for us AbsoluteIce.
Quote from: modern algebra on June 27, 2013, 08:10:01 PM
It looks like a great script. Thanks TheoAllen for writing it and thanks for translating it for us AbsoluteIce.
Thanks for the compliments, MA. I'll be sure to update this if Theo updates his script :)
Wow. I'm using this for sure. I really like this script.
Do you have any contact with TheoAllen? I would like to ask him something.
Q: "Is there a way to make it say something other than "Stash"?"
If I used this on a garbage can, it would be cool if I could have it say "Garbage" instead of stash.
Quote from: Lord Stark on June 28, 2013, 04:42:21 AM
Wow. I'm using this for sure. I really like this script.
Do you have any contact with TheoAllen? I would like to ask him something.
Q: "Is there a way to make it say something other than "Stash"?"
If I used this on a garbage can, it would be cool if I could have it say "Garbage" instead of stash.
Correct me if i'm wrong, TheoAllen, but I think you just have to go to the 'configuration' part of the script, go under vocab, and change the word 'Stash' next to ST_Vocab and change it to whatever you want to call it.
Example :
# Configuration :
# =============================================================================
module THEO
module CHEST
# =========================================================================
# Vocabs
# -------------------------------------------------------------------------
AMOUNT_VOCAB = "Amount :" # Vocab for said amount.
ALL_VOCAB = "All" # Vocab for all categories.
INV_VOCAB = "Inventory" # Vocab for inventory.
ST_VOCAB = "Garbage" # Vocab for stash/storage.
Sorry, I meant dynamically. I don't want the treasure chests to labeled garbage too. :P
Quote from: Lord Stark on June 28, 2013, 04:42:21 AM
Wow. I'm using this for sure. I really like this script.
Do you have any contact with TheoAllen? I would like to ask him something.
Q: "Is there a way to make it say something other than "Stash"?"
If I used this on a garbage can, it would be cool if I could have it say "Garbage" instead of stash.
No, in this version, you can't. Btw, that's great idea. That will be my next update. Stay tune ~
Sorry for late reply. I've been busy with my personal project recently.
Btw, as Lord Stark request. I've updated this script
You can see the changelog here http://theolized.blogspot.com/2013/06/update-chest-system-v11.html
I'm sorry if my blog is in Indonesian. But don't worry. the script documentation is still in english ;)
You added my idea. :tpg:
This is one of my favorite scripts in a while. Thank you for sharing this with us.
EDIT: Also adding names is super easy. I like how you did that.
You're welcome. And I also want to thanks for your idea.
Share to the others if you think it's useful :)
Sunday, June 30th, 2013.
- Script updated to 1.1 thanks to TheoAllen.
Friday, July 05, 2013
- Very short demo for the newcomers to learn how to use the script :)
Script updated. I add some compatibility patch for my limited inventory
http://pastebin.com/QhXQ7YBk
The menu now looks like this
(https://dl.dropboxusercontent.com/u/41797508/Galeries/SS/Blog/chest7.jpg)