Enemy Detection System by Gubid Edit Please!!

Started by archerRin, August 11, 2009, 11:43:35 am

Previous topic - Next topic

archerRin

August 11, 2009, 11:43:35 am Last Edit: August 11, 2009, 01:22:57 pm by archerRin
Enemy Detection Alteration
This is a request for an edit of an existing script.

Enemy Detection System by Gubid:
Code: text
#--------------------------------------------------------------------------
#             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



RMXP or RMVX:
RMXP
Detailed Description:
I want to add the functionality that when the player is behind the monster , the monster won't be able to start detection and chase the player. Even if the monster is in the range of detection. Therefore you can effectively sneak behind him to engage battle thus launching an initiative.

However, if detection has already started then even if the player is behind the monster, the monster will still be able to chase the player.
I think if this was with events I could do it easily with like, if player facing left and monster facing left then do not initialize monster alert/chase. But it's done with scripts and I'm not a scripter.

Also if possible I need this to be compatible with the caterpillar script. At the moment, the monster recognizes the caterpillar party members as an obstacle and therefore always are blocked by them.

Thank you for any help, and i will credit you in-game!
Screen shots:
N/a I am sure you know what I mean. If you don't please state why.
Other Scripts I am using (in order):
I dont think this will be much use because its only that script which need edits but here. Also I dont use SDK.