Save-Point

Full Version: Save-Point
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Board Message
Sorry, you do not have permission to access this resource.
Save-Point - Vehicle/Party-Change patch needed

Save-Point

Full Version: Vehicle/Party-Change patch needed
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have been using DerVVulfman's Super Simple Vehicle System for, well, vehicles in my game! I've also been using Leon Westbrooke's Party Changing System to switch between party members.

I've found that if you enter a vehicle with one character in the lead (first slot), go to the HQ, switch the party around so another character is in the lead, exit the HQ, and dock, the current party lead will have the character graphic of the character that originally entered the vehicle.

This isn't game breaking by any means and is actually quite amusing, but it does break any immersion you may have and makes you do a double take, and I would like to request a patch to amend this issue.

Thank you in advance.
The script you've found has a terrible format. Thus, I've gone through the burden of indenting it properly.

Code:
#===================================
#  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

  def min_size_or_greater?
    @actors.size >= @min_size
  end

  def max_size_or_less?
    @actors.size <= @max_size
  end
end

#=============================================================================
# ** Window_Selectable
#=============================================================================
class Window_Selectable < Window_Base
  attr_accessor :cursor_height
  alias custom_int initialize
  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
  # * Enable Item - index : item number
  def enable_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
    min = $game_party.min_size
    max = $game_party.max_size
    text = "Please make a party of #{min} to #{max} members."
    self.contents.draw_text(0, 0, 614, 32, text, 1)
  end
end

#==================================================
#  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
    return @data[index]
  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)
      hue = @actor.character_hue
      bitmap = RPG::Cache.character(@actor.character_name, 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

#==================================================
#  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
    return @data[index]
  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
    @item_max = @data.size
    @data.push(nil)
    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)
      hue = @actor.character_hue
      bitmap = RPG::Cache.character(@actor.character_name, 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

#===================================
#  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
    elsif @extra_window.active
      update_extra
      return
    end
  end

  def update_slot
    if Input.trigger?(Input::B)
      if $game_party.min_size_or_greater? and $game_party.max_size_or_less?
        $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)
        $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
          actor_id = $game_party.actors[@slot_window.index].id
          $game_party.party_members.push(actor_id)
          $game_party.remove_actor_from_party(actor_id)
          update_delete_extra_actors
        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
          actor_id = $game_party.actors[@slot_window.index].id
          $game_party.party_members.push(actor_id)
          $game_party.actors[@slot_window.index] = hold
          $game_party.party_members.delete_at(@extra_window.index)
          update_delete_extra_actors
        else
          $game_party.actors[@slot_window.index] = @extra_window.actors
          $game_party.party_members.delete_at(@extra_window.index)
          update_delete_extra_actors
        end
      end
    end
  end

  def update_delete_extra_actors
    $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

I've also made some minor changes to improve readability or to prevent lines to be wrapped up or creating a few new methods to make them easier to handle than they were previously.

By the way, the unused undisable_item(index) method has been renamed to enable_item(index) because the former was grammatically incorrect. Tongue sticking out

EDIT: I had to fix a bug introduced by Leon where it added a nil element to an array that was supposed to be empty at that point. Serious

And HERE is the bug fix!

Code:
# * Fix for Super Simple Vehicle System - Enhanced * #

class Scene_Party_Change
  alias :kyon_fix_for_wulfo_super_simple_veh_main :main
  def main
    kyon_fix_for_wulfo_super_simple_veh_main
    $game_system.vehicle_character = $game_party.actors[0].character_name
  end
end
Thank you! This patch fixed the issue I was having!