It is currently Wed Feb 22, 2012 8:06 pm

All times are UTC - 6 hours



Welcome
Welcome to icugigasoft

You are currently viewing our boards as a guest, which gives you limited access to view most discussions and access our other features. By joining our free community, you will have access to post topics, communicate privately with other members (PM), respond to polls, upload content, and access many other special features. In addition, registered members also see less advertisements. Registration is fast, simple, and absolutely free, so please, join our community today!





 Page 2 of 2 [ 19 posts ]  Go to page Previous  1, 2
Author Message
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.0
PostPosted: Thu Jan 19, 2012 9:47 am 
Junior Member
Junior Member
User avatar

Joined: Thu Jun 24, 2010 11:29 am
Posts: 37
Could you put a setting in the VX version of the script that can let you change how many people can be in a caterpillar at a time?


Offline
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.0
PostPosted: Thu Jan 19, 2012 9:52 pm 
Senior Member
Senior Member
User avatar

Joined: Mon Jun 28, 2010 5:55 pm
Posts: 1144
Location: Look somewhere else...
Sure.



_________________
Super Mario RPG
Working on:Maps :P
Online
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.0
PostPosted: Wed Feb 01, 2012 8:29 pm 
Senior Member
Senior Member
User avatar

Joined: Mon Jun 28, 2010 5:55 pm
Posts: 1144
Location: Look somewhere else...
Updated VX Caterpillar System:

#==============================================================================
# ** Partner System VX Version 1.2
#    By MarioSuperStar
#    Give credit if used
#==============================================================================

#==============================================================================
# ** Settings
# $ACTION_VAR = variable to select partner to process
# =============================================================================

$ACTION_VAR = 2 #Variable indicating who performs the Set Move Route event command
                # When the target is Player. If $ACTION_VAR is equal to -1, the
                # character performing the move route will be the player.
                # If $ACTION_VAR is greater than -1, it uses the partner with
                # the position number of $ACTION_VAR. Example: 0 is the first
                #partner member, being the second person in the party.
$PARTNER_SWITCH = 1 # Switch that is activated when partners are displayed on the map.
$OVERWORLD_MAX = 1 # Max number of party memebers displayed in the map. 0 = all the party members.

class Game_Character
  attr_accessor :move_route
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================

class Game_Partner < Game_Character
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :actor_id
  attr_accessor :interpreter
  attr_accessor :copy_move
  attr_accessor :transparent
  attr_accessor :index
  attr_accessor :align
  attr_accessor :fx
  attr_accessor :fy
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     map_id : map ID
  #     event  : event (RPG::Event)
  #--------------------------------------------------------------------------
  def initialize(map_id, actor_id)
    super()
    @transparent = false
    @map_id = $game_map.map_id
    @actor_id = actor_id
    actor = $game_actors[actor_id]
    @index = actor.index - 1
    @id = 0 - actor.index
    @anime_count = 0
    @playing_move_route = false
    @through = false
    @walk_anime = true
    @interpreter = nil
    @align = false
    @fx = 0
    @fy = 0
    refresh
  end
 
  def perform_action
    action = @copy_move[0]
    case action
    when "move_down"
      move_down
    when "move_left"
      move_left
    when "move_right"
      move_right
    when "move_up"
      move_up
    end
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
      @copy_move.push(player.copy_move[0])
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_x
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + 1
    when 6
      return player.x - 1
    when 8
      return player.x
    end
  end
 
  def formulate_y
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + 1
    when 2
      return player.y - 1
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xxx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    player = $game_player
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + (1 * index)
    when 6
      return player.x - (1 * index)
    when 8
      return player.x
    end
  end
 
  def formulate_yyy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + (1 * index)
    when 2
      return player.y - (1 * index)
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x
    when 6
      return player.x
    when 8
      return player.x
    end
  end
 
  def formulate_yy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y
    when 2
      return player.y
    when 6
      return player.y
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
  end
 
 
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def passable?(x, y, passable = false)
    x = $game_map.round_x(x)                        # Horizontal loop adj.
    y = $game_map.round_y(y)                        # Vertical loop adj.
    return false unless $game_map.valid?(x, y)      # Outside map?
    return true if @through or debug_through?       # Through ON?
    return false unless map_passable?(x, y)         # Map Impassable?
    return false if collide_with_characters?(x, y, passable)  # Collide with character?
    return true                                     # Passable
  end
 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh_
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
    if passable?(formulate_x, formulate_y, true)
      moveto(formulate_x, formulate_y)            # Move to initial position
    elsif passable?(formulate_xx-1, formulate_yy, true)
      moveto(formulate_xx - 1, formulate_yy)
    elsif passable?(formulate_xx+1, formulate_yy, true)
      moveto(formulate_xx+1, formulate_yy)
    elsif passable?(formulate_xx, formulate_yy-1, true)
      moveto(formulate_xx, formulate_yy-1)
    elsif passable?(formulate_xx, formulate_yy+1, true)
      moveto(formulate_xx, formulate_yy+1)
    end
    p ""
    turn_toward_point(formulate_xx, formulate_yy)
    mov = "move_down" if @direction == 2
    mov = "move_left" if @direction == 4
    mov = "move_right" if @direction == 6
    mov = "move_up" if @direction == 8
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
    end
    @direction = player.direction
    @copy_move = [mov]
  end
 
  def check_event_trigger_touch(x = 0, y = 0)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    return if $partners == nil
    @playing_move_route = false if $game_player.move_route == nil
    return if @playing_move_route
    return @playing_move_route = true && move_route_forcing($game_player.move_route) if $game_player.move_route != nil
    through = false
    return if moving?
    if @interpreter != nil                      # Now parallel processing?
      @interpreter.update                       # Update interpreter
      return
    end
    if @align
      @move_speed = 5
      move_toward_point(@fx, @fy)
    end
    return if $game_map.interpreter.running?
  end
  #--------------------------------------------------------------------------
  # * Turn toward Player
  #--------------------------------------------------------------------------
  def turn_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx.abs > sy.abs                    # Horizontal distance is longer
      sx > 0 ? turn_left : turn_right
    elsif sx.abs < sy.abs                 # Vertical distance is longer
      sy > 0 ? turn_up : turn_down
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move toward Player
  #--------------------------------------------------------------------------
  def move_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs                  # Horizontal distance is longer
        sx > 0 ? move_left : move_right   # Prioritize left-right
        if @move_failed and sy != 0
          sy > 0 ? move_up : move_down
        end
      else                             # Vertical distance is longer
        sy > 0 ? move_up : move_down      # Prioritize up-down
        if @move_failed and sx != 0
          sx > 0 ? move_left : move_right
        end
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update While Stopped
  #--------------------------------------------------------------------------
  def update_stop
    return if $partners == nil
    if @x == @fx and @y == @fy and @align
      @align = false
      @move_speed = $game_player.move_speed
      turn_toward_point(formulate_xx, formulate_yy)
      mov = "move_down" if @direction == 2
      mov = "move_left" if @direction == 4
      mov = "move_right" if @direction == 6
      mov = "move_up" if @direction == 8
      @copy_move = [mov]
    end
    if $game_switches[$PARTNER_SWITCH] and @align == false
      turn_toward_point(formulate_xx, formulate_yy)
    end
    if @step_anime
      @anime_count += 1
    elsif @pattern != @original_pattern
      @anime_count += 1.5
    end
    @stop_count += 1 unless @locked
  end
 
  #--------------------------------------------------------------------------
  # * Calculate X Distance From Player
  #--------------------------------------------------------------------------
  def distance_x_from_point(x)
    sx = @x - x
    if $game_map.loop_horizontal?         # When looping horizontally
      if sx.abs > $game_map.width / 2     # Larger than half the map width?
        sx -= $game_map.width             # Subtract map width
      end
    end
    return sx
  end
  #--------------------------------------------------------------------------
  # * Calculate Y Distance From Player
  #--------------------------------------------------------------------------
  def distance_y_from_point(y)
    sy = @y - y
    if $game_map.loop_vertical?           # When looping vertically
      if sy.abs > $game_map.height / 2    # Larger than half the map height?
        sy -= $game_map.height            # Subtract map height
      end
    end
    return sy
  end
 
  #--------------------------------------------------------------------------
  # * Determine Character Collision
  #     x : x-coordinate
  #     y : y-coordinate
  #    Detects normal character collision, including the player and vehicles.
  #--------------------------------------------------------------------------
  def collide_with_characters?(x, y, passable = false)
    for event in $game_map.events_xy(x, y)          # Matches event position
      unless event.through                          # Passage OFF?
        return true if self.is_a?(Game_Event)       # Self is event
        return true if event.priority_type == 1     # Target is normal char
      end
    end
    if passable == true
      if @priority_type == 1                          # Self is normal char
        return true if $game_player.pos_nt?(x, y)     # Matches player position
        return true if $game_map.boat.pos_nt?(x, y)   # Matches boat position
        return true if $game_map.ship.pos_nt?(x, y)   # Matches ship position
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        actor = $game_actors[@actor_id]
        index = actor.index - 1
        return true if partner.pos_nt?(x, y) and (partner != $partners[index].character)
      end
    end
    return false
  end
 
  def distance_x_from_player
    return @x - formulate_x
  end
 
  def distance_y_from_player
    return @y - formulate_y
  end
end

class Scene_Map
  attr_accessor :spriteset
  #--------------------------------------------------------------------------
  # * Player Transfer  Processing
  #--------------------------------------------------------------------------
  def update_transfer_player
    return unless $game_player.transfer?
    fade = (Graphics.brightness > 0)
    fadeout(30) if fade
    partner_flag = @spriteset.partners != nil
    @spriteset.dispose              # Dispose of sprite set
    $game_player.perform_transfer   # Execute player transfer
    $game_map.autoplay              # Automatically switch BGM and BGS
    $game_map.update
    Graphics.wait(15)
    @spriteset = Spriteset_Map.new  # Recreate sprite set
    @spriteset.on_partner if partner_flag
    fadein(30) if fade
    Input.update
  end
end

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Get Character
  #     parameter : parameter
  #--------------------------------------------------------------------------
  def get_character(parameter)
    # Branch by parameter
    case parameter
    when -1   # Player
      if $partners != nil
        partners = $partners
        partner = $partners[$game_variables[$ACTION_VAR]]
        partner = partner.character
      end
      return partner == nil ? nil : partner if $game_variables[$ACTION_VAR] > -1 and $partners != nil
      return $game_player
    when 0  # this event
      events = $game_map.events
      return events == nil ? nil : events[@event_id]
    else  # specific event
      events = $game_map.events
      return events == nil ? nil : events[parameter]
    end
  end
 
  def align_partners
    @x_vals = []
    @y_vals = []
    for i in 0...$partners.size
      partner = $partners[i].character
      partner_ = $partners[i-1].character
      partner.align = true
      if partner.passable?(partner.formulate_xxx, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx-1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx - 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx+1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx + 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy-1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy - 1
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy+1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy + 1
      end
      if @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy)
        val = false
        unless @x_vals.include?(partner.fx-1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx-1, partner.fy, true)
            partner.fx = partner.fx - 1
            partner.fy = partner.fy
            val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx+1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx+1, partner.fy, true)
          partner.fx = partner.fx + 1
          partner.fy = partner.fy
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy-1)
          if partner.passable?(partner.fx, partner.fy-1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy - 1
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy+1)
          if partner.passable?(partner.fx, partner.fy+1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy + 1
          val = true
          end
        end
      else
        @x_vals.push(partner.fx)
        @y_vals.push(partner.fy)
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    loop do
      if $game_map.map_id != @map_id        # Map is different?
        @event_id = 0                       # Make event ID 0
      end
      val = false
      if $game_switches[$PARTNER_SWITCH] and $partners != nil
      for i in 0...$partners.size
        partner = $partners[i].character
        if partner.align == true
          val = true
        end
      end
      end
      return if val == true
      if @child_interpreter != nil          # If child interpreter exists
        @child_interpreter.update           # Update child interpreter
        if @child_interpreter.running?      # If running
          return                            # Return
        else                                # After execution has finished
          @child_interpreter = nil          # Erase child interpreter
        end
      end
      if @message_waiting                   # Waiting for message finish
        return
      end
      if @moving_character != nil           # Waiting for move to finish
        if @moving_character.move_route_forcing
          return
        end
        @moving_character = nil
      end
      if @wait_count > 0                    # Waiting
        @wait_count -= 1
        return
      end
      if $game_troop.forcing_battler != nil # Forcing battle action
        return
      end
      if $game_temp.next_scene != nil       # Opening screens
        return
      end
      if @list == nil                       # If content list is empty
        setup_starting_event if @main       # Set up starting event
        return if @list == nil              # Nothing was set up
      end
      return if execute_command == false    # Execute event command
      @index += 1                           # Advance index
    end
  end
end

class Spriteset_Map
 
  def on_partner
    if $partners == []
      on_partner_
    end
    $game_switches[$PARTNER_SWITCH] = true
    for i in 0...$partners.size
      partner = $partners[i].character
      partner.refresh_
    end
  end
 
  def on_partner_
    size = $game_party.members.size - 1
    size = $OVERWORLD_MAX == 0 ? size : $OVERWORLD_MAX
    while size > 0
      actor = $game_party.members[size]
      $partners.push(Sprite_Character.new(@viewport1, Game_Partner.new(@viewport1, actor.id)))
      size -= 1
    end
    $partners.reverse!
  end
 
  def off_partner
    $game_switches[$PARTNER_SWITCH] = false
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = []
  end
 
  def update_partners
    for sprite in $partners
      sprite.update
    end
    for partner in $partners
      partner.character.update
    end
  end
 
  alias update_partner update
  def update
    update_partners if $partners != nil
    update_partner
  end
 
  alias dispose_partner dispose
  def dispose
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = nil
    dispose_partner
  end
 
  def create_characters
    $partners = []
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    for vehicle in $game_map.vehicles
      sprite = Sprite_Character.new(@viewport1, vehicle)
      @character_sprites.push(sprite)
    end
    on_partner_
    on_partner if $game_switches[$PARTNER_SWITCH]
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  end
   
end

class Game_Player < Game_Character
 
  attr_accessor :move_speed
 
  def increase_steps
    @stop_count = 0
    update_bush_depth
    if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.perform_action
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.copy_move.shift
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move Down
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_down(turn_ok = true)
    if passable?(@x, @y+1)                  # Passable
      turn_down
      @y = $game_map.round_y(@y+1)
      @real_y = (@y-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_down")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_down if turn_ok
      check_event_trigger_touch(@x, @y+1)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Left
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_left(turn_ok = true)
    if passable?(@x-1, @y)                  # Passable
      turn_left
      @x = $game_map.round_x(@x-1)
      @real_x = (@x+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_left")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_left if turn_ok
      check_event_trigger_touch(@x-1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Right
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_right(turn_ok = true)
    if passable?(@x+1, @y)                  # Passable
      turn_right
      @x = $game_map.round_x(@x+1)
      @real_x = (@x-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_right")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_right if turn_ok
      check_event_trigger_touch(@x+1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move up
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_up(turn_ok = true)
    if passable?(@x, @y-1)                  # Passable
      turn_up
      @y = $game_map.round_y(@y-1)
      @real_y = (@y+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_up")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_up if turn_ok
      check_event_trigger_touch(@x, @y-1)   # Touch event is triggered?
      @move_failed = true
    end
  end
end

class Scene_Map < Scene_Base
  attr_accessor :spriteset
end



_________________
Super Mario RPG
Working on:Maps :P
Online
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.0
PostPosted: Fri Feb 03, 2012 11:05 am 
Junior Member
Junior Member
User avatar

Joined: Thu Jun 24, 2010 11:29 am
Posts: 37
MarioSuperStar wrote:
Updated VX Caterpillar System:

#==============================================================================
# ** Partner System VX Version 1.2
#    By MarioSuperStar
#    Give credit if used
#==============================================================================

#==============================================================================
# ** Settings
# $ACTION_VAR = variable to select partner to process
# =============================================================================

$ACTION_VAR = 2 #Variable indicating who performs the Set Move Route event command
                # When the target is Player. If $ACTION_VAR is equal to -1, the
                # character performing the move route will be the player.
                # If $ACTION_VAR is greater than -1, it uses the partner with
                # the position number of $ACTION_VAR. Example: 0 is the first
                #partner member, being the second person in the party.
$PARTNER_SWITCH = 1 # Switch that is activated when partners are displayed on the map.
$OVERWORLD_MAX = 1 # Max number of party memebers displayed in the map. 0 = all the party members.

class Game_Character
  attr_accessor :move_route
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================

class Game_Partner < Game_Character
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :actor_id
  attr_accessor :interpreter
  attr_accessor :copy_move
  attr_accessor :transparent
  attr_accessor :index
  attr_accessor :align
  attr_accessor :fx
  attr_accessor :fy
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     map_id : map ID
  #     event  : event (RPG::Event)
  #--------------------------------------------------------------------------
  def initialize(map_id, actor_id)
    super()
    @transparent = false
    @map_id = $game_map.map_id
    @actor_id = actor_id
    actor = $game_actors[actor_id]
    @index = actor.index - 1
    @id = 0 - actor.index
    @anime_count = 0
    @playing_move_route = false
    @through = false
    @walk_anime = true
    @interpreter = nil
    @align = false
    @fx = 0
    @fy = 0
    refresh
  end
 
  def perform_action
    action = @copy_move[0]
    case action
    when "move_down"
      move_down
    when "move_left"
      move_left
    when "move_right"
      move_right
    when "move_up"
      move_up
    end
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
      @copy_move.push(player.copy_move[0])
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_x
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + 1
    when 6
      return player.x - 1
    when 8
      return player.x
    end
  end
 
  def formulate_y
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + 1
    when 2
      return player.y - 1
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xxx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    player = $game_player
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + (1 * index)
    when 6
      return player.x - (1 * index)
    when 8
      return player.x
    end
  end
 
  def formulate_yyy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + (1 * index)
    when 2
      return player.y - (1 * index)
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x
    when 6
      return player.x
    when 8
      return player.x
    end
  end
 
  def formulate_yy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y
    when 2
      return player.y
    when 6
      return player.y
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
  end
 
 
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def passable?(x, y, passable = false)
    x = $game_map.round_x(x)                        # Horizontal loop adj.
    y = $game_map.round_y(y)                        # Vertical loop adj.
    return false unless $game_map.valid?(x, y)      # Outside map?
    return true if @through or debug_through?       # Through ON?
    return false unless map_passable?(x, y)         # Map Impassable?
    return false if collide_with_characters?(x, y, passable)  # Collide with character?
    return true                                     # Passable
  end
 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh_
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
    if passable?(formulate_x, formulate_y, true)
      moveto(formulate_x, formulate_y)            # Move to initial position
    elsif passable?(formulate_xx-1, formulate_yy, true)
      moveto(formulate_xx - 1, formulate_yy)
    elsif passable?(formulate_xx+1, formulate_yy, true)
      moveto(formulate_xx+1, formulate_yy)
    elsif passable?(formulate_xx, formulate_yy-1, true)
      moveto(formulate_xx, formulate_yy-1)
    elsif passable?(formulate_xx, formulate_yy+1, true)
      moveto(formulate_xx, formulate_yy+1)
    end
    p ""
    turn_toward_point(formulate_xx, formulate_yy)
    mov = "move_down" if @direction == 2
    mov = "move_left" if @direction == 4
    mov = "move_right" if @direction == 6
    mov = "move_up" if @direction == 8
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
    end
    @direction = player.direction
    @copy_move = [mov]
  end
 
  def check_event_trigger_touch(x = 0, y = 0)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    return if $partners == nil
    @playing_move_route = false if $game_player.move_route == nil
    return if @playing_move_route
    return @playing_move_route = true && move_route_forcing($game_player.move_route) if $game_player.move_route != nil
    through = false
    return if moving?
    if @interpreter != nil                      # Now parallel processing?
      @interpreter.update                       # Update interpreter
      return
    end
    if @align
      @move_speed = 5
      move_toward_point(@fx, @fy)
    end
    return if $game_map.interpreter.running?
  end
  #--------------------------------------------------------------------------
  # * Turn toward Player
  #--------------------------------------------------------------------------
  def turn_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx.abs > sy.abs                    # Horizontal distance is longer
      sx > 0 ? turn_left : turn_right
    elsif sx.abs < sy.abs                 # Vertical distance is longer
      sy > 0 ? turn_up : turn_down
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move toward Player
  #--------------------------------------------------------------------------
  def move_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs                  # Horizontal distance is longer
        sx > 0 ? move_left : move_right   # Prioritize left-right
        if @move_failed and sy != 0
          sy > 0 ? move_up : move_down
        end
      else                             # Vertical distance is longer
        sy > 0 ? move_up : move_down      # Prioritize up-down
        if @move_failed and sx != 0
          sx > 0 ? move_left : move_right
        end
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update While Stopped
  #--------------------------------------------------------------------------
  def update_stop
    return if $partners == nil
    if @x == @fx and @y == @fy and @align
      @align = false
      @move_speed = $game_player.move_speed
      turn_toward_point(formulate_xx, formulate_yy)
      mov = "move_down" if @direction == 2
      mov = "move_left" if @direction == 4
      mov = "move_right" if @direction == 6
      mov = "move_up" if @direction == 8
      @copy_move = [mov]
    end
    if $game_switches[$PARTNER_SWITCH] and @align == false
      turn_toward_point(formulate_xx, formulate_yy)
    end
    if @step_anime
      @anime_count += 1
    elsif @pattern != @original_pattern
      @anime_count += 1.5
    end
    @stop_count += 1 unless @locked
  end
 
  #--------------------------------------------------------------------------
  # * Calculate X Distance From Player
  #--------------------------------------------------------------------------
  def distance_x_from_point(x)
    sx = @x - x
    if $game_map.loop_horizontal?         # When looping horizontally
      if sx.abs > $game_map.width / 2     # Larger than half the map width?
        sx -= $game_map.width             # Subtract map width
      end
    end
    return sx
  end
  #--------------------------------------------------------------------------
  # * Calculate Y Distance From Player
  #--------------------------------------------------------------------------
  def distance_y_from_point(y)
    sy = @y - y
    if $game_map.loop_vertical?           # When looping vertically
      if sy.abs > $game_map.height / 2    # Larger than half the map height?
        sy -= $game_map.height            # Subtract map height
      end
    end
    return sy
  end
 
  #--------------------------------------------------------------------------
  # * Determine Character Collision
  #     x : x-coordinate
  #     y : y-coordinate
  #    Detects normal character collision, including the player and vehicles.
  #--------------------------------------------------------------------------
  def collide_with_characters?(x, y, passable = false)
    for event in $game_map.events_xy(x, y)          # Matches event position
      unless event.through                          # Passage OFF?
        return true if self.is_a?(Game_Event)       # Self is event
        return true if event.priority_type == 1     # Target is normal char
      end
    end
    if passable == true
      if @priority_type == 1                          # Self is normal char
        return true if $game_player.pos_nt?(x, y)     # Matches player position
        return true if $game_map.boat.pos_nt?(x, y)   # Matches boat position
        return true if $game_map.ship.pos_nt?(x, y)   # Matches ship position
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        actor = $game_actors[@actor_id]
        index = actor.index - 1
        return true if partner.pos_nt?(x, y) and (partner != $partners[index].character)
      end
    end
    return false
  end
 
  def distance_x_from_player
    return @x - formulate_x
  end
 
  def distance_y_from_player
    return @y - formulate_y
  end
end

class Scene_Map
  attr_accessor :spriteset
  #--------------------------------------------------------------------------
  # * Player Transfer  Processing
  #--------------------------------------------------------------------------
  def update_transfer_player
    return unless $game_player.transfer?
    fade = (Graphics.brightness > 0)
    fadeout(30) if fade
    partner_flag = @spriteset.partners != nil
    @spriteset.dispose              # Dispose of sprite set
    $game_player.perform_transfer   # Execute player transfer
    $game_map.autoplay              # Automatically switch BGM and BGS
    $game_map.update
    Graphics.wait(15)
    @spriteset = Spriteset_Map.new  # Recreate sprite set
    @spriteset.on_partner if partner_flag
    fadein(30) if fade
    Input.update
  end
end

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Get Character
  #     parameter : parameter
  #--------------------------------------------------------------------------
  def get_character(parameter)
    # Branch by parameter
    case parameter
    when -1   # Player
      if $partners != nil
        partners = $partners
        partner = $partners[$game_variables[$ACTION_VAR]]
        partner = partner.character
      end
      return partner == nil ? nil : partner if $game_variables[$ACTION_VAR] > -1 and $partners != nil
      return $game_player
    when 0  # this event
      events = $game_map.events
      return events == nil ? nil : events[@event_id]
    else  # specific event
      events = $game_map.events
      return events == nil ? nil : events[parameter]
    end
  end
 
  def align_partners
    @x_vals = []
    @y_vals = []
    for i in 0...$partners.size
      partner = $partners[i].character
      partner_ = $partners[i-1].character
      partner.align = true
      if partner.passable?(partner.formulate_xxx, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx-1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx - 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx+1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx + 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy-1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy - 1
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy+1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy + 1
      end
      if @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy)
        val = false
        unless @x_vals.include?(partner.fx-1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx-1, partner.fy, true)
            partner.fx = partner.fx - 1
            partner.fy = partner.fy
            val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx+1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx+1, partner.fy, true)
          partner.fx = partner.fx + 1
          partner.fy = partner.fy
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy-1)
          if partner.passable?(partner.fx, partner.fy-1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy - 1
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy+1)
          if partner.passable?(partner.fx, partner.fy+1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy + 1
          val = true
          end
        end
      else
        @x_vals.push(partner.fx)
        @y_vals.push(partner.fy)
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    loop do
      if $game_map.map_id != @map_id        # Map is different?
        @event_id = 0                       # Make event ID 0
      end
      val = false
      if $game_switches[$PARTNER_SWITCH] and $partners != nil
      for i in 0...$partners.size
        partner = $partners[i].character
        if partner.align == true
          val = true
        end
      end
      end
      return if val == true
      if @child_interpreter != nil          # If child interpreter exists
        @child_interpreter.update           # Update child interpreter
        if @child_interpreter.running?      # If running
          return                            # Return
        else                                # After execution has finished
          @child_interpreter = nil          # Erase child interpreter
        end
      end
      if @message_waiting                   # Waiting for message finish
        return
      end
      if @moving_character != nil           # Waiting for move to finish
        if @moving_character.move_route_forcing
          return
        end
        @moving_character = nil
      end
      if @wait_count > 0                    # Waiting
        @wait_count -= 1
        return
      end
      if $game_troop.forcing_battler != nil # Forcing battle action
        return
      end
      if $game_temp.next_scene != nil       # Opening screens
        return
      end
      if @list == nil                       # If content list is empty
        setup_starting_event if @main       # Set up starting event
        return if @list == nil              # Nothing was set up
      end
      return if execute_command == false    # Execute event command
      @index += 1                           # Advance index
    end
  end
end

class Spriteset_Map
 
  def on_partner
    if $partners == []
      on_partner_
    end
    $game_switches[$PARTNER_SWITCH] = true
    for i in 0...$partners.size
      partner = $partners[i].character
      partner.refresh_
    end
  end
 
  def on_partner_
    size = $game_party.members.size - 1
    size = $OVERWORLD_MAX == 0 ? size : $OVERWORLD_MAX
    while size > 0
      actor = $game_party.members[size]
      $partners.push(Sprite_Character.new(@viewport1, Game_Partner.new(@viewport1, actor.id)))
      size -= 1
    end
    $partners.reverse!
  end
 
  def off_partner
    $game_switches[$PARTNER_SWITCH] = false
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = []
  end
 
  def update_partners
    for sprite in $partners
      sprite.update
    end
    for partner in $partners
      partner.character.update
    end
  end
 
  alias update_partner update
  def update
    update_partners if $partners != nil
    update_partner
  end
 
  alias dispose_partner dispose
  def dispose
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = nil
    dispose_partner
  end
 
  def create_characters
    $partners = []
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    for vehicle in $game_map.vehicles
      sprite = Sprite_Character.new(@viewport1, vehicle)
      @character_sprites.push(sprite)
    end
    on_partner_
    on_partner if $game_switches[$PARTNER_SWITCH]
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  end
   
end

class Game_Player < Game_Character
 
  attr_accessor :move_speed
 
  def increase_steps
    @stop_count = 0
    update_bush_depth
    if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.perform_action
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.copy_move.shift
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move Down
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_down(turn_ok = true)
    if passable?(@x, @y+1)                  # Passable
      turn_down
      @y = $game_map.round_y(@y+1)
      @real_y = (@y-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_down")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_down if turn_ok
      check_event_trigger_touch(@x, @y+1)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Left
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_left(turn_ok = true)
    if passable?(@x-1, @y)                  # Passable
      turn_left
      @x = $game_map.round_x(@x-1)
      @real_x = (@x+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_left")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_left if turn_ok
      check_event_trigger_touch(@x-1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Right
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_right(turn_ok = true)
    if passable?(@x+1, @y)                  # Passable
      turn_right
      @x = $game_map.round_x(@x+1)
      @real_x = (@x-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_right")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_right if turn_ok
      check_event_trigger_touch(@x+1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move up
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_up(turn_ok = true)
    if passable?(@x, @y-1)                  # Passable
      turn_up
      @y = $game_map.round_y(@y-1)
      @real_y = (@y+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_up")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_up if turn_ok
      check_event_trigger_touch(@x, @y-1)   # Touch event is triggered?
      @move_failed = true
    end
  end
end

class Scene_Map < Scene_Base
  attr_accessor :spriteset
end

Thanks. This will be useful for my game!
edit: for some reason, whenever I try to run my game, it returns this error:
http://i.imgur.com/HoeqV.png
line 56 is:
@index = actor.index - 1


Offline
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.2
PostPosted: Sat Feb 04, 2012 12:39 am 
Senior Member
Senior Member
User avatar

Joined: Sun Nov 01, 2009 7:38 pm
Posts: 4144
Does the index need to be subtracted here:
EDIT: nvm


Offline
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.2
PostPosted: Sat Feb 04, 2012 12:54 pm 
Senior Member
Senior Member
User avatar

Joined: Mon Jun 28, 2010 5:55 pm
Posts: 1144
Location: Look somewhere else...
How many members do you have in your party when this error occurs?



_________________
Super Mario RPG
Working on:Maps :P
Online
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.2
PostPosted: Sat Feb 04, 2012 4:41 pm 
Junior Member
Junior Member
User avatar

Joined: Thu Jun 24, 2010 11:29 am
Posts: 37
MarioSuperStar wrote:
How many members do you have in your party when this error occurs?
One. It's when I select 'New Game'.


Offline
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.2
PostPosted: Sun Feb 05, 2012 10:30 am 
Senior Member
Senior Member
User avatar

Joined: Mon Jun 28, 2010 5:55 pm
Posts: 1144
Location: Look somewhere else...
An update is coming, so I suggest you to wait until that. It won't take long.



_________________
Super Mario RPG
Working on:Maps :P
Online
 Profile  
 
 Post subject: Re: Caterpillar System XP 1.1 and VX 1.2
PostPosted: Sun Feb 05, 2012 10:51 am 
Senior Member
Senior Member
User avatar

Joined: Mon Jun 28, 2010 5:55 pm
Posts: 1144
Location: Look somewhere else...
#==============================================================================
# ** Partner System VX Version 1.3 Build
#    By MarioSuperStar
#    Give credit if used
#==============================================================================

#==============================================================================
# ** Settings
# $ACTION_VAR = variable to select partner to process
# =============================================================================

$ACTION_VAR = 2 #Variable indicating who performs the Set Move Route event command
                # When the target is Player. If $ACTION_VAR is equal to -1, the
                # character performing the move route will be the player.
                # If $ACTION_VAR is greater than -1, it uses the partner with
                # the position number of $ACTION_VAR. Example: 0 is the first
                #partner member, being the second person in the party.
$PARTNER_SWITCH = 1 # Switch that is activated when partners are displayed on the map.
$OVERWORLD_MAX = 1 # Max number of party memebers displayed in the map. 0 = all the party members.
$SHOW_AT_STARTUP = true #Show partners at startup.

class Game_Character
  attr_accessor :move_route
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================

class Game_Partner < Game_Character
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :actor_id
  attr_accessor :interpreter
  attr_accessor :copy_move
  attr_accessor :transparent
  attr_accessor :index
  attr_accessor :align
  attr_accessor :fx
  attr_accessor :fy
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     map_id : map ID
  #     event  : event (RPG::Event)
  #--------------------------------------------------------------------------
  def initialize(map_id, actor_id)
    super()
    @transparent = false
    @map_id = $game_map.map_id
    @actor_id = actor_id
    actor = $game_actors[actor_id]
    @index = actor.index - 1
    @id = 0 - actor.index
    @anime_count = 0
    @playing_move_route = false
    @through = false
    @walk_anime = true
    @interpreter = nil
    @align = false
    @fx = 0
    @fy = 0
    refresh
  end
 
  def perform_action
    action = @copy_move[0]
    case action
    when "move_down"
      move_down
    when "move_left"
      move_left
    when "move_right"
      move_right
    when "move_up"
      move_up
    end
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
      @copy_move.push(player.copy_move[0])
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_x
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + 1
    when 6
      return player.x - 1
    when 8
      return player.x
    end
  end
 
  def formulate_y
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + 1
    when 2
      return player.y - 1
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xxx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    player = $game_player
    case player.direction
    when 2
      return player.x
    when 4
      return player.x + (1 * index)
    when 6
      return player.x - (1 * index)
    when 8
      return player.x
    end
  end
 
  def formulate_yyy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    case player.direction
    when 4
      return player.y
    when 8
      return player.y + (1 * index)
    when 2
      return player.y - (1 * index)
    when 6
      return player.y
    end
  end
 
  #--------------------------------------------------------------------------
  # * Formulate Starting Coordinates
  #--------------------------------------------------------------------------
  def formulate_xx
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 2
      return player.x
    when 4
      return player.x
    when 6
      return player.x
    when 8
      return player.x
    end
  end
 
  def formulate_yy
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index-1].character
    else
      player = $game_player
    end
    case player.direction
    when 4
      return player.y
    when 8
      return player.y
    when 2
      return player.y
    when 6
      return player.y
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
  end
 
 
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def passable?(x, y, passable = false)
    x = $game_map.round_x(x)                        # Horizontal loop adj.
    y = $game_map.round_y(y)                        # Vertical loop adj.
    return false unless $game_map.valid?(x, y)      # Outside map?
    return true if @through or debug_through?       # Through ON?
    return false unless map_passable?(x, y)         # Map Impassable?
    return false if collide_with_characters?(x, y, passable)  # Collide with character?
    return true                                     # Passable
  end
 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh_
    actor = $game_actors[@actor_id]
    index = actor.index
    if $game_party.members.size == 0 and $game_party.members[index] == nil
      @character_name = ""
      @character_index = 0
    else
      if $game_party.members[index] != nil
        @character_name = actor.character_name
        @character_index = actor.character_index
      end
    end
    if passable?(formulate_x, formulate_y, true)
      moveto(formulate_x, formulate_y)            # Move to initial position
    elsif passable?(formulate_xx-1, formulate_yy, true)
      moveto(formulate_xx - 1, formulate_yy)
    elsif passable?(formulate_xx+1, formulate_yy, true)
      moveto(formulate_xx+1, formulate_yy)
    elsif passable?(formulate_xx, formulate_yy-1, true)
      moveto(formulate_xx, formulate_yy-1)
    elsif passable?(formulate_xx, formulate_yy+1, true)
      moveto(formulate_xx, formulate_yy+1)
    end
    turn_toward_point(formulate_xx, formulate_yy)
    mov = "move_down" if @direction == 2
    mov = "move_left" if @direction == 4
    mov = "move_right" if @direction == 6
    mov = "move_up" if @direction == 8
    player = $game_player
    actor = $game_actors[@actor_id]
    index = actor.index
    index -= 1
    if index > 0
      player = $partners[index - 1].character
    end
    @direction = player.direction
    @copy_move = [mov]
    @transparent = false
  end
 
  def check_event_trigger_touch(x = 0, y = 0)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    return if $partners == nil
    @playing_move_route = false if $game_player.move_route == nil
    return if @playing_move_route
    return @playing_move_route = true && move_route_forcing($game_player.move_route) if $game_player.move_route != nil
    through = false
    return if moving?
    if @interpreter != nil                      # Now parallel processing?
      @interpreter.update                       # Update interpreter
      return
    end
    if @align
      @move_speed = 5
      move_toward_point(@fx, @fy)
    end
    return if $game_map.interpreter.running?
  end
  #--------------------------------------------------------------------------
  # * Turn toward Player
  #--------------------------------------------------------------------------
  def turn_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx.abs > sy.abs                    # Horizontal distance is longer
      sx > 0 ? turn_left : turn_right
    elsif sx.abs < sy.abs                 # Vertical distance is longer
      sy > 0 ? turn_up : turn_down
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move toward Player
  #--------------------------------------------------------------------------
  def move_toward_point(x, y)
    sx = distance_x_from_point(x)
    sy = distance_y_from_point(y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs                  # Horizontal distance is longer
        sx > 0 ? move_left : move_right   # Prioritize left-right
        if @move_failed and sy != 0
          sy > 0 ? move_up : move_down
        end
      else                             # Vertical distance is longer
        sy > 0 ? move_up : move_down      # Prioritize up-down
        if @move_failed and sx != 0
          sx > 0 ? move_left : move_right
        end
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update While Stopped
  #--------------------------------------------------------------------------
  def update_stop
    return if $partners == nil
    if @x == @fx and @y == @fy and @align
      @align = false
      @move_speed = $game_player.move_speed
      turn_toward_point(formulate_xx, formulate_yy)
      mov = "move_down" if @direction == 2
      mov = "move_left" if @direction == 4
      mov = "move_right" if @direction == 6
      mov = "move_up" if @direction == 8
      @copy_move = [mov]
    end
    if $game_switches[$PARTNER_SWITCH] and @align == false
      turn_toward_point(formulate_xx, formulate_yy)
    end
    if @step_anime
      @anime_count += 1
    elsif @pattern != @original_pattern
      @anime_count += 1.5
    end
    @stop_count += 1 unless @locked
  end
 
  #--------------------------------------------------------------------------
  # * Calculate X Distance From Player
  #--------------------------------------------------------------------------
  def distance_x_from_point(x)
    sx = @x - x
    if $game_map.loop_horizontal?         # When looping horizontally
      if sx.abs > $game_map.width / 2     # Larger than half the map width?
        sx -= $game_map.width             # Subtract map width
      end
    end
    return sx
  end
  #--------------------------------------------------------------------------
  # * Calculate Y Distance From Player
  #--------------------------------------------------------------------------
  def distance_y_from_point(y)
    sy = @y - y
    if $game_map.loop_vertical?           # When looping vertically
      if sy.abs > $game_map.height / 2    # Larger than half the map height?
        sy -= $game_map.height            # Subtract map height
      end
    end
    return sy
  end
 
  #--------------------------------------------------------------------------
  # * Determine Character Collision
  #     x : x-coordinate
  #     y : y-coordinate
  #    Detects normal character collision, including the player and vehicles.
  #--------------------------------------------------------------------------
  def collide_with_characters?(x, y, passable = false)
    for event in $game_map.events_xy(x, y)          # Matches event position
      unless event.through                          # Passage OFF?
        return true if self.is_a?(Game_Event)       # Self is event
        return true if event.priority_type == 1     # Target is normal char
      end
    end
    if passable == true
      if @priority_type == 1                          # Self is normal char
        return true if $game_player.pos_nt?(x, y)     # Matches player position
        return true if $game_map.boat.pos_nt?(x, y)   # Matches boat position
        return true if $game_map.ship.pos_nt?(x, y)   # Matches ship position
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        actor = $game_actors[@actor_id]
        index = actor.index - 1
        return true if partner.pos_nt?(x, y) and (partner != $partners[index].character)
      end
    end
    return false
  end
 
  def distance_x_from_player
    return @x - formulate_x
  end
 
  def distance_y_from_player
    return @y - formulate_y
  end
end

class Scene_Map
  attr_accessor :spriteset
  #--------------------------------------------------------------------------
  # * Player Transfer  Processing
  #--------------------------------------------------------------------------
  def update_transfer_player
    return unless $game_player.transfer?
    fade = (Graphics.brightness > 0)
    fadeout(30) if fade
    partner_flag = @spriteset.partners != nil
    @spriteset.dispose              # Dispose of sprite set
    $game_player.perform_transfer   # Execute player transfer
    $game_map.autoplay              # Automatically switch BGM and BGS
    $game_map.update
    Graphics.wait(15)
    @spriteset = Spriteset_Map.new  # Recreate sprite set
    @spriteset.on_partner if partner_flag
    fadein(30) if fade
    Input.update
  end
end

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Get Character
  #     parameter : parameter
  #--------------------------------------------------------------------------
  def get_character(parameter)
    # Branch by parameter
    case parameter
    when -1   # Player
      if $partners != nil
        partners = $partners
        partner = $partners[$game_variables[$ACTION_VAR]]
        partner = partner.character
      end
      return partner == nil ? nil : partner if $game_variables[$ACTION_VAR] > -1 and $partners != nil
      return $game_player
    when 0  # this event
      events = $game_map.events
      return events == nil ? nil : events[@event_id]
    else  # specific event
      events = $game_map.events
      return events == nil ? nil : events[parameter]
    end
  end
 
  def align_partners
    @x_vals = []
    @y_vals = []
    for i in 0...$partners.size
      partner = $partners[i].character
      partner_ = $partners[i-1].character
      partner.align = true
      if partner.passable?(partner.formulate_xxx, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx-1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx - 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx+1, partner.formulate_yyy, true)
        partner.fx = partner.formulate_xxx + 1
        partner.fy = partner.formulate_yyy
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy-1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy - 1
      elsif partner.passable?(partner.formulate_xxx, partner.formulate_yyy+1, true)
        partner.fx = partner.formulate_xxx
        partner.fy = partner.formulate_yyy + 1
      end
      if @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy)
        val = false
        unless @x_vals.include?(partner.fx-1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx-1, partner.fy, true)
            partner.fx = partner.fx - 1
            partner.fy = partner.fy
            val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx+1) and @y_vals.include?(partner.fy)
          if partner.passable?(partner.fx+1, partner.fy, true)
          partner.fx = partner.fx + 1
          partner.fy = partner.fy
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy-1)
          if partner.passable?(partner.fx, partner.fy-1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy - 1
          val = true
          end
        end
        return if val
        unless @x_vals.include?(partner.fx) and @y_vals.include?(partner.fy+1)
          if partner.passable?(partner.fx, partner.fy+1, true)
          partner.fx = partner.fx
          partner.fy = partner.fy + 1
          val = true
          end
        end
      else
        @x_vals.push(partner.fx)
        @y_vals.push(partner.fy)
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    loop do
      if $game_map.map_id != @map_id        # Map is different?
        @event_id = 0                       # Make event ID 0
      end
      val = false
      if $game_switches[$PARTNER_SWITCH] and $partners != nil
      for i in 0...$partners.size
        partner = $partners[i].character
        if partner.align == true
          val = true
        end
      end
      end
      return if val == true
      if @child_interpreter != nil          # If child interpreter exists
        @child_interpreter.update           # Update child interpreter
        if @child_interpreter.running?      # If running
          return                            # Return
        else                                # After execution has finished
          @child_interpreter = nil          # Erase child interpreter
        end
      end
      if @message_waiting                   # Waiting for message finish
        return
      end
      if @moving_character != nil           # Waiting for move to finish
        if @moving_character.move_route_forcing
          return
        end
        @moving_character = nil
      end
      if @wait_count > 0                    # Waiting
        @wait_count -= 1
        return
      end
      if $game_troop.forcing_battler != nil # Forcing battle action
        return
      end
      if $game_temp.next_scene != nil       # Opening screens
        return
      end
      if @list == nil                       # If content list is empty
        setup_starting_event if @main       # Set up starting event
        return if @list == nil              # Nothing was set up
      end
      return if execute_command == false    # Execute event command
      @index += 1                           # Advance index
    end
  end
end

class Spriteset_Map
 
  def on_partner
    return if $game_party.members.size == 1
    if $partners == []
      on_partner_
    end
    $game_switches[$PARTNER_SWITCH] = true
    for i in 0...$partners.size
      partner = $partners[i].character
      partner.refresh_
    end
  end
 
  def on_partner_
    return if $game_party.members.size == 1
    size = $game_party.members.size - 1
    size = $OVERWORLD_MAX == 0 ? size : $OVERWORLD_MAX
    while size > 0
      actor = $game_party.members[size]
      $partners.push(Sprite_Character.new(@viewport1, Game_Partner.new(@viewport1, actor.id)))
      size -= 1
    end
    for i in 0...$partners.size
      partner = $partners[i].character
      partner.transparent = true
    end
    $partners.reverse!
  end
 
  def off_partner
    $game_switches[$PARTNER_SWITCH] = false
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = []
  end
 
  def update_partners
    for sprite in $partners
      sprite.update
    end
    for partner in $partners
      partner.character.update
    end
  end
 
  alias update_partner update
  def update
    update_partners if $partners != nil
    update_partner
  end
 
  alias dispose_partner dispose
  def dispose
    return if $partners == nil
    for sprite in $partners
      sprite.dispose
    end
    $partners = nil
    dispose_partner
  end
 
  def create_characters
    $partners = []
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    for vehicle in $game_map.vehicles
      sprite = Sprite_Character.new(@viewport1, vehicle)
      @character_sprites.push(sprite)
    end
    on_partner_
    on_partner if $game_switches[$PARTNER_SWITCH] or $SHOW_AT_STARTUP
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  end
   
end

class Game_Player < Game_Character
 
  attr_accessor :move_speed
 
  def increase_steps
    @stop_count = 0
    update_bush_depth
    if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.perform_action
      end
      for i in 0...$partners.size
        partner = $partners[i].character
        partner.copy_move.shift
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move Down
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_down(turn_ok = true)
    if passable?(@x, @y+1)                  # Passable
      turn_down
      @y = $game_map.round_y(@y+1)
      @real_y = (@y-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_down")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_down if turn_ok
      check_event_trigger_touch(@x, @y+1)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Left
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_left(turn_ok = true)
    if passable?(@x-1, @y)                  # Passable
      turn_left
      @x = $game_map.round_x(@x-1)
      @real_x = (@x+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_left")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_left if turn_ok
      check_event_trigger_touch(@x-1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move Right
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_right(turn_ok = true)
    if passable?(@x+1, @y)                  # Passable
      turn_right
      @x = $game_map.round_x(@x+1)
      @real_x = (@x-1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_right")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_right if turn_ok
      check_event_trigger_touch(@x+1, @y)   # Touch event is triggered?
      @move_failed = true
    end
  end
  #--------------------------------------------------------------------------
  # * Move up
  #     turn_ok : Allows change of direction on the spot
  #--------------------------------------------------------------------------
  def move_up(turn_ok = true)
    if passable?(@x, @y-1)                  # Passable
      turn_up
      @y = $game_map.round_y(@y-1)
      @real_y = (@y+1)*256
      if $game_switches[$PARTNER_SWITCH] and @move_route_forcing == false
        $partners[0].character.copy_move.push("move_up")
      end
      increase_steps
      @move_failed = false
    else                                    # Impassable
      turn_up if turn_ok
      check_event_trigger_touch(@x, @y-1)   # Touch event is triggered?
      @move_failed = true
    end
  end
end

class Scene_Map < Scene_Base
  attr_accessor :spriteset
end



_________________
Super Mario RPG
Working on:Maps :P
Online
 Profile  
 
Display posts from previous:  Sort by  
 Page 2 of 2 [ 19 posts ]  Go to page Previous  1, 2

All times are UTC - 6 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  


suspicion-preferred