Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3768 miembros registrados.
El último usuario registrado es lMac.

Nuestros miembros han publicado un total de 85831 mensajes en 12224 argumentos.

[XP] Enemy Detection System

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Enemy Detection System

Mensaje por Lance Amano el 2017-09-03, 21:00

Este script de Gubid permite crear eventos que sean capaces de detectar, perseguir y perder de vista al jugador. Ideal para todo tipo de RPG con enemigos en el campo.

Indicaciones:

- Todos los eventos que usen este script deben tener la palabra "enemy" en su nombre.
- Línea 31 - true si quieren que el enemigo vuelva a su posisión original. false si no.
- Líneas 39 y 40 - Se configura si desean que los enemigos se vuelvan más rápidos al detectar al jugador o no y la velocidad misma.
- Línea 48 - Rango del enemigo. Es decir, la distancia que se necesita para que el enemigo vea al jugador y lo empieze a perseguir.
- Línea 55 - Rango de escape. Es decir, la distancia que se necesita pra que el enemigo pierda de vista al jugador y abandone la persecución.
- Línea 90 - Número de ID de la animación que se ejecuta cuando el enemigo detecta al jugador. Por detecto es 98 (Signo de exclamación).

Código:
#--------------------------------------------------------------------------
#             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 = 3.5
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
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por Ociier15 el 2017-09-03, 21:10

Esto va bien para un escenario de infiltración o un RPG de zombies (En el caso de que uno de nuestros putrefactos amigos se decida a echarnos un mordisco). En cualquier caso, está genial.

-Ociier, Guardián de los valles verdes y el río de la Mano Warrior
avatar
Ociier15
Iniciado
Iniciado

0/3

Créditos 29

Gracias : 5

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por xXIsrael0499Xx el 2017-09-03, 21:58

Muy interesante el script, se pueden hacer cosas bastante chachis con esto; Gracias por compartir no estaba cociente de que existía este script y pienso que a mas de uno le servirá también.

Dejo por aquí mi +1 Gracias.
avatar
xXIsrael0499Xx
Principiante
Principiante

0/3

Créditos 1108

Gracias : 56

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por Calayax el 2017-09-04, 03:53

Por lo que logro comprender tras un serio intruseo llego a la conclusión de que no es posible aplicar distintas configuraciones de distancias y escapes y velocidades para diversos enemigos. A primeras pareciera que todo funcionaria en base a una sola configuración standard.

Gracias por el aporte (me ahorra usar un tedioso envío)
avatar
Calayax
Soñador
Soñador

0/3

Créditos 678

Gracias : 42

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por Lance Amano el 2017-09-04, 20:29

@Calayax: Correcto. Sin duda alguna fue diseñado de esta manera debido a lo complicado que sería crear una configuración para cada evento. Sin mencionar todos los errores que eso podría ocasionar.
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por Wecoc el 2017-09-04, 22:01

En realidad no es tan difícil, solo hay que poner como variable de evento lo que ahora está como global.

Código:
#--------------------------------------------------------------------------
#            Enemy Detection System
#            by Gubid - 8/12/07
#            v 1.2.2 Updated 10/2/07
#            Edit by Wecoc (no credits required)
#--------------------------------------------------------------------------
# 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.
# $game_map.events[ID].return_position = true/false # Default: 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.
# $game_map.events[ID].chase_speed = (value) # Default: 3.5
# $game_map.events[ID].enable_speed_change = true/false # Default: 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.
# $game_map.events[ID].view_range = (value) # Default: 5
#--------------------------------------------------------------------------
# ESCAPE RANGE
#--------------------------------------------------------------------------
# Use this to set the distance in which you must escape to stop the detection
# process.
# $game_map.events[ID].escape_range = (value) # Default: 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 event.enable_speed_change
                event.old_speed = event.move_speed
                event.move_speed = event.chase_speed
              end
              event.exclamation = true
              event.animation_id = 98 # 98 is the exclamation animation
              event.f_route.clear
            end
          else
            if event.exclamation == true
              event.exclamation = false
              if event.return_position
                ex = @map.events[event.id].x
                ey = @map.events[event.id].y
                if event.x != ex or event.y != ey
                  route = get_route(event, ex, ey)
                  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 <= event.view_range and range > 0
        return true
      elsif range <= event.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
 
  attr_accessor :return_position
  attr_accessor :chase_speed
  attr_accessor :enable_speed_change
  attr_accessor :view_range
  attr_accessor :escape_range
 
  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
    #----- New parameters (set default values here) -----
    @return_position = false
    @chase_speed = 3.5
    @enable_speed_change = true
    @view_range = 5
    @escape_range = 7
    #----------------------------------------------------
    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 then self.move_down
        when 4 then self.move_left
        when 6 then self.move_right
        when 8 then 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?
    for event in $game_map.events.values
      return true if event.exclamation
    end
    return false
  end
 
  def change_switch(id = 0, value = false, type = 0, switch = "A")
    if id > 0
      if type == 0 # For use of main switches
        $game_switches[id] = value
      elsif type == 1 # For use of self switches
        key = [$game_map.map_id, id, switch]
        $game_self_switches[key] = value
      end
      $game_map.need_refresh = true
      return true
    end
  end
end

En las instrucciones está todo.
avatar
Wecoc
Administrador
Administrador



Créditos 12083

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Enemy Detection System

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.