Move NPC to last "seen" position of the player

Sausage_Boi

Game Dev. "Artist."
Veteran
Joined
Sep 10, 2014
Messages
1,733
Reaction score
681
First Language
Americanese
Primarily Uses
RMVXA
Hello, I am looking for a script that will allow an NPC to see the player at a certain position, and then, even after the player has moved from those coordinates, the NPC will move to that position. I am using the Proximity Detection script by V.M of D.T and I am just trying to get the NPC to travel to the X,Y coordinates of where the player had been when the NPC noticed. I was thinking it might be eventable, but I don't even know what I would need to do, and perhaps a script call would be easier?
Thanks for any help! Have a good day.

##Proximity Detection Script v1.5a

#
#Usage: Functions mainly used to activate events when within a certain range!
#
#Functions:
#  Proxy.inprox?(@event_id, distance, los)
#    -distance is the range of detection and los is whether to use line of sight,
#     both have default values
#  Proxy.inprox_d?(@event_id, distance, los)
#    -same as original but only checks in the direction the event is facing
#  Proxy.inprox_r?(@event_id, width, height)
#    -checks a rectangle of width/height around the event (odd values best)
#
# All calls return true if within range and false when not
#
#Examples:
# Proxy.inprox?(@event_id)
# Proxy.inprox?(@event_id,10)
# Proxy.inprox?(@event_id,5,false)
# Proxy.inprox_d?(@event_id,6)
# Proxy.inprox_r?(@event_id,3,3)
#
#------#
#-- Script by: V.M of D.T
#
#- Questions or comments can be:
#    given by email: sumptuaryspade@live.ca
#    provided on facebook: http://www.facebook.com/DaimoniousTailsGames
#   All my other scripts and projects can be found here: http://daimonioustails.weebly.com/
#
#--- Free to use in any project, commercial or non-commercial, with credit given
# - - Though a donation's always a nice way to say thank you~ (I also accept actual thank you's)
 
 
module Proxy
  #Default radius of detection:
  PROXYRANGE = 4
  #Region for transparent obstacles
  REGION = 20
  #Switch to be turned on to pause Proximity
  PAUSE_SWITCH = 100
  #----#
  def self.inprox?(id, distance = PROXYRANGE, los = true, second_id = nil)
    return if $game_switches[PAUSE_SWITCH]
    x = $game_map.events[id].x
    y = $game_map.events[id].y
    if !second_id
      x2 = $game_player.x; y2 = $game_player.y
    else
      x2 = $game_map.events[second_id].x;y2 = $game_map.events[second_id].y
    end
    x_d = x - x2; y_d = y - y2
    x_d *= -1 if x_d < 0; y_d *= -1 if y_d < 0
    t_d = x_d + y_d
    return false if t_d > distance
    return false if !line_of_sight($game_player.x,$game_player.y,x,y) and los
    return true
  end
  def self.inprox_d?(id, distance = PROXYRANGE, los = true)
    if self.inprox?(id, distance, los) then else return false end
    x1 = $game_player.x; x2 = $game_map.events[id].x
    y1 = $game_player.y; y2 = $game_map.events[id].y
    x1 > x2 ? xx = x1 - x2 : xx = x2 - x1
    y1 > y2 ? yy = y1 - y2 : yy = y2 - y1
    case $game_map.events[id].direction
    when 2
      if $game_player.y > $game_map.events[id].y then
        if yy >= xx then return true end end
    when 4
      if $game_player.x < $game_map.events[id].x then
        if xx >= yy then return true end end
    when 6
      if $game_player.x > $game_map.events[id].x then
        if xx >= yy then return true end end
    when 8
      if $game_player.y < $game_map.events[id].y then
        if yy >= xx then return true end end
    end
    return false
  end
  def self.inprox_r?(id, width, height)
    return if $game_switches[PAUSE_SWITCH]
    width % 2 == 0 ? hwidth = width / 2 : hwidth = (width - 1) / 2
    height % 2 == 0 ? hheight = height / 2 : hheight = (height - 1) / 2
    x = $game_map.events[id].x - hwidth
    y = $game_map.events[id].y - hheight
    if $game_player.x >= x and $game_player.x < (x + width)
      if $game_player.y >= y and $game_player.y < (y + height)
        return true
      end
    end
    return false
  end
  def self.line_of_sight(x,y,x2,y2)
    tile_array = []
    x_d = x - x2; y_d = y - y2
    x_d *= -1 if x_d < 0
    y_d *= -1 if y_d < 0
    t_d = x_d + y_d
    t_d.to_i.times do |i|
      x_distance = x - x2
      y_distance = y - y2
      x_distance *= -1 if x_distance < 0
      y_distance *= -1 if y_distance < 0
      if x_distance > y_distance or y_distance == 0
        x < x2 ? x += 1 : x -= 1
      elsif
        y < y2 ? y += 1 : y -= 1 or x_distance == 0
      end
      tile_array.push([x,y])
    end
    tile_array.each do |cord|
      next if $game_map.region_id(cord[0],cord[1]) == REGION
      return false if !$game_map.check_passage(cord[0], cord[1], 0x002)
    end
    return true
  end
end
 
Last edited by a moderator:

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

Latest Threads

Latest Posts

Latest Profile Posts

Holy stink, where have I been? Well, I started my temporary job this week. So less time to spend on game design... :(
Cartoonier cloud cover that better fits the art style, as well as (slightly) improved blending/fading... fading clouds when there are larger patterns is still somewhat abrupt for some reason.
Do you Find Tilesetting or Looking for Tilesets/Plugins more fun? Personally I like making my tileset for my Game (Cretaceous Park TM) xD
How many parameters is 'too many'??
Yay, now back in action Happy Christmas time, coming back!






Back in action to develop the indie game that has been long overdue... Final Fallacy. A game that keeps on giving! The development never ends as the developer thinks to be the smart cookie by coming back and beginning by saying... "Oh bother, this indie game has been long overdue..." How could one resist such? No-one c

Forum statistics

Threads
105,857
Messages
1,017,019
Members
137,564
Latest member
McFinnaPants
Top