Registrarse

[Essentials] Nuevo Encuentro Salvaje

Jessie

What goes around, comes around




Nuevo Encuentro Salvaje






Introducción







Cuando uno comienza a desarrollar un proyecto nuevo usando Pokémon Essentials, una de las primeras cosas que uno suele pensar en agregar son nuevos tipos de encuentros.
Aunque en la misma Wiki existe una explicación de como hacerlo, muchas veces suele ser algo confusa ya que este supone que el usuario ya ha leído otros temas relacionados en lugar de realizar una explicación un poco más detallada.

Así que para poder aprender la manera de agregar un nuevo tipo de encuentro salvaje, he decidido hacer este tutorial.



Proceso






Antes de comenzar hay que tener en cuenta que durante las actualizaciones de Pokémon Essentials, se pueden agregar o reducir el número o tipo de encuentros, así que como consejo, no le den solo copiar y pegar al código, intenten comprender como funciona, así pueden agregar o quitar tipos de encuentros a su antojo.

Para realizar un nuevo encuentro salvaje, se tiene que definir el nombre del encuentro, en este ejemplo usaré encuentro en Nieve.
Primero en la sección PField_Encounters crearemos un nuevo tipo de encuentro.

Código:
module EncounterTypes
  Land            = 0
  Cave            = 1
  Water           = 2
  RockSmash     = 3
  OldRod         = 4
  GoodRod        = 5
  SuperRod       = 6
  HeadbuttLow  = 7
  HeadbuttHigh = 8
  LandMorning  = 9
  LandDay        = 10
  LandNight      = 11
  BugContest    = 12

  Nieve        = 13 # Agregamos el nuevo encuentro

  Names=[
     "Land",
     "Cave",
     "Water",
     "RockSmash",
     "OldRod",
     "GoodRod",
     "SuperRod",
     "HeadbuttLow",
     "HeadbuttHigh",
     "LandMorning",
     "LandDay",
     "LandNight",
     "BugContest",

     "Nieve"                   # Agregamos el nombre que tendrá en el PBS
   ]

Ahora agregaremos el número de entradas que tendrá, por ejemplo para grass/hierba tiene 12 entradas para pokémon, mientras el de oldrod/caña vieja tiene solo 2, para este ejemplo le agregaré solo 5.
También agregaremos la densidad del encuentro, esto quiere decir la probabilidad de que salga un encuentro salvaje, solamente se agrega otro valor junto a los que ya existen.
Código:
EnctypeChances=[
     [20,20,10,10,10,10,5,5,4,4,1,1],
     [20,20,10,10,10,10,5,5,4,4,1,1],
     [60,30,5,4,1],
     [60,30,5,4,1],
     [70,30],
     [60,20,20],
     [40,40,15,4,1],
     [30,25,20,10,5,5,4,1],
     [30,25,20,10,5,5,4,1],
     [20,20,10,10,10,10,5,5,4,4,1,1],
     [20,20,10,10,10,10,5,5,4,4,1,1],
     [20,20,10,10,10,10,5,5,4,4,1,1],
     [20,20,10,10,10,10,5,5,4,4,1,1],

      [25,25,20,20,10] # Tendrá 5 entradas, cada valor es el %
  ]

EnctypeDensities=[25,25,10,0,0,0,0,0,0,25,25,25,25  ,25] # al final se agrega un nuevo 25

# Aquí se agrega el tipo de encuentro, Land (1), Cave(2), Water(3), Otros(0)

EnctypeCompileDens=[1,2,3,0,0,0,0,0,0,1,1,1,1  ,1]  # Será tipo 1, Land


Mas abajo encontraremos los encuentros definidos por tipo, por ejemplo isGrass? o isCave?, aquí agregaremos el nuestro.
Código:
def isNieve?
    return false if  @ density==nil
    return @enctypes[EncounterTypes::Nieve] ? true : false
end


Ahora en la sección Compiler buscas la parte donde se guardan los tipos de encuentros y agregamos el nuevo tipo.
Lo que sucede en está sección está vinculado a la acción de copilar los datos de los PBS.
Código:
  if thisenc && (thisenc[1][EncounterTypes::Land] ||
         thisenc[1][EncounterTypes::LandMorning] ||
        thisenc[1][EncounterTypes::LandDay] ||
        thisenc[1][EncounterTypes::BugContest] ||
         thisenc[1][EncounterTypes::LandNight]   ||  # Agregamos un separador

         thisenc[1][EncounterTypes::Nieve] ) &&   # Agregamos el nuevo encuentro
         thisenc[1][EncounterTypes::Cave]


Ahora toca agregar la manera en la que sucederá el nuevo encuentro que hemos creado.
Para encuentros en Nieve, este se debe activar al caminar sobre un terreno en particular.
Primero vamos a la sección PField_Encounters y buscamos la siguiente función, para definir cuando sucederá nuestro nuevo tipo de encuentro.
Código:
def pbEncounterType
  if $PokemonGlobal && $PokemonGlobal.surfing
    return EncounterTypes::Water
  elsif self.isCave?
    return EncounterTypes::Cave

  # Colocamos nuestro nuevo encuentro aquí
  elsif self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
      return EncounterTypes::Nieve
  #

  elsif self.isGrass?
    time = pbGetTimeNow
    enctype = EncounterTypes::Land
    enctype = EncounterTypes::LandNight if self.hasEncounter?(EncounterTypes::LandNight) && PBDayNight.isNight?(time)
    enctype = EncounterTypes::LandDay if self.hasEncounter?(EncounterTypes::LandDay) && PBDayNight.isDay?(time)
    enctype = EncounterTypes::LandMorning if self.hasEncounter?(EncounterTypes::LandMorning) && PBDayNight.isMorning?(time)
    if pbInBugContest? && self.hasEncounter?(EncounterTypes::BugContest)
      enctype = EncounterTypes::BugContest
    end
    return enctype
  end
  return -1
end


Ahora buscaremos el siguiente método para definir bajo que condiciones será posible que suceda una batalla salvaje en cualquier mapa.
Código:
def isEncounterPossibleHere?
    if $PokemonGlobal && $PokemonGlobal.surfing
      return true
    elsif pbGetTerrainTag($game_player)==PBTerrain::Ice
      return false
    elsif self.isCave?
      return true

  # Creamos un nuevo condicional para nuestro encuentro
  
   else
      if self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
        return true
  #

      elsif self.isGrass?
       return pbIsGrassTag?($game_map.terrain_tag($game_player.x,$game_player.y))
      end
    end
      return false
  end


Lo que sigue es crear un nuevo terreno, para esto vamos al a sección PBTerrain y lo agregamos, en este ejemplo usaré el número 16 el cual será el Terrain del tile para el encuentro en nieve, pero deben asegurarse que ese número no esta ya en u
Código:
module PBTerrain
  Ledge           = 1
  Grass           = 2
  Sand            = 3
  Rock            = 4
  DeepWater       = 5
  StillWater      = 6
  Water           = 7
  Waterfall       = 8
  WaterfallCrest  = 9
  TallGrass       = 10
  UnderwaterGrass = 11
  Ice             = 12
  Neutral         = 13
  SootGrass       = 14
  Bridge          = 15

  Nieve       = 16     # Agregamos nuestro terreno


Mas abajo, en esta misma sección, estará la lista de funciones que ayudan a determinar el tipo de terreno, ahí agregaremos el nuestro(esta parte es opcional, solo para cuando tengas varios terrenos en los que sucede el mismo tipo de encuentro)
Código:
def pbIsNieveTag?(tag)
  return tag==PBTerrain::Nieve    # Si el terreno es el mismo que el que definimos
end


Solo queda agregar el nuevo tipo de encuentro al archivo dentro de la carpeta PBS, encounters.txt y el número del TerrainTag usado al tile que servirá como tile de nieve para este tipo de encuentro salvaje.

El archivo PBS quedaría algo así :

Código:
#########################
001 # Ruta 001
25,10,10
Nieve
PIDGEY,5
PIDGEY,5
PIDGEY,5
PIDGEY,5
PIDGEY,5



Conclusión






Como pueden ver, quizás parezca un poco confuso, pero si siguen las instrucciones e intentar comprender como funciona en lugar de solo dar copiar y pegar al código, verán que no es tan complicado agregar un nuevo tipo de encuentro.

Adicionalmente, he creado un script que sirve de base para realizar todo esto, pero les suguiero que lean este tutorial para que sea más sencillo entender como funcionan los encuentros salvajes, pero si así lo desean pueden revisar el script desde JessWishesDev en la sección de aprendizaje/Recursos.

Espero que les sirva para sus proyecto.

Saludos.



 
Última edición:

Jessie

What goes around, comes around
Respuesta: Nuevo encuentro salvaje

Me dijeron de un error en los encuentros en donde no se podían tener diferentes encuentros en el mismo mapa, esto se debía a las prioridades que se tomaban al momento de leer el tipo de evento "posible" en ese mapa.

Pero ya lo edite y agregue los condicionales que faltaban para evitar que esto suceda.
Saludos.
 

Morel X

Pues bueno aquí estamosxD
Re: Nuevo encuentro salvaje

No me había dado cuenta hasta ahora que me esta dando un problema, y es que por ejemplo, estoy en la ruta 23 donde hay hierba por un lado y por otro lado hay arena, si por ejemplo yo pokemon charmander en la hierba y caterpie en la arena, en los dos sitios me salen caterpie, por qué crees que me esta pasando eso?
 

Jessie

What goes around, comes around
Respuesta: Re: Nuevo encuentro salvaje

No me había dado cuenta hasta ahora que me esta dando un problema, y es que por ejemplo, estoy en la ruta 23 donde hay hierba por un lado y por otro lado hay arena, si por ejemplo yo pokemon charmander en la hierba y caterpie en la arena, en los dos sitios me salen caterpie, por qué crees que me esta pasando eso?
Es por lo mismo que explique en el comentario anterior, tienes que cambiar la parte de las prioridades en las secciones pbEncounterType y la de isEncounterPossibleHere?, ahí se encuentran los condicionales del tipo de encuentro y si es posible el encuentro, en el ejemplo, doy prioridad al encuentro "Nieve" si existe un encuentro en Nieve definido en el PBS y si el personaje se encuentra parado sobre el TerrainTag Nieve, de no ser así entonces pasa al siguiente condicional que es verificar si estas en grass.

Ya lo he revisado y si me ha funcionado, incluso con solo 1 de esos tipos de encuentros definidos.
 

Morel X

Pues bueno aquí estamosxD
Re: Nuevo encuentro salvaje

Si eso lo he hecho y funciona pero lo que pasa es que ahora parece que comparten los pokemon salvajes y no se porque, puedes echarle un vistazo a ver si he sido yo que lo he puesto mal? yo lo he hecho con arena en lugar de nieve, el pbEncounterType:

def pbEncounterType
if $PokemonGlobal && $PokemonGlobal.surfing
return EncounterTypes::Water
elsif self.isCave?
return EncounterTypes::Cave
elsif self.isArena?
return EncounterTypes::Arena
elsif self.isGrass?
time=pbGetTimeNow
enctype=EncounterTypes::Land
enctype=EncounterTypes::LandNight if self.hasEncounter?(EncounterTypes::LandNight) && PBDayNight.isNight?(time)
enctype=EncounterTypes::LandDay if self.hasEncounter?(EncounterTypes::LandDay) && PBDayNight.isDay?(time)
enctype=EncounterTypes::LandMorning if self.hasEncounter?(EncounterTypes::LandMorning) && PBDayNight.isMorning?(time)
if pbInBugContest? && self.hasEncounter?(EncounterTypes::BugContest)
enctype=EncounterTypes::BugContest
end

Y el isEncounterPossibleHere?:

def isEncounterPossibleHere?
if $PokemonGlobal && $PokemonGlobal.surfing
return true
elsif PBTerrain.isIce?(pbGetTerrainTag($game_player))
return false
elsif self.isCave?
return true
else
if self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
return true
elsif self.isGrass?
return PBTerrain.isGrass?($game_map.terrain_tag($game_player.x,$game_player.y))
end
end
return false
end
 

Jessie

What goes around, comes around
Respuesta: Re: Nuevo encuentro salvaje

def pbEncounterType
if $PokemonGlobal && $PokemonGlobal.surfing
return EncounterTypes::Water
elsif self.isCave?
return EncounterTypes::Cave
elsif self.isArena?
return EncounterTypes::Arena
elsif self.isGrass?
time=pbGetTimeNow
enctype=EncounterTypes::Land
enctype=EncounterTypes::LandNight if self.hasEncounter?(EncounterTypes::LandNight) && PBDayNight.isNight?(time)
enctype=EncounterTypes::LandDay if self.hasEncounter?(EncounterTypes::LandDay) && PBDayNight.isDay?(time)
enctype=EncounterTypes::LandMorning if self.hasEncounter?(EncounterTypes::LandMorning) && PBDayNight.isMorning?(time)
if pbInBugContest? && self.hasEncounter?(EncounterTypes::BugContest)
enctype=EncounterTypes::BugContest
end
Aquí tienes el problema, tienes colocado solo elsif self.isArena?, esto quiere decir que siempre que tengas ese tipo de encuentro definido en el PBS siempre te saldrá en cualquier terraintag que llame a un encuentro salvaje.
Lo que no hiciste fue agregar el condicional de pbGetTerrainTag($game_player)==PBTerrain::Arena para que ese tipo de encuentro solo suceda en la Arena, quedaría algo así:

Código:
def pbEncounterType
    if $PokemonGlobal && $PokemonGlobal.surfing
      return EncounterTypes::Water
    elsif self.isCave?
      return EncounterTypes::Cave
    elsif self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
      return EncounterTypes::Arena
    elsif self.isGrass?
      time=pbGetTimeNow
      enctype=EncounterTypes::Land
      enctype=EncounterTypes::LandNight if self.hasEncounter?(EncounterTypes::LandNight) && PBDayNight.isNight?(time)
      enctype=EncounterTypes::LandDay if self.hasEncounter?(EncounterTypes::LandDay) && PBDayNight.isDay?(time)
      enctype=EncounterTypes::LandMorning if self.hasEncounter?(EncounterTypes::LandMorning) && PBDayNight.isMorning?(time)
      if pbInBugContest? && self.hasEncounter?(EncounterTypes::BugContest)
        enctype=EncounterTypes::BugContest
      end
Ahora ya debe funcionar sin problemas.
 

Morel X

Pues bueno aquí estamosxD
Re: Respuesta: Re: Nuevo encuentro salvaje

Aquí tienes el problema, tienes colocado solo elsif self.isArena?, esto quiere decir que siempre que tengas ese tipo de encuentro definido en el PBS siempre te saldrá en cualquier terraintag que llame a un encuentro salvaje.
Lo que no hiciste fue agregar el condicional de pbGetTerrainTag($game_player)==PBTerrain::Arena para que ese tipo de encuentro solo suceda en la Arena, quedaría algo así:

Código:
def pbEncounterType
    if $PokemonGlobal && $PokemonGlobal.surfing
      return EncounterTypes::Water
    elsif self.isCave?
      return EncounterTypes::Cave
    elsif self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
      return EncounterTypes::Arena
    elsif self.isGrass?
      time=pbGetTimeNow
      enctype=EncounterTypes::Land
      enctype=EncounterTypes::LandNight if self.hasEncounter?(EncounterTypes::LandNight) && PBDayNight.isNight?(time)
      enctype=EncounterTypes::LandDay if self.hasEncounter?(EncounterTypes::LandDay) && PBDayNight.isDay?(time)
      enctype=EncounterTypes::LandMorning if self.hasEncounter?(EncounterTypes::LandMorning) && PBDayNight.isMorning?(time)
      if pbInBugContest? && self.hasEncounter?(EncounterTypes::BugContest)
        enctype=EncounterTypes::BugContest
      end
Ahora ya debe funcionar sin problemas.
Fallo mio, me salte eso sin querer, gracias! por cierto en la parte esta del: def isEncounterPossibleHere?

Si yo quiero poner otro terreno más como lo pondría, así? es que lo había probado y no me había funcionado:

def isEncounterPossibleHere?
if $PokemonGlobal && $PokemonGlobal.surfing
return true
elsif pbGetTerrainTag($game_player)==PBTerrain::Ice
return false
elsif self.isCave?
return true

else
if self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
return true
if self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
return true
elsif self.isGrass?
return pbIsGrassTag?($game_map.terrain_tag($game_player.x,$game_player.y))
end
end
return false
end
 

Jessie

What goes around, comes around
Respuesta: Re: Respuesta: Re: Nuevo encuentro salvaje

Fallo mio, me salte eso sin querer, gracias! por cierto en la parte esta del: def isEncounterPossibleHere?

Si yo quiero poner otro terreno más como lo pondría, así? es que lo había probado y no me había funcionado:

def isEncounterPossibleHere?
if $PokemonGlobal && $PokemonGlobal.surfing
return true
elsif pbGetTerrainTag($game_player)==PBTerrain::Ice
return false
elsif self.isCave?
return true

else
if self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
return true
if self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
return true
elsif self.isGrass?
return pbIsGrassTag?($game_map.terrain_tag($game_player.x,$game_player.y))
end
end
return false
end
Algo así, solo que recuerda que solo el primer condicional lleva if los demás deben llevar elsif, así que quedaría algo así :

Código:
def isEncounterPossibleHere?
    if $PokemonGlobal && $PokemonGlobal.surfing
      return true
    elsif pbGetTerrainTag($game_player)==PBTerrain::Ice
      return false
    elsif self.isCave?
      return true
    
else
      if self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
        return true
      elsif self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
        return true
      elsif self.isGrass?
       return pbIsGrassTag?($game_map.terrain_tag($game_player.x,$game_player.y))
      end
    end
      return false
  end
 

Morel X

Pues bueno aquí estamosxD
Re: Respuesta: Re: Respuesta: Re: Nuevo encuentro salvaje

Algo así, solo que recuerda que solo el primer condicional lleva if los demás deben llevar elsif, así que quedaría algo así :

Código:
def isEncounterPossibleHere?
    if $PokemonGlobal && $PokemonGlobal.surfing
      return true
    elsif pbGetTerrainTag($game_player)==PBTerrain::Ice
      return false
    elsif self.isCave?
      return true
    
else
      if self.isNieve? && pbGetTerrainTag($game_player)==PBTerrain::Nieve
        return true
      elsif self.isArena? && pbGetTerrainTag($game_player)==PBTerrain::Arena
        return true
      elsif self.isGrass?
       return pbIsGrassTag?($game_map.terrain_tag($game_player.x,$game_player.y))
      end
    end
      return false
  end
Entiendo, perfecto muchas gracias!
 

Jessie

What goes around, comes around
He actualizado este tutorial para que sea un poco más comprensible.
Aunque probablemente en las versiones futuras de Essentials no todo funcione del mismo modo, esto serviría como base para entender como funciona el sistema de encuentros salvajes.

Saludos.
 
Arriba