Últimos temas
» [MV] ¿Cómo mover un sprite?
por Frägarach Hoy a las 2:19 am

» Como cambio esto?...
por Shy_Cream Hoy a las 2:09 am

» El Dia Z - Demo
por EdwarPlay Ayer a las 8:08 pm

» Pokemon Destiny
por Greninja555 Ayer a las 5:46 pm

» Animación Habilidad de Enemigos RPGMAKER VX ACE
por Metatron Ayer a las 3:16 am

» [VX] Cambio de Resolución
por luistop12 Vie Sep 13, 2019 6:51 am

» ¿Como Mover al jugador mientras hay una conversación?
por Zachy Vie Sep 13, 2019 2:05 am

» ¿Como hacer un menú/Galería de imágenes? (RPG VxAce)
por ZororoWhite Jue Sep 12, 2019 7:57 pm

» Inherited Sins [Juego Completo] [Definitive Edition]
por Nina Jue Sep 12, 2019 7:47 pm

» Zaza no konpasu (La Brújula de Zaza) [VXACE]
por Pocari Sáb Sep 07, 2019 12:28 pm

» Ayuda con el ABS
por DarkarPro0102 Sáb Sep 07, 2019 8:32 am

» Pop! Horror City Complementos
por EdwarPlay Jue Sep 05, 2019 10:59 pm


[VX] Stealth Detection System 1.0

Ir abajo

[VX] Stealth Detection System 1.0 Empty [VX] Stealth Detection System 1.0

Mensaje por Turbiosoft.acho el Sáb Jul 12, 2014 10:38 pm

¡Hola!

Os traigo un script bastante apañao creado por cmpsr2000.

En él podéis crear eventos especiales en los que el jugador debe pasar por zonas vigiladas (o algo así), sin ser visto. Tiene tres modos de funcionamiento: el modo de juego normal; Modo MGS (Metal Gear) y el modo de Evento Común. Con esto, puedes hacer un game over o mandar al jugador a la cárcel.

(Sí, sé que esto se puede hacer con engines. Pero hay gente vaga que prefiere no comerse el coco).

¿Cómo se usa?

Pega el script encima de Main.
En la carpeta "Audio>SE" de la demo está el sonido "found". Copia y pégalo en la carpeta SE de tu proyecto.

Imágenes:

Spoiler:
[VX] Stealth Detection System 1.0 Fe5001c933472de009243585b6a1121c
[VX] Stealth Detection System 1.0 F9ebce2526a96504f3272731ce4ea66d

Script

Código:
#-------------------------------------------------------------------------------
#
#                           Stealth Detection System 1.0
#                    código por cmpsr2000 en rpgrevolution.com/forums
#                               Lanzado el 11/06/2008
#-------------------------------------------------------------------------------
#                            Traducción por Turbiosoft.acho
#                           http://rmakercom.foroactivo.com/
#
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#
# Es un sistema de detección avanzado hecho para RPG Maker VX.
# Para usar este sistema, necesitas crear un evento que comience con esta
# llamada de script:
#
#   $game_stealth.detector(IDevento, alcanceVisión, acciónDetectar,
#                          visiónTúnel, alcanceReal)
#
#   IDevento:       La ID del evento. Usa @event_id como el medio más fácil.
#   alcanceVisión:  Hasta que punto el "guardia" puede ver. Los valores más
#                   altos tiran más de CPU! El lag aumenta enormemente si no
#                   se utiliza la visión de túnel.
#   acciónDetectar: La acción se realizará cuando el guardia vea al jugador.
#                   Por defecto = 1
#                   0: Ir a prisión
#                   1: Game Over
#                   2: Ejecutar evento común
#                   3: Modo MGS
#   visiónTúnel:     determina cuando la visión del guardia es en línea recta.
#                   (False o True)
#                   Por defecto = false
#   alcanceReal:    Determina cuando un guardia puede ver a través de obstáculos.
#                   (False ou True)
#                   Por defecto = false
#
#   NOTA: No necesitas configurar los parámetros que están en DEFAULT (por defecto).
#
#                         Explicación del Modo MGS:
#
#       Cuando se usa acciónDetectar, 3 guardias serán "alertados" si
#       ven al jugador. El guardia correrá a donde lo vio, y comenzará
#       a patrullar para verlo de nuevo. Si el guardia ve al jugador
#       otra vez, se dará lugar a una acción de captura.
#
#-------------------------------------------------------------------------------
class Game_Stealth
  
  attr_accessor :common_event_id
  
  def initialize
    @checkedTiles   = []
    @fovPassability = {}
    @detectingEvent = nil
    @tempInterpreter = nil
    @alertedGuards = []
    
    #---------------------------------------------------------------------------
    # Si quieres utilizar la visión de túnel, configura el largo aquí.
    #---------------------------------------------------------------------------
    @tunnelWidth = 3
    
    #---------------------------------------------------------------------------
    # La ID del evento común en caso de que se use acciónDetectar 2
    #---------------------------------------------------------------------------
    @common_event_id = 1
    
    #---------------------------------------------------------------------------
    # La velocidad y frecuencia en la que se mueven los guardias en acciónDetectar 3 (MGS).
    #   velocidad: 1: x8 lentísimo,
    #               2: x4 muy lento
    #               3: x2 lento
    #               4: normal
    #               5: x2 rápido
    #               6: x4 muy rapido
    #
    #   frecuencia: 1: bajísima
    #               2: baja
    #               3: normal
    #               4: alta
    #               5: altísima
    #---------------------------------------------------------------------------
    @guardInterceptSpeed = 4
    @guardInterceptFrequency = 5
    
    #---------------------------------------------------------------------------
    # Esta es la reacción que realizará el guardia si ve al jugador por segunda
    # vez en el modo MGS. Esto está configurado por defecto en game over ya que
    # todas las otras opciones requieren algunas configuraciones. Los valores son:
    #   captureAction:  0: Ir para prisión
    #                   1: Game Over
    #                   2: Ejecutar evento común
    #---------------------------------------------------------------------------
    @captureAction = 1
    
    #---------------------------------------------------------------------------
    # Cuántos frames esperará el guardia para realizar un turno
    # cuando esté patrullando en modo MGS.
    #---------------------------------------------------------------------------
    @waitTime = 60
    
    #---------------------------------------------------------------------------
    # Cambia esto para falso para desactivar el área de detección alrededor del
    # guardia. Esto significa que el personaje puede pasar cerca del guardia si
    # no se encuentra en su línea de visión.
    #---------------------------------------------------------------------------
    @allowDetectRadius= true

    @tunnelWidth += 1 if (@tunnelWidth % 2) == 1
  end
  
  #-----------------------------------------------------------------------------
  # Standard update method; checks for player detection then handles MGS
  # state changes for guards then checks for player detection again
  #-----------------------------------------------------------------------------
  def update
    if $game_player.detected and not $game_player.moving?
      doDetectAction
    end
    for guard in @alertedGuards
      case guard.detectState
      when nil, 0 #alerted
        guard.lock
        guard.returnX           = guard.x
        guard.returnY           = guard.y
        guard.returnRoute       = guard.move_route
        guard.returnRouteIndex  = guard.move_route_index
        guard.returnSpeed       = guard.move_speed
        guard.returnFrequency   = guard.move_frequency
        guard.move_speed        = @guardInterceptSpeed
        guard.move_frequency    = @guardInterceptFrequency
        guard.isAware = false
        guard.detectState = guard.goto($game_player.x, $game_player.y) ? 1 : 3
        guard.unlock
      when 1 #intercepting
        if (guard.move_route_index == guard.move_route.list.length - 1 and
           guard.stopping?) or guard.move_failed
          guard.lock
          guard.isAware = true
          guard.spinInPlace(@waitTime)
          guard.detectState = 2
          guard.unlock
        end
      when 2 #checking
        if guard.move_route_index == guard.move_route.list.length - 1 and
           guard.stopping?
          guard.lock
          guard.isAware = false
          go = guard.goto(guard.returnX, guard.returnY)
          guard.detectState = 3
          guard.unlock
        end
      when 3 #returning
        if guard.move_route_index == guard.move_route.list.length - 1 and not
           guard.moving?
          guard.lock
          guard.isAware = true
          guard.move_route        = guard.returnRoute
          guard.move_route_index  = guard.returnRouteIndex
          guard.move_speed        = guard.returnSpeed
          guard.move_frequency    = guard.returnFrequency
          guard.detectState       = 0
          @captured = false
          @alertedGuards.delete(guard)
          guard.unlock
        end
      end
    end
    observe
  end
  #-----------------------------------------------------------------------------
  # Runs through the aware events(guards) on the map and tells them to check
  # for the player.
  #-----------------------------------------------------------------------------
  def observe
    for event in $game_map.events.values #events is a hash!
      if event.isAware
        if event.moved? or event.turned? or $game_player.moved?
          if checkForDetection(event)
            $game_player.detected = true
            @detectingEvent = event
            return
          end
        end
      end
      @checkedTiles   = []
      @fovPassability = {}
    end
  end
  #-----------------------------------------------------------------------------
  # Runs through each tile in the event(guard)'s field of view and checks
  # it for the player. RETURNS: Boolean
  #   event:    The guard that is currently checking for the player.
  #-----------------------------------------------------------------------------
  def checkForDetection(event)
    return true if playerInDetectionRadius(event)
    return false if playerOutOfRange(event)
    fieldOfView = event.tunnelVision ? @tunnelWidth : 1
    for distance in 1..event.detectRange
      for width in 1..fieldOfView
        return true if checkTile(event, width, distance)
      end
      fieldOfView += 2 unless event.tunnelVision
    end
    return false
  end
  #-----------------------------------------------------------------------------
  # Checks a tile for the player. RETURNS: Boolean
  #   event:    The guard that is currently checking for the player.
  #   width:    The width-index of the tile being checked
  #   distance: The depth-index of the tile being checked
  #-----------------------------------------------------------------------------
  def checkTile(event, width, distance)
    if event.tunnelVision
      if @tunnelWidth > 1
        width = width - ((@tunnelWidth - 1)/2)
      else
        width = 0
      end
    else
      width -= distance
    end
    x = event.x
    y = event.y
    direction = event.direction
    case direction
    when 2
      y += distance
      x += width
    when 4
      y += width
      x -= distance
    when 6
      y += width
      x += distance
    when 8
      y -= distance
      x += width
    end
    return false if @checkedTiles.index([x,y]) != nil
    return false if tileHidden?(event, x, y)
    return true if $game_player.x == x and $game_player.y == y
    return false
  end
  #-----------------------------------------------------------------------------
  # Determines the visibility of a tile to a guard. RETURNS: Boolean
  #   event:    The guard that is currently checking for the player.
  #   x:        The x coordinate of the tile to be checked
  #   y:        The y coordinate of the tile to be checked
  #-----------------------------------------------------------------------------
  def tileHidden?(event, x, y)
    return false if event.trueSight
    #check the current tile first
    @checkedTiles.push([x,y])
    originalX = x
    originalY = y
    if not $game_map.passable?(x, y)
      @fovPassability[[x,y]] = false
      return true
    end
    
    #now check all adjacent tiles one step closer to the detector
    direction = event.direction
    case direction
    when 2 #down
      y -= 1
      for i in (x-1)..(x+1)
        #if we've checked the tile, then it exists in the FoV
        if @checkedTiles.index([i,y]) != nil
          if not @fovPassability[[i,y]]
            @fovPassability[[originalX,originalY]] = false
            return true
          end
        end
      end
    when 4 #left
      x += 1
      for i in (y-1)..(y+1)
        #if we've checked the tile, then it exists in the FoV
        if @checkedTiles.index([x,i]) != nil
          if not @fovPassability[[x,i]]
            @fovPassability[[originalX,originalY]] = false
            return true
          end
        end
      end
    when 6 #right
      x -= 1
      for i in (y-1)..(y+1)
        #if we've checked the tile, then it exists in the FoV
        if @checkedTiles.index([x,i]) != nil
          if not @fovPassability[[x,i]]
            @fovPassability[[originalX,originalY]] = false
            return true
          end
        end
      end
    when 8 #up
      y += 1
      for i in (x-1)..(x+1)
        #if we've checked the tile, then it exists in the FoV
        if @checkedTiles.index([i,y]) != nil
          if not @fovPassability[[i,y]]
            @fovPassability[[originalX,originalY]] = false
            return true
          end
        end
      end
    end
    
    #this tile and the blocking tiles must be passable
    @fovPassability[[originalX,originalY]] = true
    return false
  end
  #-----------------------------------------------------------------------------
  # Guards and other "detector" events have an awareness of their immediate
  # surroundings. If the player is adjacent to the event, they will be
  # discovered if @allowDetectRadius is true. RETURNS: Boolean
  #   event:    The guard that is currently checking for the player.
  #-----------------------------------------------------------------------------
  def playerInDetectionRadius(event)
    return false unless @allowDetectRadius
    adjacentTiles = [ [event.x, event.y - 1],
                      [event.x + 1, event.y - 1],
                      [event.x + 1, event.y],
                      [event.x + 1, event.y + 1],
                      [event.x, event.y + 1],
                      [event.x - 1, event.y + 1],
                      [event.x - 1, event.y],
                      [event.x - 1, event.y - 1] ]
    for tile in adjacentTiles
      if $game_player.x == tile[0] and $game_player.y == tile[1]
        return true
      end
    end
    return false
  end
  
  def playerOutOfRange(event)
    direction = event.direction
    case direction
    when 2 #down
      yDifference = event.y - $game_player.y
      xDifference = event.x - $game_player.x
      coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1
      if yDifference > event.detectRange or $game_player.y < event.y - 1 or
         (xDifference.abs > coneWidth)
        return true
      end
    when 4 #left
      yDifference = event.y - $game_player.y
      xDifference = event.x - $game_player.x
      coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1
      if xDifference > event.detectRange or $game_player.x > event.x + 1 or
         (yDifference.abs > coneWidth)
        return true
      end
    when 6 #right
      yDifference = $game_player.y - event.y
      xDifference = $game_player.x - event.x
      coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1
      if xDifference > event.detectRange or $game_player.x < event.x - 1 or
         (yDifference.abs > coneWidth)
        return true
      end
    when 8 #up
      yDifference = event.y - $game_player.y
      xDifference = event.x - $game_player.x
      coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1
      if yDifference > event.detectRange or $game_player.y > event.y + 1 or
         (xDifference.abs > coneWidth)
        return true
      end
    end
    return false
  end
  #-----------------------------------------------------------------------------
  # Called in an event to enable detection for the event (guard).
  #   eventID:      The id of the event. use @event_id in your event call!
  #   detectRange:  How far away the guard can see
  #   detectAction: What happens when caught. defaults to game_over
  #   tunnelVision: Whether the guard has field of view or tunnel vision
  #   trueSight:    Whether the guard can see through objects
  #-----------------------------------------------------------------------------
  def detector(eventID, detectRange, detectAction = 1,
               tunnelVision = false, trueSight = false)
    event               = $game_map.events[eventID]
    event.isAware       = true
    event.detectAction  = detectAction
    event.detectRange   = detectRange
    event.tunnelVision  = tunnelVision
    event.trueSight     = trueSight
    event.setPosition
  end
  #-----------------------------------------------------------------------------
  # Called in an event to set the location tile of the "jail"
  #   eventID:   The ID of the event that is at the jail location.
  #              Again, use @event_id
  #-----------------------------------------------------------------------------
  def jail(eventID)
    event = $game_map.events[eventID]
    @jailX      = event.x
    @jailY      = event.y
  end
  #-----------------------------------------------------------------------------
  # Executes the desired action upon detecting the player
  #-----------------------------------------------------------------------------
  def doDetectAction
    case @detectingEvent.detectAction
    when 0 # goto jail
      sendToJail
    when 1 # game over
      $scene = Scene_Gameover.new
    when 2 # execute common event
      doCommonEvent
    when 3 # MGS - enemy moves towards player position
      if @detectingEvent.detectState == 2
        if not @captured
          case @captureAction
          when 0
            sendToJail
          when 1, 3
            gameOver
          when 2
            doCommonEvent
          end
          @captured = true
        end
      else
        Sound.play_found
        @detectingEvent.balloon_id = 1
        unless @alertedGuards.include?(@detectingEvent)
          @alertedGuards.push(@detectingEvent)
        end
      end
    end
    $game_player.detected = false
    @detectingEvent = nil
  end
  #-----------------------------------------------------------------------------
  # MODE 0: Send player to the "jail" tile
  #-----------------------------------------------------------------------------
  def sendToJail
      $game_player.reserve_transfer($game_map.map_id, @jailX, @jailY,
                                    @detectingEvent.direction)
  end
  #-----------------------------------------------------------------------------
  # MODE 1: Game Over
  #-----------------------------------------------------------------------------
  def gameOver
    $scene = Scene_Gameover.new
  end
  #-----------------------------------------------------------------------------
  # MODE 2: Execute Common Event
  #-----------------------------------------------------------------------------
  def doCommonEvent
      $game_temp.common_event_id = @common_event_id
  end
end

Demo:

Descargar

¡Espero que os sirva!

_________________

¡Apoya PCII colocando esta barrita en tu firma!
[VX] Stealth Detection System 1.0 JZxmSi
Turbiosoft.acho apoya a...:
[VX] Stealth Detection System 1.0 AvSsi3
[VX] Stealth Detection System 1.0 TpIA16
[VX] Stealth Detection System 1.0 VqJJJp
[VX] Stealth Detection System 1.0 BU4sOt

Y a los juegos de Zoro y Japo (?)


Turbiosoft.acho
Turbiosoft.acho
Admin
Admin

Femenino
Rmakercom
RPG Maker : Ace
Mensajes : 1287
Monedas : 4378
Reputación : 195
Localización : En el glorioso y magistral Zulo.

Volver arriba Ir abajo

[VX] Stealth Detection System 1.0 Empty ¡Excelente aporte!

Mensaje por Harry404 el Dom Jul 13, 2014 10:34 pm

Me recuerda mucho al inicio de The legend of zelda spirit tracks o el mas conocido...
San andreas XD.

Siempre tienes que aportar para VX. TT____TT.
Intentare conseguir este script para vx ace e.e

Aun así,¡Muchas gracias! estos eventos de no dejarse ver, son bastante comunes.
Por lo que les servirá a todos.

¡Buena Turby! 1+
Harry404
Harry404
PJ de Quest
PJ de Quest

Masculino
Colombia
RPG Maker : Ace
Mensajes : 35
Monedas : 49
Reputación : 0
Edad : 18
Localización : Hogwarts School of Witchcraft and Pajas

Volver arriba Ir abajo

Volver arriba

- Temas similares

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