Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Need help changing a script

Would anyone know how to make this script so that when the player is behind the enemy, i.e. the enemy cannot technically see the player, the enemy will not be alerted?

Thanks.

Code:
#--------------------------------------------------------------------------

#             Enemy Detection System

#             by Gubid - 8/12/07

#             v 1.2.2 Updated 10/2/07

#--------------------------------------------------------------------------

#Description:

#This system allows events that are named something including "ENEMY" then

#that event will be told to approach Game_Player, until Game_Player has gotten

#a specified distance away. At that time event will return to its original

#position if desired. If you happen to get close enough to the returning event

#it will begin to follow you again.

#

#Thanks to Near Fantasia for supplying the slightly modified path finding script.

#--------------------------------------------------------------------------

#if there are any questions as to the use of this script or

#modifications/additions/etc, please post it to the thread on CreationAyslum.net

#--------------------------------------------------------------------------

 

#--------------------------------------------------------------------------

#Update_Detect - How to Stop Detection if desired

#--------------------------------------------------------------------------

#1. Within a event, add a SCRIPT (3rd page)

#2. type "update_detect(EVENT_ID, TRUE/FALSE)" -Note: it defaults to false

 

#--------------------------------------------------------------------------

#RETURN TO POSITION

#--------------------------------------------------------------------------

#Use this to determine if you would like the event to return to its original

#position or not.

#--------------------------------------------------------------------------

RETURN_TO_POSITION = false

 

#--------------------------------------------------------------------------

#CHASE_SPEED and ENABLE_SPEED_CHANGE

#--------------------------------------------------------------------------

#Use this to set the speed in which enemies will approach after spotting you

#and whether or not their speed will change.

#--------------------------------------------------------------------------

CHASE_SPEED = 4

ENABLE_SPEED_CHANGE = true

 

#--------------------------------------------------------------------------

#VIEW_RANGE

#--------------------------------------------------------------------------

#Use this to set the distance in which you must be in order to start the detection

#process, or escape to stop.

#--------------------------------------------------------------------------

VIEW_RANGE = 5

 

#--------------------------------------------------------------------------

#ESCAPE_RANGE

#--------------------------------------------------------------------------

#Use this to set the distance in which you must escape to stop the detection process

#--------------------------------------------------------------------------

ESCAPE_RANGE = 7

 

#--------------------------------------------------------------------------

#Other Notes

#--------------------------------------------------------------------------

#If the event has a custom move route, they will resume that route when finished

#chasing you, but if you dont set RETURN_TO_POSITION, then they will resume

#their custom route at the location they stopped chasing you.

 

class Game_Map

#--------------------------------------------------------------------------

# * Frame Update

#--------------------------------------------------------------------------

  alias en_detect_gm_update update

  def update

    en_detect_gm_update

   

    # Update map event

    for event in @events.values

      if !event.name.include?("enemy")

        next

      else

        if event.character_name != ""

          if event.stop_detect?

            next

          end

          if check_distance(event.id) == true

            if event.exclamation == false

              event.old_type = event.move_type

              event.move_type = 2

              if ENABLE_SPEED_CHANGE

                event.old_speed = event.move_speed

                event.move_speed = CHASE_SPEED

              end

              event.exclamation = true

              event.animation_id = 98 #98 happens to be the exclamation animation

              event.f_route.clear

            end

          else

            if event.exclamation == true

              event.exclamation = false

              if RETURN_TO_POSITION == true

                if event.x != @map.events[event.id].x or event.y != @map.events[event.id].y

                  route = get_route(event, @map.events[event.id].x, @map.events[event.id].y)

                  event.run_route(route)

                end

              else

                event.restore_route

              end

            end

          end

        end

      end

    end

  end

 

  def check_distance(id = nil)

    unless id == nil

      event = $game_map.events[id]

      range = ($game_player.x - event.x).abs + ($game_player.y - event.y).abs

     

      if range <= VIEW_RANGE and range > 0

        return true

      elsif range <= ESCAPE_RANGE and range > 0 and event.exclamation

        return true

      end

    end

  end

 

  def get_route(event, x=0, y=0)

    target_x = x

    target_y = y

    max = (target_x - event.x).abs + (target_y - event.y).abs + 5

    position = [[event.x, event.y]]

    route = [[]]

    more_step = [0]

    for i in more_step

      x = position[i][0]

      y = position[i][1]

      if !position.include?([x, y + 1]) and event.passable?(x, y, 2)

        position.push([x, y + 1])

        route.push(route[i] + [2])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [2]))

        end

      end

 

      if !position.include?([x - 1, y]) and event.passable?(x, y, 4)

        position.push([x - 1, y])

        route.push(route[i] + [4])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [4]))

        end

      end

 

      if !position.include?([x + 1, y]) and event.passable?(x, y, 6)

        position.push([x + 1, y])

        route.push(route[i] + [6])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [6]))

        end

      end

 

      if !position.include?([x, y - 1]) and event.passable?(x, y, 8)

        position.push([x, y - 1])

        route.push(route[i] + [8])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [8]))

        end

      end

    end

    if position.index([target_x, target_y]) == false

      return [2]

    else

      return route[position.index([target_x, target_y])]

    end

  end

end

 

 

class Game_Event

  attr_accessor :move_type

  attr_accessor :move_speed

  attr_accessor :old_speed

  attr_accessor :exclamation

  attr_accessor :old_type

  attr_accessor :stop_trigger

  attr_reader   :f_route

 

  def initialize(map_id, event)

    super()

    @map_id = map_id

    @event = event

    @id = @event.id

    @erased = false

    @starting = false

    @through = true

    @name = @event.name

    @exclamation = false

    @f_route = []

    @step = 0

    @old_type = @move_type

    @old_move_route =  @move_route

    @old_speed = @move_speed

    @stop_trigger = false

    moveto(@event.x, @event.y)

    refresh    

  end

 

  def stop_detect?

    return @stop_trigger

  end

   

  def restore_route

    @move_type = @old_type

    @move_route_index = @original_move_route_index

    @move_speed = @old_speed

    refresh

    return

  end

 

  def name

    return @name

  end

 

  alias en_det_update update

  def update

    if @f_route.size > 0

      run_path unless self.moving?

      if @f_route.size == 0

        restore_route

      end

    end    

    en_det_update

  end

 

  def run_route(route)

    @f_route = route

    @step = 0

  end

 

  def run_path

    if @f_route.size > 0

      if @f_route[@step] == nil

        @f_route = []

      end

      action = @f_route[@step]

      @step += 1

      case action

      when 2

        self.move_down

      when 4

        self.move_left

      when 6

        self.move_right

      when 8

        self.move_up

      end

    end

  end  

end

 

class Interpreter

  def update_detect(id, set = false)

    $game_map.events[id].stop_trigger = set

  end

 

  def spotted?

    is_true = 0

    for event in $game_map.events.values

      if event.exclamation

        is_true += 1

      end

    end

    if is_true > 0

      return true

    else

      return false

    end

  end

 

  def change_switch(id = 0, value = false, type = 0, switch = "A")

    if id > 0

      if type == 0 #for use of main switches

        #id is switch_id and value should set to true or false

        $game_switches[id] = value

      elsif type == 1 #For use of self switches

        #id is event.id and switch is the desired selfswitch. It must be text!

        #value is true or false

        key = [$game_map.map_id, id, switch]

        # Updates self switch

        $game_self_switches[key] = value

      end

      # Refresh map

      $game_map.need_refresh = true

      return true

    end

  end

end
 
This should work
Code:
#--------------------------------------------------------------------------

#             Enemy Detection System

#             by Gubid - 8/12/07

#             v 1.2.2 Updated 10/2/07

#--------------------------------------------------------------------------

#Description:

#This system allows events that are named something including "ENEMY" then

#that event will be told to approach Game_Player, until Game_Player has gotten

#a specified distance away. At that time event will return to its original

#position if desired. If you happen to get close enough to the returning event

#it will begin to follow you again.

#

#Thanks to Near Fantasia for supplying the slightly modified path finding script.

#--------------------------------------------------------------------------

#if there are any questions as to the use of this script or

#modifications/additions/etc, please post it to the thread on CreationAyslum.net

#--------------------------------------------------------------------------

 

#--------------------------------------------------------------------------

#Update_Detect - How to Stop Detection if desired

#--------------------------------------------------------------------------

#1. Within a event, add a SCRIPT (3rd page)

#2. type "update_detect(EVENT_ID, TRUE/FALSE)" -Note: it defaults to false

 

#--------------------------------------------------------------------------

#RETURN TO POSITION

#--------------------------------------------------------------------------

#Use this to determine if you would like the event to return to its original

#position or not.

#--------------------------------------------------------------------------

RETURN_TO_POSITION = false

 

#--------------------------------------------------------------------------

#CHASE_SPEED and ENABLE_SPEED_CHANGE

#--------------------------------------------------------------------------

#Use this to set the speed in which enemies will approach after spotting you

#and whether or not their speed will change.

#--------------------------------------------------------------------------

CHASE_SPEED = 4

ENABLE_SPEED_CHANGE = true

 

#--------------------------------------------------------------------------

#VIEW_RANGE

#--------------------------------------------------------------------------

#Use this to set the distance in which you must be in order to start the detection

#process, or escape to stop.

#--------------------------------------------------------------------------

VIEW_RANGE = 5

 

#--------------------------------------------------------------------------

#ESCAPE_RANGE

#--------------------------------------------------------------------------

#Use this to set the distance in which you must escape to stop the detection process

#--------------------------------------------------------------------------

ESCAPE_RANGE = 7

 

#--------------------------------------------------------------------------

#Other Notes

#--------------------------------------------------------------------------

#If the event has a custom move route, they will resume that route when finished

#chasing you, but if you dont set RETURN_TO_POSITION, then they will resume

#their custom route at the location they stopped chasing you.

 

class Game_Map

#--------------------------------------------------------------------------

# * Frame Update

#--------------------------------------------------------------------------

  alias en_detect_gm_update update

  def update

    en_detect_gm_update

   

    # Update map event

    for event in @events.values

      if !event.name.include?("enemy")

        next

      else

        if event.character_name != ""

          if event.stop_detect?

            next

          end

          if check_distance(event.id) == true

            if event.exclamation == false

              event.old_type = event.move_type

              event.move_type = 2

              if ENABLE_SPEED_CHANGE

                event.old_speed = event.move_speed

                event.move_speed = CHASE_SPEED

              end

              event.exclamation = true

              event.animation_id = 98 #98 happens to be the exclamation animation

              event.f_route.clear

            end

          else

            if event.exclamation == true

              event.exclamation = false

              if RETURN_TO_POSITION == true

                if event.x != @map.events[event.id].x or event.y != @map.events[event.id].y

                  route = get_route(event, @map.events[event.id].x, @map.events[event.id].y)

                  event.run_route(route)

                end

              else

                event.restore_route

              end

            end

          end

        end

      end

    end

  end

 

  def check_distance(id = nil)

    unless id == nil

      event = $game_map.events[id]

      if check_behind(id) and !event.exclamation

        return false

      end

      range = ($game_player.x - event.x).abs + ($game_player.y - event.y).abs

      if range <= VIEW_RANGE and range > 0

        return true

      elsif range <= ESCAPE_RANGE and range > 0 and event.exclamation

        return true

      end

    end

  end

  

  def check_behind(id)

    event = $game_map.events[id]

    case event.direction

    when 2 # Down

      return true if $game_player.y < event.y

    when 4 # Left

      return true if $game_player.x > event.x

    when 6 # Right

      return true if $game_player.x < event.x

    when 8 # Up

      return true if $game_player.y > event.y

    end

    return false

  end

  

  def get_route(event, x=0, y=0)

    target_x = x

    target_y = y

    max = (target_x - event.x).abs + (target_y - event.y).abs + 5

    position = [[event.x, event.y]]

    route = [[]]

    more_step = [0]

    for i in more_step

      x = position[i][0]

      y = position[i][1]

      if !position.include?([x, y + 1]) and event.passable?(x, y, 2)

        position.push([x, y + 1])

        route.push(route[i] + [2])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [2]))

        end

      end

 

      if !position.include?([x - 1, y]) and event.passable?(x, y, 4)

        position.push([x - 1, y])

        route.push(route[i] + [4])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [4]))

        end

      end

 

      if !position.include?([x + 1, y]) and event.passable?(x, y, 6)

        position.push([x + 1, y])

        route.push(route[i] + [6])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [6]))

        end

      end

 

      if !position.include?([x, y - 1]) and event.passable?(x, y, 8)

        position.push([x, y - 1])

        route.push(route[i] + [8])

        if route[i].size + 1 < max

          more_step.push(route.index(route[i] + [8]))

        end

      end

    end

    if position.index([target_x, target_y]) == false

      return [2]

    else

      return route[position.index([target_x, target_y])]

    end

  end

end

 

 

class Game_Event

  attr_accessor :move_type

  attr_accessor :move_speed

  attr_accessor :old_speed

  attr_accessor :exclamation

  attr_accessor :old_type

  attr_accessor :stop_trigger

  attr_reader   :f_route

 

  def initialize(map_id, event)

    super()

    @map_id = map_id

    @event = event

    @id = @event.id

    @erased = false

    @starting = false

    @through = true

    @name = @event.name

    @exclamation = false

    @f_route = []

    @step = 0

    @old_type = @move_type

    @old_move_route =  @move_route

    @old_speed = @move_speed

    @stop_trigger = false

    moveto(@event.x, @event.y)

    refresh    

  end

 

  def stop_detect?

    return @stop_trigger

  end

   

  def restore_route

    @move_type = @old_type

    @move_route_index = @original_move_route_index

    @move_speed = @old_speed

    refresh

    return

  end

 

  def name

    return @name

  end

 

  alias en_det_update update

  def update

    if @f_route.size > 0

      run_path unless self.moving?

      if @f_route.size == 0

        restore_route

      end

    end    

    en_det_update

  end

 

  def run_route(route)

    @f_route = route

    @step = 0

  end

 

  def run_path

    if @f_route.size > 0

      if @f_route[@step] == nil

        @f_route = []

      end

      action = @f_route[@step]

      @step += 1

      case action

      when 2

        self.move_down

      when 4

        self.move_left

      when 6

        self.move_right

      when 8

        self.move_up

      end

    end

  end  

end

 

class Interpreter

  def update_detect(id, set = false)

    $game_map.events[id].stop_trigger = set

  end

 

  def spotted?

    is_true = 0

    for event in $game_map.events.values

      if event.exclamation

        is_true += 1

      end

    end

    if is_true > 0

      return true

    else

      return false

    end

  end

 

  def change_switch(id = 0, value = false, type = 0, switch = "A")

    if id > 0

      if type == 0 #for use of main switches

        #id is switch_id and value should set to true or false

        $game_switches[id] = value

      elsif type == 1 #For use of self switches

        #id is event.id and switch is the desired selfswitch. It must be text!

        #value is true or false

        key = [$game_map.map_id, id, switch]

        # Updates self switch

        $game_self_switches[key] = value

      end

      # Refresh map

      $game_map.need_refresh = true

      return true

    end

  end

end
The enemy will still chase if the player hides behind them, but they will not be alerted if they have not already been so.
 
I added a check_behind function
Code:
   def check_behind(id)

     event = $game_map.events[id]

     case event.direction

     when 2 # Down

       return true if $game_player.y < event.y

     when 4 # Left

       return true if $game_player.x > event.x

     when 6 # Right

       return true if $game_player.x < event.x

     when 8 # Up

       return true if $game_player.y > event.y

     end

     return false

   end
then called it in the check_distance function.
Code:
       if check_behind(id) and !event.exclamation

         return false

       end

the !event.exclamation is so that it continues chasing you even if you duck behind them. (There were some straaange errors if you don't do that)
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top