[XP] Party Switcher

Started by Leon_Westbrooke, January 23, 2008, 03:05:26 am

Previous topic - Next topic

Leon_Westbrooke

January 23, 2008, 03:05:26 am Last Edit: February 21, 2009, 05:41:52 am by Blizzard
Party Switcher
Authors: Leon_Westbrooke
Version: 2.0
Type: Custom Component
Key Term: Player / Party / Troop Add-on



Introduction
This script is to allow an easy way to add/remove actors from the party, and create a reserve party.


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.)



    Screenshots
    Spoiler: ShowHide





    Script
    Spoiler: ShowHide

    [/list]

    #===================================
    #  Party Changing System by Leon_Westbrooke
    #   -v 1.1
    #----------------------------------------------------------------------
    #  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, 6]
        @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
            if @slot_window.index != 0
              $game_system.se_play($data_system.decision_se)
              @slot_window.active = false
              @extra_window.active = true
              @extra_window.index = 0
            else
              $game_system.se_play($data_system.buzzer_se)
            end
          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
    Instructions can be found in the header.


    Compatibility
    No known compatability issues.


    Credits and Thanks

    • Created by Leon_Westbrooke
    • Creds to SephirothSpawn for some help with the scrolling cursor.



    Author's Notes
    Additional notes are found in the script.

Nortos

I'm liking your scripts done some nice contributions I wonder what's been done differently in this than Blizz's I'll take a look at it l8er but for now I'm gonna power you up for this and your crafting system :)

Lost_Hope

you know...i like these scripts but I'm gonna have to get someone to add them in the game for me cause I know nothing about scripting....

cheos

October 30, 2011, 09:43:37 pm #3 Last Edit: November 01, 2011, 03:58:40 pm by cheos
i know how old this topic is old but i cant figure out the call script to pull up the menu in the screen shot can anyone help me out?
nvm i had to look for this script elsewhere to find the call
the call i found is  $scene = Scene_Party_Change.new
[Insert Mind Blowing Signature]