Help - Search - Members - Calendar
Full Version: Easily Memorize, Remove, and Replace Player's Items
RPG RPG Revolution Forums > Scripting > Script Tutorials > RGSS2
BigEd781
Game_Party Addition for Item Memorization

Game_Party Addition for Item Memorization


Introduction

This is an addition to Game_Party that will allow you to easily memorize, remove, and restore the player's items, gold, and equipment.
This script should be fully compatible with other scripts that are well written (i.e., they alias the initialize method instead of overwriting it), but for one case that I can think of.
This script will be incompatible with the KGC large party script when memorizing equipped items. I will get around to fixing this soon enough.

Usage

Place the script in the materials section.

[Show/Hide] Memorizing and Restoring Items

When you want to take away the player's items, use a "Script" event command and this code:
CODE
$game_party.backup_items
$game_party.clear_items

$game_party.backup_items - Makes a copy of all currently held items and saves it to be restored later.
$game_party.clear_items - Removes all items from the player's inventory. Don't worry, you made a copy first, right?

Next, when you want to give the items back to the player, use another "Script" event command (inside a treasure chest or something) and use this single line:
CODE
$game_party.restore_items

That will replace all of the items that were saved when you last used the backup_items method and add them to the inventory.


[Show/Hide] Memorizing and Restoring Gold


This is very similar to the last operation. We have two commands to use when taking away the player's gold:
CODE
$game_party.backup_gold
$game_party.clear_gold

$game_party.backup_gold - Makes a copy of the current gold total.
$game_party.clear_gold - Removes all of the player's gold. Be sure to make the backup first!

When you wish to give the player's gold back to the party, use this in a "Script" event command:
CODE
$game_party.restore_gold

This will add the saved gold to the current total.


[Show/Hide] Memorizing and Restoring Player's Equipment


Again this process is familiar. Two command to clear and save the entire party's currently equipped items.
CODE
$game_party.backup_all_equips
$game_party.unequip_all

$game_party.backup_all_equips - Makes a copy of the current equipment for every member of the party.
$game_party.unequip_all - Removes all equipment from every party member. The equipment is not saved! It will be lost if you do not perform a backup first.

When you wish to give the party's equipment back, use the following line in a "Script" event command:
CODE
$game_party.restore_all_equips

This will unequip whatever the players are currently equipped with and place the saved equipment where it was previously. Nothing will be lost by performing this operation.

There is one more feature to mention involving equipment. You do not have to use only these three functions to change the equipment of the entire party.
You can save, clear, and restore the equipment of individual actors by calling similar methods of the Game_Actor class, like so:
CODE
$game_actors[id].backup_equips
$game_actors[id].clear_equips
$game_actors[id].restore_equips

id refers to the id of the actor that you wish to perform these actions on.



Script
Remember, just place it in the Materials section above "Main".

CODE
#==============================================================================
# ** Game_Party implementation
#------------------------------------------------------------------------------
#    aliased methods : initialize
#==============================================================================
class Game_Party
  alias :biged_old_init :initialize
  def initialize
    biged_old_init
    @temp_items = {}        # temp items hash
    @temp_weapons = {}      # temp weapons hash
    @temp_armors = {}       # temp armors hash
    @temp_gold = nil        # temp gold variable
  end
  #--------------------------------------------------------------------------
  # * if the player has picked up some items since their's were wiped
  #   and backed up, we need to combine the totals of any common items
  #--------------------------------------------------------------------------
  def merge_like_key_values(dest, src)
    return if dest == {}        
    for key in dest.keys          
      src[key] += dest[key] if src.has_key?(key)      
    end          
  end
  #--------------------------------------------------------------------------
  # * Make a copy of the current inventory
  #--------------------------------------------------------------------------
  def backup_items
    @temp_items   = Marshal::load(Marshal::dump(@items))
    @temp_weapons = Marshal::load(Marshal::dump(@weapons))
    @temp_armors  = Marshal::load(Marshal::dump(@armors))
  end
  #--------------------------------------------------------------------------
  # * Clear the current inventory
  #--------------------------------------------------------------------------
  def clear_items
    @items.clear
    @weapons.clear
    @armors.clear
  end
  #--------------------------------------------------------------------------
  # * Restore the backed up inventory if a backup exists
  #--------------------------------------------------------------------------
  def restore_items
    unless @temp_items == {}
      merge_like_key_values(@items, @temp_items)
      @items = @items.merge(@temp_items)
    end
    unless @temp_weapons == {}
      merge_like_key_values(@weapons, @temp_weapons)
      @weapons = @weapons.merge(@temp_weapons)
    end
    unless @temp_armors == {}  
      merge_like_key_values(@armors, @temp_armors)
      @armors = @armors.merge(@temp_armors)
    end
    @temp_items = @temp_weapons = @temp_armors = {}
  end  
  #--------------------------------------------------------------------------
  # * Backup All mparty member's equipment
  #--------------------------------------------------------------------------
  def backup_all_equips
    for i in @actors
      $game_actors[i].backup_equips
    end
  end
  #--------------------------------------------------------------------------
  # * unequip all party member
  #   THE EQUIPMENT WILL BE LOST FOREVER
  #   IF YOU DO NOT FIRST MAKE A BACKUP!
  #--------------------------------------------------------------------------
  def unequip_all
    for i in @actors
      $game_actors[i].clear_equips
    end
  end
  #--------------------------------------------------------------------------
  # * Backup All mparty member's equipment
  #--------------------------------------------------------------------------
  def restore_all_equips
    for i in @actors
      $game_actors[i].restore_equips
    end
  end
  #--------------------------------------------------------------------------
  # * Make a copy of the current gold total
  #--------------------------------------------------------------------------
  def backup_gold
    @temp_gold = @gold  
  end
  #--------------------------------------------------------------------------
  # * Clear the current gold total
  #--------------------------------------------------------------------------
  def clear_gold
    @gold = 0
  end
  #--------------------------------------------------------------------------
  # * Restore the saved gold total if one exists
  #--------------------------------------------------------------------------
  def restore_gold
    unless @temp_gold == nil
      @gold += @temp_gold
      @temp_gold = nil
    end
  end
  
end
#==============================================================================
# ** Game_Actor implementation
#------------------------------------------------------------------------------
#    aliased methods : initialize
#==============================================================================
class Game_Actor < Game_Battler
  alias :biged_old_init :initialize
  def initialize(actor_id)
    biged_old_init(actor_id)  
    @temp_weapons = []  #temporary store for weapons
    @temp_armors = []   #temporary store for armor
  end
  #--------------------------------------------------------------------------
  # * Make a copy of the currently equiped items
  #--------------------------------------------------------------------------
  def backup_equips    
    @temp_weapons = weapons
    @temp_armors = armors      
  end
  #--------------------------------------------------------------------------
  # * Restore back up equipment if it exists
  #--------------------------------------------------------------------------
  def restore_equips
    #un-equip the current equipment and place it in the inventory
    unless @temp_weapons == [] && @temp_armors == []  #no backup made
      for i in 0...5 do
        change_equip(i, nil)
      end
    end
    #-------------------------------------------------------------#
    #we check each one individually here because if any slot      #  
    #is set to nil, a default value is used (not nil).  This      #
    #default value does actually correspond to an item, and we    #
    #don't want that, so we check.                                #
    #-------------------------------------------------------------#
    #the incrementor is there because the armor array size will be#
    #different depending on whether the player is using 2 swords  #
    #-------------------------------------------------------------#
    @weapon_id = @temp_weapons[0].id if @temp_weapons[0] != nil    
    if two_swords_style
      @armor1_id = @temp_weapons[1].id if @temp_weapons[1] != nil      
      i = 0
    else
      @armor1_id = @temp_armors[0].id if @temp_armors[0] != nil  
      i = 1
    end
    @armor2_id = @temp_armors[i].id if @temp_armors[i] != nil
    @armor3_id = @temp_armors[i+1].id if @temp_armors[i+1] != nil
    @armor4_id = @temp_armors[i+2].id if @temp_armors[i+2] != nil
    @temp_weapons = @temp_armors = []    
  end
  #--------------------------------------------------------------------------
  # * Clear the currently equipped item set.
  #   THIS DOES NOT PLACE THE ITEMS IN INVENTORY!
  #   THEY WILL BE GONE FOREVER UNLESS YOU MAKE A BACKUP FIRST!
  #--------------------------------------------------------------------------  
  def clear_equips
    @weapon_id = 0
    @armor1_id = 0
    @armor2_id = 0
    @armor3_id = 0
    @armor4_id = 0
  end
end

VerifyedRasta
Great job Ed! ... I might use this in my game as well and credit you of course
webbo227
Amazing, just what I need! Thanks! happy.gif
maker2008
great script, thank you very much!
I really want a similar operation on gold
BigEd781
OK, I'll update it with a gold function tonight. I will also change it a bit so that it only appends the saved items to the player's inventory instead of completely replacing it. This is would be good if you removed the player's items, but then they gained an item before having their full inventory restored.
Twilight27
Wow, BigED, this is an excellent script! Thanks for sharing it! Just one question...
Say I save&remove my items and go through this "test". During this test I obtain "Elixir". After I complete the test, I use the "replace" command to get back the items.

Would I have just the "saved" items in my inventory now, or "saved+elixir" items?
BigEd781
...

Read the previous post. I am fixing that problem when I get home tonight. It is a quick fix, but I can't test it at work.
BigEd781
*Only bumping because the script has been updated*

Currently held items are no longer blown away when the back up items are restored. The two items sets are merged instead.
VerifyedRasta
QUOTE (BigEd781 @ Aug 29 2008, 04:52 PM) *
*Only bumping because the script has been updated*

Currently held items are no longer blown away when the back up items are restored. The two items sets are merged instead.


Excellent! This will go perfectly with my game now, thanks!
Twilight27
QUOTE (BigEd781 @ Aug 29 2008, 07:52 PM) *
*Only bumping because the script has been updated*

Currently held items are no longer blown away when the back up items are restored. The two items sets are merged instead.



Oooh, I found an error n_n. Okay, this is my setup; a very small trial/dungeon. You enter this "area". It's one-spaced so you're forced to step on the tile which "takes away" your equipment. I had Item A, so that's gone. I continue and get item B and then proceed to leave the small dungeon, again a forced tile spot which gives you back the items. It worked, I had items A and B. However, if I repeat the same procedure (from the starting point to the ending, not going backwards first), I end up with Item A x1 and Item Bx1; and not Item Ax1 and Item Bx2.

EDIT: The entrance is one-spaced, and that calls the script command, same as the ending.

Understand? (There was another error where walking over it repeatedly ended up in losing all the items, but am still testing that one)
Lukedevoux
Well I just tested out your script VERY COOL! thumbsup.gif So you just need to fix remove of equipped items as well. Since I still had equipped items, when I called the script.
BigEd781
QUOTE (Twilight27 @ Aug 29 2008, 06:00 PM) *
QUOTE (BigEd781 @ Aug 29 2008, 07:52 PM) *
*Only bumping because the script has been updated*

Currently held items are no longer blown away when the back up items are restored. The two items sets are merged instead.



Oooh, I found an error n_n. Okay, this is my setup; a very small trial/dungeon. You enter this "area". It's one-spaced so you're forced to step on the tile which "takes away" your equipment. I had Item A, so that's gone. I continue and get item B and then proceed to leave the small dungeon, again a forced tile spot which gives you back the items. It worked, I had items A and B. However, if I repeat the same procedure (from the starting point to the ending, not going backwards first), I end up with Item A x1 and Item Bx1; and not Item Ax1 and Item Bx2.

EDIT: The entrance is one-spaced, and that calls the script command, same as the ending.

Understand? (There was another error where walking over it repeatedly ended up in losing all the items, but am still testing that one)



I will look into it. If that is true, that is a good bug find, thanks! It is happening because I am simply merging the two hashes, but that will not combine equal key values. I can fix it, but probably not until tomorrow.
@Luke: I forgot about those tongue.gif I'll fix that.
Twilight27
QUOTE (Lukedevoux @ Aug 29 2008, 09:06 PM) *
Well I just tested out your script VERY COOL! thumbsup.gif So you just need to fix remove of equipped items as well. Since I still had equipped items, when I called the script.


Hey Ed, can you make the removal of equipped items optional?
BigEd781
It will be.
BigEd781
*UPDATE*

FEATURE - Now possible to perform saving, clearing, and restoring operations on gold.
FEATURE - Now possible to perform saving, clearing, and restoring operations on currently equipped items. You may perform this on the entire party as a whole, or individual actors.
BUG_FIX - Fixed the bug pointed out by Twilight which caused restored items to not merge properly when it shared items in common with the current inventory. Nice catch Twilight, thanks again.

I noted above that this will almost assuredly fail to save all of the currently equipped items if you are using the KGC large party script. This is because I have not taken the time to look at it as to get information on how it keeps track of equipped items. I will fix that eventually.
Twilight27
QUOTE (BigEd781 @ Aug 30 2008, 04:54 AM) *
I noted above that this will almost assuredly fail to save all of the currently equipped items if you are using the KGC large party script. This is because I have not taken the time to look at it as to get information on how it keeps track of equipped items. I will fix that eventually.


I plan to use that large party script, but also plan to disable the removal of equipped items (So far...). Will I experience any other problems then?
And I'll test it out for any more bugs n_n
Twilight27
**BUG**

Heh, I found more errors (though you can work around it). Here, I'll upload this project for testing

(Removed)

You can check the game to see if I did anything wrong; as you can see, you have to go through the 'fence dungeon' where the "call script" commands activate at the start and end. In the middle you can talk to the crystal to get one item (for more testing).

Okay, simply start the game, talk to the left-most character at the top, who'll give you some items. Go straight down (right path) and after the "script call" space event, go back up (out of the dungeon) and back down (back into it). Proceed to exit the dungeon and you'll have no items.

My guess is, the game recorded the fact that you had no items on the second walk-by, so that is what you get back in the end.

(It works perfectly anyway, and I can still use this. Just prevent the character from going backwards and then back in; which I planned to do somehow anyway...)
maker2008
Thank you very much!
BigEd781
QUOTE (Twilight27 @ Aug 30 2008, 08:01 AM) *
**BUG**

Heh, I found more errors (though you can work around it). Here, I'll upload this project for testing

http://www.mediafire.com/?ccmyqrs82tl

You can check the game to see if I did anything wrong; as you can see, you have to go through the 'fence dungeon' where the "call script" commands activate at the start and end. In the middle you can talk to the crystal to get one item (for more testing).

Okay, simply start the game, talk to the left-most character at the top, who'll give you some items. Go straight down (right path) and after the "script call" space event, go back up (out of the dungeon) and back down (back into it). Proceed to exit the dungeon and you'll have no items.

My guess is, the game recorded the fact that you had no items on the second walk-by, so that is what you get back in the end.

(It works perfectly anyway, and I can still use this. Just prevent the character from going backwards and then back in; which I planned to do somehow anyway...)


So are are right in thinking that the game recorded the fact that you have no items, but that is really by design. I do not see a reason to disallow making a backup when the player has no items. It is working as it should. You wlso should remember that this is not a likely scenario. When you want to take away a player's items, it will rarely (if ever) be done more than once before the player's items are returned. Also, the player will most likely not have control over when these things take place, as they do in the example.

So there is nothing I could really change here. Having no items is still a valid case. Keep up the testing though!

PS, as long as you are not using the equipped item functions you should have no problems with this and the large party scripts.
Twilight27
Well yea, just like I said, it wasn't a problem I would have encountered since the player won't be able to do that. Anyway, you checked out the testing demo right? I'm going to remove the link soon.

Um, now I'm wondering...there are scripts that vary the equipment you have, such as: Arm, Head, Feet, etc.
Does your equipment option work with those scripts perfectly?
BigEd781
Maybe, maybe not. When you switch equipped equipment back and forth, I am using the structure of the default Game_Actor class to do so. As long as the variables which hold the equipment id's were not change it should work.
And yeah, I looked at the demo. thanks again.
Jeffsun
is it possible to have more than one backup?
my game focuses on three characters, alternating back and forth between all three.
so, i need to have not one but two saved backups.
BigEd781
No, but I think thgat there is a KGC script which does that.
Jeffsun
can you give me a link to the script or tell me a way to find it?
if not, then is there any way to duplicate the script?
i duplicated the first script, and put a 2 in front of everything, so it would be different than the first.
Didnt come out so great. xO

thanks.

TalesOf_Fantasy
It a really good script!

but,
can it work on the actors level?
like become weak for a moment or somethng else like being separated
BigEd781
QUOTE (TalesOf_Fantasy @ Jan 30 2009, 09:48 AM) *
It a really good script!

but,
can it work on the actors level?
like become weak for a moment or somethng else like being separated


Thanks, but that is not really the intended purpose here. You can change an actor's level using events.
Michael
Cool, I tried it and it's perfect. I might create a jail type game where you have to escape from jail or something sometime.
Thanks!
Real Ninjason
I know this Post is quite old, but I especially registered to make this request:

Im writing a game where I switch Parties, because the are in different locations.


So i'd need a this script with the addition that you can actually store more than just one parties equipment, gold and items.

Is that possible?
platipus
would it be possible if it was done with stats? storing stats i guess..
Real Ninjason
you mean like:
$game_party[ID].backup_items

where I can just set the ID for Party 1 and 2?

I thought about that, but I am unfortunately not as good a scripter to even begin realizing this...
halcyonchaos
This is exactly what I need for my game! smile.gif Thank you!
The Frontera
Great script ! I will use it in my game ! laugh.gif
Thank you !
Sable
Oh man this is a lifesaver.

In my game the player would come accross border checkpoints whereby the players weapons would be taken when entering but given back when the player leaves.

While this would serve the same purpose, is there a way for the script to backup, remove and restore weapon equips specifically?
potatoeblaster
ok, so im a noob in this stuff right? can you take your time and explain in baby steps what I need to do ? cause i really want this script. I'm like a baby trying to understand algebra xD Your script is very very good i can tell but I suck rolleyes.gif
Digioso
QUOTE (potatoeblaster @ Sep 25 2011, 10:44 AM) *
ok, so im a noob in this stuff right? can you take your time and explain in baby steps what I need to do ? cause i really want this script. I'm like a baby trying to understand algebra xD Your script is very very good i can tell but I suck rolleyes.gif


Read the first posting. Everything is mentioned there.

@BigEd: Thanks a lot for the script. It is really useful. More than one backup would be really nice, though. smile.gif
nohmaan
Is it possible to use this script to have multiple inventories?

i.e. The game starts with 2 main characters in different areas, so when switching to each person's story until they meet up later on, would it be possible for them to have 2 separate inventories and combine then when they meet?
Digioso
QUOTE (nohmaan @ Oct 4 2011, 04:40 AM) *
Is it possible to use this script to have multiple inventories?

i.e. The game starts with 2 main characters in different areas, so when switching to each person's story until they meet up later on, would it be possible for them to have 2 separate inventories and combine then when they meet?


It isn't possible. You can only have one backup at a time.
Anon4907
I just started using this script. I'm getting a Syntax Error on line 12 (I did the liberty of adding some extra text at the top, crediting BigEd and whatnot), so it's really line 7, where the code reads as:

CODE
  alias :biged_old_init :initialize


I'm not sure what's going on, but I assume a simple fix is all that's needed. Much thanks :3
Night_Runner
I just tested the code in a blank project and there was no problems with that line (or any line actually).

Would you be able to show me the first 13 lines of code, as it is in your version?
Anon4907
QUOTE (Night_Runner @ Nov 3 2011, 08:39 AM) *
I just tested the code in a blank project and there was no problems with that line (or any line actually).

Would you be able to show me the first 13 lines of code, as it is in your version?


CODE
#==============================================================================
# ** Game_Party implementation
#    Name: Item Memorization for Party/Individual Actors
#    By: BigEd781
#    Version: 1.2
#
#    Date: 2008.08.29
#------------------------------------------------------------------------------
#    aliased methods : initialize
#==============================================================================
class Game_Party
  alias :biged_old_init :initialize
  def initialize


If there's anything I should be removing, let me know. All I really added was the name of the script, who made it and when, and the version that's out (I don't think that really matters tho...) So from the line that reads: Name... down to Date... were added by me. I just felt like giving credit lol Perhaps I could just move that part to the end of the script? Also, everything else is untouched. Thanks for the quick help smile.gif

EDIT: I figured it out lol sorry out that.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2013 Invision Power Services, Inc.