11-03-2006, 01:00 PM
(This post was last modified: 05-20-2017, 03:26 AM by DerVVulfman.)
"Lite" Containers
by Jimmie
Nov 3, 2006
Alright. The fruit of my work, so far. This "little snippet" of code will do the following:
But apart from that, the player can also:
As an added plus, the map updates while in the menu, so decide quickly!
The only things you can easily change are purposely at the top.
Now, to call this baby...
ID is the container's number. Each map has their own unique containers!
Yes, that means that you can't make "banks" (but you will be able to in the "non-Lite" version), but it also means that you won't have to keep track of how many containers are in all the other parts of the game.
Item1, Item2, Weapon1 & Armor1 are of course items in the database. For example, a potion would be 1.
Number is the number of that item you want in the container.
For example, if I want a container with 3 Potions, 1 High Potion, 1 Bronze Sword, 2 Mithril Spears, and a Bronze Shield, I'd use this call script:
Another example, creating a container with 5 high potions and 2 high perfumes, but nothing else:
Now what's the ID for? Well, if you just go ahead and create a new container every time the player runs an event, the items would never end. Therefore, make use of local switches, and on the following page use this call script instead:
Remember, each map has its own unique container ID's.
Now, if you have a legal version of RMXP and use the SDK, there's nothing else to do.
If you use Postality Knights Edition, you need to search for all instances of "$defaultfont" and remove the comments on those lines.
If you don't use the SDK, put comments in front of the two first and the very last line of code.
That's all really. There should be no need for a demo, but here are some screenies!
Have fun!
~Jimmie
by Jimmie
Nov 3, 2006
This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given. If you are the owner of the thread, please contact administration.
No support is given. If you are the owner of the thread, please contact administration.
Code:
#==============================================================================
# ** Lite Containers
#------------------------------------------------------------------------------
# Jimme Reashu / Jimmie
# Version 1
# Last updated: November 4th -06
#==============================================================================
# Turn these lines and the very last "end" into comments by adding "#"'s if you don't use the SDK
#------------------------------------------------------------------------------
SDK.log('Lite Containers', 'Jimme Reashu', 1, 'Nov. 4 -06')
#--------------------------------------------------------------------------
# Begin SDK Enabled Check
#--------------------------------------------------------------------------
if SDK.state('Lite Containers') == true
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Addon to Game_Party BEGINS
# This lets us check for number of items without specifying type.
#------------------------------------------------------------------------------
# This is the maximum number of items the party can carry. Set to 0 for no limit.
MAX_ITEMS = 16
class Game_Party
def number(item)
case item
when RPG::Item
return item_number(item.id)
when RPG::Weapon
return weapon_number(item.id)
when RPG::Armor
return armor_number(item.id)
end
end
def total_items
@number = 0
for i in 1..$data_items.size
@number += item_number(i)
end
for i in 1...$data_weapons.size
@number += weapon_number(i)
end
for i in 1...$data_armors.size
@number += armor_number(i)
end
@number
end
def gain_item(item_id, n)
if item_id > 0
@items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
if total_items > MAX_ITEMS && MAX_ITEMS != 0
difference = @total_items - MAX_ITEMS
lose_item(item_id, difference)
end
end
end
def gain_weapon(weapon_id, n)
if weapon_id > 0
@weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
if total_items > MAX_ITEMS && MAX_ITEMS != 0
difference = @total_items - MAX_ITEMS
lose_weapon(weapon_id, difference)
end
end
end
def gain_armor(armor_id, n)
if armor_id > 0
@armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
if total_items > MAX_ITEMS && MAX_ITEMS != 0
difference = @total_items - MAX_ITEMS
lose_armor(armor_id, difference)
end
end
end
end
#------------------------------------------------------------------------------
# Addon to Game_Party ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Container System Menu BEGINS
# This is the menu that appears first of all, with Open/Close option
#------------------------------------------------------------------------------
class Scene_ContainerMenu
#------------------------------------------------------------------------------
def main
# This defines the map spriteset, so that events and the map will still be visible.
@spriteset = Spriteset_Map.new
# These commands are the ones you see when you activate a container.
@commands = ['Open', 'Exit']
# The command window is what you control. This is what shows the commands.
@command_window = Window_Command.new(160, @commands)
@command_window.y = ($game_player.screen_y - @command_window.height/2)
@command_window.x = ($game_player.screen_x - 80)
@command_window.index = 0
@command_window.opacity = 160
# The help window describes the commands in the command window.
@help_window = Window_Help.new
@help_window.opacity = 160
# This fades out the map and then fades in the map together with the command window.
# (The map fading is not visible, but it's there)
Graphics.transition
# This is the loop that updates graphics, keyboard input, the map and the command window.
loop do
Graphics.update
Input.update
update
# If the scene changes, the loop stops.
if $scene != self
break
end
end
# When the scene changes, the graphics freeze until the next scene is ready to take over.
Graphics.freeze
# All windows and the map sprites are "disposed", their memory slots are freed.
@command_window.dispose
@help_window.dispose
@spriteset.dispose
end
#------------------------------------------------------------------------------
# This is the method that updates all windows and the map.
def update
# These are the commands to update everything included in this scene.
@command_window.update
@help_window.update
$game_map.update
@spriteset.update
# This calls the next method: update_command, which further controls what happens with the
# when RMXP registers keyboard input.
update_command
end
#------------------------------------------------------------------------------
# This is the method that controls the scene based on input from the player.
def update_command
# If the player presses game-key B (Esc. or X by default), the following code is run:
if Input.trigger?(Input::B)
# Play the "cancel" sound set in the database
$game_system.se_play($data_system.cancel_se)
# Return to the map
$scene = Scene_Map.new
# Abort this method and return to the "update" method, which has reched its end,
# meaning that it returns to the "Main" loop and the jumps to Scene_Map.
return
end # Ends the "if"
# If the player presses game-key C (Enter, Num-0, or C by default)
if Input.trigger?(Input::C)
# The "case" is basically the same things as a bunch of simple "if"'s.
# See the following comments for what they do...
case @commands[@command_window.index]
# "If" @commands[@command_window.index] is 'Open'...
when 'Open'
# Go to Scene_ContainerItems and...
$scene = Scene_ContainerItems.new
# Play the "decision" or "confirm" sound in the database
$game_system.se_play($data_system.decision_se)
# But "if" it's 'Exit' instead...
when 'Exit'
# Go back to Scene_Map and...
$scene = Scene_Map.new
# Play the cancel sound.
$game_system.se_play($data_system.cancel_se)
end # "Cases" are ended in the same way as "ifs"
end # Ends the "if"
# This is what's shown in the help window, the mechanics are the same as above
case @commands[@command_window.index]
when 'Open'
# Calls a method within the Window_Help class to change the text of the help window.
@help_window.set_text('Open the container to manage items.',1)
when 'Exit'
# Calls a method within the Window_Help class to change the text of the help window.
@help_window.set_text('Close this menu and return to the map.',1)
end # Ends the "case"
return # Returns to the "update" method.
end # Ends the method.
#------------------------------------------------------------------------------
end # Ends the class
#------------------------------------------------------------------------------
# Container System Menu ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Container Items Menu BEGINS
# This is the scene that controls the system as soon as Open
# is chosen in the main menu.
#------------------------------------------------------------------------------
class Scene_ContainerItems
#--------------------------------------------------------------------------
def main
@action = 0 # This variable is used to keep track of what the player is doing.
# 0 = Container window active
# 1 = Item window active
# 2 = Action window active (Cont.)
# 3 = Action window active (Inv)
# 4 = Using from cont.
# 5 = Taking from cont.
# 6 = Tossing from cont.
# 7 = Using from inv.
# 8 = Giving from inv.
# 9 = Tossing from inv.
# The help window is the same as before, it's used to describe the selection further.
@help_window = Window_Help.new
@help_window.opacity = 160
# The window "@item_window" shows what items are in the container.
@item_window = Window_ContainerItem.new
# This sets what window will show details about the selection.
# In this case, it's the just-defined window "@help_window"
@item_window.help_window = @help_window
# The opacity is 0 because we'll be fooling around with headers and stuff,
# so we use dummy windows to show a border around everything instead of separate windows.
@item_window.opacity = 0
# The window "@small_window" got its name from the longer "Small Item Window".
# It's based on the window "Window_Item" in the main menu, but it's been made smaller.
@small_window = Window_ItemSmall.new
@small_window.help_window = @help_window
# "Active" is a variable often used when determining whether the window's cursor should follow
# the input and things like that. Without it, you'd be selecting things in all windows at once...
@small_window.active = false
# The opacity is 0 for the same reason as above.
@small_window.opacity = 0
# This calls a method in the class "Window_ItemSmall". It removes the cursor without changing
# the selection.
@small_window.clear_cursor
# This is the first dummy window I mentioned. It forms the background of "@item_window".
@dummy1 = Window_Base.new(0,256,320,224)
# The contents are what you actually draw stuff on. It has to be 32x32 smaller, or else the
# "arrows" in the windowskin that indicate more content will be shown.
@dummy1.contents = Bitmap.new(288,192)
# A little transparency never hurts, especially since the map is updating in the background.
@dummy1.opacity = 160
# This window is basically the same as "@dummy1", only a bit to the right.
@dummy2 = Window_Base.new(320,256,320,224)
@dummy2.contents = Bitmap.new(288,192)
@dummy2.opacity = 160
# The target window is what you use when you select a target for items used in this scene.
@target_window = Window_ContainerTarget.new
# The target window should be invisible until we select an item to use...
@target_window.visible = false
# And should not follow input until then either.
@target_window.active = false
@target_window.opacity = 160
# However, setting the position early never hurts.
@target_window.y = 64
# This is the same spriteset as in the previous Scene, it shows what's on the map.
@spriteset = Spriteset_Map.new
# These lines of code are needed so that people who still haven't bought the legal RMXP can
# use the script. Remove the comments if you're one of them.
# You'll also need to search the script for other instances (because there ARE more).
#--------------------------------------------------------------------------
#@dummy1.contents.font.name = $defaultfonttype
#@dummy1.contents.font.size = $defaultfontsize
#@dummy2.contents.font.name = $defaultfonttype
#@dummy2.contents.font.size = $defaultfontsize
#--------------------------------------------------------------------------
# This calculates the width of the text, so that the lines can be drawn accordingly.
w1 = @dummy1.contents.text_size('Container Items').width + 8
w2 = @dummy2.contents.text_size('Party Items').width + 8
# Draws the line, and then writes the text for dummy #1
@dummy1.contents.fill_rect(Rect.new(0,26,w1,1),Color.new(255,255,255))
@dummy1.contents.draw_text(4,0,288,32,'Container Items')
# Same thing for # 2
@dummy2.contents.fill_rect(Rect.new(0,26,w2,1),Color.new(255,255,255))
@dummy2.contents.draw_text(4,0,288,32,'Party Items')
# This loop is the same as the one in the previous scenes. Almost all scenes use this.
# The only difference is what is disposed at the end.
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@dummy1.dispose
@dummy2.dispose
@help_window.dispose
@item_window.dispose
@target_window.dispose
@small_window.dispose
@spriteset.dispose
end
#--------------------------------------------------------------------------
def update
@help_window.update
@target_window.update
@dummy1.update
@dummy2.update
$game_map.update
@spriteset.update
case @action
when 0
update_item
return
when 1
update_small
return
when 2
update_action
return
when 3
update_action
return
when 4
update_target
return
when 5
update_trade
return
when 6
update_toss
return
when 7
update_target
return
when 8
update_trade
return
when 9
update_toss
return
end
if @item_window.active
update_item
return
end
if @target_window.active
update_target
return
end
if @small_window.active
update_small
return
end
if @action_window.active
update_action
return
end
if @number_window != nil
update_trade
return
end
if @toss_window != nil
update_toss
return
end
end
def update_dummy(height)
@height = height
return if @dummy3.disposed?
unless @dummy3.height == @height
@dummy3.height = height
@dummy3.contents = Bitmap.new(128,@height-32)
#@dummy3.contents.font.name = $defaultfonttype
#@dummy3.contents.font.size = $defaultfontsize
w3 = (128 - @dummy3.contents.text_size(@item.name).width - 32)/2
@dummy3.contents.fill_rect(w3,26,128-(w3*2),1,Color.new(255,255,255))
@dummy3.contents.blt(w3+4,4,RPG::Cache.icon(@item.icon_name),Rect.new(0,0,24,24),255)
@dummy3.contents.draw_text(w3+32,0,128-(w3*2)-32,32,@item.name)
end
end
#--------------------------------------------------------------------------
def update_small
@small_window.update
if Input.dir4 == 4
@small_window.clear_cursor
@action = 0
@item_window.active = true
@small_window.active = false
$game_system.se_play($data_system.cursor_se)
return
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_ContainerMenu.new
return
end
if Input.trigger?(Input::C)
@action = 3
@item = @small_window.item
@h = ((@item.is_a?(RPG::Item) and (@item.occasion == 0 or @item.occasion == 2)) ? 160 : 128)
@action_window = Window_PControl.new(@item)
@item_window.active = false
@action_window.active = true
@action_window.x = 240
@action_window.y = 116
@action_window.z = 110
@action_window.opacity = 0
@dummy3 = Window_Base.new(240,80,160,@h)
@dummy3.contents = Bitmap.new(128,@h-32)
#@dummy3.contents.font.name = $defaultfonttype
#@dummy3.contents.font.size = $defaultfontsize
@dummy3.opacity = 160
@dummy3.z = 109
w3 = (128 - @dummy3.contents.text_size(@item.name).width - 32)/2
@dummy3.contents.fill_rect(w3,26,128-(w3*2),1,Color.new(255,255,255))
@dummy3.contents.blt(w3+4,4,RPG::Cache.icon(@item.icon_name),Rect.new(0,0,24,24),255)
@dummy3.contents.draw_text(w3+32,0,128-(w3*2)-32,32,@item.name)
$game_system.se_play($data_system.decision_se)
return
end
end
def update_toss
@number_window.update
if Input.trigger?(Input::B)
case @action
when 6
@action = 2
when 9
@action = 3
end
@number_window.dispose
@number_window = nil
@action_window.active = true
@action_window.visible = true
$game_system.se_play($data_system.cancel_se)
return
end
if Input.trigger?(Input::C)
case @number_window.index
when 0 #Toss 1
numb = $container.toss(@item,1)
$game_system.se_play($data_system.decision_se)
if numb == 1
@number_window.dispose
@number_window = nil
@action_window.dispose
@dummy3.dispose
case @action
when 6
@action = 0
@item_window.active = true
when 9
@action = 1
@small_window.active = true
end
end
when 1 #Toss All
$container.toss(@item,99)
$game_system.se_play($data_system.decision_se)
@number_window.dispose
@number_window = nil
@action_window.dispose
@dummy3.dispose
case @action
when 6
@action = 0
@item_window.active = true
when 9
@action = 1
@small_window.active = true
end
when 2 #Back
@number_window.dispose
@number_window = nil
case @action
when 6
@action = 2
when 9
@action = 3
end
@action_window.active = true
@action_window.visible = true
$game_system.se_play($data_system.cancel_se)
return
end
@item_window.refresh
@small_window.refresh
end
end
def update_trade
@number_window.update
if Input.trigger?(Input::B)
case @action
when 5
@action = 2
when 8
@action = 3
end
@number_window.dispose
@number_window = nil
@action_window.active = true
@action_window.visible = true
$game_system.se_play($data_system.cancel_se)
return
end
if Input.trigger?(Input::C)
case @number_window.index
when 0 # 1
case @action
when 5
numb = $container.to_party(@item,1)
when 8
numb = $container.from_party(@item,1)
end
if numb == false
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
if numb == 1
@number_window.dispose
@number_window = nil
@action_window.dispose
@dummy3.dispose
case @action
when 5
@action = 0
@item_window.active = true
when 8
@action = 1
@small_window.active = true
end
end
when 1 #Take All
case @action
when 5
numb = $container.to_party(@item,99)
if numb == false
$game_system.se_play($data_system.buzzer_se)
return
end
when 8
$container.from_party(@item,99)
end
$game_system.se_play($data_system.decision_se)
@number_window.dispose
@number_window = nil
@action_window.dispose
@dummy3.dispose
case @action
when 5
@action = 0
@item_window.active = true
when 8
@action = 1
@small_window.active = true
end
when 2 #Back
@number_window.dispose
@number_window = nil
@action_window.active = true
@action_window.visible = true
case @action
when 5
@action = 2
when 8
@action = 3
end
$game_system.se_play($data_system.cancel_se)
return
end
@item_window.refresh
@small_window.refresh
end
end
def update_action
@action_window.update
update_dummy(@h) unless @h == nil
if Input.trigger?(Input::B)
case @action
when 2
@action = 0
@item_window.active = true
when 3
@action = 1
@small_window.active = true
end
@action_window.dispose
@dummy3.dispose
$game_system.se_play($data_system.cancel_se)
return
end
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
ind = @action_window.index
ind += 1 unless (@item.is_a?(RPG::Item) && (@item.occasion == 0 or @item.occasion == 2))
case ind
when 0 #USE item
if @item.scope >= 3
case @action
when 2
@action = 4
when 3
@action = 7
end
@action_window.visible = false
update_dummy(64)
@dummy3.y = 192
@action_window.active = false
@target_window.visible = true
@target_window.active = true
if @item.scope == 4 || @item.scope == 6
@target_window.index = -1
else
@target_window.index = 0
end
else
if @item.common_event_id > 0
$game_temp.common_event_id = @item.common_event_id
$game_system.se_play(@item.menu_se)
if @item.consumable
$game_party.lose_item(@item.id, 1)
@item_window.draw_item(@item_window.index)
end
$scene = Scene_Map.new
return
end
end
when 1 #TAKE/GIVE item
@action_window.active = false
@action_window.visible = false
case @action
when 2
@action = 5
@number_window = Window_Take.new(@item)
when 3
@action = 8
@number_window = Window_Give.new(@item)
end
@number_window.z = 111
@number_window.x = 240
@number_window.y = 116
@number_window.opacity = 0
@number_window.active = true
update_dummy(160)
when 2 #TOSS item
@action_window.active = false
@action_window.visible = false
case @action
when 2
@action = 6
when 3
@action = 9
end
@number_window = Window_Toss.new(@item)
@number_window.z = 111
@number_window.x = 240
@number_window.y = 116
@number_window.opacity = 0
@number_window.active = true
update_dummy(160)
end
end
end
def update_item
@item_window.update
if Input.dir4 == 6
@item_window.clear_cursor
@action = 1
@item_window.active = false
@small_window.active = true
$game_system.se_play($data_system.cursor_se)
return
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_ContainerMenu.new
return
end
if Input.trigger?(Input::C)
@action = 2
@item = @item_window.item
@h = ((@item.is_a?(RPG::Item) and (@item.occasion == 0 or @item.occasion == 2)) ? 160 : 128)
@action_window = Window_CControl.new(@item)
@item_window.active = false
@action_window.active = true
@action_window.x = 240
@action_window.y = 116
@action_window.z = 110
@action_window.opacity = 0
@dummy3 = Window_Base.new(240,80,160,@h)
@dummy3.contents = Bitmap.new(128,@h-32)
#@dummy3.contents.font.name = $defaultfonttype
#@dummy3.contents.font.size = $defaultfontsize
@dummy3.opacity = 160
@dummy3.z = 109
w3 = (128 - @dummy3.contents.text_size(@item.name).width - 32)/2
@dummy3.contents.fill_rect(w3,26,128-(w3*2),1,Color.new(255,255,255))
@dummy3.contents.blt(w3+4,4,RPG::Cache.icon(@item.icon_name),Rect.new(0,0,24,24),255)
@dummy3.contents.draw_text(w3+32,0,128-(w3*2)-32,32,@item.name)
$game_system.se_play($data_system.decision_se)
return
end
end
#--------------------------------------------------------------------------
def update_target
if $container.number(@item) == 0
@action_window.dispose
@dummy3.visible = false
case @action
when 4
@action = 0
@item_window.active = true
when 7
@action = 1
@small_window.active = true
end
@target_window.visible = false
@target_window.active = false
return
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
unless $container.useable(@item.id)
@item_window.refresh
end
case @action
when 4
@action = 2
when 7
@action = 3
end
@action_window.active = true
@action_window.visible = true
@target_window.visible = false
@target_window.active = false
update_dummy(160)
@dummy3.y = 80
return
end
if Input.trigger?(Input::C)
unless $container.useable(@item)
$game_system.se_play($data_system.buzzer_se)
return
end
if @target_window.index == -1
used = false
for i in $game_party.actors
used |= i.item_effect(@item)
end
end
if @target_window.index >= 0
target = $game_party.actors[@target_window.index]
used = target.item_effect(@item)
end
if used
$game_system.se_play(@item.menu_se)
if @item.consumable
$container.remove(@item, 1)
@item_window.refresh
end
@target_window.refresh
if $game_party.all_dead?
$scene = Scene_Gameover.new
return
end
if @item.common_event_id > 0
$game_temp.common_event_id = @item.common_event_id
$scene = Scene_Map.new
return
end
end
unless used
$game_system.se_play($data_system.buzzer_se)
end
return
end
end
end
#------------------------------------------------------------------------------
# Container Item Menu ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Container Item Window BEGINS
# This window shows what's in the container.
#------------------------------------------------------------------------------
class Window_ContainerItem < Window_Selectable
#--------------------------------------------------------------------------
def initialize
super(0, 288, 320, 192)
@column_max = 1
refresh
self.index = 0
end
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
@numbers = []
if $container.items != nil
$container.items.each{|a|@data.push($data_items[a[0]]);@numbers.push(a[1])}
end
if $container.weapons != nil
$container.weapons.each{|a|@data.push($data_weapons[a[0]]);@numbers.push(a[1])}
end
if $container.armors != nil
$container.armors.each{|a|@data.push($data_armors[a[0]]);@numbers.push(a[1])}
end
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
#self.contents.font.name = $defaultfonttype
#self.contents.font.size = $defaultfontsize
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
number = @numbers[index]
if item.is_a?(RPG::Item) and (item.occasion == 0 or item.occasion == 2)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4
y = index * 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 + 240, y, 16, 32, ':', 1)
self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? '' : self.item.description)
end
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
return
end
row = @index / @column_max
if row < self.top_row
self.top_row = row
end
if row > self.top_row + (self.page_row_max - 1)
self.top_row = row - (self.page_row_max - 1)
end
cursor_width = self.width / @column_max - 32
x = @index % @column_max * (cursor_width + 32)
y = @index / @column_max * 32 - self.oy
self.cursor_rect.set(x, y, cursor_width, 32)
end
def clear_cursor
self.cursor_rect.empty
end
end
#------------------------------------------------------------------------------
# Container Item Window ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Party Item Window BEGINS
#------------------------------------------------------------------------------
class Window_ItemSmall < Window_Selectable
#--------------------------------------------------------------------------
def initialize
super(320, 288, 320, 192)
@column_max = 1
refresh
self.index = 0
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)
#self.contents.font.name = $defaultfonttype
#self.contents.font.size = $defaultfontsize
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
if item.is_a?(RPG::Item) and
$game_party.item_can_use?(item.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
y = index * 32
rect = Rect.new(4, 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(4, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(4 + 28, y, 212, 32, item.name, 0)
self.contents.draw_text(4 + 240, y, 16, 32, ':', 1)
self.contents.draw_text(4 + 256, y, 24, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? '' : self.item.description)
end
def clear_cursor
self.cursor_rect.empty
end
end
#------------------------------------------------------------------------------
# Party Item Window ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Item Target Window BEGINS
#------------------------------------------------------------------------------
class Window_ContainerTarget < Window_Base
attr_accessor :index
#--------------------------------------------------------------------------
def initialize
super(0, 256, 640, 128)
self.contents = Bitmap.new(width - 32, height - 32)
#self.contents.font.name = $defaultfonttype
#self.contents.font.size = $defaultfontsize
refresh
@index = -1
end
#--------------------------------------------------------------------------
def refresh
self.contents.clear
off = ((608/$game_party.actors.size) - 120)/2
for i in 0...$game_party.actors.size
x = (608/$game_party.actors.size) * i
y = 0
actor = $game_party.actors[i]
draw_actor_graphic(actor, x + off +20, y + 85)
draw_actor_name(actor, x+off+10, y)
hp_bar(actor,x+off+40,y+45,80,4)
draw_actor_hp(actor, x+off+40, y + 21,80)
sp_bar(actor,x+off+40,y+65,80,4)
draw_actor_sp(actor, x+off+40, y + 41,80)
draw_actor_state(actor,x+off+40,y+62,80)
end
dist = 608/$game_party.actors.size
for i in 1...$game_party.actors.size
self.contents.fill_rect(Rect.new(i * dist,0,2,96),Color.new(255,255,255))
end
end
#--------------------------------------------------------------------------
def update_cursor_rect
x = ((608/$game_party.actors.size) * @index).round
off = (((608/$game_party.actors.size) - 140)/2).round
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(x+off, 0, 140, 96)
end
end
def update
super
if Input.trigger?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@index += 1
@index %= $game_party.actors.size
end
if Input.trigger?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@index -= 1
@index += $game_party.actors.size
@index %= $game_party.actors.size
end
if self.active and @help_window != nil
update_help
end
update_cursor_rect
end
end
#------------------------------------------------------------------------------
# Item Target Window ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Small Windows BEGIN
#------------------------------------------------------------------------------
class Window_CControl < Window_Command
def initialize(item)
if item.is_a?(RPG::Item)
super(160,['Use','Take','Discard'])
else
super(160,['Take','Discard'])
end
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(0, 32 * index, self.contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index],1)
end
end
class Window_PControl < Window_Command
def initialize(item)
if item.is_a?(RPG::Item)
super(160,['Use','Deposit','Discard'])
else
super(160,['Deposit','Discard'])
end
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(0, 32 * index, self.contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index],1)
end
end
class Window_Take < Window_Command
def initialize(item)
super(160,['Take 1','Take All','Go Back'])
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(0, 32 * index, self.contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index],1)
end
end
class Window_Give < Window_Command
def initialize(item)
super(160,['Deposit 1','Deposit All','Go Back'])
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(0, 32 * index, self.contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index],1)
end
end
class Window_Toss < Window_Command
def initialize(item)
super(160,['Discard 1','Discard All','Go Back'])
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(0, 32 * index, self.contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index],1)
end
end
#------------------------------------------------------------------------------
# Small Windows END
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Window_Base Addon BEGINS
#------------------------------------------------------------------------------
class Window_Base < Window
def easy_bar(x,y,width,height,scolor,ecolor,c,m)
if height >= 8
#Draw fancy background
self.contents.fill_rect(Rect.new(x,y,width,height),Color.new(0,0,0))
self.contents.fill_rect(Rect.new(x+1,y+1,width-2,height-2),Color.new(255,255,255))
self.contents.fill_rect(Rect.new(x+2,y+2,width-4,height-4),Color.new(128,128,128))
elsif height >= 4
#Draw simple background
self.contents.fill_rect(Rect.new(x,y,width,height),Color.new(0,0,0))
else
#Draw shadow
self.contents.fill_rect(Rect.new(x+3,y+2,width,height),Color.new(128,128,128))
end
if scolor == ecolor
if height >= 8
fill = c*(width-4)/m
self.contents.fill_rect(Rect.new(x+2, y+2, fill, height-4), scolor)
elsif height >= 4
fill = c*(width-2)/m
self.contents.fill_rect(Rect.new(x+1, y+1, fill, height-2), scolor)
else
fill = c*width/m
self.contents.fill_rect(Rect.new(x,y,fill,height),scolor)
end
else
if height >= 8
fill = c*(width-4)/m
difr = scolor.red - ecolor.red
difg = scolor.green - ecolor.green
difb = scolor.blue - ecolor.blue
for i in 0...fill
r = scolor.red - (difr/fill)*i
g = scolor.green - (difg/fill)*i
b = scolor.blue - (difb/fill)*i
self.contents.fill_rect(Rect.new(x+i+2,y+2,1,height-4),Color.new(r,g,b))
end
elsif height >= 4
fill = c*(width-2)/m
difr = scolor.red - ecolor.red
difg = scolor.green - ecolor.green
difb = scolor.blue - ecolor.blue
for i in 0...fill
r = scolor.red - (difr/fill)*i
g = scolor.green - (difg/fill)*i
b = scolor.blue - (difb/fill)*i
self.contents.fill_rect(Rect.new(x+i+1,y+1,1,height-2),Color.new(r,g,b))
end
else
fill = c*width/m
difr = scolor.red - ecolor.red
difg = scolor.green - ecolor.green
difb = scolor.blue - ecolor.blue
for i in 0...fill
r = scolor.red - (difr/fill)*i
g = scolor.green - (difg/fill)*i
b = scolor.blue - (difb/fill)*i
self.contents.fill_rect(Rect.new(x+i,y,1,height),Color.new(r,g,b))
end
end
end
end
def hp_bar(actor,x,y,width,height = 8)
easy_bar(x,y,width,height,Color.new(255,120,0),Color.new(255,180,0),actor.hp,actor.maxhp)
end
def sp_bar(actor,x,y,width,height = 8)
easy_bar(x,y,width,height,Color.new(50,0,200),Color.new(120,0,255),actor.sp,actor.maxsp)
end
end
#------------------------------------------------------------------------------
# Window_Base Addon ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Containers Class BEGINS
#------------------------------------------------------------------------------
class Game_Containers
attr_accessor :store
def initialize
@store = {}
end
def create(number=0, items=[], weapons=[], armors=[])
@store[$game_map.map_id][number] = Game_Container.new(items, weapons, armors)
$container = @store[$game_map.map_id][number]
$scene = Scene_ContainerMenu.new
end
def load(number)
$container = @store[$game_map.map_id][number]
$scene = Scene_ContainerMenu.new
end
end
class Scene_Title
alias jimmr_icre_command_new_game command_new_game
def command_new_game
$containers = Game_Containers.new
jimmr_icre_command_new_game
end
end
class Game_Map
alias jimmr_icre_setup setup
def setup(map_id)
jimmr_icre_setup(map_id)
if $containers.store[@map_id] == nil
$containers.store[@map_id] = {}
end
end
end
#------------------------------------------------------------------------------
# Containers Class ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Container Class BEGINS
#------------------------------------------------------------------------------
class Game_Container
attr_accessor :items, :weapons, :armors
def initialize(items=[], weapons=[], armors=[])
@items = items
@weapons = weapons
@armors = armors
end
def number(item)
@item = item
@number = 0
case @item
when RPG::Item
self.items.each{|a|@number = a[1] if a[0] == @item.id}
when RPG::Weapon
self.weapons.each{|a|@number = a[1] if a[0] == @item.id}
when RPG::Armor
self.armors.each{|a|@number = a[1] if a[0] == @item.id}
end
return @number
end
def useable(item)
@item = item
case @item
when RPG::Item
@number = number(@item)
return ((item.occasion == 0 or item.occasion == 2) && @number > 0)
end
false
end
def remove(item, number)
@number = number
@item = item
case @item
when RPG::Item
self.items.each{|a|a[1] -= @number if a[0] == @item.id;self.items.delete(a) if a[1] == 0}
when RPG::Weapon
self.weapons.each{|a|a[1] -= @number if a[0] == @item.id;self.weapons.delete(a) if a[1] == 0}
when RPG::Armor
self.armors.each{|a|a[1] -= @number if a[0] == @item.id;self.armors.delete(a) if a[1] == 0}
end
end
def add(item, number)
@number = number
@item = item
@found = false
case @item
when RPG::Item
self.items.each{|a|if a[0] == @item.id; a[1] += @number; @found = true; end}
self.items.push([@item.id,@number]) if @found == false
when RPG::Weapon
self.weapons.each{|a|if a[0] == @item.id; a[1] += @number; @found = true; end}
self.weapons.push([@item.id,@number]) if @found == false
when RPG::Armor
self.armors.each{|a|if a[0] == @item.id; a[1] += @number; @found = true; end}
self.armors.push([@item.id,@number]) if @found == false
end
end
def toss(item,number)
@item = item
@cnumber = 0
case @item
when RPG::Item
self.items.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [number,@cnumber].min
remove(@item,@number)
when RPG::Weapon
self.weapons.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [number,@cnumber].min
remove(@item,@number)
when RPG::Armor
self.armors.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [number,@cnumber].min
remove(@item,@number)
end
return @cnumber
end
def to_party(item,number)
@item = item
@carry = [99 - $game_party.number(@item),MAX_ITEMS-$game_party.total_items].min
return false if @carry == 0
@tnumber = [number,@carry].min
@cnumber = 0
case @item
when RPG::Item
self.items.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
remove(@item,@number)
$game_party.gain_item(@item.id,@number)
when RPG::Weapon
self.weapons.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
remove(@item,@number)
$game_party.gain_weapon(@item.id,@number)
when RPG::Armor
self.armors.each{|a|@cnumber = a[1] if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
remove(@item,@number)
$game_party.gain_armor(@item.id,@number)
end
return @cnumber
end
def from_party(item,number)
@item = item
@carry = $game_party.number(@item)
@tnumber = [number,@carry].min
@cnumber = 99
case @item
when RPG::Item
self.items.each{|a|@cnumber = (99-a[1]) if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
add(@item,@number)
$game_party.gain_item(@item.id,-@number)
when RPG::Weapon
self.weapons.each{|a|@cnumber = (99-a[1]) if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
add(@item,@number)
$game_party.gain_weapon(@item.id,-@number)
when RPG::Armor
self.armors.each{|a|@cnumber = (99-a[1]) if a[0] == @item.id}
@number = [@tnumber,@cnumber].min
add(@item,@number)
$game_party.gain_armor(@item.id,-@number)
end
return @carry
end
end
#------------------------------------------------------------------------------
# Container Class ENDS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Selectable Window Addon BEGINS
#------------------------------------------------------------------------------
class Window_Selectable < Window_Base
alias jimmr_lite_container_update update
def update
@index = [@index,@item_max-1].min
jimmr_lite_container_update
end
end
#--------------------------------------------------------------------------
# End SDK Enabled Check
#--------------------------------------------------------------------------
end
class Scene_Save < Scene_File
alias jimmr_lite_container_save_data write_save_data
def write_save_data(file)
jimmr_lite_container_save_data(file)
Marshal.dump($containers, file) if $containers != nil
end
end
class Scene_Load < Scene_File
alias jimmr_lite_container_load_data read_save_data
def read_save_data(file)
jimmr_lite_container_load_data(file)
$containers = Marshal.load(file)
end
end
Alright. The fruit of my work, so far. This "little snippet" of code will do the following:
- The player can choose what items they want to take from containers.
- The player can put items from their inventory into containers.
- Why? Because there's an item limit.
But apart from that, the player can also:
- Discard items both from the container and inventory.
- Use items both from the container and inventory.
As an added plus, the map updates while in the menu, so decide quickly!
The only things you can easily change are purposely at the top.
Now, to call this baby...
Code:
$containers.create(ID,[[Item1,Number],[Item2,Number]], [[Weapon1,Number]], [[Armor1, Number]])
ID is the container's number. Each map has their own unique containers!
Yes, that means that you can't make "banks" (but you will be able to in the "non-Lite" version), but it also means that you won't have to keep track of how many containers are in all the other parts of the game.
Item1, Item2, Weapon1 & Armor1 are of course items in the database. For example, a potion would be 1.
Number is the number of that item you want in the container.
For example, if I want a container with 3 Potions, 1 High Potion, 1 Bronze Sword, 2 Mithril Spears, and a Bronze Shield, I'd use this call script:
Code:
$containers.create(ID,[[1,3],[2,1]],[[1,1],[8,2]],[[1,1]])
Another example, creating a container with 5 high potions and 2 high perfumes, but nothing else:
Code:
$containers.create(ID,[[2,5],[5,2]], [], [])
Now what's the ID for? Well, if you just go ahead and create a new container every time the player runs an event, the items would never end. Therefore, make use of local switches, and on the following page use this call script instead:
Code:
$containers.load(ID)
Remember, each map has its own unique container ID's.
Now, if you have a legal version of RMXP and use the SDK, there's nothing else to do.
If you use Postality Knights Edition, you need to search for all instances of "$defaultfont" and remove the comments on those lines.
If you don't use the SDK, put comments in front of the two first and the very last line of code.
That's all really. There should be no need for a demo, but here are some screenies!
Screenies!
Have fun!
~Jimmie