RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
Move Event with Player

0 Members and 1 Guest are viewing this topic.

pokeball TDSOffline
***
Rep:
Level 84
-T D S-
Silver - GIAW 11 (Hard)Silver - Game In A Week VII
Move Event with Player
Version: 1.0
Author: TDS
Date: January 19, 2013

Version History


  • <Version 1.0> 2013.01.19 - Public Release

Description


This script makes events move whenever the player moves, it also allows them to mimic the player or do the opposite.

Features

  • Move when the player moves.
  • Mimic Player normal or opposite movements. (If the Player moves up event moves down.)
  • Set custom mimic directions. (If the Player moves up event moves left.)

Instructions

Instructions are on the script.

Script


Code: [Select]
#==============================================================================
# ** TDS Move Event With Player
#    Ver: 1.0
#------------------------------------------------------------------------------
#  * Description:
#  This script makes events move whenever the player moves, it also allows them
#  to mimic the player or do the opposite.
#------------------------------------------------------------------------------
#  * Features:
#  Move when the player moves.
#  Mimic Player normal or opposite movements. (If the Player moves up event moves down)
#  Set custom mimic directions. (If the Player moves up event moves left)
#------------------------------------------------------------------------------
#  * Instructions:
#
#  To make an event move whenever the player moves add this to a comment in the
#  events page.
#
#    <Move_With_Player(: Steps)>
#
#    Steps = Amount of steps to move when the player moves. (Optional)
#    Example: <Move_With_Player> or <Move_With_Player: 3>
#
#------------------------------------------------------------------------------
#  Move Tags:
#    These tags provide optional functionality to the event when the player
#    moves. If none of these tags are used the event will move based on its
#    movement type.
#------------------------------------------------------------------------------
#
#  <Player_Move_Step_Wait(: Steps)>
#    ^ Amount of steps the player has to take before the event moves. (Optional)
#    ^ Example: <Player_Move_Step_Wait> or <Player_Move_Step_Wait: 2>
#
#  <Mimic_Player_Movement>
#    ^ Makes the event move in the same direction as the player.
#
#  <Reverse_Mimic_Player_Movement>
#    ^ Makes the event move in the opposite direction as the player.
#
#  <Custom_Mimic_Direction_DIR: DIR>
#    ^ If mimicking the player's movement it change directions based on these.
#    ^ DIR should be changed to any of these (UP, LEFT, RIGHT, DOWN)
#    ^ Example: <Custom_Mimic_Direction_UP: DOWN>
#
#  <Match_Player_Speed(: Offset)>
#    ^ Will match the event speed to the players speed when the player moves.
#    ^ Offset is the amount of speed to add or remove when matching speed. (Optional)
#    ^ Example: <Match_Player_Speed> or <Match_Player_Speed: -1>
#
#  <Player_Move_Wait>
#    ^ Will make the player unable to move until the event is done moving.
#------------------------------------------------------------------------------
#  * Notes:
#  I suggest using the <Player_Move_Wait> since the player can move in ways that
#  can make the event fall behind in trying to catch up to the player.

#------------------------------------------------------------------------------
# WARNING:
#
# Do not release, distribute or change my work without my expressed written
# consent, doing so violates the terms of use of this work.
#
# If you really want to share my work please just post a link to the original
# site.
#
# * Not Knowing English or understanding these terms will not excuse you in any
#   way from the consequenses.
#==============================================================================
# * Import to Global Hash *
#==============================================================================
($imported ||= {})[:TDS_Move_Event_With_Player] = true


#==============================================================================
# ** Game_Temp
#------------------------------------------------------------------------------
#  This class handles temporary data that is not included with save data.
# The instance of this class is referenced by $game_temp.
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :player_move_events  # Array of Events Following Player Movements
  #--------------------------------------------------------------------------
  # * Alias Listing
  #-------------------------------------------------------------------------- 
  alias tds_move_event_with_player_game_temp_initialize            initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(*args, &block)
    # Run Original Method
    tds_move_event_with_player_game_temp_initialize(*args, &block)   
    # Initialize Player Move Events
    @player_move_events = []
  end
  #--------------------------------------------------------------------------
  # * Determine if Events are moving with the player
  #--------------------------------------------------------------------------
  def events_moving_with_player? ; !@player_move_events.empty? end
  #--------------------------------------------------------------------------
  # * Add Event Moving with Player
  #--------------------------------------------------------------------------
  def add_event_moving_with_player(event) ; @player_move_events << event if !@player_move_events.include?(event) end
  #--------------------------------------------------------------------------
  # * Remove Event Moving with Player
  #--------------------------------------------------------------------------
  def remove_event_moving_with_player(event) ; @player_move_events.delete(event) end
end


#==============================================================================
# ** Game_Player
#------------------------------------------------------------------------------
#  This class handles the player. It includes event starting determinants and
# map scrolling functions. The instance of this class is referenced by
# $game_player.
#==============================================================================

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # * Alias Listing
  #-------------------------------------------------------------------------- 
  alias tds_move_event_with_player_game_player_increase_steps   increase_steps
  alias tds_move_event_with_player_game_player_movable?         movable?
  alias tds_move_event_with_player_game_player_perform_transfer perform_transfer 
  #--------------------------------------------------------------------------
  # * Increase Steps
  #--------------------------------------------------------------------------
  def increase_steps(*args, &block)
    # If Normal Walk
    if normal_walk?
      # Move Events that move with the player
      $game_map.events.values.each {|e| e.move_with_player if e.move_with_player?}
    end
    # Run Original Method
    tds_move_event_with_player_game_player_increase_steps(*args, &block)
  end
  #--------------------------------------------------------------------------
  # * Determine if Movement is Possible
  #--------------------------------------------------------------------------
  def movable?(*args, &block)
    # Return False if there are events moving with the player
    return false if $game_temp.events_moving_with_player?
    # Run Original Method
    tds_move_event_with_player_game_player_movable?(*args, &block)
  end 
  #--------------------------------------------------------------------------
  # * Execute Player Transfer
  #--------------------------------------------------------------------------
  def perform_transfer(*args, &block)   
    # Clear Game Temp Events Moving with Player Array if Moving to a new map
    $game_temp.player_move_events.clear if transfer? and @new_map_id != $game_map.map_id
    # Run Original Method
    tds_move_event_with_player_game_player_perform_transfer(*args, &block)   
  end 
end


#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class handles events. Functions include event page switching via
#  condition determinants and running parallel process events. Used within the
#  Game_Map class.
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Constants (Structs)
  #--------------------------------------------------------------------------
  # Move With Player Settings
  Move_With_Player_Settings = Struct.new(:active, :steps, :original_steps,
  :step_wait, :original_step_wait, :mimic, :reverse_mimic, :custom_mimic,
  :match_speed, :match_speed_offset, :wait, :waiting, :direction, :speed) 
  #--------------------------------------------------------------------------
  # * Alias Listing
  #-------------------------------------------------------------------------- 
  alias tds_move_event_with_player_game_event_update_self_movement update_self_movement
  alias tds_move_event_with_player_game_event_clear_page_settings  clear_page_settings
  alias tds_move_event_with_player_game_event_setup_page_settings  setup_page_settings
  #--------------------------------------------------------------------------
  # * Determine if Event should move along with player
  #--------------------------------------------------------------------------
  def move_with_player? ; @move_with_player.active end 
  #--------------------------------------------------------------------------
  # * Update During Autonomous Movement
  #--------------------------------------------------------------------------
  def update_self_movement(*args, &block)   
    # Update Move With Player Movement if Moving with Player
    return update_move_with_player_movement if move_with_player?
    # Run Original Method
    tds_move_event_with_player_game_event_update_self_movement(*args, &block)
  end
  #--------------------------------------------------------------------------
  # * Update Move With Player Movement
  #--------------------------------------------------------------------------
  def update_move_with_player_movement
    # If not moving and Waiting Flag is true and there are no remaining steps
    if !moving? and @move_with_player.waiting and @move_with_player.steps <= 0
      # Remove Self to Array of Events Moving With Player
      $game_temp.remove_event_moving_with_player(self)
      # Set Move with Player Waiting flag to false
      @move_with_player.waiting = false
    end
   
    # Return if Moving or Move with Player remaining steps is 0 or less
    return if moving? or @move_with_player.steps <= 0 or @move_with_player.step_wait > 0
    # Decrease Move With Player Remaining Steps Counter   
    @move_with_player.steps -= 1
    # Reset Move With Player Step Wait     
    @move_with_player.step_wait = @move_with_player.original_step_wait
   
    # If Matching Player Movement Speed
    if @move_with_player.match_speed
      # Set Move Speed Adjusted by Offset
      @move_speed = (@move_with_player.speed + @move_with_player.match_speed_offset)
    end
   
    # If Mimicking Player Movement
    if @move_with_player.mimic
      # Get Player Direction
      direction = @move_with_player.direction
      # If Move With Player Custom Mimic Hash is not empty and Has Custom Direction
      if !@move_with_player.custom_mimic.empty? and @move_with_player.custom_mimic.has_key?(direction)
        # Set Direction
        direction = @move_with_player.custom_mimic[@move_with_player.direction]
      end
      # Move in the in direction
      return move_straight(direction)
    end
   
    # Move in Opposite Direction If Mimicking Player Movement in Reverse
    return move_straight(reverse_dir(@move_with_player.direction)) if @move_with_player.reverse_mimic
   
    # Move Type Case
    case @move_type
    when 1 ; move_type_random
    when 2 ; move_type_toward_player
    when 3
      # Update Move Route
      update_routine_move
      # Update Move Route if at Last Command (Prevents stop)
      update_routine_move if @move_route.list[@move_route_index].code == 0
    end   
  end
  #--------------------------------------------------------------------------
  # * Update During Autonomous Movement
  #--------------------------------------------------------------------------
  def move_with_player
    # Return if Move With Player Step Wait is more than 0
    return @move_with_player.step_wait -= 1 if @move_with_player.step_wait > 0
     # Return if moving or Have Steps Remaining
    return if moving? or @move_with_player.steps > 0
    # Reset Move With Player Steps
    @move_with_player.steps = @move_with_player.original_steps
    # Set Move With Player Direction (Direction when the player moved)
    @move_with_player.direction = $game_player.direction
    # Set Move With Player Speed
    @move_with_player.speed = $game_player.real_move_speed
    # If Wait flag is true
    if @move_with_player.wait
      # Add Self to Array of Events Moving With Player
      $game_temp.add_event_moving_with_player(self)
      # Set Move with player waiting flag
      @move_with_player.waiting = true
    end
  end
  #--------------------------------------------------------------------------
  # * Clear Event Page Settings
  #--------------------------------------------------------------------------
  def clear_page_settings(*args, &block)
    # Run Original Method
    tds_move_event_with_player_game_event_clear_page_settings(*args, &block)
    # Clear Move With Player Page Settings
    clear_move_with_player_page_settings
  end
  #--------------------------------------------------------------------------
  # * Clear Event Page Move with Player Settings
  #--------------------------------------------------------------------------
  def clear_move_with_player_page_settings
    # Create Move with Player Settings Struct
    @move_with_player = Move_With_Player_Settings.new
    # Set Move With Player Active Flag to false
    @move_with_player.active = false
   
    # Move With Player Speed Match Flag & Offset
    @move_with_player.match_speed = false ; @move_with_player.match_speed_offset = 0
   
    # Set Move With Player Mimic Flags
    @move_with_player.mimic = @move_with_player.reverse_mimic  = false
    # Clear Move With Player Custom Mimic Hash
    @move_with_player.custom_mimic = {}

    # Move With Player Step & Original Step values
    @move_with_player.steps = @move_with_player.original_steps = 0
    # Set Move With Player Step Wait & Original Step Wait values       
    @move_with_player.step_wait = @move_with_player.original_step_wait = 0   
   
    # Set Move With Player Diection & Speed
    @move_with_player.direction = 0 ; @move_with_player.speed = 0
    # Set Move With Player Wait and Waiting Flags
    @move_with_player.wait = @move_with_player.waiting = false
    # Remove Self to Array of Events Moving With Player
    $game_temp.remove_event_moving_with_player(self)   
  end
  #--------------------------------------------------------------------------
  # * Set Up Event Page Settings
  #--------------------------------------------------------------------------
  def setup_page_settings(*args, &block)
    # Run Original Method
    tds_move_event_with_player_game_event_setup_page_settings(*args, &block)
    # Setup Page Move With Player Settings
    setup_page_move_with_player_settings
  end
  #--------------------------------------------------------------------------
  # * Set Up Event Page Move With Player Settings
  #--------------------------------------------------------------------------
  def setup_page_move_with_player_settings
    # Clear Move With Player Page Settings
    clear_move_with_player_page_settings
    # Get All Page Comment Text
    comment_text = @list.select {|c| [108, 408].include? (c.code)}.collect {|c| c.parameters}.join
    # Return if Comment Text is empty
    return if comment_text.empty?   
    # Set Move With Player Active Flag to true if Text Flag exist
    @move_with_player.active = true if comment_text =~ /<Move_With_Player[:]?\s?(-?\d+)?>/i       
    # Set Move with Player Steps (Amount of steps to take per player move)
    @move_with_player.original_steps = $1.nil? ? 1 : $1.to_i

    # Return if Move With Player Flag is false
    return if !@move_with_player.active
   
    # Match Comment Text for Step Wait Values
    comment_text[/<Player_Move_Step_Wait: (\d+)>/i]
    @move_with_player.step_wait = @move_with_player.original_step_wait = $1.nil? ? 0 : $1.to_i
     
    # Set Move With Player Match Speed Flag to true if Text Flag exists   
    @move_with_player.match_speed = true if comment_text =~ /<Match_Player_Speed[:]?\s?(-?\d+)?>/i
    # Set Move With Player Match Speed offset
    @move_with_player.match_speed_offset = $1.nil? ? 0 : $1.to_i   

    # Set Move with Player Mimic Flag to true if Text Flag exist
    @move_with_player.mimic = true if comment_text =~ /<Mimic_Player_Movement>/i
    # Set Move with Player Reverse Mimic Flag to true if Text Flag exist
    @move_with_player.reverse_mimic = true if comment_text =~ /<Reverse_Mimic_Player_Movement>/i
   
    # Match Comment Text for Custom Mimic Direction
    comment_text.scan(/<Custom_Mimic_Direction_(UP|DOWN|LEFT|RIGHT): (UP|DOWN|LEFT|RIGHT)>/i) {|dir|
      # Go Through Directions
      dir.each {|s|
        # Convert Direction names to numbers
        s.gsub!(/DOWN/i){"2"} ; s.gsub!(/LEFT/i){"4"} ; s.gsub!(/RIGHT/i){"6"}
        s.gsub!(/UP/i){"8"}
      }
      # Set Move With Player Custom Mimic Direction
      @move_with_player.custom_mimic[dir.at(0).to_i] = dir.at(1).to_i
    }   
   
    # Set Move With Player Wait flag to true if Text Flag exist
    @move_with_player.wait = true if comment_text =~ /<Player_Move_Wait>/i
  end
end

Credit


  • TDS

Support


On this topic.

Known Compatibility Issues

None that I'm aware of.


Author's Notes


I suggest using the <Player_Move_Wait> since the player can move in ways that can make the event fall behind in trying to catch up to the player.

Restrictions

Only for use in non-commercial games.
« Last Edit: January 20, 2013, 08:22:29 PM by TDS »

***
Rep:
Level 77
RMRK Junior
You should add a "move at random when player moves" option to make things more Lufia-like.

pokeball TDSOffline
***
Rep:
Level 84
-T D S-
Silver - GIAW 11 (Hard)Silver - Game In A Week VII
It already has that since the script was inspired by Lufia II.

Quote
These tags provide optional functionality to the event when the player moves. If none of these tags are used the event will move based on its movement type.

If none of the new tags are added and you just use "<Move_With_Player>", then the event will use it's move type which can be "Fixed", ""Random", "Approach", "Custom". With Custom it will just proceed forward with it's custom move route by the amount of steps it can take when the player moves.

**
Rep:
Level 65
old zelda mirror statue puzzles?