[RESOLVED][XP] Dargor's large party script and shops

Started by Simon Greedwell, August 27, 2013, 09:09:57 pm

Previous topic - Next topic

Simon Greedwell

August 27, 2013, 09:09:57 pm Last Edit: August 28, 2013, 10:23:05 pm by Simon Greedwell
I recently decided to use Dargor's large party script that allows more than 4 characters in the party. Sadly, I noticed that only the first four characters appear in the shop menu. Is there any way to fix this? I'm using the default shop script if you are wondering.

There's Dargo's script if needed:

#==============================================================================
# ** Large Party
#------------------------------------------------------------------------------
#  Author: Dargor
#  Version 1.3
#  02/08/2007
#==============================================================================

#==============================================================================
# ** Large Party Customization Module
#==============================================================================

module Dargor
 module Large_Party
   # Maximum number of actors allowed in the party
   Max_Size = 9
   # Battle status window refresh rate (used in phase5)
   Battle_Refresh_Rate = 32
 end
end

#==============================================================================
# ** Game_Temp
#------------------------------------------------------------------------------
#  This class handles temporary data that is not included with save data.
#  Refer to "$game_temp" for the instance of this class.
#==============================================================================

class Game_Temp
 #--------------------------------------------------------------------------
 # * Public Instance Variables
 #--------------------------------------------------------------------------
 attr_accessor :battle_actor_index  # @actor_index in battle scene
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_temp_initialize initialize
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize
   large_party_temp_initialize
   @battle_actor_index = 0
 end
end

#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
#  This class handles the party. It includes information on amount of gold
#  and items. Refer to "$game_party" for the instance of this class.
#==============================================================================

class Game_Party
 #--------------------------------------------------------------------------
 # * Public Instance Variables
 #--------------------------------------------------------------------------
 attr_accessor :max_size   # Max number of actors allowed in the party
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_initialize initialize
 alias large_party_add_actor add_actor
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize
   large_party_initialize
   @max_size = Dargor::Large_Party::Max_Size
 end
 #--------------------------------------------------------------------------
 # * Add an Actor
 #     actor_id : actor ID
 #--------------------------------------------------------------------------
 def add_actor(actor_id)
   # Original method
   large_party_add_actor(actor_id)
   # Get actor
   actor = $game_actors[actor_id]
   # If the party has less than 4 members and this actor is not in the party
   if @actors.size < @max_size and not @actors.include?(actor)
     # Add actor
     @actors.push(actor)
     # Refresh player
     $game_player.refresh
   end
 end
end

#==============================================================================
# ** Sprite_Battler
#------------------------------------------------------------------------------
#  This sprite is used to display the battler.It observes the Game_Character
#  class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Battler < RPG::Sprite
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_sprite_update update
 #--------------------------------------------------------------------------
 # * Frame Update
 #--------------------------------------------------------------------------
 def update
   # Original method
   large_party_sprite_update
   # Set sprite coordinates
   if @battler.is_a?(Game_Actor)
     self.x = @battler.screen_x - ($game_temp.battle_actor_index / 4) * 640
   end
 end
end
#==============================================================================
# ** Spriteset_Battle
#------------------------------------------------------------------------------
#  This class brings together battle screen sprites. It's used within
#  the Scene_Battle class.
#==============================================================================

class Spriteset_Battle
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_spriteset_update update
 #--------------------------------------------------------------------------
 # * Frame Update
 #--------------------------------------------------------------------------
 def update
   # Cycle through all extra actors (4+)
   # Create/update sprites
   for i in 4...$game_party.actors.size
     if @actor_sprites[i].nil?
       @actor_sprites.push(Sprite_Battler.new(@viewport2))
     end
     @actor_sprites[i].battler = $game_party.actors[i]
   end
   # Original method
   large_party_spriteset_update
 end
end

#==============================================================================
# ** Window_MenuStatus
#------------------------------------------------------------------------------
#  This window displays party member status on the menu screen.
#==============================================================================

class Window_MenuStatus < Window_Selectable
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_menu_status_initialize initialize
 alias large_party_menu_status_refresh refresh
 alias large_party_menu_status_update_cursor_rect update_cursor_rect
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize
   # Original method
   large_party_menu_status_initialize
   # Adjust contents height
   @item_max = $game_party.actors.size
   height = @item_max * 120
   self.contents = Bitmap.new(width - 32, height - 32)
   # Refresh
   refresh
 end
 #--------------------------------------------------------------------------
 # * Refresh
 #--------------------------------------------------------------------------
 def refresh(*args)
   # Original method
   large_party_menu_status_refresh(*args)
   # Adjust default height
   self.height = 480
 end
 #--------------------------------------------------------------------------
 # * Cursor Rectangle Update
 #--------------------------------------------------------------------------
 def update_cursor_rect
   large_party_menu_status_update_cursor_rect
   row = @index / @column_max
   if row < self.top_row
     self.top_row = row
   end
   if row > self.top_row + (self.page_row_max - 1)
     self.top_row = row - (self.page_row_max - 1)
   end
   cursor_width = self.width / @column_max - 32
   x = @index % @column_max * (cursor_width + 32)
   y = @index / @column_max * 116 - self.oy
   self.cursor_rect.set(x, y, cursor_width, 96)
 end
 #--------------------------------------------------------------------------
 # * Top Row
 #--------------------------------------------------------------------------
 def top_row
   return self.oy / 116
 end
 #--------------------------------------------------------------------------
 # * Set Top Row
 #     row : new row
 #--------------------------------------------------------------------------
 def top_row=(row)
   if row < 0
     row = 0
   end
   if row > row_max - 1
     row = row_max - 1
   end
   self.oy = row * 116
 end
 #--------------------------------------------------------------------------
 # * Page Row Max
 #--------------------------------------------------------------------------
 def page_row_max
   return 4
 end
end

#==============================================================================
# ** Window_BattleStatus
#------------------------------------------------------------------------------
#  This window displays the status of all party members on the battle screen.
#==============================================================================

class Window_BattleStatus < Window_Base
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_battle_status_initialize initialize
 alias large_party_battle_status_refresh refresh
 alias large_party_battle_status_update update
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize
   @column_max = 4
   large_party_battle_status_initialize
   width = $game_party.actors.size * 160
   self.contents = Bitmap.new(width - 32, height - 32)
   self.width = 640
   @level_up_flags = []
   for i in 0...$game_party.actors.size
     @level_up_flags << false
   end
   @item_max = $game_party.actors.size
   refresh
 end
 #--------------------------------------------------------------------------
 # * Refresh
 #--------------------------------------------------------------------------
 def refresh
   # Refresh contents when actors are added/removed in-battle
   if $game_party.actors.size != @item_max
     @item_max = $game_party.actors.size
     width = @item_max * 160
     self.contents = Bitmap.new(width - 32, height - 32)
     self.width = 640
   end
   large_party_battle_status_refresh
   column = $game_temp.battle_actor_index / 4
   self.ox = column * 640
 end
end
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Scene_Battle
 #--------------------------------------------------------------------------
 # * Alias Listing
 #--------------------------------------------------------------------------
 alias large_party_phase3_setup_command_window phase3_setup_command_window
 alias large_party_update_phase4_step2 update_phase4_step2
 alias large_party_start_phase5 start_phase5
 alias large_party_update_phase5 update_phase5
 #--------------------------------------------------------------------------
 # * Actor Command Window Setup
 #--------------------------------------------------------------------------
 def phase3_setup_command_window
   $game_temp.battle_actor_index = @actor_index
   @status_window.refresh
   large_party_phase3_setup_command_window
   @actor_command_window.x = (@actor_index%4) * 160
 end
 #--------------------------------------------------------------------------
 # * Frame Update (main phase step 2 : start action)
 #--------------------------------------------------------------------------
 def update_phase4_step2
   if @active_battler.is_a?(Game_Actor)
     $game_temp.battle_actor_index = @active_battler.index
     @status_window.refresh
   end
   large_party_update_phase4_step2
 end
 #--------------------------------------------------------------------------
 # * Frame Update (main phase step 4 : animation for target)
 #--------------------------------------------------------------------------
 def update_phase4_step4
   if @target_battlers[0] != nil
     $game_temp.battle_actor_index = @target_battlers[0].index
     @status_window.refresh
   end
   # Animation for target
   for target in @target_battlers
     target.animation_id = @animation2_id
     target.animation_hit = (target.damage != "Miss")
   end
   # Animation has at least 8 frames, regardless of its length
   @wait_count = 8
   # Shift to step 5
   @phase4_step = 5
 end
 #--------------------------------------------------------------------------
 # * Start After Battle Phase
 #--------------------------------------------------------------------------
 def start_phase5
   @actor_index = 0
   @status_wait = Graphics.frame_count
   large_party_start_phase5
 end
 #--------------------------------------------------------------------------
 # * Frame Update (after battle phase)
 #--------------------------------------------------------------------------
 def update_phase5
   refresh_rate = Dargor::Large_Party::Battle_Refresh_Rate
   if Graphics.frame_count >= @status_wait + refresh_rate
     $game_temp.battle_actor_index = @actor_index
     @status_window.refresh
     @status_wait = Graphics.frame_count
     max = ($game_party.actors.size.to_f/4).ceil * 4
     @actor_index = (@actor_index+1) % max
   end
   large_party_update_phase5
 end
end
Bury with my...money!

WhiteRose

August 27, 2013, 10:00:44 pm #1 Last Edit: August 27, 2013, 10:52:04 pm by WhiteRose
This is my speciality. I can write a fix for you right now - hold on just a few minutes.

EDIT: Are you hoping for a shop window with a specific maximum number of characters (5 or 6 or whatever,) or for one that accounts for any number of characters in the party? Either way should be pretty doable, though the former would probably be a bit simpler.

EDIT 2: Looks like the maximum value that you have set in the script is nine. That's big enough that it'll probably be easier to make one that scrolls to accommodate any number of party members. I'll have that ready in a few minutes....

EDIT 3: Because the actor shopping window never actually scrolls, this might be harder than I thought. Sorry to let you down. :( I'll see if I can come up with an idea to make this work, but you might have to just end up using a different shop interface. There are a few in the Script Database, if you want to take a look.

Simon Greedwell

That's ok, thanks for your help.

I've tried other shop scripts such as Leon's but all of them seems to have the same problem.
Bury with my...money!

KK20

This is actually going to need to be a script request. Since your party can be a size of 9, trying to draw all the actors in the party in the same way as the shop scene does it is not going to fit on the screen.

You should describe (or better yet, provide a picture) of what you would want the scene to look like and any extra controls should there be any.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

So it's happens that I asked this in another site and I got a script that allows me to use the L & R member cycling keys i.e the Q & W on the keyboard to switch between the buy window and the status window where all the characters are displayed.

I will leave it here:

#==============================================================================
# ** Large Party Scene Shop & Window Expansion
#------------------------------------------------------------------------------
#    by DerVVulfman
#    version 1.0
#    08-28-2013
#    RGSS / RPGMaker XP
#------------------------------------------------------------------------------
#
#    Requested by:  Simon Greedwell
#
#    Just a quick rewrite of the Shop Status window and Scene_Shop script to
#    allow Dargor's Large Party system work.  It should also work with other
#    similar large party systems for RPGMaker XP, but untried.  However, the
#    highlighting feature works even without the use of a large party system.
#
#    When in the Shop Buy window, hitting the L & R member cycling keys ( or
#    the Q & W on the keyboard ), you exit the Buy window & enter the status
#    window.  During this time,  all the members within the  window  will be
#    highlighted.  Use Up/Down keys to scroll through them.  ESC returns you
#    to the Buy window.
#
#==============================================================================



#==============================================================================
# ** Window_ShopStatus
#------------------------------------------------------------------------------
#  This window displays number of items in possession and the actor's equipment
#  on the shop screen.
#==============================================================================

class Window_ShopStatus < Window_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :index                    # Window Index
  attr_accessor :item_max                 # Window Max Items
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias large_party_shop_status_initialize initialize 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Original method
    large_party_shop_status_initialize
    # Set Contents index
    @index = 0
    # Set Contents size
    @item_max = $game_party.actors.size
    # Refresh
    refresh   
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    return if @item.nil?
    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, 32, "number in possession")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
    return if @item.is_a?(RPG::Item)
    # Create Start and End points for actor sorting
    start_count = 0 + @index
    end_count = start_count + 3
    end_count = $game_party.actors.size if end_count > $game_party.actors.size
    # Reset Line Count for Text Display
    line_count = 0
    # Equipment adding information
    for i in start_count..end_count
      # Get actor
      actor = $game_party.actors[i]
      # If equippable, use normal text color, otherwise use invalid text color
      self.contents.font.color = (actor.equippable?(@item)) ?
                                  normal_color : disabled_color
      # Draw actor's name
      self.contents.draw_text(4, 48 + 64 * line_count, 120, 32, actor.name)
      # Get current equipment
      if @item.is_a?(RPG::Weapon)
        # For Weapon
        item1 = $data_weapons[actor.weapon_id]
      else
        # For armor, branched on Armor kind
        case @item.kind
        when 0 ; item1 = $data_armors[actor.armor1_id]
        when 1 ; item1 = $data_armors[actor.armor2_id]
        when 2 ; item1 = $data_armors[actor.armor3_id]
        else ;   item1 = $data_armors[actor.armor4_id]
        end
      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, 48 + 64 * line_count, 112, 32,
          sprintf("%+d", change), 2)
      end
      # Draw item
      unless item1.nil?
        x = 4
        y = 80 + 64 * line_count
        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, 32, item1.name)
      end
      # Advance Line by 1
      line_count += 1
    end
    # Update Cursor Rectangle
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Update Cursor Rectangle
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # Remove if window is inactive
    return self.cursor_rect.empty unless self.active
    # Update cursor rectangle
    self.cursor_rect.set(0, 48, 240, 256)
  end 
end



#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  This class performs shop screen processing.
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias large_party_scene_shop_update update
  alias large_party_scene_shop_update_buy update_buy
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    large_party_scene_shop_update
    # If status window is active: call update_status
    if @status_window.active
      update_status
      return
    end
  end 
  #--------------------------------------------------------------------------
  # * Frame Update (when buy window is active)
  #--------------------------------------------------------------------------
  def update_buy
    large_party_scene_shop_update_buy
    @status_window.active = false
    # If C button was pressed
    if Input.trigger?(Input::L) or Input.trigger?(Input::R)
      # Play decision SE
      $game_system.se_play($data_system.cursor_se)
      @status_window.active = true
      @buy_window.active = false
      @status_window.refresh
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when buy window is active)
  #--------------------------------------------------------------------------
  def update_status
    if Input.repeat?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      max = @status_window.item_max - 4
      val = @status_window.index += 1
      val = max if val > max
      @status_window.index = val
      @status_window.refresh
    end
    if Input.repeat?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      val = @status_window.index -= 1
      val = 0 if val < 0
      @status_window.index = val
      @status_window.refresh
    end   
    # If C button was pressed
    if Input.trigger?(Input::B)
      # Play decision SE
      $game_system.se_play($data_system.cancel_se)
      @status_window.active = false
      @buy_window.active = true
      @status_window.refresh
      return
    end
  end 
end
Bury with my...money!