I'm using this script:
#==============================================================================
# Easy Party Switcher by Blizzard
# Version 1.21b
# Date: 21.05.2006
# Date v1.1: 25.05.2006
# Date v1.2b: 27.05.2006
# Date v1.21b: 12.08.2006
#
#
# This is the official Party Switcher of:
# Chaos Project - The Three Moons™
#
#
# Special Thanks to:
# Zeriab for pointing out a few glitches and shortening the code. =D
#
#
# IMPORTANT NOTE:
#
# Be sure to set the $party_max_size to the maximum size of your party.
# There is already a preconfiguration of 4.
#
#
# Compatibility:
#
# 99% chance of full compatibility with SDK, not tested altough. Can cause
# incompatibility with Party Change Systems. WILL corrupt your old savegames.
#
#
# Features:
#
# - Set party members for "not _available" (shown transparent in the reserve)
# - Remove party members from the reserve list ("disabled_for_party")
# - Set party members, who MUST be in the party (shown transparent in the
# current party, "must_be_in_party")
# - option either to wipe the party (for multi-party use) or only remove every
# member (except 1) from the party.
# - Easy to use and easy to switch party members
# - also supports small parties (2 or 3 members) and large parties (5 or more)
#
#
# How to use:
#
# To call this script, make a "Call script" command in an event. The syntax is:
#
# $scene = Scene_PartySwitcher.new
# or
# $scene = Scene_PartySwitcher.new(XXX)
# or
# $scene = Scene_PartySwitcher.new(XXX, 1)
# or
# $scene = Scene_PartySwitcher.new(XXX, YYY, ZZZ)
#
# - If you use the first syntax, no extra feature will be applied and you can
# switch the party as you wish.
# - If you use the second syntax, you can replace XXX for 1 to remove all party
# members except one (either one, who must be in the party or a random one), or
# replace XXX with 2, to cause a wipe party. Wiping a party will disable the
# of the current members and a NEW party of the remaining members must be
# formed. If you replace it with 3, the current party configuration will be
# stored for a later fast switch-back.
# - If you use the third sytnax, you can use the XXX as described above or just
# set it to 0 to disable it. Also the "1" in the syntax will reset any
# disabled_for_party and is made to be used after multi-party use.
# - If you use the fourth syntax you can replace ZZZ with 1 to replace the
# party with a stored one AND store the current or replace it with 2 to replace
# the party with a stored one, but without storing the current. USE THIS ONLY
# IF YOU ASSUME TO HAVE A STORED PARTY READY! This syntax will not open the
# Party Switcher and it will override the commands XXX and YYY, so you can
# replace these with any number.
#
# - Character faces go into a "Faces" folder in "Characters" and they have the
# same name as the character spritesets have.
#
#
# Other syntaxes:
# $game_actors[XXX].not_available = true/false
# $game_actors[XXX].disabled_for_party = true/false
# $game_actors[XXX].must_be_in_party = true/false
#
# - not_available will disable the possibility of an already unlocked character
# to be in th current party.
# - disabled for party will cause the character NOT to appear in the party
# switch screen.
# - must_be_in_party will cause the character to be automatically moved into
# the current party, while switching parties and also he cannot be put in the
# reserve.
#
#
# Additional note:
#
# For your own sake, do not apply the attribute "must_be_in_party" to a
# character at the same time with "not_available" or "disabled_for_party" as
# this WILL disrupt your party and party switch system.
#
#==============================================================================
$party_max_size = 4
#==============================================================================
# Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
attr_accessor :must_be_in_party
attr_accessor :disabled_for_party
attr_accessor :not_available
alias setup_eps_later setup
def setup(actor_id)
@must_be_in_party = false
@disabled_for_party = false
@not_available = false
setup_eps_later(actor_id)
end
end
#==============================================================================
# Game_Party
#==============================================================================
class Game_Party
def actors=(actors)
@actors = actors
end
end
#==============================================================================
# Window_Base
#==============================================================================
class Window_Base
def draw_actor_face(actor, x, y)
if actor != nil and actor.character_name != nil and actor.character_name != ""
bitmap = RPG::Cache.character("Faces/" + actor.character_name, actor.character_hue)
cw = 80
ch = 80
src_rect = Rect.new(0, 0, cw, ch)
if actor.not_available or actor.must_be_in_party
self.contents.blt(x, y, bitmap, src_rect, 128)
else
self.contents.blt(x, y, bitmap, src_rect)
end
end
end
end
#==============================================================================
# Window_Current
#==============================================================================
class Window_Current < Window_Selectable
def initialize
if $party_max_size > 4
super(0, 0, 240 + 32, 480)
else
super(0, 0, 240 + 32, $party_max_size * 120)
end
@item_max = $party_max_size
self.contents = Bitmap.new(width - 32, 480 - 32 + (@item_max - 4) * 120)
if $fontface != nil
self.contents.font.name = $fontface
elsif $defaultfonttype != nil
self.contents.font.name = $defaultfonttype
end
self.contents.font.size = 24
refresh
self.active = false
self.index = -1
end
def refresh
self.contents.clear
for i in 0...$game_party.actors.size
x = 0
y = i * 120 - 4
actor = $game_party.actors[i]
self.contents.font.color = normal_color
if actor != nil
draw_actor_face(actor, x, y + 8)
draw_actor_name(actor, x + 160, y)
draw_actor_level(actor, x + 96, y)
draw_actor_hp(actor, x + 96, y + 32)
draw_actor_sp(actor, x + 96, y + 64)
end
end
end
def setactor(index_1, index_2)
temp = $game_party.actors[index_1]
$game_party.actors[index_1] = $game_party.actors[index_2]
$game_party.actors[index_2] = temp
refresh
end
def getactor(index)
return $game_actors[$game_party.actors[index].id]
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
x = 0
y = (@index / @column_max) * 120 - self.oy
self.cursor_rect.set(x, y, self.width - 32, 88)
end
def clone_cursor
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
x = 0
y = (@index / @column_max) * 120
src_rect = Rect.new(0, 0, self.width, 88)
bitmap = RPG::Cache.windowskin("Cursor_Current")
self.contents.blt(x, y, bitmap, src_rect, 192)
end
def top_row
return self.oy / 116
end
def top_row=(row)
row = row % row_max
self.oy = row * 120
end
def page_row_max
return (self.height / 120)
end
end
#==============================================================================
# Window_Reserve
#==============================================================================
class Window_Reserve < Window_Selectable
def initialize
super(0, 0, 400 - 32, 320)
setup
@column_max = 3
if (@item_max / @column_max) >= 3
self.contents = Bitmap.new(width - 32, @item_max / @column_max * 96)
else
self.contents = Bitmap.new(width - 32, height - 32)
end
if $fontface != nil
self.contents.font.name = $fontface
elsif $defaultfonttype != nil
self.contents.font.name = $defaultfonttype
end
self.contents.font.size = 24
self.active = false
self.index = -1
refresh
end
def setup
@actors = []
for i in 0...$data_actors.size
flag = false
for j in 0...$game_party.actors.size
if $game_actors[i] == $game_party.actors[j]
flag = true
end
end
if flag == false
unless $game_actors[i] == nil or $game_actors[i].disabled_for_party
@actors.push($game_actors[i])
end
end
end
@item_max = (@actors.size + $game_party.actors.size + 3) / 3 * 3
end
def refresh
self.contents.clear
for i in 0... @actors.size
drawing(@actors[i], i)
end
end
def drawing(actor, i)
x = (i % 3) * 112 + 16
y = (i / 3) * 96 - 8
self.contents.font.color = normal_color
draw_actor_face(actor, x, y + 18)
end
def getactor(index)
return @actors[index]
end
def setactor(index_1, index_2)
temp = @actors[index_1]
@actors[index_1] = @actors[index_2]
@actors[index_2] = temp
refresh
end
def setparty(index_1, index_2)
temp = @actors[index_1]
@actors[index_1] = $game_party.actors[index_2]
$game_party.actors[index_2] = temp
refresh
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
x = (@index % @column_max) * 112 + 8
y = (@index / @column_max) * 96 - self.oy
self.cursor_rect.set(x, y, 96, 96)
end
def clone_cursor
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
x = (@index % @column_max) * 112 + 8
y = (@index / @column_max) * 96
src_rect = Rect.new(0, 0, 96, 96)
bitmap = RPG::Cache.windowskin("Cursor_Reserve")
self.contents.blt(x, y, bitmap, src_rect, 192)
end
def top_row
return self.oy / 96
end
def top_row=(row)
row = row % row_max
self.oy = row * 96
end
def page_row_max
return (self.height - 32) / 96
end
end
#==============================================================================
# Window_HelpStatus
#==============================================================================
class Window_HelpStatus < Window_Base
def initialize(gotactor)
super(0, 0, 400 - 32, 160)
self.contents = Bitmap.new(width - 32, height - 32)
if $fontface != nil
self.contents.font.name = $fontface
elsif $defaultfonttype != nil
self.contents.font.name = $defaultfonttype
end
self.contents.font.size = 24
refresh(gotactor)
self.active = false
end
def refresh(actor)
self.contents.clear
if actor != nil
x = 0
y = 0
self.contents.font.color = normal_color
if actor.not_available
self.contents.draw_text(x + 8, y, 160, 32, "not available", 0)
end
draw_actor_face(actor, x, y + 40)
draw_actor_name(actor, x + 160, y + 32)
draw_actor_level(actor, x + 96, y + 32)
draw_actor_hp(actor, x + 96, y + 64)
draw_actor_sp(actor, x + 96, y + 96)
end
end
end
#==============================================================================
# Window_Warning
#==============================================================================
class Window_Warning < Window_Base
def initialize
super(0, 0, 320, 96)
self.visible = false
self.contents = Bitmap.new(width - 32, height - 32)
if $fontface != nil
self.contents.font.name = $fontface
elsif $defaultfonttype != nil
self.contents.font.name = $defaultfonttype
end
self.contents.font.size = 24
self.x = 320 - (width / 2)
self.y = 240 - (height / 2)
self.z = 9999
self.contents.font.color = normal_color
self.contents.draw_text(0, 0, 288, 32, "You cannot remove", 1)
self.contents.draw_text(0, 32, 288, 32, "the last party member!", 1)
end
end
#==============================================================================
# Scene_PartySwitcher
#==============================================================================
class Scene_PartySwitcher
def initialize(wipe_party = 0, reset = 0, store = 0)
@wipe_party = wipe_party
@store = store
@reset = reset
@current_window_temp = 0
@reserve_window_temp = 0
@canceler = false
@temp_window = ""
end
def main
if @store == 0
if @wipe_party == 1
setup_forced_party
elsif @wipe_party == 2
wipe_party
elsif @wipe_party == 3
store_party
wipe_party
end
@current_window = Window_Current.new
@current_window.index = 0
@current_window.active = true
@reserve_window = Window_Reserve.new
@reserve_window.x = 240 + 32
@reserve_window.y = 160
@warning_window = Window_Warning.new
actor = @reserve_window.getactor(0)
@help_window = Window_HelpStatus.new(actor)
@help_window.x = 240 + 32
if @reset == 1
actor.not_available = false
end
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@current_window.dispose
@reserve_window.dispose
@help_window.dispose
else
swap_parties(@store)
$scene = Scene_Map.new
end
sort_party
$game_player.refresh
Graphics.transition
end
def update
check = @reserve_window.index
if @reserve_window.active
reserve_update
@reserve_window.update
end
if check != @reserve_window.index
if @reserve_window.active
actor = @reserve_window.getactor(@reserve_window.index)
elsif @current_window.active
actor = @reserve_window.getactor(@reserve_window_temp)
end
if @temp_window == "Current" or @temp_window == ""
@help_window.refresh(actor)
end
end
if @current_window.active
current_update
@current_window.update
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
if @canceler == false
$scene = Scene_Map.new
elsif @canceler == true
@temp_window = ""
@canceler = false
if @reserve_window.active
actor = @reserve_window.getactor(@reserve_window.index)
elsif @current_window.active
actor = @reserve_window.getactor(@reserve_window_temp)
end
if @temp_window == "Current" or @temp_window == ""
@help_window.refresh(actor)
end
@current_window.refresh
@reserve_window.refresh
end
return
end
if Input.trigger?(Input::A)
sort_party
@current_window.refresh
end
end
def current_update
if Input.trigger?(Input::C)
if @canceler == false
$game_system.se_play($data_system.decision_se)
@canceler = true
@temp_actor_index = @current_window.index
@temp_window = "Current"
@current_window.clone_cursor
elsif @canceler == true
switch_members
end
return
end
if Input.trigger?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@current_window.active = false
@reserve_window.active = true
@current_window_temp = @current_window.index
actor = @reserve_window.getactor(@reserve_window_temp)
@current_window.index = -1
@reserve_window.index = @reserve_window_temp
if @canceler == false
@help_window.refresh(actor)
end
return
end
end
def reserve_update
if Input.trigger?(Input::C)
if @canceler == false
$game_system.se_play($data_system.decision_se)
@canceler = true
@temp_actor_index = @reserve_window.index
@temp_window = "Reserve"
@reserve_window.clone_cursor
elsif @canceler == true
switch_members
end
return
end
if (@reserve_window.index % 3) == 0
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@reserve_window.active = false
@current_window.active = true
@reserve_window_temp = @reserve_window.index
@reserve_window.index = -1
@current_window.index = @current_window_temp
end
return
end
end
def switch_members
if @temp_window == "Reserve" and @reserve_window.active
@reserve_window.setactor(@temp_actor_index, @reserve_window.index)
actor = @reserve_window.getactor(@reserve_window.index)
@help_window.refresh(actor)
end
if @temp_window == "Current" and @current_window.active
@current_window.setactor(@temp_actor_index, @current_window.index)
end
if @temp_window == "Reserve" and @current_window.active
actor1 = @current_window.getactor(@current_window.index)
actor2 = @reserve_window.getactor(@temp_actor_index)
if call_warning(@current_window.index, actor2)
if actor1 != nil and actor1.must_be_in_party
$game_system.se_play($data_system.buzzer_se)
@canceler = false
@temp_window = ""
actor = @reserve_window.getactor(@reserve_window_temp)
@current_window.refresh
@reserve_window.refresh
@help_window.refresh(actor)
return
end
if actor2 != nil and actor2.not_available
$game_system.se_play($data_system.buzzer_se)
@canceler = false
@temp_window = ""
actor = @reserve_window.getactor(@reserve_window_temp)
@current_window.refresh
@reserve_window.refresh
@help_window.refresh(actor)
return
end
@reserve_window.setparty(@temp_actor_index, @current_window.index)
@current_window.refresh
actor = @reserve_window.getactor(@reserve_window_temp)
@help_window.refresh(actor)
else
warning
end
end
if @temp_window == "Current" and @reserve_window.active
actor1 = @current_window.getactor(@temp_actor_index)
actor2 = @reserve_window.getactor(@reserve_window.index)
if call_warning(@temp_actor_index, actor2)
if actor1 != nil and actor1.must_be_in_party
$game_system.se_play($data_system.buzzer_se)
@canceler = false
@temp_window = ""
actor = @reserve_window.getactor(@reserve_window.index)
@current_window.refresh
@reserve_window.refresh
@help_window.refresh(actor)
return
end
if actor2 != nil and actor2.not_available
$game_system.se_play($data_system.buzzer_se)
@canceler = false
@temp_window = ""
actor = @reserve_window.getactor(@reserve_window.index)
@current_window.refresh
@reserve_window.refresh
@help_window.refresh(actor)
return
end
@reserve_window.setparty(@reserve_window.index, @temp_actor_index)
@current_window.refresh
actor = @reserve_window.getactor(@reserve_window.index)
@help_window.refresh(actor)
else
warning
end
end
$game_system.se_play($data_system.decision_se)
@canceler = false
@temp_window = ""
return
end
def sort_party
actors = []
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor != nil
actors.push($game_actors[actor.id])
end
end
$game_party.actors = actors
for i in 0...$data_actors.size
actor = $game_actors[i]
if actor != nil
actor.must_be_in_party = false
end
end
end
def wipe_party
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor != nil
actor.not_available = true
end
end
actors = []
$game_party.actors = actors
for i in 0...$data_actors.size
actor = $game_actors[i]
if actor != nil and actor.must_be_in_party and not actor.not_available
$game_party.add_actor(actor.id)
end
end
if $game_party.actors.size == 0
for i in 0...$data_actors.size
actor = $game_actors[i]
unless actor == nil or actor.not_available or actor.disabled_for_party
$game_party.add_actor(actor.id)
return
end
end
end
end
def setup_forced_party
actors = []
$game_party.actors = actors
for i in 0...$data_actors.size
actor = $game_actors[i]
if actor != nil and actor.must_be_in_party and
not actor.disabled_for_party and not actor.not_available
$game_party.add_actor(actor.id)
end
end
end
def store_party
$stored_party = $game_party.actors
end
def swap_parties(swap)
temp = $game_party.actors
for i in 0...temp.size
if temp[i] != nil
temp[i].not_available = true
end
end
for i in 0...$stored_party.size
if $stored_party[i] != nil
$stored_party[i].not_available = false
end
end
$game_party.actors = $stored_party
if swap == 1
$stored_party = temp
else
$stored_party = nil
end
end
def call_warning(index, actor2)
actor1 = $game_party.actors[index]
if actor1 != nil and actor2 == nil
count = 0
for i in $game_party.actors
if i != nil
count += 1
end
end
if count <= 1
return false
end
end
return true
end
def warning
$game_system.se_play($data_system.buzzer_se)
@warning_window.visible = true
loop do
Graphics.update
Input.update
if Input.trigger?(Input::C)
@warning_window.visible = false
@current_window.refresh
@reserve_window.refresh
break
end
end
return
end
end
And I'm having some trouble with it. Like... How do I make a faces folder in characters? I'm not understanding that. Do I just use the folder in my game file (That's the "C:/...Games/..." one?) Okay, it seems like that's it. My original party has only 1 person, but all the faces pop up already. What should I do, folks? D: Sorry if this has already been asked or if this is in the wrong section.
When you go to the database (in the editor, not the scripts) in the first tab you can see the actors list. Each actor has a certain id. These actors are stored in $data_actors, and then in $game_actors.
You can use the systaxes in the Call script command (tab 3 of the events command list)
$game_actors[XXX].not_available = BOOL
XXX must be replaced with the ID, without the leading zero's
BOOL must be replaced with true or false.
so, what happens if we do:
$game_actors[1].must_be_in_party = true
Now, Arshes/Axulus (id = 1) MUST be in the party. You can not switch him to the reserved list.
$game_actors[2].not_available = true
Now, Basil (id = 2) can NOT be in the party. You can not switch him to the party list.
$game_actors[7].disabled_for_party = true
Now, Gloria (id = 7) will not show up in both the party list and both the reserverd list.
$game_actors[1].must_be_in_party = false
$game_actors[2].disabled_for_party = false
$game_actors[7].not_available = false
Now, Arshes can be in the reserved list again, Basil can be in the party again, and Gloria will show up in the list again.
I Hope you understand.