[Tutorial] Sustituir los eventos de golpe cabeza por un Terrain Tag


Autores
AlecGW, Xaveriux

Introducción

¡Hola a todos! Como muchos sabréis, en Essentials algunos tiles necesitan un valor para asignarles un efecto en concreto, como la hierba alta para que aparezcan Pokémon, el agua para surfear o para bucear… Esos valores son conocidos como terrain tags.

Pues bien, el objeto de este tutorial es añadir dicho valor a una mecánica que, por defecto, en Essentials no existe, como es el uso de Golpe Cabeza, un movimiento que nos permite encontrar Pokémon que habitan en algunos árboles al golpearlos.

Si estás desarrollando un fangame que aprovecha mucho esta posibilidad, pero lo estás haciendo por medio de eventos, esto puede ocasionar problemas de rendimiento y de lag si se sitúan en mapas grandes o con muchos eventos simultáneos.

Por ello, vamos a ver cómo podemos ahorrarnos la tediosa tarea de asignar eventos de Golpe Cabeza a cada tile que corresponda con el árbol que queremos que tenga ese comportamiento.

1º Asignando un terrain tag al movimiento Golpe Cabeza

En primer lugar, abrimos el editor de script pulsando F11 o bien haciendo click en el icono de la hoja en la barra superior y añadimos la siguiente línea al final de la lista que aparece al inicio del script PBTerrain:

Headbutt = 17

Por defecto, Essentials trae una lista de 16 terrain tag, por eso el número que utilizo es 17, ya que es el siguiente. Si has añadido otros terrain tag antes que este, usa el número siguiente al último que tengas en la misma.

A continuación, añadimos estas líneas de código antes del último “end” del mismo script PBTerrain:

def PBTerrain.isHeadbutt?(tag)
       return tag == PBTerrain::Headbutt
end

Para acabar con este apartado, reemplazamos el código de la sección Headbutt en el script PField_HiddenMoves (si usáis una versión 17.2, el script se llamará PField_FieldMoves) por este:

#===============================================================================
# Headbutt
#===============================================================================
def Kernel.pbHeadbuttEffect(event)
  a=((event[1]*event[2]+event[1]*event[2])/5)%10
  b=($Trainer.id&0xFFFF)%10
  chance=1
  if a==b
    chance=8
  elsif a>b && (a-b).abs<5
    chance=5
  elsif a<b && (a-b).abs>5
    chance=5
  end
  if rand(10)>=chance
    Kernel.pbMessage(_INTL("Nope. Nothing..."))
  else
    if !pbEncounter(chance==1 ? EncounterTypes::HeadbuttLow : EncounterTypes::HeadbuttHigh)
      Kernel.pbMessage(_INTL("Nope. Nothing..."))
    end
  end
end

def Kernel.pbHeadbutt(event)
  movefinder=Kernel.pbCheckMove(:HEADBUTT)
  if $DEBUG || movefinder
    if Kernel.pbConfirmMessage(_INTL("A Pokémon could be in this tree. Would you like to use Headbutt?"))
      speciesname=!movefinder ? $Trainer.name : movefinder.name
      Kernel.pbMessage(_INTL("{1} used Headbutt!",speciesname))
      pbHiddenMoveAnimation(movefinder)
      Kernel.pbHeadbuttEffect(event)
    end
  else
    Kernel.pbMessage(_INTL("A Pokémon could be in this tree. Maybe a Pokémon could shake it."))
  end
  Input.update
  return
end

Events.onAction+=proc{|sender,e|
   terrain=Kernel.pbFacingTerrainTag
   notCliff=$game_map.passable?($game_player.x,$game_player.y,$game_player.direction)
   if PBTerrain.isHeadbutt?(terrain)
     Kernel.pbHeadbutt(pbFacingTile)
     return
   end
}

HiddenMoveHandlers::CanUseMove.add(:HEADBUTT,proc{|move,pkmn|
   facingEvent=$game_player.pbFacingEvent
   if !facingEvent || facingEvent.name!="HeadbuttTree"
     Kernel.pbMessage(_INTL("Can't use that here."))
     return false
   end
   return true
})

HiddenMoveHandlers::UseMove.add(:HEADBUTT,proc{|move,pokemon|
   if !pbHiddenMoveAnimation(pokemon)
     Kernel.pbMessage(_INTL("{1} used {2}!",pokemon.name,PBMoves.getName(move)))
   end
   facingEvent=$game_player.pbFacingEvent
   Kernel.pbHeadbuttEffect(facingEvent)
})

2º Asignando el valor del Terrain Tag al tile 

Para que nuestro tile de árbol funcione con el efecto que queremos, debemos asignarle el valor que hemos puesto en la lista del principio del tutorial, esto es, el 17. Para ello, desde el Editor o desde el modo Debug accedemos al tileset utilizando la opción “Edit Terrain Tags”, y nos dirigimos hacia el tile que queremos que tenga el valor de terrain tag Golpe Cabeza, tal que así:

Imagen que contiene objeto, reloj, computadora, diferente

Descripción generada automáticamente

3º Determinar encounters y testear

Una vez tengamos nuestro valor de terrain tag correctamente asignado al tile en cuestión, solo queda mapearlo donde queramos, asignar encuentros salvajes al mapa donde se encuentre dicho tile y ya estaría todo, solo testear si funciona. (Para asignar encounters 🡪 https://essentialsdocs.fandom.com/wiki/Wild_encounters)

Espero que os sirva de ayuda y que podáis usarlo sin problemas en vuestros fangames ¡Un saludo!

P.D: Esta tutorial ha sido testeado en una versión 17.2 de Essentials. No creo que dé problemas en versiones anteriores salvo que sean muy antiguas. En cualquier caso, podréis reportar los posibles errores que surjan desde el blog o desde el Discord de la comunidad.



Como siempre, enlazaros a nuestro canal de Discord, donde podéis recibir feedback y ayuda en vuestros proyectos de Pokémon Essentials, y a nuestro Twitter donde podéis enteraros de todas nuestras novedades. Tampoco olvidéis suscribiros a nuestro blog para estar pendientes de todo.

Puedes ver otros aportes en:

https://newpokeliberty.blogspot.com/p/blog-page_21.html

Comentarios