Jump to content

Announcing our new website

To find out the latest about our new website, visit Game Dev Unlimited

- - - - -

Party Changing System


  • You cannot reply to this topic
No replies to this topic

#1 Lizzie S

    Legendary

  • RMXPU Legend
  • PipPipPipPipPipPipPip
  • 1,624 posts

Posted 04 March 2012 - 01:07 AM

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
Attached File  PartyChange.png   44.95K   26 downloads

The Script
Attached File  Party Changing System.txt   15.51K   6 downloads
#===================================
#  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





0 user(s) are reading this topic

members, guests, anonymous users