Main Menu
  • Welcome to The RPG Maker Resource Kit.

Multiple Parties

Started by modern algebra, April 02, 2008, 05:24:37 AM

0 Members and 1 Guest are viewing this topic.

modern algebra

Multiple Parties
Version: 1.0b
Author: modern algebra
Date: April 2, 2008

Description



This script allows you to maintain multiple parties (separate item lists, step count, everything) and allows you to merge them at will. Primarily useful for a game where parties split up or a game where you can have separate parties

Features


  • Allows for many parties
  • Perfect if you want parties to be able to split up and not have access to all the same items and things
  • Allows for easy merging and deletion of parties

Screenshots

N/A for this script

Instructions

FROM SCRIPT:
Place this script below all of the default scripts in the Script Editor.
There are several codes to keep in mind:

  $game_parties[id]                                :accesses the party located in that index creates it if it does not yet exist.
  $game_parties[id] = X                          :Sets the party to X. It MUST be a Game_Party object
  party = $game_parties.merge(id1,id2) :merges two parties and saves them in party
  $game_parties.merge! (id1, id2)          :merges two parties and saves them in $game_parties[id1] and deletes $game_parties[id2]
  $game_parties.delete (id)                    :Deletes $game_parties[id]

In order to switch the current party, just do this:

  $game_party = $game_parties[id]
  $game_player.refresh

By default, the original party is saved in $game_parties[0], so you may want to avoid overwriting $game_parties[0] and just work with 1,2,...

Also, be very careful when dealing with parties. Always remember what parties exist and where they are in $game_parties or else you may make a stupid error occur.

   *EXAMPLE EVENT*

     @>Change Items: [Potion], + 1
     @>Change Gold: + 50
     @>Script: p = $game_parties[1]
      :      : $game_party = p
      :      : $game_player.refresh
     @>Change Party Member: Add [Oscar], Initialize
     @>Change Weapons: [Bastard Sword], +1
     @>Change Gold: + 100

This event just switched your party to the party with index 1, and, assuming that $game_parties[1] did not previously exist, if you looked at your menu you would see that Oscar is in the party, you have 100 Gold, and a Bastard Sword. The potion and the other 50 Gold went to the initial party

Now, let's say Oscar later meets up with his party and rejoins. Then this event would do the trick:

  @>Script: $game_parties.merge! (0, 1)
    :      : $game_party = $game_parties[0]
    :      : $game_player.refresh

And there, the two parties have been merged and everything that Oscar had obtained goes to the party.

Script




#==============================================================================
#  Multiple Parties
#  Version: 1.0b
#  Author: modern algebra (rmrk.net)
#  Date: April 2, 2008
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Description:
#    This script allows you to maintain multiple parties (separate item lists, steps,
#    everything) and allows you to merge them at will. Primarily useful for a
#    game where parties split up or a game where you can have separate parties
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Instructions:
#    Place this script under ? Materials in the Script Editor.
#    There are several codes to keep in mind:
#
#      $game_parties[id]                :accesses the party located in that index.
#                                       :creates it if it does not yet exist.
#      $game_parties[id] = X            :Sets the party to X. It MUST be a  
#                                       :Game_Party object
#      p = $game_parties.merge(id1,id2) :merges two parties and saves them in p
#      $game_parties.merge! (id1, id2)  :merges two parties and saves them in
#                                       :$game_parties[id1] and deletes $game_parties[id2]
#      $game_parties.delete (id)        :Deletes $game_parties[id]
#
#    In order to switch the current party, just do this:
#
#      $game_party = $game_parties[id]
#      $game_player.refresh
#
#    By default, the original party is saved in $game_parties[0], so you may
#    want to avoid overwriting $game_parties[0] and just work with 1,2,...
#
#    Also, be very careful when dealing with parties. Always remember what
#    parties exist and where they are in $game_parties or else you may make a
#    stupid error occur.
#
#        *EXAMPLE EVENT*
#
#      @>Change Items: [Potion], + 1
#      @>Change Gold: + 50
#      @>Script: p = $game_parties[1]
#       :      : $game_party = p
#       :      : $game_player.refresh
#      @>Change Party Member: Add [Oscar], Initialize
#      @>Change Weapons: [Bastard Sword], +1
#      @>Change Gold: + 100
#
#    Assuming that $game_parties[1] did not previously exist, this event just
#    switched your party to the party with index 1, and if you looked at your
#    menu you would see that Oscar is in the party, you have 100 Gold, and a
#    Bastard Sword. The potion and the other 50 Gold went to the initial party
#
#    Now, let's say Oscar later meets up with his party and rejoins. Then this
#    event would do the trick:
#
#      @>Script: $game_parties.merge! (0, 1)
#       :      : $game_party = $game_parties[0]
#       :      : $game_player.refresh
#
#    And there, the two parties have been merged and everything that Oscar had
#    obtained goes to the party.
#==============================================================================

#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
#  Summary of Changes:
#    new method - add_multiple_steps
#==============================================================================

class Game_Party < Game_Unit
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Add Multiple Steps
 #    amount : the amount of steps to add
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def add_multiple_steps (amount)
   @steps += amount
 end
end

#==============================================================================
# ** Game_Parties
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  This class handles Parties. It's a wrapper for the built-in class "Array."
#  It is accessed by $game_parties
#==============================================================================

class Game_Parties
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Object Initialization
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def initialize
   @data = [$game_party]
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Retrieve Party
 #    id : the ID of the party
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def [] (id)
   @data[id] = Game_Party.new if @data[id] == nil
   return @data[id]
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Set Party
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def []= (id, party)
   # Does nothing unless it is a party object
   return unless party.class == Game_Party
   @data[id] = party
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Merge
 #    id_1 : the ID of the first party
 #    id_2 : the ID of the second party
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def merge (id_1, id_2)
   new_party = Game_Party.new
   # Get old parties
   op1 = self[id_1]
   op2 = self[id_2]
   # Gold
   new_party.gain_gold (op1.gold + op2.gold)
   # Members
   (op1.members | op2.members).each { |actor| new_party.add_actor (actor.id) }
   # Items, Weapons, and Armor
   (op1.items | op2.items).each { |item|
     new_party.gain_item (item, op1.item_number (item) +  op2.item_number (item))
   }
   # Steps
   new_party.add_multiple_steps (op1.steps + op2.steps)
   # Last Item
   new_party.last_item_id = op1.last_item_id
   # Last Actor
   new_party.last_actor_index = op1.last_actor_index
   # Last Target
   new_party.last_target_index = op1.last_target_index
   # Quests (if game includes my Quest Log)
   begin
     (op1.quests.list | op2.quests.list).each { |quest|
       new_quest = new_party.quests[quest.id]
       # Reveal Objectives
       quest.revealed_objectives.each { |i| new_quest.reveal_objective (i) }
       # Complete Objectives
       quest.complete_objectives.each { |i| new_quest.complete_objective (i) }
       # Fail Objectives
       quest.failed_objectives.each { |i| new_quest.fail_objective (i) }
       # Concealed?
       new_quest.concealed = quest.concealed
       # Reward Given?
       new_quest.reward_given = quest.reward_given
     }
   rescue
   end
   return new_party
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Merge!
 #    id_1 : the ID of the first party to which the second party is merged
 #    id_2 : the ID of the second party that is deleted
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def merge! (id_1, id_2)
   @data[id_1] = merge (id_1, id_2)
   delete (id_2)
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Delete
 #     id : the ID of the quest to be deleted
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 def delete (id)
   @data[id] = nil
   # If this was the last in the array
   if id == @data.size - 1
     # Delete any nil elements that exist between this party and its successor
     id -= 1
     while @data[id] == nil
       @data.delete (id)
       id -= 1
     end
   end
 end
end

#==============================================================================
# ** Scene_Title
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    aliased method - create_game_objects
#==============================================================================

class Scene_Title < Scene_Base
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Create Game Objects
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 alias modalg_multiparty_crt_gme_objcs_5som create_game_objects
 def create_game_objects
   modalg_multiparty_crt_gme_objcs_5som
   $game_parties      = Game_Parties.new
 end
end

#==============================================================================
# ** Scene_File
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    aliased methods - read_save_data, write_save_data
#==============================================================================

class Scene_File
 
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Write Save Data
 #     file : write file object (opened)
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 alias modalg_multiparty_wrt_sv_dta_6hye write_save_data
 def write_save_data(file)
   modalg_multiparty_wrt_sv_dta_6hye (file)
   Marshal.dump($game_parties,        file)
 end
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # * Read Save Data
 #     file : file object for reading (opened)
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 alias modalg_multiparty_rd_sv_dat_2gte read_save_data
 def read_save_data(file)
   modalg_multiparty_rd_sv_dat_2gte (file)
   $game_parties        = Marshal.load(file)
 end
end


Credit




  • modern algebra

Support



Just post here for support

Known Compatibility Issues

If you are using the Quest Journal, please copy the script above, rather than out of the demo, as the demo has an error that may cause the game to incorrectly merge the quests of the two parties.

Author's Notes



Just a script I need to have for my own game that I wanted to share

Demo



See attached.




Demonic Blade

Nice, a pretty good idea actually, though I don't really get it. I might (just might) use it...
I wonder how many of my-reps are there for a reason, and not just because some jackass wanted to show off in front of some other jackasses...?
Probably a lot of them - and those people sure as hell don't deserve my pity, let alone my disgust.
That's right, let's see some more -Rep'ing! BOOYEAH!!

Leventhan

Can you perhaps make a demo?
If you have time for it...

Be kind, everyone you meet is fighting a hard battle.

modern algebra

Alright, demo is up. It probably looks complicated, but it's the eventing that is complicated, not the scripting.

Also, VX is annoying and doesn't give you the option of not fading when you transfer player, so you'll see some stupidness when you play the demo. I will write a script that allows you not to fade when you teleport perhaps.

Zeldrak

MA, would this work on XP?

if not, is there something smilar out there?

modern algebra

#5
No, it wouldn't work in XP as is. As for something similar - there's a script on phylomortis that allows for many item bags. It's not an entire party, but it might suit your purposes: And I would link but apparently phylomortis expired on March 29 :(



Alright, I found it on my computer, but there are no credits anywhere :(

Anyway, I attached it to this post.

Zeldrak

although that's helpful, i was looking more on the lines of the multiple parties per se.

having about 3 groups in the same area, when you pressed a button, you changed from a party to another, and the other parties kept the same positions after changing to the other.

if you don't understand, try checking kefka's tower from ff3(6)

modern algebra

That sounds like my demo actually :P

Anyway, I can probably make one of these for RMXP - it'd be short. But it still takes some eventing to make it work. The primary purpose of the script is to not share inventory and gold with other parties. If that is necessary for your puzzle then I will translate the script. Otherwise, a script is not necessary.

Leventhan

Tried the demo.
Using this kind of script actually opens up the way to many more puzzle possibilities, definitely practical and usable.

Be kind, everyone you meet is fighting a hard battle.

modern algebra

:(

I made a mistake. I've fixed the script now, so don't worry about it if you're new to the script, but anybody who already has the script will need to recopy the script and replace the one they have right now. Though, you've probably noticed it if you've tried to save  :'(

brutebasher9

While using this command (picture) to switch parties, my characters lose all of their items when toggling parties. May you please tell me what is wrong? :?

Relieves ideas through Rmvx, all the while training to become an enthusiastic pain of a technician in the system's back-side.

modern algebra


ahref

looks great. you could like split parties to go two different ways in some woods or something and then thed meet back in the middle with new items. Think scooby doo where they all come together with new clues but not as lame :D.

btw theres a typo in the description section "and arrows you to merge"

Demonic Blade

Quote from: ahref on May 04, 2008, 09:46:19 AM
but not as lame

That's a great way to use the script, but why can't things be lame and hilarious...? :'( ;)
I wonder how many of my-reps are there for a reason, and not just because some jackass wanted to show off in front of some other jackasses...?
Probably a lot of them - and those people sure as hell don't deserve my pity, let alone my disgust.
That's right, let's see some more -Rep'ing! BOOYEAH!!

brutebasher9

pardon..here's the picture, sorry!
Something else I tried that didn't work was the text command \n[\v[17]] that resulted in a Window_Message error at line 218. It probably happened because the two commands were never supposed to merge like that..ironic, huh?

Relieves ideas through Rmvx, all the while training to become an enthusiastic pain of a technician in the system's back-side.

modern algebra

#15
Sorry, I missed your post. Just so that I understand the problem, are you saying that items are not saved? (I.E. if one party collects items and then you switch to another party and then switch back, the first party no longer has those items?) Or are you saying that the second party does not have the items the first party collected? If the latter, that is part of the purpose of the script. Also, you should not get any error from \n[\v[17]], unless \v[17] has a value larger than the number of actors you have set in the database


EDIT:

That being said, I sort of discovered that I had overlooked something because I am an idiot. Anyway, the script has been updated and fixed.

gabiot

#16
I'm actually having that odd problem too.  Mines really complex:

At the beginning of my game, I add 3 potions of two types, and a journal.  Now I can play through the game, and earn items, (for example on this test run I just earned 1 more of each type of potion, and some other new items).  Now it works just fine, but later on I switch to a new party and play with that party.  Works fine, the items don't show up for it, as the script intends.  Then I also switch to a 3rd party for a short custscene battle.  But when I switch back to my original party, and get ready to play with them again, here's the inventory:  3 potions of each type, and a journal!  So it didn't pick up the items I obtained while playing with them...

Is this an error you could pinpoint?

Edit:  Also I just noticed you updated your script.  Did this update fix this problem?

modern algebra

No, it did not. But are you re-initializing the party?

I am assuming your initial party is $game_parties[0], but are you switching back to that party or are you recreating it? You should not recreate it.

I think that's the problem. As far as I can tell, it is not an error in the script, as the demo does not have that problem. But, if you can't figure it out, then you can either upload your project to sendspace and PM it to me to take a look at, or, if you don't feel comfortable sharing your project at this stage you can try to recreate the problem in a new project and send that to me.

Your problem is weird though, since you add those items to your party at the start of the game., so it can't be that the party has been recreated. So, maybe: do you change to another party shortly after the beginning of the gamer - remember the array counts from 0, 1, 2 ..., not 1, 2, 3... So I am thinking maybe you made the error of believing that your second party has ID 2 instead of ID 1, so when you switch back to the initial party, you actually switch to a new party... Anyway, I won't know what the actual problem is unless I can see the project.

moejoeman

Thanx mate heaps of help   ;D

Grandhoug

I was wondering if you could maybe make a little tutorial of this for the eventing, only because it really does seem complicated.
if you did may you post the link, if I just didn't overlook it 
God blessed us with food:
We killed it with poverty:

God blessed us with light:
We murdered it with global warming:

God blessed us with land:
We raped it with America:

moejoeman

.... mate.... that's why there is the demo....

Grandhoug

I understand that, but I asking for a less compilcated event example for n00b evnters like me
God blessed us with food:
We killed it with poverty:

God blessed us with light:
We murdered it with global warming:

God blessed us with land:
We raped it with America:

modern algebra

#22
Well, the instructions and the demo seem pretty clear to me:

#      @>Script: p = $game_parties[1]
#       :      : $game_party = p
#       :      : $game_player.refresh

That's the script command that changes to a new party, and then if you want to add actors and things all you need to do is use regular event commands. Once an actor is in a party, you will not have to add him again every time though. So, if you run this event below:

#        *EXAMPLE EVENT*
#
#      @>Change Items: [Potion], + 1
#      @>Change Gold: + 50
#      @>Script: p = $game_parties[1]
#       :      : $game_party = p
#       :      : $game_player.refresh
#      @>Change Party Member: Add [Oscar], Initialize
#      @>Change Weapons: [Bastard Sword], +1
#      @>Change Gold: + 100

Then your second party has Oscar, a Bastard Sword, and 100 G. If you then run this code:

#      @>Script: p = $game_parties[0]
#       :      : $game_party = p
#       :      : $game_player.refresh

It will switch back to your first party, and if you then run this code:


#      @>Script: p = $game_parties[1]
#       :      : $game_party = p
#       :      : $game_player.refresh

It will change back to the second party, which would still have Oscar, a Bastard Sword, and 100G.

Merging is even easier:  $game_parties.merge (id_1, id_2).

Here though:


#==============================================================================
# ** Game_Interpreter
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    new method - change_party
#==============================================================================

class Game_Interpreter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Change Party
  #    party_id : The ID of the party to change to
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def change_party (party_id = 0)
    $game_party = $game_parties[party_id]
    $game_player.refresh
  end
end


If you add this into the game, then you can use this command to change parties:

@>Script: change_party (new_party_id)

Grandhoug

thanks for makin it a simpler
God blessed us with food:
We killed it with poverty:

God blessed us with light:
We murdered it with global warming:

God blessed us with land:
We raped it with America:

brutebasher9

Awkward considering it's months later, but still..Thanks Modern for updating your script.

Relieves ideas through Rmvx, all the while training to become an enthusiastic pain of a technician in the system's back-side.