Jump to content
New account registrations are disabed. This website is now an archive. Read more here.
Leon

Party Changing System

Recommended Posts

Introduction

This script is just a simple party member switch script. It allows 1-4 members in a party, and an arbitrary amount of additional players. It allows you to add/remove characters from the party using the event commands, but also gives an extra command to remove them from the active party and put them in the inactive party.

 

Screenshots

post-1-0-07524000-1330823199_thumb.png

 

The Script

Party Changing System.txt

#===================================
#  Party Changing System by Leon_Westbrooke
#   -v 1.2
#----------------------------------------------------------------------
#  Instructions:  Place above main, but below all other default scripts.
#  
#  Features:  
#    -Allows the player to make a party from the minimum to maximum size.
#    -Extra members are limitless.
#    -You can remove a person from the party and put it into reserve using:
#	   $game_party.remove_actor_to_party(actor_id)
#    -You can remove a person from the reserve if they exist, and them into
#	 the party:
#	   $game_party.add_actor_to_party(actor_id)
#    -You can lock a character in reserve or active party by using:
#	   $game_party.locked.push(actor_id)
#    -You can set the maximum and minimum number of the party in-game using:
#	   $game_party.min_size = x
#	   $game_party.max_size = x
#	   (NOTE: Do NOT make the max size lower than the minimum size.)
#    -Allows you to use the default add/remove actors command.
#	   (NOTE: If you remove an actor with this method, he is gone from both
#			  the party and the reserve members.)
#
#  Credits:
#    This setup uses SephirothSpawn's coding to simplify the cursor's position.
#
#
#  Command Quick-list:
#    $game_party.remove_actor_from_party(actor_id)
#	  -Removes an actor from the party, and puts them in reserve.
#    $game_party.add_actor_to_party(actor_id)
#	  -Replaces the last actor in the party with the actor in reserve.
#    $game_party.locked.push(actor_id)
#	  -Locks the actor in place.
#    $game_party.min_size = x
#    $game_party.max_size = x
#	  -Sets the minimum and maximum party size.
#
#
#  Notes:
#    This script rewrites these methods from Game_Party:
#	  add_actor
#	  remove_actor
#===================================

#==================================================
#  Game_Party
#==================================================
class Game_Party

 attr_accessor :party_members
 attr_accessor :move
 attr_accessor :locked
 attr_accessor :min_size
 attr_accessor :max_size

 alias leon_partyswitch_gameactor_initialize initialize

 def initialize
   leon_partyswitch_gameactor_initialize
   @party_members = []
   #  Edit :This is to change if an actor is locked or not. To lock them, add
   #	    their id to the array below.
   @locked = [1]
   @min_size = 1
   @max_size = 4
 end


 def add_actor(actor_id)
   actor = $game_actors[actor_id]
   if @actors.size < @max_size
  unless @actors.include?(actor)
    unless @party_members.include?(actor.id)
	  @actors.push(actor)
	  $game_player.refresh
    end
  end
   else
  unless @party_members.include?(actor.id)
    unless @actors.include?(actor)
	  @party_members.push(actor.id)
	  $game_player.refresh
    end
  end
   end
 end

 def remove_actor(actor_id)
   @actors.delete($game_actors[actor_id])
   @party_members.delete(actor_id)
   $game_player.refresh
 end

 def remove_actor_from_party(actor_id)
   if @actors.include?($game_actors[actor_id])
  unless @party_members.include?(actor_id)
    @party_members.push(actor_id)
    @party_members.sort!
  end
   end
    @actors.delete($game_actors[actor_id])
   $game_player.refresh
 end

 def add_actor_to_party(actor_id)
   if @party_members.include?(actor_id)
  if @actors[@max_size - 1] != nil
    @party_members.push(@actors[@max_size - 1].id)
    @actors.delete_at(@max_size - 1)
  end
  @actors.push($game_actors[actor_id])
  @party_members.delete(actor_id)
   end
 end
end
#==================================================
#  END Game_Party
#==================================================

#==============================================================================
# ** Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
 #--------------------------------------------------------------------------
 # * Public Instance Variables
 #--------------------------------------------------------------------------
 attr_accessor :cursor_height
 #--------------------------------------------------------------------------
 # * Alias Initialization
 #--------------------------------------------------------------------------
 alias custom_int initialize
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize(x, y, width, height)
   custom_int(x, y, width, height)
   @cursor_height = 32
 end
 #--------------------------------------------------------------------------
 # * Get Top Row
 #--------------------------------------------------------------------------
 def top_row
   # Divide y-coordinate of window contents transfer origin by 1 row
   # height of @cursor_height
   return self.oy / @cursor_height
 end
 #--------------------------------------------------------------------------
 # * Set Top Row
 # row : row shown on top
 #--------------------------------------------------------------------------
 def top_row=(row)
   # If row is less than 0, change it to 0
   if row < 0
  row = 0
   end
   # If row exceeds row_max - 1, change it to row_max - 1
   if row > row_max - 1
  row = row_max - 1
   end
   # Multiply 1 row height by 32 for y-coordinate of window contents
   # transfer origin
   self.oy = row * @cursor_height
 end
 #--------------------------------------------------------------------------
 # * Get Number of Rows Displayable on 1 Page
 #--------------------------------------------------------------------------
 def page_row_max
   # Subtract a frame height of 32 from the window height, and divide it by
   # 1 row height of @cursor_height
   return (self.height - 32) / @cursor_height
 end
 #--------------------------------------------------------------------------
 # * Update Cursor Rectangle
 #--------------------------------------------------------------------------
 def update_cursor_rect
   # If cursor position is less than 0
   if @index < 0
  self.cursor_rect.empty
  return
   end
   # Get current row
   row = @index / @column_max
   # If current row is before top row
   if row < self.top_row
  # Scroll so that current row becomes top row
  self.top_row = row
   end
   # If current row is more to back than back row
   if row > self.top_row + (self.page_row_max - 1)
  # Scroll so that current row becomes back row
  self.top_row = row - (self.page_row_max - 1)
   end
   # Calculate cursor width
   cursor_width = self.width / @column_max - 32
   # Calculate cursor coordinates
   x = @index % @column_max * (cursor_width + 32)
   y = @index / @column_max * @cursor_height - self.oy
   if self.active == true
  # Update cursor rectangle
  self.cursor_rect.set(x, y, cursor_width, @cursor_height)
   end
 end
end

#==============================================================================
# ** Window_Command
#==============================================================================
class Window_Command < Window_Selectable
 #--------------------------------------------------------------------------
 # * Unisable Item
 # index : item number
 #--------------------------------------------------------------------------
 def undisable_item(index)
   draw_item(index, normal_color)
 end
end
#============================================================


#==================================================
#  Window_Party_Info
#==================================================
class Window_Party_Info < Window_Base
 def initialize
   super(0, 0, 640, 64)
   self.contents = Bitmap.new(width - 32, height - 32)
   refresh
 end

 def refresh
   self.contents.clear
   self.contents.draw_text(0, 0, 614, 32, "Please make a party of #{$game_party.min_size.to_s} to #{$game_party.max_size.to_s} members.", 1)
 end
end
#==================================================
#  END Window_Party_Info
#==================================================


#==================================================
#  Window_Party_Slots
#==================================================
class Window_Party_Slots < Window_Selectable

 def initialize
   super(0, 64, 320, 416)
   @item_max = 4
   self.contents = Bitmap.new(width - 32, height - 32)
   self.index = 0
   self.active = true
   refresh
 end

 def actors
   if @data[index] != nil
  return @data[index]
   end
 end

 def refresh
   @data = []
   if self.contents != nil
  self.contents.dispose
  self.contents = nil
   end
   for i in 0...$game_party.actors.size
  @data.push($game_party.actors[i])
   end
   @item_max = (@data.size + 1)
   if @item_max > 0
  if @item_max > 4
    @item_max = 4
  end
  self.contents = Bitmap.new(width - 32, row_max * 96)
  for i in 0...@item_max
    draw_item(i)
  end
   end
 end

 def draw_item(index)
   @actor = @data[index]
   y = index * 96
   x = 4
   if $game_party.locked.include?(@actor.id)
  self.contents.font.color = disabled_color
  opacity = 128
   else
  self.contents.font.color = normal_color
  opacity = 255
   end
   if @actor != nil
  self.contents.draw_text(x + 100, y, 192, 32, @actor.name)
  draw_actor_hp(@actor, x + 100, y + 32)
  draw_actor_sp(@actor, x + 100, y + 64)
  bitmap = RPG::Cache.character(@actor.character_name, @actor.character_hue)
  cw = bitmap.width / 4
  ch = bitmap.height / 4
  facing = 0
  src_rect = Rect.new(0, facing * ch, cw, ch)
  self.contents.blt(x + 24, y + 32, bitmap, src_rect, opacity)
   end
 end

 def update_cursor_rect
   if @index > -1
  x = 0
  y = index * 96
  self.cursor_rect.set(x, y, (self.width - 32), 96)
   else
  self.cursor_rect.empty
   end
 end

end
#==================================================
#  END Window_Party_Slots
#==================================================


#==================================================
#  Window_Party_Extras
#==================================================
class Window_Party_Extras < Window_Selectable
 def initialize
   super(320, 64, 320, 416)
   self.cursor_height = 96
   self.contents = Bitmap.new(width - 32, height - 32)
   self.index = -1
   self.active = false
   refresh
 end

 def actors
   if @data != nil
  return @data[index]
   end
 end

 def refresh
   if self.contents != nil
  self.contents.dispose
  self.contents = nil
   end
   @data = []
   for i in 0...$game_party.party_members.size
  @data.push($game_actors[$game_party.party_members[i]])
   end
   @data.push(nil)
   @item_max = @data.size
   if @item_max > 0
  self.contents = Bitmap.new(width - 32, row_max * 96)
  for i in 0...@item_max
    draw_item(i)
  end
   end
 end

 def draw_item(index)
   @actor = @data[index]
   y = index * 96
   x = 4
   if $game_party.locked.include?(@actor.id)
  self.contents.font.color = disabled_color
  opacity = 128
   else
  self.contents.font.color = normal_color
  opacity = 255
   end
   if @actor != nil
  self.contents.draw_text(x + 100, y, 192, 32, @actor.name)
  draw_actor_hp(@actor, x + 100, y + 32)
  draw_actor_sp(@actor, x + 100, y + 64)
  bitmap = RPG::Cache.character(@actor.character_name, @actor.character_hue)
  cw = bitmap.width / 4
  ch = bitmap.height / 4
  facing = 0
  src_rect = Rect.new(0, facing * ch, cw, ch)
  self.contents.blt(x + 24, y + 32, bitmap, src_rect, opacity)
   end
 end

end
#===================================
#  END Window_Party_Extras
#===================================


#===================================
#  Scene_Party_Change
#===================================
class Scene_Party_Change
 def main

   @info_window = Window_Party_Info.new
   @slot_window = Window_Party_Slots.new
   @extra_window = Window_Party_Extras.new

   Graphics.transition
   loop do
  Graphics.update
  Input.update
  update
  if $scene != self
    break
  end
   end
   Graphics.freeze

   @info_window.dispose
   @slot_window.dispose
   @extra_window.dispose
 end

 def update
   @slot_window.update

   if @slot_window.active
  update_slot
  return
   end

   if @extra_window.active
  update_extra
  return
   end
 end

 def update_slot
   if Input.trigger?(Input::B)
  if $game_party.actors.size >= $game_party.min_size and $game_party.actors.size <= $game_party.max_size
    $game_player.refresh
    $game_system.se_play($data_system.cancel_se)
    $scene = Scene_Map.new
  else
    $game_system.se_play($data_system.buzzer_se)
  end
   end

   if Input.trigger?(Input::C)
  if $game_party.locked.include?(@slot_window.actors.id) == true
    $game_system.se_play($data_system.buzzer_se)
  else
    $game_system.se_play($data_system.decision_se)
    @slot_window.active = false
    @extra_window.active = true
    @extra_window.index = 0
  end
   end
 end

 def update_extra
   @extra_window.update
   if Input.trigger?(Input::B)
  $game_system.se_play($data_system.cancel_se)
  @slot_window.active = true
  @extra_window.active = false
  @extra_window.index = -1
   end

   if Input.trigger?(Input::C)
  $game_system.se_play($data_system.decision_se)
  if $game_party.locked.include?(@extra_window.actors.id)
    $game_system.se_play($data_system.buzzer_se)
    return
  end
  if @extra_window.actors == nil
    if $game_party.actors[@slot_window.index] != nil
	  $game_party.party_members.push($game_party.actors[@slot_window.index].id)
	  $game_party.remove_actor_from_party($game_party.actors[@slot_window.index].id)
	  $game_party.party_members.sort!
	  @slot_window.refresh
	  @extra_window.refresh
	  @slot_window.active = true
	  @extra_window.active = false
	  @extra_window.index = -1
    else
	  @slot_window.active = true
	  @extra_window.active = false
	  @extra_window.index = -1
    end
  else
    if $game_party.actors[@slot_window.index] != nil
	  hold = @extra_window.actors
	  $game_party.party_members.push($game_party.actors[@slot_window.index].id)
	  $game_party.actors[@slot_window.index] = hold
	  $game_party.party_members.delete_at(@extra_window.index)
	  $game_party.party_members.sort!
	  @slot_window.refresh
	  @extra_window.refresh
	  @slot_window.active = true
	  @extra_window.active = false
	  @extra_window.index = -1
    else
	  $game_party.actors[@slot_window.index] = @extra_window.actors
	  $game_party.party_members.delete_at(@extra_window.index)
	  $game_party.party_members.sort!
	  @slot_window.refresh
	  @extra_window.refresh
	  @slot_window.active = true
	  @extra_window.active = false
	  @extra_window.index = -1
    end
  end
   end
 end

end

Instructions

To call, use: $scene = Scene_Party_Change.new

Share this post


Link to post
Share on other sites

So I'm using this script (Fantastic job by the way), when loading in to see the status of the individual party members I can only see the first 4, I can continue scrolling down over the others but the screen does not shift with it to view what member is highlighted.

 

All help appreciated

PS sorry for the necro-post

 

***** UPDATE

I made modifications to "Window_MenuStatus" and "Window_Base" to rectify my issues

Edited by Gatekeeper101

Share this post


Link to post
Share on other sites

Trevor, you'll need to be a bit more specific about your problems before any one can help you. what type of error are you getting?

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...