################################################################################ # Party Changer Script By Black Mage (Credit required to use) # Version : 1.7 # https://burningwizard.wordpress.com/2014/12/28/party-changer-menu-script-rmxp-rgss/ # # The set up : # First, put this script on your game. After that, you just need to # specify which characters that player can change in their party using this script call. # $partychange[Character Number In Database – 1] = true # $game_map.refresh # Change the value into false if you want to remove them from the menu. # # To call the menu, put this on script call. # $scene = Scene_Party.new # # # The version 1.2 above give you a menu mode called "Information Mode" where it # include a profile of the character that is highlighted in the menu. Beware that this # mode is highly customizable, so you need some knowledge on RGSS scripting to utilize # to it upmost potential. # To call this menu, put this on script call. # $scene = Scene_Party.new(0,1) # # If you have some knowledge on RGSS scripting, you may do edits to Profile Window # located on line 435 onwards to make the Profile Window that you like. # # # The version 1.3 above give you a large party menu mode. It's a menu that # compatible with some "Large Party" script out there. # To call this menu, put this on script call. # $scene = Scene_Party.new(0,2) # # List of "Large Party" Script that has been tested : # - Dargor's Large Party Script # # # The version 1.4 introduce lock feature. # If you want to lock specific character so that he/she can't be added or removed # from the party, simply use this script call. # $partylock[Character Number In Database – 1] = true # $game_map.refresh # Change the value into false if you want to unlock them. # Locked character will have their sprite a bit transparent on the menu. # # # The version 1.5 has configuration to make reserved party members to gain EXP. # Change the Percentage value on the script to determine how much EXP gained # for reserved party members. # Note that locked party members aren't getting any EXP by default. Change Locked # value on the script into true, to enable the locked members to gain EXP. # ################################################################################ $partychange = [] $partylock = [] module Black module Black_EXP # Reserved Party EXP Percentage gained. Put 50 if you want them to get 50% # of EXP gained by Main Party members. Percentage = 0 # Determine whether Locked Party members receive EXP or not. Change to true # if you want Locked Party members to gain EXP. Locked = false end end class Scene_Party #-------------------------------------------------------------------------- # * Object Initialization # menu_index : command cursor's initial position #-------------------------------------------------------------------------- def initialize(menu_index = 0, window_form = 0) @menu_index = menu_index @window_form = window_form end #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main # Make Help Window @help_window = Window_PartyHelp.new(@window_form) @help_window2 = Window_PartyHelp2.new(@window_form) # Make Party Change Window @partychange_window = Window_PartyChange.new(@window_form) if @window_form == 0 @partychange_window.x = 0 elsif @window_form == 1 @partychange_window.x = 0 elsif @window_form == 2 @partychange_window.x = 260 end if @window_form == 0 @partychange_window.y = 240 elsif @window_form == 1 @partychange_window.y = 240 elsif @window_form == 2 @partychange_window.y = 64 end @partychange_window.active = true @partychange_window.index = 0 # Make party window @party_window = Window_Party.new(@window_form) @party_window.x = 0 @party_window.y = 64 # If mode 1 enabled if @window_form == 1 @help_window3 = Window_PartyHelp3.new @profile_window = Window_Profile.new end # Execute transition Graphics.transition # Main loop loop do # Update game screen Graphics.update # Update input information Input.update # Frame update update # Abort loop if screen is changed if $scene != self break end end # Prepare for transition Graphics.freeze # Dispose of windows @partychange_window.dispose @party_window.dispose @help_window.dispose @help_window2.dispose # If mode 1 enabled if @window_form == 1 @help_window3.dispose @profile_window.dispose end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Update windows @partychange_window.update @party_window.update # Update the profile window if mode 1 is true if @window_form == 1 @profile_window.update(@partychange_window.index) end # Update the party change window if @partychange_window.active update_partychange return end end #-------------------------------------------------------------------------- # * Frame Update (when party window is active) #-------------------------------------------------------------------------- def update_partychange # If B button was pressed if Input.trigger?(Input::B) if $game_party.actors.size == 0 $game_system.se_play($data_system.buzzer_se) return else # Play cancel SE $game_system.se_play($data_system.cancel_se) # Switch to map screen $scene = Scene_Map.new return end end if Input.trigger?(Input::C) @hero = @partychange_window.hero # If Hero is Nil if @hero == nil $game_system.se_play($data_system.decision_se) return end if $game_party.actors.include?($game_actors[@partychange_window.hero.id]) return if $partylock[@partychange_window.hero.id - 1] == true $game_party.remove_actor(@partychange_window.hero.id) @party_window.dispose @party_window = Window_Party.new(@window_form) @party_window.x = 0 @party_window.y = 64 $game_system.se_play($data_system.decision_se) @party_window.refresh return else return if $partylock[@partychange_window.hero.id - 1] == true $game_party.add_actor(@partychange_window.hero.id) @party_window.dispose @party_window = Window_Party.new(@window_form) @party_window.x = 0 @party_window.y = 64 $game_system.se_play($data_system.decision_se) @party_window.refresh return end end end end ########## #Displaying the Party Change Window ########## class Window_PartyChange < Window_Selectable #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(window_form = 0) @window_form = window_form case window_form when 0 super(0, 0, 640, 240) @column_max = 7 when 1 super(0, 0, 380, 240) @column_max = 4 when 2 super(0, 0, 380, 416) @column_max = 4 end refresh self.index = 0 end #-------------------------------------------------------------------------- # * Get Hero #-------------------------------------------------------------------------- def hero return @data[self.index] end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] @lock = [] if $partychange.size > 0 for i in 0..$partychange.size if $partychange[i] == true @data.push($game_actors[i+1]) if $partylock[i] == true @lock.push(true) else @lock.push(false) end end end @item_max = @data.size self.contents = Bitmap.new(width - 32, row_max * 112) for i in 0..(@item_max - 1) case @window_form when 0 x = ((i) % 7 * (88)) + 40 y = (((i)/7) * 112) + 70 when 1 x = ((i) % 4 * (88)) + 40 y = (((i)/4) * 112) + 70 when 2 x = ((i) % 4 * (88)) + 40 y = (((i)/4) * 90) + 70 end actor = @data[i] bitmap = RPG::Cache.character(actor.character_name, actor.character_hue) cw = bitmap.width / 4 ch = bitmap.height / 4 src_rect = Rect.new(0, 0, cw, ch) if @lock[i] == true self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect, 150) else self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect) end end end end #-------------------------------------------------------------------------- # * Cursor Rectangle Update #-------------------------------------------------------------------------- #Redefine Row def top_row if @window_form == 2 return self.oy / 90 else return self.oy / 112 end end def top_row=(row) if row < 0 row = 0 end if row > row_max - 1 row = row_max - 1 end if @window_form == 2 self.oy = row * 90 else self.oy = row * 112 end end def page_row_max if @window_form == 2 return (self.height) / 90 else return (self.height) / 112 end end def update_cursor_rect if @index < 0 self.cursor_rect.empty return end 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 # If cursor position is less than 0 case @window_form when 0 self.cursor_rect.set(index % 7 * (88), (@index/7) * 110 - self.oy + ((@index/7) * 2), self.width - 560, 96) when 1 self.cursor_rect.set(index % 4 * (88), (@index/4) * 110 - self.oy + ((@index/4) * 2), self.width - 300, 96) when 2 self.cursor_rect.set(index % 4 * (88), (@index/4) * 88 - self.oy + ((@index/4) * 2), self.width - 300, 96) end end end ########## #Displaying current Party Window ########## class Window_Party < Window_Selectable #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(window_form = 0) @window_form = window_form case window_form when 0 super(0, 0, 640, 120) @column_max = 2 when 1 super(0, 0, 640, 120) @column_max = 2 when 2 super(0, 0, 260, 416) @column_max = 2 end self.contents = Bitmap.new(width - 32, height - 32) refresh self.active = false self.index = -1 end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh self.contents.clear @item_max = $game_party.actors.size @collumn_custom = 1 case @window_form when 0 for i in 0...$game_party.actors.size x = (i % 4 * (160)) + (64) y = (i/4) * 116 actor = $game_party.actors[i] draw_actor_graphic(actor, x - 40, y + 80) draw_actor_name(actor, x - 50, y) draw_actor_level(actor, x - 10, y + 50) end when 1 for i in 0...$game_party.actors.size x = (i % 4 * (160)) + (64) y = (i/4) * 116 actor = $game_party.actors[i] draw_actor_graphic(actor, x - 40, y + 80) draw_actor_name(actor, x - 50, y) draw_actor_level(actor, x - 10, y + 50) end when 2 for i in 0...$game_party.actors.size x = (i % 4 * (60)) + (64) y = (i/4) * 90 actor = $game_party.actors[i] draw_actor_graphic(actor, x - 40, y + 70) end end end end ########## #Displaying Help Window ########## class Window_PartyHelp < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(window_form = 0) case window_form when 0 super(0, 0, 640, 64) when 1 super(0, 0, 640, 64) when 2 super(0, 0, 260, 64) end self.contents = Bitmap.new(width - 32, height - 32) self.contents.clear self.contents.font.color = normal_color self.contents.draw_text(4, 0, self.width - 40, 32, 'Current Party', 1) end end class Window_PartyHelp2 < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(window_form = 0) case window_form when 0 super(0, 184, 640, 56) when 1 super(0, 184, 380, 56) when 2 super(260, 0, 380, 64) end self.contents = Bitmap.new(width - 32, height - 32) self.contents.clear self.contents.font.color = normal_color self.contents.draw_text(4, 0, self.width - 40, 28, 'Add or remove character', 1) end end class Window_PartyHelp3 < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(window_form = 0) super(380, 184, 260, 56) self.contents = Bitmap.new(width - 32, height - 32) self.contents.clear self.contents.font.color = normal_color self.contents.draw_text(4, 0, self.width - 40, 28, 'Character Profile', 1) end end ########## #The Customizable Character Profile ########## class Window_Profile < Window_Base #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize super(380, 240, 260, 240) self.contents = Bitmap.new(width - 32, height - 32) end def update(index) #==================== # Window Profile Customization #==================== picture = true # Set to false if you don't want to use picture. x_pos = 100 # Denotes the possition of the text. x_pic = 0 # Denotes the possition of the picture. font_size = 22 # The font size. 22 is the default size. @index = index self.contents.clear @data = [] # Get the actor data if $partychange.size > 0 for i in 0..$partychange.size if $partychange[i] == true @data.push($game_actors[i+1]) end end end if picture == true actor = @data[index] bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue) cw = bitmap.width ch = bitmap.height src_rect = Rect.new(0, 0, cw, ch) self.contents.blt(x_pic, 0, bitmap, src_rect) end # Do something if $partychange.size > 0 self.contents.font.size = font_size self.contents.draw_text(x_pos, 0, 300, 24, 'Name : ' + @data[index].name, 0) case actor.id when 1 age = '12' when 2 age = '12' else age = '???' end self.contents.draw_text(x_pos, 24, 300, 24, 'Age : ' + age, 0) self.contents.draw_text(x_pos, 48, 300, 24, 'Class : ' + @data[index].class_name, 0) self.contents.draw_text(x_pos, 72, 300, 24, 'Level : ' + @data[index].level.to_s, 0) case actor.id when 1 self.contents.draw_text(x_pos, 110, 300, 24, 'Story : I think', 0) self.contents.draw_text(x_pos, 134, 300, 24, 'this guy name', 0) self.contents.draw_text(x_pos, 158, 300, 24, 'is Aluxes.', 0) else self.contents.draw_text(x_pos, 110, 300, 24, 'Nothing to talk ', 0) self.contents.draw_text(x_pos, 134, 300, 24, 'about', 0) end end end end #-------------------------------------------------------------------------- # * Reserve Party EXP #-------------------------------------------------------------------------- class Scene_Battle alias black_start_phase5 start_phase5 def start_phase5 black_start_phase5 @percentage = Black::Black_EXP::Percentage @black_actors = [] @black_actors_id = [] for i in 0...$game_party.actors.size @black_actors_id.push($game_party.actors[i].id) end for i in @black_actors_id @black_actors.push($game_actors[i]) end # Get the EXP Value exp = 0 for enemy in $game_troop.enemies # If enemy is not hidden unless enemy.hidden # Add EXP and amount of gold obtained exp += enemy.exp end end for i in 0...$partychange.size actor = $game_actors[i+1] # Check if the actor is already in party and already receive its share. if @black_actors.include?(actor) else # Check if the actor is on reserved list. if $partychange[i] == true # Check if the actor is not locked. if $partylock[i] != true if actor.cant_get_exp? == false last_level = actor.level actor.exp += (exp*@percentage)/100 if actor.level > last_level @status_window.level_up(i) end end elsif $partylock[i] == true # If the actor is locked, check if he/she can receive EXP. if Black::Black_EXP::Locked == true if actor.cant_get_exp? == false last_level = actor.level actor.exp += (exp*@percentage)/100 if actor.level > last_level @status_window.level_up(i) end end end end end end end end end # FIX so that the reserved party is saved on the save file. class Party_Change def initialize @partychange = $partychange @partylock = $partylock @partychangelength = $partychange.size @partylocklength = $partylock.size end def list(number) return @partychange[number] end def lock(number) return @partylock[number] end def list_length return @partychangelength end def lock_length return @partylocklength end end class Scene_Save < Scene_File def write_save_data(file) # Make character data for drawing save file characters = [] for i in 0...$game_party.actors.size actor = $game_party.actors[i] characters.push([actor.character_name, actor.character_hue]) end # Write character data for drawing save file Marshal.dump(characters, file) # Wrire frame count for measuring play time Marshal.dump(Graphics.frame_count, file) # Increase save count by 1 $game_system.save_count += 1 # Save magic number # (A random value will be written each time saving with editor) $game_system.magic_number = $data_system.magic_number # Write each type of game object Marshal.dump($game_system, file) Marshal.dump($game_switches, file) Marshal.dump($game_variables, file) Marshal.dump($game_self_switches, file) Marshal.dump($game_screen, file) Marshal.dump($game_actors, file) Marshal.dump($game_party, file) Marshal.dump($game_troop, file) Marshal.dump($game_map, file) Marshal.dump($game_player, file) $party_change = Party_Change.new Marshal.dump($party_change, file) end end class Scene_Load < Scene_File #-------------------------------------------------------------------------- # * Read Party Change Data # file : file object for reading (opened) #-------------------------------------------------------------------------- def read_save_data(file) # Read character data for drawing save file characters = Marshal.load(file) # Read frame count for measuring play time Graphics.frame_count = Marshal.load(file) # Read each type of game object $game_system = Marshal.load(file) $game_switches = Marshal.load(file) $game_variables = Marshal.load(file) $game_self_switches = Marshal.load(file) $game_screen = Marshal.load(file) $game_actors = Marshal.load(file) $game_party = Marshal.load(file) $game_troop = Marshal.load(file) $game_map = Marshal.load(file) $game_player = Marshal.load(file) $party_change = Marshal.load(file) for i in 0..($party_change.list_length - 1) $partychange[i] = $party_change.list(i) end for i in 0..($party_change.lock_length - 1) $partylock[i] = $party_change.lock(i) end # If magic number is different from when saving # (if editing was added with editor) if $game_system.magic_number != $data_system.magic_number # Load map $game_map.setup($game_map.map_id) $game_player.center($game_player.x, $game_player.y) end # Refresh party members $game_party.refresh end end