8-Actor Party

cockroach

An RPG Jack-of-all-trades
Member
Joined
Jul 5, 2015
Messages
23
Reaction score
51
Primarily Uses
8-Actor-Party

This is a very simple edit I have made so the RMXP engine allows 8 heroes and show them in all the instances necessary. It consists mostly of firstly allowing the party to have 8 heroes, then tweaking the MenuStatus, the Shop, Item Usage, the default Battle System, the Save window, and so on, so the heroes always appear.

It does look crowded sometimes with 8 heroes in the party, that's why I made it kind of "adaptative", so it only makes it look this way when there are in fact 8 heroes. Default battle with 8 heroes is a disaster. Heheh.

Screenshots

01_Menu.png02_Menu.png

03_Shop.png

04_Battle.png

05_Battle.png

06_Save.png

06_Skill.png
An implementation using other battle system, compatible with more than 4 heroes (GTBS in this case):

ss1.JPGss2.JPG
How to Use

Insert the Script below above Main, and below others. Then all you need to do is adding heroes normally via events.

 


Demo

8-Actor-Party.zip


Script

Code:
#==============================================================================# ** 8_Hero_Party - by cockroach#------------------------------------------------------------------------------#  This script is meant to permit 8 heroes in the party.#  The heroes will appear in every instance of the game and show up properly,#  but in many cases it may look crowded. (Specially in the default Battle System)#  This is why this goes best with another type of battle system.#  If anyone wants to use even more than 8 heroes, all necessary changes are in#  this script, and it is a very easy thing to alter.##  All you need to do is adding heroes to the party normally, no custom script#  call is necessary.##  (This very simple script is free for usage and edition, in any type of game.)#==============================================================================#==============================================================================# Alterations in Game_Actor#==============================================================================class Game_Actor    def screen_x    p_size = $game_party.actors.size    if p_size < 4      p_size = 4    end    # Return after calculating x-coordinate by order of members in party    if self.index != nil      return self.index * (640/p_size) + (320/p_size)    else      return 0    end  endend#==============================================================================# Alterations in Game_Party#==============================================================================class Game_Party  #--------------------------------------------------------------------------  # * Add an Actor  #     actor_id : actor ID  #--------------------------------------------------------------------------  def add_actor(actor_id)    # Get actor    actor = $game_actors[actor_id]    # If the party has less than 8 members and this actor is not in the party    if @actors.size < 8 and not @actors.include?(actor)      # Add actor      @actors.push(actor)      # Refresh player      $game_player.refresh    end  end    #--------------------------------------------------------------------------  # * Random Selection of Target Actor  #     hp0 : limited to actors with 0 HP  #--------------------------------------------------------------------------  def random_target_actor(hp0 = false)    # Initialize roulette    roulette = []    # Loop    for actor in @actors      # If it fits the conditions      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)        # Get actor class [position]        position = ($data_classes[actor.class_id].position)/2        # Front guard: n = 4; Mid guard: n = 3; Rear guard: n = 2        n = 4 - position        if n == 0          n = 1        end        # Add actor to roulette n times        n.times do          roulette.push(actor)        end      end    end    # If roulette size is 0    if roulette.size == 0      return nil    end    # Spin the roulette, choose an actor    return roulette[rand(roulette.size)]  endend#==============================================================================# Alterations in Window_MenuStatus#==============================================================================class Window_MenuStatus < Window_Selectable  #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------  def refresh    self.contents.clear    @item_max = $game_party.actors.size    for i in 0...$game_party.actors.size      x = 64      if @item_max > 5        y = i * (455 / @item_max)      else        y = i * 76.5      end      actor = $game_party.actors[i]      draw_actor_graphic(actor, x - 40, y + 47)      draw_actor_name(actor, x, y - 9)      draw_actor_class(actor, x + 144, y - 9)      draw_actor_level(actor, x, y + 7)      draw_actor_state(actor, x + 90, y + 7)      draw_actor_exp(actor, x, y + 23)      draw_actor_hp(actor, x + 236, y + 7)      draw_actor_sp(actor, x + 236, y + 23)    end  end  #--------------------------------------------------------------------------  # * Cursor Rectangle Update  #--------------------------------------------------------------------------  def update_cursor_rect    if @index < 0      self.cursor_rect.empty    else      if @item_max > 5        y = @index * (455 / @item_max) - 3      else        y = @index * 76.5 - 3      end      self.cursor_rect.set(0, y, self.width - 32, 52)    end  endend#==============================================================================# Alterations in Window_Target#==============================================================================class Window_Target < Window_Selectable  #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------  def refresh    self.contents.clear    for i in 0...$game_party.actors.size      x = 4      y = i * 55      actor = $game_party.actors[i]      draw_actor_name(actor, x, y)      draw_actor_class(actor, x + 144, y)      draw_actor_level(actor, x + 8, y + 16)      draw_actor_state(actor, x + 8, y + 32)      draw_actor_hp(actor, x + 152, y + 16)      draw_actor_sp(actor, x + 152, y + 32)    end  end  #--------------------------------------------------------------------------  # * Cursor Rectangle Update  #--------------------------------------------------------------------------  def update_cursor_rect    # Cursor position -1 = all choices, -2 or lower = independent choice    # (meaning the user's own choice)    if @index <= -2      self.cursor_rect.set(0, (@index + 10) * 55 + 6, self.width - 32, 48)    elsif @index == -1      self.cursor_rect.set(0, 0, self.width - 32 + 6, @item_max * 58 - 20)    else      self.cursor_rect.set(0, @index * 55 + 6, self.width - 32, 52)    end  endend#==============================================================================# Alterations in Window_SaveFile#==============================================================================class Window_SaveFile < Window_Base  #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------  def refresh    self.contents.clear    # Draw file number    self.contents.font.color = normal_color    name = "File#{@file_index + 1}"    self.contents.draw_text(4, 0, 600, 32, name)    @name_width = contents.text_size(name).width    # If save file exists    if @file_exist      # Draw character      for i in 0...@characters.size        bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])        cw = bitmap.rect.width / 4        ch = bitmap.rect.height / 4        src_rect = Rect.new(0, 0, cw, ch)        x = 275 - @characters.size * 24 + i * 48 - cw / 2        self.contents.blt(x, 68 - ch, bitmap, src_rect)      end      # Draw play time      hour = @total_sec / 60 / 60      min = @total_sec / 60 % 60      sec = @total_sec % 60      time_string = sprintf("%02d:%02d:%02d", hour, min, sec)      self.contents.font.color = normal_color      self.contents.draw_text(4, 8, 600, 32, time_string, 2)      # Draw timestamp      self.contents.font.color = normal_color      time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")      self.contents.draw_text(4, 40, 600, 32, time_string, 2)    end  endend#==============================================================================# Alterations in Window_ShopStatus#==============================================================================class Window_ShopStatus < Window_Base  #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------  def refresh    self.contents.clear    if @item == nil      return    end    case @item    when RPG::Item      number = $game_party.item_number(@item.id)    when RPG::Weapon      number = $game_party.weapon_number(@item.id)    when RPG::Armor      number = $game_party.armor_number(@item.id)    end    self.contents.font.color = system_color    self.contents.draw_text(4, 0, 200, 24, "number in possession")    self.contents.font.color = normal_color    self.contents.draw_text(204, 0, 32, 24, number.to_s, 2)    if @item.is_a?(RPG::Item)      return    end    # Equipment adding information    for i in 0...$game_party.actors.size      # Get actor      actor = $game_party.actors[i]      p_size = $game_party.actors.size      # If equippable, then set to normal text color. If not, set to      # invalid text color.      if actor.equippable?(@item)        self.contents.font.color = normal_color      else        self.contents.font.color = disabled_color      end      # Draw actor's name      if p_size > 5        y1 = i * (288 / p_size)      else        y1 = i * 48      end      self.contents.draw_text(4, 24 + y1, 120, 24, actor.name)      # Get current equipment      if @item.is_a?(RPG::Weapon)        item1 = $data_weapons[actor.weapon_id]      elsif @item.kind == 0        item1 = $data_armors[actor.armor1_id]      elsif @item.kind == 1        item1 = $data_armors[actor.armor2_id]      elsif @item.kind == 2        item1 = $data_armors[actor.armor3_id]      else        item1 = $data_armors[actor.armor4_id]      end      # If equippable      if actor.equippable?(@item)        # If weapon        if @item.is_a?(RPG::Weapon)          atk1 = item1 != nil ? item1.atk : 0          atk2 = @item != nil ? @item.atk : 0          change = atk2 - atk1        end        # If armor        if @item.is_a?(RPG::Armor)          pdef1 = item1 != nil ? item1.pdef : 0          mdef1 = item1 != nil ? item1.mdef : 0          pdef2 = @item != nil ? @item.pdef : 0          mdef2 = @item != nil ? @item.mdef : 0          change = pdef2 - pdef1 + mdef2 - mdef1        end        # Draw parameter change values        self.contents.draw_text(124, 24 + y1, 112, 24,          sprintf("%+d", change), 2)      end      # Draw item      if item1 != nil        x = 4        y = 8 + y1 + 32        bitmap = RPG::Cache.icon(item1.icon_name)        opacity = self.contents.font.color == normal_color ? 255 : 128        self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)        self.contents.draw_text(x + 28, y, 212, 24, item1.name)      end    end  endendclass Spriteset_Battle  #--------------------------------------------------------------------------  # * Object Initialization  #--------------------------------------------------------------------------  def initialize    # Make viewports    @viewport1 = Viewport.new(0, 0, 640, 320)    @viewport2 = Viewport.new(0, 0, 640, 480)    @viewport3 = Viewport.new(0, 0, 640, 480)    @viewport4 = Viewport.new(0, 0, 640, 480)    @viewport2.z = 101    @viewport3.z = 200    @viewport4.z = 5000    # Make battleback sprite    @battleback_sprite = Sprite.new(@viewport1)    # Make enemy sprites    @enemy_sprites = []    for enemy in $game_troop.enemies.reverse      @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))    end    # Make actor sprites    @actor_sprites = []    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    @actor_sprites.push(Sprite_Battler.new(@viewport2))    # Make weather    @weather = RPG::Weather.new(@viewport1)    # Make picture sprites    @picture_sprites = []    for i in 51..100      @picture_sprites.push(Sprite_Picture.new(@viewport3,        $game_screen.pictures[i]))    end    # Make timer sprite    @timer_sprite = Sprite_Timer.new    # Frame update    update  end    def update    # Update actor sprite contents (corresponds with actor switching)    @actor_sprites[0].battler = $game_party.actors[0]    @actor_sprites[1].battler = $game_party.actors[1]    @actor_sprites[2].battler = $game_party.actors[2]    @actor_sprites[3].battler = $game_party.actors[3]    @actor_sprites[4].battler = $game_party.actors[4]    @actor_sprites[5].battler = $game_party.actors[5]    @actor_sprites[6].battler = $game_party.actors[6]    @actor_sprites[7].battler = $game_party.actors[7]    # If battleback file name is different from current one    if @battleback_name != $game_temp.battleback_name      @battleback_name = $game_temp.battleback_name      if @battleback_sprite.bitmap != nil        @battleback_sprite.bitmap.dispose      end      @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)      @battleback_sprite.src_rect.set(0, 0, 640, 320)    end    # Update battler sprites    for sprite in @enemy_sprites + @actor_sprites      sprite.update    end    # Update weather graphic    @weather.type = $game_screen.weather_type    @weather.max = $game_screen.weather_max    @weather.update    # Update picture sprites    for sprite in @picture_sprites      sprite.update    end    # Update timer sprite    @timer_sprite.update    # Set screen color tone and shake position    @viewport1.tone = $game_screen.tone    @viewport1.ox = $game_screen.shake    # Set screen flash color    @viewport4.color = $game_screen.flash_color    # Update viewports    @viewport1.update    @viewport2.update    @viewport4.update  endend#==============================================================================# ** Window_BattleStatus#------------------------------------------------------------------------------#  This window displays the status of all party members on the battle screen.#==============================================================================class Window_Base < Window  def shadow_color    return Color.new(0, 0, 0)  end  #--------------------------------------------------------------------------  # * Draw Name  #     actor : actor  #     x     : draw spot x-coordinate  #     y     : draw spot y-coordinate  #--------------------------------------------------------------------------  def draw_actor_name(actor, x, y, shadow = false)    self.contents.font.color = normal_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(x, y, 120, 32, actor.name)  end  #--------------------------------------------------------------------------  # * Draw State  #     actor : actor  #     x     : draw spot x-coordinate  #     y     : draw spot y-coordinate  #     width : draw spot width  #--------------------------------------------------------------------------  def draw_actor_state(actor, x, y, width = 120, shadow = false)    text = make_battler_state_text(actor, width, true)    self.contents.font.color = actor.hp == 0 ? knockout_color : normal_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(x, y, width, 32, text)  end  #--------------------------------------------------------------------------  # * Draw HP  #     actor : actor  #     x     : draw spot x-coordinate  #     y     : draw spot y-coordinate  #     width : draw spot width  #--------------------------------------------------------------------------  def draw_actor_hp(actor, x, y, width = 144, height = 32, shadow = false)    # Draw "HP" text string    self.contents.font.color = system_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(x, y, 32, height, $data_system.words.hp)    # Calculate if there is draw space for MaxHP    if width - 32 >= 108      hp_x = x + width - 108      flag = true    elsif width - 32 >= 28      hp_x = x + width - 48      flag = false    end    # Draw HP    self.contents.font.color = actor.hp == 0 ? knockout_color :      actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(hp_x, y, 48, height, actor.hp.to_s, 2)    # Draw MaxHP    if flag      self.contents.font.color = normal_color      if shadow        self.contents.font.color = shadow_color      end      self.contents.draw_text(hp_x + 48, y, 12, height, "/", 1)      self.contents.draw_text(hp_x + 60, y, 48, height, actor.maxhp.to_s)    end  end  #--------------------------------------------------------------------------  # * Draw SP  #     actor : actor  #     x     : draw spot x-coordinate  #     y     : draw spot y-coordinate  #     width : draw spot width  #--------------------------------------------------------------------------  def draw_actor_sp(actor, x, y, width = 144, height = 32, shadow = false)    # Draw "SP" text string    self.contents.font.color = system_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(x, y, 32, height, $data_system.words.sp)    # Calculate if there is draw space for MaxHP    if width - 32 >= 108      sp_x = x + width - 108      flag = true    elsif width - 32 >= 28      sp_x = x + width - 48      flag = false    end    # Draw SP    self.contents.font.color = actor.sp == 0 ? knockout_color :      actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color    if shadow      self.contents.font.color = shadow_color    end    self.contents.draw_text(sp_x, y, 48, height, actor.sp.to_s, 2)    # Draw MaxSP    if flag      self.contents.font.color = normal_color      if shadow        self.contents.font.color = shadow_color      end      self.contents.draw_text(sp_x + 48, y, 12, height, "/", 1)      self.contents.draw_text(sp_x + 60, y, 48, height, actor.maxsp.to_s)    end  endendclass Window_BattleStatus < Window_Base  #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------  def refresh    self.contents.clear    @item_max = $game_party.actors.size    if @item_max > 7      self.contents.font.size = 16      self.contents.font.bold = true    elsif @item_max > 6      self.contents.font.size = 18      self.contents.font.bold = true    elsif @item_max > 4      self.contents.font.size = 20      self.contents.font.bold = true    else      self.contents.font.size = 22    end    for i in 0...$game_party.actors.size      actor = $game_party.actors[i]      if @item_max > 6        actor_x = i * 610/@item_max + 0        text_x = 75        t_height = 32      elsif @item_max > 4        actor_x = i * 612/@item_max + 4        text_x = 95        t_height = 32      else        actor_x = i * 160 + 4        text_x = 120        t_height = 32      end            # Draw shade            actor_x -= 2      draw_actor_name(actor, actor_x, 2, true)      draw_actor_hp(actor, actor_x, 34, text_x, t_height, true)      draw_actor_sp(actor, actor_x, 66, text_x, t_height, true)      if @level_up_flags[i]        self.contents.font.color = Color.new(0, 0, 0)        self.contents.draw_text(actor_x, 98, 120, t_height, "LEVEL UP!")      else        draw_actor_state(actor, actor_x, 98, 120, true)      end            actor_x += 2      draw_actor_name(actor, actor_x, 0)      draw_actor_hp(actor, actor_x, 32, text_x, t_height)      draw_actor_sp(actor, actor_x, 64, text_x, t_height)      if @level_up_flags[i]        self.contents.font.color = normal_color        self.contents.draw_text(actor_x, 96, 120, t_height, "LEVEL UP!")      else        draw_actor_state(actor, actor_x, 96)      end          end  endendclass Scene_Battle    def phase3_setup_command_window    # Disable party command window    @party_command_window.active = false    @party_command_window.visible = false    # Enable actor command window    @actor_command_window.active = true    @actor_command_window.visible = true        p_size = $game_party.actors.size - 1    step_x = 480/p_size    if step_x > 160      step_x = 160    end    window_x = @actor_index * step_x    if @actor_index == $game_party.actors.size - 1      window_x = 480    end    # Set actor command window position    @actor_command_window.x = window_x    # Set index to 0    @actor_command_window.index = 0  endend

 
 

Attachments

Hunewearl

Veteran
Veteran
Joined
Oct 8, 2015
Messages
34
Reaction score
2
First Language
English
Primarily Uses
This is great =) Wish it worked better with the combat scipt I use but at elast it does work! Thank you.
 
Joined
Dec 19, 2015
Messages
20
Reaction score
2
First Language
English
Primarily Uses
Wow!  I tested out the script and it worked.  Since the game I am working on has a max of eight chars anyway, this is very useful.  I am glad I stumbled upon this!

Thank you again for making this one.
 

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Profile Posts

Latest member to OcRam -plugin suite: OcRam_Layers! Optimized parallax layers (for parallax mapping?) + dynamic layers which can be used in title-, battle and map scenes!
People convinced me to use my old graphics for this new project, i guess i can't run away from blender just yet. https://gyazo.com/2a105847c042bb78c6d4919ec1308660
10/24 done :3 Maybe I can finish 11 and 12 this weekend^^

Forum statistics

Threads
102,960
Messages
996,295
Members
134,426
Latest member
GameVenture
Top