Registrarse

[RPG - Scripting] Montar en pokemon

Estado
Cerrado para nuevas respuestas.

Morel X

Pues bueno aquí estamosxD
Buenas pues quería que cuando seleccionemos un pokemon de equipo, en donde ponen sus datos, dar objeto, etc. Quería que apareciera la opción Montar, pero que solo funcionara con los pokémon que estan en el script, por ejemplo arcanine, rapidash, onix, etc. En plan pokemon lest go.

Llevo un tiempo intentándolo y pues vi algunos tutoriales pero no me funcionaron.

Un saludo.
 

Diego Mertens

Dartrix Joven
Podrias simplemente implementar la funcion de pokemonturas, no se si me entendiste, pero es un script que hace que puedas montar ciertos pokemon y hasta tienen sus efetos propios:
Código:
#==============================================================================#
#==============================================================================#
# PokéMonturas para Pokémon Essentials.
#==============================================================================#
#==============================================================================#
# Creado por JessWshs
# Versión 3.0 :
#      Interface(nueva)
#      Eliminado el codigo extra
#      No es necesario usar variables adicionales
#      Añadida la opción debug para agregar todas las monturas juntas
#      Mensaje que te avisa cuando ya no puedes registrar más(modo $debug).
#      Opción de "Reset" para cuando se edite la información de las monturas.
#      Mensaje de usar/dejar de usar la montura seleccionada.
#      Cambio de charset dependiendo de la montura que se use.
#      Agregado 12 diferentes monturas.
#      Condicionales para las 12 monturas.
#      No pueden usarse en interiores.
#      Excepciones de mapas interiores.
#      Si se accede a un mapa que no sea "Outdoor", se cancela la montura.
#      No pueden usarse si se hace surf a menos que sea una montura marina.
#      No pueden usarse si se hace buceo a menos que se desee emergir.
#      Las nuevas monturas ya no se salen del margen de la pantalla.
#      Compatible con la version 17 de Essentials.
#      Compatible con la version 16 de Essentials.
#      Compatible con la version 15 de Essentials.
#      Velocidades de movimiento según la montura usada.
#      Compatible con el script de Huellas en la arena de KleinStudio.
#      Efecto de obtener objetos al usar Corte.
#      Efecto de obtener objetos o encuentros salvajes al Romper Rocas.
#      Registrar hasta 4 monturas a la vez en modo acceso rápido.
#      Acceder a la pantalla de Buscamontura oprimiendo la tecla "S" (opcional).
#      Abrir la pantalla de acceso rápido oprimiendo la tecla "A"
#      Compatibilidad con las cañas de pescar.
#      Solo se pueden usar las cañas con la montura llamada "SurfPesca"(Lapras).
#      Compatibilidad con el uso de la bicicleta.
#      Compatibilidad con el uso del BuscaObjetos(objeto clave).
#      Algunos efectos externos de monturas se realizan desde Scene_Map.
#      Los npc de GolpeRoca y Corte pueden estar vacios.
#      Agregada animación al usar una montura.
#      Agregada animación al usar vuelo(opcional).
# 
#==============================================================================#
#==================Como registrar==============================================#
#==============================================================================#
# Registra una nueva montura usando el comando :  pbRegMontura
#  Se registrará una nueva cada vez que se llame ese comando.
#  Si esta en modo debug, al registrar una montura te preguntará si quieres
#  registrarlas todas o si ya tienes todas registradas.
#
# La pantalla del buscamontura se abre usando el comando :  pbPkMontura
#  Se puede acceder al oprimir la tecla "S" si la variable ACTIVARLR esta
#  activada "true".
# 
# Para abrir la pantalla de acceso rápido se usa el comando : pbPkMonturaKey
#  por defecto, se puede acceder usando la tecla "A".
# 
# Los charset/Overworld/minis deben estar en al carpeta Graphics/characters y
#  son nombrados de la siguiente manera :  montura_EFECTO_00GENERO
#  donde EFECTO es el efecto de la montura
#  y GENERO es 0 si es un Chico o 1 si es una Chica.
#  ejemplos : montura_RompeRocas_000, montura_RompeRocas_001
#             montura_SurfPesca_000, montura_SurfPesca_001
#  Cuando el efecto de la montura cambia su imagen, se nombra de esta manera :
#   montura_EFECTOA_00GENERO, en caso especial que la montura tenga más de un
#   efecto, el siguiente efecto se llamará montura_EFECTOB_00GENERO, hasta ahora
#   la unica montura con este caso es "SurfPesca"(lapras) donde
#    montura_SurfPesca_000 es la imagen normal de la montura
#    montura_SurfPescaA_000 es la imagen de la montura al moverse rápido
#    montura_SurfPescaB_000 es la imagen de la montura al usar una Caña.
# 
#
#  En caso de agregar o eliminar monturas, cambiar los números de la lista de
#   monturas o cambiar la lista de mapas especiales, se tiene que dar un "Reset"
#   para cargar los cambios hechos, usando el comando :  pbRegMontura(true),
#   el efecto de entregar/registrar montura nueva se aplicará normalmente
#   luego de hacer el reset.
#   Esto solo aplica si ya se tiene una partida guardada.
# 
# 
#  Si se desea borrar todas las monturas ya obtenidas/registradas se hace
#   de la siguiente manera :  pbRegMontura(nil,true)
#   Luego de borrarlas, el efecto de entregar la primera montura disponible
#   se aplicará normalmente.
#
#
#==============================================================================#
#================Huellas en la arena (Script de KleinStudio)===================#
#==============================================================================#
# Para que funcione, este script de Pokémonturas debe estar debajo del
#  script de Huellas en la arena.
#
# Las imagenes de las huellas van en la carpeta Graphics/Pictures.
# Se deben nombrar de esta manera : footsetEFECTO, donde EFECTO es el nombre
#  del efecto de la montura, por ejemplo : "footsetRompeRocas", "footsetCorte".
# Si la imagen no existe, se usará la llamada "footset".
# Si la montura esta dentro la lista en la variable SINHUELLAS, no tendrá imagen
#  de huellas al caminar por el terrain de arena.
#
#
#==============================================================================#
#   Funciones de las 12 monturas.
#==============================================================================#
#
#  *Carga Tauros : al oprimir "Z" y moverte, cambiará de imagen del jugador y
#  rompera rocas (npc) llamadas "Rock" que tenga enfrente.
#
#  *Olfatero Stoutland : al oprimir "Z" , cambiara de imagen del personaje y
#    mostrará un signo de "?" si hay un objeto oculto cerca, y un signo de "!"
#    si el objeto esta a 3 tiles de distancia hacía cualquier dirección.
#
#  *Nado lapras : al apretar "Z" mientras te mueves, cambiara la imagen del
#    personaje e incrementará su velocidad de movimiento.
#   Al usar una caña, se cambiará la imagen del jugador pescando sobre la
#    montura.
#
#  *Vuelo Charizard : Te trasnportará a un mapa ya visitado.
#   
#  *Propulción Sharpedo : Al oprimir "Z" mientras te mueves, romperá rocas(npc)
#     con el nombre "Rock" que tenga enfrente.
#
#  *Todoterreno Mudsdale : Solo esta montura puede pasar por el
#    terrain número 22 (PBTerrain::CaminoRocoso) y al caminar apretando "Z"
#    avanzará más rapido.
#
#  *Empuje Machamp : Al estar cerca de un npc llamado "Boulder"
#      cambiará de imagen el personaje y al avanzar hacía ese npc, este se
#      moverá (si es posible).  
#
#  *Corte Syther : Al oprimir "Z" estando enfrente de un npc llamado
#      "Tree", se aplicará el efecto de corte.
#       No es necesario que el npc tenga algún texto o script dentro.
#
#  *Cascada Goldeen : Solo con esta montura se puede subir por las
#      cascadas.
#
#  *Buceo Wailmer : Solo al estar haciendo surf y estar sobre un terrain
#       de "DeepWater"(terrain 5), te sumergirá(existiendo un mapa para buceo).
#       Estando en un mapa submarino, te regresará a la superficie surfeando.
#
#  *TrepraRocas Golem : Al usarse, te permitirá subir o bajar por los terrenos
#        23 (PBTerrain::TreparocasA) y 24 (PBTerrain::TreparocasB).
#       El 23 es para subir mirando hacía la derecha o la izquierda, el jugador
#        seguirá subiendo en diagonal hasta que tenga un espacio pasable enfrente.
#       El 24 es para bajar mirando hacía la derecha o la izquierda, el jugador
#        seguirá bajando en diagonal hasta que tenga un espacio pasable enfrente.
#       La animación al subir solo se verá si el jugador pasa sobre alguno de
#        los terrenos 23 o 24.
#       Ambos, 23 y 24, sirven para subir o bajar mirando hacía adelante o atras.
#
#  *Remolino Empoleon : Solo está montura puede pasar por el
#       terrain número 25 (PBTerrain::Remolino).
#
#==============================================================================#
# *Creditos no son necesarios pero se agradece.
#==============================================================================#
#==============================================================================#
#
#==============================================================================#
# Compatibilidad con algunas caracteristicas de versiones anteriores de
#  Pokémon Essentials.
#==============================================================================#

# Apartir de la versión 16 la variable debe ser "true"
PASABLEPUENTE = true
# Apartir de la versión 17 la variable debe ser "true"
SURFABLEMAPAS = true
# Apartir de la versión 17 la variable debe ser "true"
VUELOMAPA     = true
# Apartir de la versión 17 la variable debe ser "true"
PESCAMOV      = true
# Apartir de la versión 17 la variable debe ser "true"
BOTONES       = true

#==============================================================================#
# Variables
#==============================================================================#

# Número máximo de monturas que se pueden recibir.
MAX_MONTURAS = 12

# Número máximo de monturas que se verán en la pantalla.
MAX_POR_LINEA = 7

# Nombre del sonido escuchado al recibir una montura nueva, ubicado en la
#  carpeta Audio/ME.
MON_MU = "Item get"

# Distancia máxima a la que se detectarán los objetos ocultos cercanos.
MON_DIST = 3

# Numeros de las animaciones al hallar un objeto oculto cerca,
#  MON_ANIM_1 es si el objeto esta dentro del rango de la pantalla
#  MON_ANIM_2 es si el objeto esta cerca del jugador a MON_DIST de distancia.
MON_ANIM_1 = 3
MON_ANIM_2 = 4

# Número de la animación al empujar rocas.
MON_ANIM_3 = 7

# Número de la animación al usar TrepaRocas
MON_TREPAROCAS=2

# Velocidad de espera para cada vez que se sube/baja un tile con TrepaRocas.
MON_TREPAROCAS_VEL = 0

# Si quieres que se vea la base al momento de hacer surf/buceo
# Para versiones previas a la 17, se recomienda dejarlo en false
BASESURF=false
BASEDIVE=false

# Número de montura minima que debes tener registrada
#  para poder hacer surf/buceo (el 0 cuenta como la primera montura).
MON_SURF = 2
MON_BUCEO = 9

# Probabilidad de encuentro salvaje al usar RompeRocas/SurfRocas.
MON_GR_EN = 25

# Probabilidad de obtener objetos al usar RompeRocas/SurfRocas.
MON_GR_OB = 20

# Probabilidad de obtener objetos al usar Corte.
MON_CR_OB = 20

# Usar la función de la tecla "S" para abrir el Buscamontura.
ACTIVARLR = true

# Activar la Animación al usar el efecto "Vuelo".
ANIMA_VUELO = true

# ID de los mapas que no son "outdoor" pero puedes usar las monturas en ellos
# por ejemplo cuevas, tuneles, Mapas para Buceo, las casetas de conexión, etc.
LISTADEMAPAS = [34,29,30,49,70]

# Lista de monturas que no dejan huellas en la arena(script de KleinStudio)
SINHUELLAS = ["SurfPesca","SurfRocas","Buceo","Cascada","Remolino"]
#==============================================================================#
#=========================Terrenos/Terraintag==================================#
#==============================================================================#
##Para versiones desde la 15 o menores, se cambia "module" por "class".
# class PBTerrain
module PBTerrain
  CaminoRocoso = 22  # Solo la montura con el efecto "CaminoRocoso" (Mudsdale)
                     #  puede pasar por este terreno
  TreparocasA  = 23  # Usado para Subir en diagonal usando TrepaRocas
  TreparocasB  = 24  # Usado para Bajar en diagonal usando TrepaRocas
                     #  Ambos sirven para Subir/Bajar de frente
  Remolino     = 25  # Solo la montura con el efecto "Remolino" (Empoleon)
                     #  puede pasar por este terreno

 def PBTerrain.caminoRocoso?(tag)
   return tag==PBTerrain::CaminoRocoso
 end
 def PBTerrain.remolino?(tag)
   return tag==PBTerrain::Remolino
 end
 def PBTerrain.isWaterfall?(tag)
    return tag==PBTerrain::WaterfallCrest ||
           tag==PBTerrain::Waterfall
  end
  def PBTerrain.isPassableWater?(tag)
    return tag==PBTerrain::Water ||
           tag==PBTerrain::StillWater ||
           tag==PBTerrain::DeepWater ||
           tag==PBTerrain::WaterfallCrest
  end 
  def PBTerrain.isSurfable?(tag)
    return PBTerrain.isWater?(tag)
  end
  def PBTerrain.isWater?(tag)
    return tag==PBTerrain::Water ||
           tag==PBTerrain::StillWater ||
           tag==PBTerrain::DeepWater ||
           tag==PBTerrain::WaterfallCrest ||
           tag==PBTerrain::Waterfall
  end
  
end

#==============================================================================#
#=========================Game_Temp============================================#
#==============================================================================#
class Game_Temp
  attr_accessor :monturas
  attr_accessor :buscador
  attr_accessor :cascada

end

#==============================================================================#
#============================Game_Player=======================================#
#==============================================================================#
class Game_Player
 attr_accessor :monturas_efectos
  
def monturaskey(cargar=false,val=0,montura="",borrar=false)
  @derecha=""   if !@derecha   || borrar==true
  @izquierda="" if !@izquierda || borrar==true
  @abajo=""     if !@abajo     || borrar==true
  @arriba=""    if !@arriba    || borrar==true
  if cargar
    n=[@derecha,@izquierda,@abajo,@arriba]
    return n
  else
    case val
    when 0; @derecha=montura
    when 1; @izquierda=montura
    when 2; @abajo=montura
    when 3; @arriba=montura
    end
  end
end

def monturas(var=nil,reset=false,borrar=false)
   montura_num= 0 
   ## Números nacionales(Dex) de los Pokémon que serán monturas.
   montura_lista=[128,508,131,6,319,1,68,123,118,320,76,395]
   montura_efecto= ""
   montura_activo= false
   montura_mapas = LISTADEMAPAS
   if (!var && !@monturas) || borrar==true
      @monturas=[montura_num,montura_lista,montura_efecto,montura_activo,montura_mapas]
   elsif reset==true
      @monturas=[$game_temp.monturas[0],montura_lista,$game_temp.monturas[2],$game_temp.monturas[3],montura_mapas]
   elsif var
     @monturas = []
     for i in 0..4
       @monturas.push(var[i])
     end
   end
   $game_temp.monturas=@monturas
end
 
alias monturas_update update
def update
  monturas_update
  $game_player.monturas()
  monturas=$game_temp.monturas
  if  monturas[3]==true
      ##Velocidades a las que se mueven ciertas monturas
      @move_speed = 4.8 if monturas[2]=="RompeRocas" || monturas[2]=="SurfRocas"
      @move_speed = 6.2 if ( monturas[2]=="RompeRocas" || monturas[2]=="SurfRocas" ) && Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
      @move_speed = 5.2 if monturas[2]=="Buscador"
      @move_speed = 2.0 if monturas[2]=="Buscador" && Input.press?(Input::A)
      @move_speed = 4.2 if monturas[2]=="SurfPesca"
      @move_speed = 5.6 if ( monturas[2]=="SurfPesca" && Input.press?(Input::A) ) || monturas[2]=="SurfRocas"
      @move_speed = 3.4 if monturas[2]=="CaminoRocoso"
      @move_speed = 5.6 if monturas[2]=="CaminoRocoso" && Input.press?(Input::A)
      @move_speed = 4.0 if monturas[2]=="Fuerza" || monturas[2]=="Remolino" || monturas[2]=="Corte" || monturas[2]=="Buceo"
      @move_speed = 3.0 if monturas[2]== (monturas[2]=="Remolino" && pbGetTerrainTag($game_player)==PBTerrain::Remolino)
      @move_speed = 3.8 if monturas[2]=="TrepaRocas"
      @move_speed = 5.0 if monturas[2]=="RompedorRocas"
      @move_speed = 6.2 if monturas[2]=="RompedorRocas" && Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
  end
end

end
  
#======================================================================================================#
#============================Lista de monturas=========================================================#
#======================================================================================================#
def pbListadeMonturas(val)
 ## La primera es de base, osea montura "0" y no se modifica.
 m=[["Ninguno","Nada","texto"]]
 m.push(["Carga Tauros"         ,"RompeRocas"   , "Tauros romperá rocas."                ]) if val>=0
 m.push(["Olfateo Stouland"     ,"Buscador"     ,"Stouland hallará objetos ocultos."     ]) if val>=1
 m.push(["Nado Lapras"          ,"SurfPesca"    ,"Navega y Pesca con Lapras."            ]) if val>=2
 m.push(["Vuelo Charizard"      ,"Vuelo"        ,"Charizard te llevará volando."         ]) if val>=3
 m.push(["Propulsión Sharpedo"  ,"SurfRocas"    ,"Sharpedo nadará rapidamente."          ]) if val>=4
 m.push(["Todoterreno Mudsdale" ,"CaminoRocoso" ,"Mudsdale te llevará entre rocas."      ]) if val>=5
 m.push(["Empuje Machamp"       ,"Fuerza"       ,"Machamp moverá enormes piedras."       ]) if val>=6
 m.push(["Corte Scyther"        ,"Corte"        ,"Scyther cortará pequeños árboles."     ]) if val>=7
 m.push(["Cascada Goldeen"      ,"Cascada"      ,"Goldeen nadará encima de cascadas."    ]) if val>=8
 m.push(["Buceo Wailmer"        ,"Buceo"        ,"Wailmer buceará por los mares."        ]) if val>=9
 m.push(["TrepaRocas Golem"     ,"TrepaRocas"   ,"Golem trepará sobre laderas rocosas."  ]) if val>=10
 m.push(["Remolino Empoleon"    ,"Remolino"     ,"Empoleon atravesará remolinos marinos."]) if val>=11
 m.push(["Krookodile Destructor","RompedorRocas","Krookodile destruirá rocas."           ]) if val>=12
 ## El primero es el nombre de la montura, el segundo es el efecto y el tercero es el texto de información.
  
 ## Apartir de aqui se pueden agregar más usando el siguiente formato.
 ## m.push["Nombre de la montura","Efecto","texto de información"] if val>=NUMERO DE MONTURA
 ##  el NUMERO DE MONTURA es el lugar que ocupará la montura nueva (0 es el primer lugar)
 ## ejemplo :
 ## m.push["Destello Zubat","Destello","Zubat iluminará tu camino"] if val>=12

 lista=[]
 for i in 1..val
   lista.push(m[i][1])
 end
 $game_player.monturas_efectos=lista
 return m
end

#================================================================================#
#=======================Animación al Usar montura================================#
#================================================================================#
def pbmontura_animacion
    anim={}
    anim["anim"]=Sprite.new
    anim["anim"].z = 99999
    anim["anim"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/monturas_fx")
    anim["anim"].x= 160
    anim["anim"].y= 80
    for i in 2..4
      anim["anim"].src_rect.set(192*i,192,192,192)
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    for i in 0..4
      anim["anim"].src_rect.set(192*i,192*2,192,192)
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    anim["anim"].opacity=0
end
  
#================================================================================#
#============================Registrar monturas==================================#
#================================================================================#
def pbRegMontura(reset=nil,borrar=false)
  $game_player.monturas()
  monturas=$game_temp.monturas
  if MAX_MONTURAS!=monturas[1].length || reset==true
    $game_player.monturas(nil,true)
    monturas=$game_temp.monturas
    Kernel.pbMessage("Parece que ha cambiado la lista de monturas/mapas en el script, se ha dado un reset para evitar errores.") if $DEBUG
  end
  if borrar==true
    $game_player.monturas(nil,false,true)
    monturas=$game_temp.monturas
    $game_player.monturaskey(true,0,"",true)
    Kernel.pbMessage("Se han borrado las monturas.") if $DEBUG
  end
  n=0
  if monturas[0]==MAX_MONTURAS
    Kernel.pbMessage("Ya tienes registrado todas las monturas disponibles en el buscamontura.") if $DEBUG
  else
    if $DEBUG
      if Kernel.pbConfirmMessage(_INTL("¿Deseas tener todas las monturas disponibles?"))
         Kernel.pbMessage("\\me[#{MON_MU}]Has registrado todas las monturas en el Buscamontura.")
         monturas[0]=MAX_MONTURAS
         n=1
       end
    end
    if n==0
      monturas[0] +=1
      pk=monturas[1][monturas[0]-1]
      poke=(PokeBattle_Pokemon.new(pk,1)).name
      Kernel.pbMessage("\\me[#{MON_MU}]Has registrado a #{poke} en el Buscamontura.")
    end
  end
  $game_player.monturas(monturas)
end

#================================================================================#
#===============Pantalla de Acceso Rápido de monturas============================#
#================================================================================#
def pbPkMonturaKey
    sprites={}
    vista=Viewport.new(0,0,Graphics.width,Graphics.height)
    vista.z=99998
    sprites["overlay"]=BitmapSprite.new(Graphics.width, Graphics.height)
    sprites["overlay"].z = 99999
    overlay=sprites["overlay"].bitmap
    overlay.clear
    sprites["Fondo"]=Sprite.new
    sprites["Fondo"].z = 99999
    sprites["Fondo"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo3")
    sprites["Fondo"].opacity=250
    key=$game_player.monturaskey(true)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    efectos=$game_player.monturas_efectos
    iconos=[0,0,0,0]
    numm=[]
    for i in 0..3
     if key[i]!=""
      for j in 0..gamemontura[0]
        iconos[i]=gamemontura[1][j] if efectos[j]==key[i]
      end
      icono=_INTL("{1}",iconos[i])
      icono="0" + icono if iconos[i]<100 && iconos[i]>9
      icono="00"+ icono if iconos[i]<10
      numm.push(i)
      sprites["montura#{i}"]=Sprite.new
      sprites["montura#{i}"].z = 99999
      sprites["montura#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Icons/icon#{icono}")
      sprites["montura#{i}"].opacity=250
      sprites["montura#{i}"].src_rect.set(0,0,64,64)
      iconx= i==0 ? 143 : 223
      iconx= 303 if i==1
      icony= i==2 ? 76 : 236
      icony= 156 if i==0 || i==1
      sprites["montura#{i}"].x=iconx
      sprites["montura#{i}"].y=icony
    end
  end
  boton=0
  loop do
    Graphics.update
    Input.update
    pbUpdateSpriteHash(sprites)

if Input.trigger?(Input::RIGHT); boton=2; end 
if Input.trigger?(Input::LEFT);  boton=1; end
if Input.trigger?(Input::UP);    boton=3; end
if Input.trigger?(Input::DOWN);  boton=4; end

## Efectos al seleccionar la montura.
if boton!=0 && gamemontura[0]>0
  unless (key[0]=="" && boton==1) || (key[1]=="" && boton==2) || (key[2]=="" && boton==3) || (key[3]=="" && boton==4)
    pbSEPlay("select")
   nombre=""
   for i in 0..3
     nombre=key[i]  if key[i]!="" && boton==i+1
   end
   p=  nombre==gamemontura[2] ? 1 : 0
   if pbPuedeMontar?(nombre,gamemontura[4],gamemontura[2])
     if nombre=="Vuelo"
        sprites["Fondo"].opacity=0
        for i in 0..3
          sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
        end
        pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
        pbWait(5)
        if gamemontura[3]==true
          $game_player.transparent = true
          pbmontura_animacion
          gamemontura[2]= ""
          gamemontura[3]= false
          $game_player.monturas(gamemontura)
          CambiaCharset(1)
          $game_player.transparent = false
        end
        pbWait(10)
        pbVuelo
        break 
      elsif nombre=="Buceo"
        sprites["Fondo"].opacity=0
       for i in 0..3
         sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
       end
        pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
        pbWait(5)
        gamemontura[2]= nombre
        if p==1 #Emergir
           gamemontura[2]= "SurfPesca"
           pbBucear(p)
           $game_player.monturas(gamemontura)
           $game_player.transparent = true
           pbmontura_animacion
           CambiaCharset(0,gamemontura[2])
           $game_player.transparent = false
        else
           $game_player.monturas(gamemontura)
           $game_player.transparent = true
           pbmontura_animacion
           CambiaCharset(0,gamemontura[2])
           $game_player.transparent = false
           pbBucear(p)
        end
        pbWait(5)
        break
    ## Si agregas un efecto especial como el Vuelo o buceo que se activan al momento
    ##  de usar la montura, lo puedes colocar aquí con un "elsif".
    #elsif
     else
       gamemontura[2]= (p==1) ? "" : nombre
       gamemontura[3]= (p==1) ? false : true
       $game_player.monturas(gamemontura)
       sprites["Fondo"].opacity=0
       for i in 0..3
         sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
       end
       pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
       pbWait(5)
       $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
       $game_player.transparent = true
       pbmontura_animacion
       if gamemontura[2]=="SurfPesca" || gamemontura[2]=="SurfRocas" || gamemontura[2]=="Cascada" || gamemontura[2]=="Remolino"
         surfbgm = pbGetMetadata(0,MetadataSurfBGM)
         pbCueBGM(surfbgm,0.5) if surfbgm
         pbStartSurfing if !$PokemonGlobal.surfing
       end
       CambiaCharset(p,gamemontura[2])
       $game_player.transparent = false
       pbWait(5)
       break
     end
   else
     sprites["Fondo"].opacity=0
     for i in 0..3
      sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
    end
  pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
  Kernel.pbMessage(_INTL("Parece que no puedes usarlo aquí ni ahora."))
  break
   end
  end
end
    
if Input.trigger?(Input::B)
  pbSEPlay("Choose")
  sprites["Fondo"].opacity=0
  for i in 0..3
      sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
  end
  pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
      break
     end
  end
end

#================================================================================#
#========================Pantalla del Buscamontura===============================#
#================================================================================#
def pbPkMontura
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    sprites={}
    vista=Viewport.new(0,0,Graphics.width,Graphics.height)
    vista.z=99998
    sprites["overlay"]=BitmapSprite.new(Graphics.width, Graphics.height)
    sprites["overlay"].z = 99999
    overlay=sprites["overlay"].bitmap
    overlay.clear
    sprites["Fondo"]=Sprite.new
    sprites["Fondo"].z = 99999
    sprites["Fondo"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo")
    sprites["retorno"]=Sprite.new
    sprites["retorno"].z = 99999
    sprites["retorno"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Regreso")
    sprites["retorno"].x=0
    sprites["retorno"].y=336
    sprites["infobase"]=Sprite.new
    sprites["infobase"].z = 99999
    sprites["infobase"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Basetxt")
    sprites["infobase"].x=66
    sprites["infobase"].y=340
    sprites["info"]=Window_UnformattedTextPokemon.new("")
    sprites["info"].width=Graphics.width
    sprites["info"].height=Graphics.height
    sprites["info"].baseColor=Color.new(220,220,220)
    sprites["info"].shadowColor=Color.new(60,60,68)
    sprites["info"].z=99999
    sprites["info"].windowskin=nil
    sprites["info"].text=_INTL("Información de la montura seleccionada.")
    sprites["info"].x=70
    sprites["info"].y=327
    # Lista de monturas obtenidas.
    # Solo si se tiene 1 o más monturas registradas.
    if gamemontura[0]!=0
      monturas=pbListadeMonturas(gamemontura[0])
      for i in 1..gamemontura[0]
       unless i >MAX_POR_LINEA
        sprites["base#{i}"]=Sprite.new
        sprites["base#{i}"].z = 99999
        sprites["base#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Base")
        sprites["base#{i}"].src_rect.set(0,0,410,48)
        sprites["base#{i}"].src_rect.set(0,48,410,48) if i==1
        sprites["base#{i}"].x=90
        sprites["base#{i}"].y=(48*(i-1))+2
        sprites["base#{i}"].opacity=0 if i>MAX_POR_LINEA
       end
       icono=gamemontura[1][i-1]
       sprites["icono#{i}"]=Sprite.new
       sprites["icono#{i}"].z = 99999
       icono2=_INTL("{1}",icono)
       icono2="0" + icono2 if icono<100 && icono>9
       icono2="00"+ icono2 if icono<10
       sprites["icono#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Icons/icon#{icono2}")
       sprites["icono#{i}"].src_rect.set(0,0,64,64)
       sprites["icono#{i}"].x=120
       sprites["icono#{i}"].y=(48*(i-1))-18
       sprites["icono#{i}"].opacity=0 if i>MAX_POR_LINEA
       nombre=monturas[i][0]
       sprites["txt#{i}"]=Window_UnformattedTextPokemon.new("")
       sprites["txt#{i}"].width=Graphics.width
       sprites["txt#{i}"].height=Graphics.height
       sprites["txt#{i}"].baseColor=Color.new(60,60,68)
       sprites["txt#{i}"].shadowColor=Color.new(160,160,168)
       sprites["txt#{i}"].z=99999
       sprites["txt#{i}"].windowskin=nil
       sprites["txt#{i}"].text=_INTL("{1}",nombre)
       sprites["txt#{i}"].x=184
       sprites["txt#{i}"].y=(48*(i-1))-12
       sprites["txt#{i}"].text=_INTL("") if i>MAX_POR_LINEA
       sprites["key#{i}"]=Sprite.new
       sprites["key#{i}"].z=99999
       sprites["key#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/KeyMarca")
       sprites["key#{i}"].x=45
       sprites["key#{i}"].y=(48*(i-1))+6
       sprites["key#{i}"].opacity= 0
       sprites["key#{i}"].opacity= 255 if i-1<MAX_POR_LINEA 
       sprites["key#{i}"].src_rect.set(38,0,38,41)
       mkey=$game_player.monturaskey(true)
       monk=0
       for j in mkey
        monk=1 if monturas[i][1]== j
       end
       sprites["key#{i}"].src_rect.set(0,0,38,41) if monk==1
       sprites["key#{i}"].opacity= 255 if monk==1 && i-1<MAX_POR_LINEA
     end
     lugar=1
     sprites["info"].text=_INTL("{1}",monturas[1][2])
    end
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(sprites)
     if MInput.trigger?(:M) && gamemontura[0]>0
      sprites["fondokey"]=Sprite.new
      sprites["fondokey"].z=99999
      sprites["fondokey"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo2")
      sprites["fondokey"].opacity= 200
      cancelar=false
      for existe in 0..mkey.size
         $game_player.monturaskey(false,existe,"") if mkey[existe]==(monturas[lugar][1])
      end
      while cancelar==false
       Graphics.update
       Input.update
       pbUpdateSpriteHash(sprites)
       if Input.trigger?(Input::RIGHT)
         $game_player.monturaskey(false,1,monturas[lugar][1])
         cancelar=true
       elsif Input.trigger?(Input::LEFT)
        $game_player.monturaskey(false,0,monturas[lugar][1])
        cancelar=true
       elsif Input.trigger?(Input::UP)
         $game_player.monturaskey(false,2,monturas[lugar][1])
         cancelar=true
       elsif Input.trigger?(Input::DOWN)
         $game_player.monturaskey(false,3,monturas[lugar][1])
         cancelar=true
       end
      end
      pbWait(10)
      sprites["fondokey"].dispose
      nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA      
      for k in 1..gamemontura[0]
       sprites["key#{k}"].src_rect.set(38,0,38,41)
       sprites["key#{k}"].opacity= 255
       monk=0
       mkey=$game_player.monturaskey(true)
       for l in mkey
         monk=1 if monturas[k][1]== l
       end
      sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
      sprites["key#{k}"].opacity= 255 if monk==1
      sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva
      end
    end
  if Input.trigger?(Input::DOWN) && gamemontura[0]>0
       for i in 1..MAX_MONTURAS
         if lugar==i && gamemontura[0]>lugar
          pbSEPlay("Choose")
          if lugar>=MAX_POR_LINEA
            for j in 1..MAX_MONTURAS
              sprites["icono#{j}"].y-=48
              sprites["txt#{j}"].y-=48
              sprites["key#{j}"].y-=48
              nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA
              for k in 1..gamemontura[0]
               sprites["key#{k}"].src_rect.set(38,0,38,41)
               sprites["key#{k}"].opacity= 255
               monk=0
               mkey=$game_player.monturaskey(true)
              for l in mkey
               monk=1 if monturas[k][1]== l
              end
              sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
              sprites["key#{k}"].opacity= 255 if monk==1
              sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva+1
             end              
            end
            sprites["icono#{lugar+1}"].opacity=255
            sprites["icono#{lugar+1-MAX_POR_LINEA}"].opacity=0
            sprites["txt#{lugar+1}"].text=_INTL("{1}",monturas[lugar+1][0])
          else
            sprites["base#{i}"].src_rect.set(0,0,410,48)
            sprites["base#{i+1}"].src_rect.set(0,48,410,48)
          end
          lugar+=1
          sprites["info"].text=_INTL("{1}",monturas[lugar][2])
          break
        end
       end
     end
  if Input.trigger?(Input::UP) && gamemontura[0]>0
       for i in 1..MAX_MONTURAS
         if lugar==i && lugar!=1
           pbSEPlay("Choose")
           if lugar>MAX_POR_LINEA
              for j in 1..MAX_MONTURAS
                sprites["icono#{j}"].y+=48
                sprites["txt#{j}"].y+=48
                sprites["key#{j}"].y+=48
              nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA
              for k in 1..gamemontura[0]
               sprites["key#{k}"].src_rect.set(38,0,38,41)
               sprites["key#{k}"].opacity= 255
               monk=0
               mkey=$game_player.monturaskey(true)
              for l in mkey
               monk=1 if monturas[k][1]== l
              end
              sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
              sprites["key#{k}"].opacity= 255 if monk==1
              sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva-1
             end
              end
             sprites["icono#{lugar}"].opacity=0
             sprites["icono#{lugar-MAX_POR_LINEA}"].opacity=255
             sprites["txt#{lugar}"].text=""
           else
             sprites["base#{i}"].src_rect.set(0,0,410,48)
             sprites["base#{i-1}"].src_rect.set(0,48,410,48)
           end
           lugar=i-1
           sprites["info"].text=_INTL("{1}",monturas[lugar][2])
           break
         end
       end
     end 
  # Los efectos que suceden al seleccionar alguna de las monturas.
  if Input.trigger?(Input::C) && gamemontura[0]>0
       pbSEPlay("select")
       p=0
       p= 1 if gamemontura[2]==monturas[lugar][1]
       m= (p==1) ? "¿Dejar de usar esta pokemontura?" : "¿Deseas usar esta pokemontura?"
       if Kernel.pbConfirmMessage(_INTL("#{m}"))
          if pbPuedeMontar?(monturas[lugar][1],gamemontura[4],gamemontura[2])
            if monturas[lugar][1]=="Vuelo"
              pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
              pbWait(15)
              if gamemontura[3]==true
               gamemontura[2]= ""
               gamemontura[3]= false
               $game_player.monturas(gamemontura)
               $game_player.transparent = true
               pbmontura_animacion
               CambiaCharset(1)
               $game_player.transparent = false
              end
              pbWait(20)
              pbVuelo
              break
            elsif monturas[lugar][1]=="Buceo"
              pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
              pbWait(5)
              gamemontura[2]= monturas[lugar][1]
              if p==1 #Emergir
                gamemontura[2]= "SurfPesca"
                pbBucear(p)
                $game_player.monturas(gamemontura)
                $game_player.transparent = true
                pbmontura_animacion
                CambiaCharset(0,gamemontura[2])
                $game_player.transparent = false
              else
                $game_player.monturas(gamemontura)
                $game_player.transparent = true
                pbmontura_animacion
                CambiaCharset(0,gamemontura[2])
                $game_player.transparent = false
                pbBucear(p)
              end
              pbWait(5)
              break
            ## Si agregas un efecto especial como el Vuelo o buceo que se activan al momento
            ##  de usar la montura, lo puedes colocar aquí con un "elsif".
            #elsif
            else
             gamemontura[2]= (p==1) ? "" : monturas[lugar][1]
             gamemontura[3]= (p==1) ? false : true
             $game_player.monturas(gamemontura)
             pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
             pbWait(5)
             $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
             $game_player.transparent = true
             pbmontura_animacion
             if gamemontura[2]=="SurfPesca" || gamemontura[2]=="SurfRocas" || gamemontura[2]=="Cascada" || gamemontura[2]=="Remolino"
               surfbgm = pbGetMetadata(0,MetadataSurfBGM)
               pbCueBGM(surfbgm,0.5) if surfbgm
               pbStartSurfing if !$PokemonGlobal.surfing
             end
             CambiaCharset(p,gamemontura[2])
             $game_player.transparent = false
             pbWait(5)
             break
           end
          else
            Kernel.pbMessage(_INTL("Parece que no puedes usarlo aquí ni ahora."))
          end
        end
      end
    
     if Input.trigger?(Input::B)
       pbSEPlay("Choose")
       pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
      break
     end
    end
end

#================================================================================#
#========================Cambiar la imagen del personaje=========================#
#================================================================================#
def CambiaCharset(val1,val2="nada")
  $game_player.setDefaultCharName(nil,$game_player.fullPattern) if val1==1
  $game_player.setDefaultCharName("montura_#{val2}_00#{$PokemonGlobal.playerID}",$game_player.fullPattern) if val1==0
end

#================================================================================#
#===============Verifica si es posible usar la montura seleccionada==============#
#================================================================================#
def pbPuedeMontar?(lugar="",listamapas=[],lugar2="")
  r=true
  #Condicionales basicos
  if $game_player.pbHasDependentEvents? ||
    (!pbGetMetadata($game_map.map_id,MetadataOutdoor) && !listamapas.include?($game_map.map_id) ) ||
    pbGetMetadata($game_map.map_id,MetadataBicycleAlways) ||
    pbGetTerrainTag($game_player)==PBTerrain::CaminoRocoso ||
    $PokemonGlobal.bicycle==true
    r=false
  else # Si los condicionales basicos no aplican
    if lugar=="SurfPesca" || lugar=="SurfRocas" || lugar=="Cascada" || lugar=="Remolino"
      if lugar==lugar2 || !PBTerrain.isSurfable?(Kernel.pbFacingTerrainTag)
        r=false unless (lugar!=lugar2 && $PokemonGlobal.surfing)#!$game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
      end
    elsif lugar=="Buceo"
       if $PokemonGlobal.diving
          unless PBTerrain.isDeepWater?($MapFactory.getTerrainTag(pbMapaBuceo(1),$game_player.x,$game_player.y))
            r=false
          end
       elsif !PBTerrain.isDeepWater?($game_player.terrain_tag)
          r=false
       elsif !pbGetMetadata($game_map.map_id,MetadataDiveMap)
         r=false
       end
    elsif $PokemonGlobal.surfing
      r=false 
    elsif $PokemonGlobal.diving
      r= false
    elsif lugar=="Vuelo" && listamapas.include?($game_map.map_id)
      r=false    
    #else

    end
  end
  return r
end

#================================================================================#
# Si se entra a un mapa "Indoor" que no aparesca en la lista de mapas especiales
#  la montura se cancela.
#================================================================================#
Events.onMapSceneChange+=proc{|sender,e|
  scene      = e[0]
  mapChanged = e[1]
  return if !scene || !scene.spriteset
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if !pbGetMetadata($game_map.map_id,MetadataOutdoor) && !gamemontura[4].include?($game_map.map_id)
    gamemontura[2]= ""
    gamemontura[3]= false
    CambiaCharset(1)
    $game_player.monturas(gamemontura)
  end
}

#================================================================================#
#====================================Scene_Map===================================#
#================================================================================#
class Scene_Map
alias monturas_update update
def update
  monturas_update
  $game_player.monturas()
  gamemonturas=$game_temp.monturas
  if gamemonturas[3]
    unless pbMapInterpreterRunning?
      pbefectoMonturas(gamemonturas[2])
    end
  end
  if gamemonturas[0]>0
    unless pbMapInterpreterRunning? || $game_player.moving?
      botonr= BOTONES==true ? Input::R : Input::X
      botonl= BOTONES==true ? Input::L : Input::Y
      if Input.press?(botonr) && ACTIVARLR
        pbPkMontura
      elsif Input.press?(botonl) 
        pbPkMonturaKey
      end
    end
  end
end
end

#================================================================================#
#==================Efectos de las monturas en el mapa============================#
#================================================================================#
def pbefectoMonturas(val)
    if val=="RompeRocas" || val=="SurfRocas"
      unless Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A") if val=="RompeRocas"
        n=0
        n=1 unless !$game_player.pbFacingEvent || $game_player.pbFacingEvent.name!="Rock"
        pbSmashEvent($game_player.pbFacingEvent) unless !$game_player.pbFacingEvent || $game_player.pbFacingEvent.name!="Rock"
        pbRockSmashNuevo if n==1
      end
    elsif val=="Buscador"
      unless Input.press?(Input::A)
        $game_temp.buscador=0
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
        pbBuscador
      end
    elsif val=="SurfPesca"
      unless Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
      end
    elsif val=="CaminoRocoso"
      unless Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
      end
    elsif val=="Fuerza"
      unless  $game_player.pbFacingEvent && $game_player.pbFacingEvent.name=="Boulder"
        CambiaCharset(0,"#{val}")
        $PokemonMap.strengthUsed = false
      else
        $PokemonMap.strengthUsed = true
        CambiaCharset(0,"#{val}A")
      end  
    elsif val=="Corte"
      unless  $game_player.pbFacingEvent && $game_player.pbFacingEvent.name=="Tree" && Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
        pbSmashEvent($game_player.pbFacingEvent)
        pbCorteLoot
      end
    #else
    end
end

#================================================================================#
#==============================Efecto RompeRocas=================================#
#================================================================================#
def pbRockSmashNuevo
  objetos=[PBItems::POTION,PBItems::ANTIDOTE,PBItems::ETHER,PBItems::REPEL]
  r=rand(100)
  pbEncounter(EncounterTypes::RockSmash) if r<MON_GR_EN
  Kernel.pbItemBall(objetos[rand(objetos.length)]) if r>MON_GR_EN && r<MON_GR_EN+MON_GR_OB
end

def pbSmashEvent(event)
  return if !event
  if event.name=="Tree";    pbSEPlay("Cut",80)
  elsif event.name=="Rock"; pbSEPlay("Rock Smash",80)
  end
  pbMoveRoute(event,[
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnLeft,
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnRight,
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnUp,
     PBMoveRoute::Wait,2
  ])
  pbWait(2*2*4)
  event.erase
  $PokemonMap.addErasedEvent(event.id) if $PokemonMap
end
#================================================================================#
#==============================Efecto Corte======================================#
#================================================================================#
def pbCorteLoot
  objetos=[PBItems::POTION,PBItems::ANTIDOTE,PBItems::ETHER,PBItems::REPEL]
  r=rand(100)
  Kernel.pbItemBall(objetos[rand(objetos.length)]) if r<MON_CR_OB
end

#================================================================================#
#==============================Efecto Busca Objetos==============================#
#================================================================================#
def pbBuscador
  event=pbClosestHiddenItem
  if event
    $game_temp.buscador=0 if !$game_temp.buscador || $game_temp.buscador>50
    offsetX=event.x- $game_player.x
    offsetY=event.y-$game_player.y
    if offsetX.abs<MON_DIST && offsetY.abs<MON_DIST
       $scene.spriteset.addUserAnimation(MON_ANIM_1,$game_player.x,$game_player.y,false) if $game_temp.buscador==0
       $game_temp.buscador+=1
    else
       $scene.spriteset.addUserAnimation(MON_ANIM_2,$game_player.x,$game_player.y,true) if $game_temp.buscador==0
       $game_temp.buscador+=1
    end
  end
end

def pbClosestHiddenItem
  result = []
  playerX=$game_player.x
  playerY=$game_player.y
  for event in $game_map.events.values
    next if event.name!="HiddenItem"
    next if (playerX-event.x).abs>=8
    next if (playerY-event.y).abs>=6
    next if $game_self_switches[[$game_map.map_id,event.id,"A"]]
    result.push(event)
  end
  return nil if result.length==0
  ret=nil
  retmin=0
  for event in result
    dist=(playerX-event.x).abs+(playerY-event.y).abs
    if !ret || retmin>dist
      ret=event
      retmin=dist
    end
  end
  return ret
end

#================================================================================#
#==============================Efecto Surfing====================================#
#================================================================================#
def pbStartSurfing 
  Kernel.pbCancelVehicles
  $PokemonEncounters.clearStepCount
  $PokemonGlobal.surfing = true
  $PokemonTemp.surfJump = $MapFactory.getFacingCoords($game_player.x,$game_player.y,$game_player.direction) if SURFABLEMAPAS==true
  Kernel.pbUpdateVehicle
  Kernel.pbJumpToward
  $PokemonTemp.surfJump = nil  if SURFABLEMAPAS==true
  Kernel.pbUpdateVehicle
  $game_player.check_event_trigger_here([1,2])
end

def pbEndSurf(xOffset,yOffset)
  return false if !$PokemonGlobal.surfing
  return false if PBTerrain.remolino?(Kernel.pbFacingTerrainTag)
  x = $game_player.x
  y = $game_player.y
  currentTag = $game_map.terrain_tag(x,y)
  facingTag = Kernel.pbFacingTerrainTag
  if PBTerrain.isSurfable?(currentTag) && !PBTerrain.isSurfable?(facingTag)
    $PokemonTemp.surfJump = [x,y] if SURFABLEMAPAS==true
    $game_player.transparent = true
    if Kernel.pbJumpToward(1,false,true)
      pbmontura_animacion
      $game_map.autoplayAsCue
      $game_player.increase_steps
      result = $game_player.check_event_trigger_here([1,2])
      Kernel.pbOnStepTaken(result)
      $game_player.monturas()
      gamemonturas=$game_temp.monturas
      gamemonturas[2]=""
      gamemonturas[3]=false
      $game_player.monturas(gamemonturas)
      CambiaCharset(1)
      $game_player.transparent = false
    end
    $PokemonTemp.surfJump = nil if SURFABLEMAPAS==true
    return true
  end
  return false
end

def Kernel.pbSurf
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  Kernel.pbMessage(_INTL("El agua se ve algo profunda desde aquí."))
  if gamemontura[0]>MON_SURF
    if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura marina?"))
      $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
      gamemontura[2]= "SurfPesca"
      gamemontura[3]= true
      $game_player.monturas(gamemontura)
      pbWait(15)
      $game_player.transparent = true
      pbmontura_animacion
      surfbgm = pbGetMetadata(0,MetadataSurfBGM)
      pbCueBGM(surfbgm,0.5) if surfbgm
      pbStartSurfing
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
      pbWait(10)
    end
  end
end

class Sprite_SurfBase

  def initialize(sprite,event,viewport=nil)
    @rsprite  = sprite
      [MENTION=24071]Sprite[/MENTION]   = nil
    @event    = event
    @viewport = viewport
    @disposed = false
    s = BASESURF==true ? "base_surf" : ""
    d = BASEDIVE==true ? "base_dive" : ""
    @surfbitmap = AnimatedBitmap.new("Graphics/Characters/#{s}")
    @divebitmap = AnimatedBitmap.new("Graphics/Characters/#{d}")
    @cws = @surfbitmap.width/4
    @chs = @surfbitmap.height/4
    @cwd = @divebitmap.width/4
    @chd = @divebitmap.height/4
    update unless !update
  end
end

#================================================================================#
#==============================Efecto de Vuelo===================================#
#================================================================================#
def pbVuelo
    if VUELOMAPA==true
      scene = PokemonRegionMap_Scene.new(-1,false)
      screen = PokemonRegionMapScreen.new(scene)
    else
      scene = PokemonRegionMapScene.new(-1,false)
      screen = PokemonRegionMap.new(scene)
    end
    ret = screen.pbStartFlyScreen
    if ret
      $PokemonTemp.flydata=ret
      pbWait(15)
      pbFadeOutIn(99999){
      pbanimacion_vuelo if ANIMA_VUELO
      $game_temp.player_new_map_id    = $PokemonTemp.flydata[0]
      $game_temp.player_new_x         = $PokemonTemp.flydata[1]
      $game_temp.player_new_y         = $PokemonTemp.flydata[2]
      $game_temp.player_new_direction = 2
      Kernel.pbCancelVehicles
      $PokemonTemp.flydata = nil
      $scene.transfer_player
      $game_map.autoplay
      $game_map.refresh
      }
     end
end

#================================================================================#
#============================Animación de vuelo==================================#
#================================================================================#

def pbanimacion_vuelo
    anim={}
    anim["anim"]=Sprite.new
    anim["anim"].z = 99999
    anim["anim"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/vuelo00")
    anim["anim"].opacity=0
    anim["anim2"]=Sprite.new
    anim["anim2"].z = 99999
    anim["anim2"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/vuelo01")
    anim["anim2"].x= -192
    anim["anim2"].y= 110
    anim["anim2"].src_rect.set(0,0,64,53)
    anim["anim2"].zoom_x=3
    anim["anim2"].zoom_y=3
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity+=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    n=0
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(anim)
     anim["anim"].mirror = !anim["anim"].mirror if n==5
     n= n==5 ? 0 : n+=1
     anim["anim2"].x+=14
     anim["anim2"].y+=4
     break if anim["anim2"].x>DEFAULTSCREENWIDTH 
    end
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity-=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    pbWait(40)
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity+=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    anim["anim2"].src_rect.set(64,0,64,53)
    anim["anim2"].y=150
    n=0
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(anim)
     anim["anim"].mirror = !anim["anim"].mirror if n==5
     n= n==5 ? 0 : n+=1
     anim["anim2"].x-=14
     anim["anim2"].y-=4
     break if anim["anim2"].x<-192
   end
   15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity-=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    pbWait(15)
end

#================================================================================#
#==============================Game_Map==========================================#
#================================================================================#
class Game_Map
  
    def playerPassable?(x, y, d, self_event = nil)
    puente = PASABLEPUENTE==true ? $PokemonGlobal : $PokemonMap
    bit = (1 << (d / 2 - 1)) & 0x0f
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      
      next if puente && puente.bridge==0 &&
         tile_id && (@terrain_tags[tile_id])==PBTerrain::Bridge
      $game_player.monturas()
      gamemontura=$game_temp.monturas
      if tile_id == nil
        return false
      elsif gamemontura[2]=="CaminoRocoso" && PBTerrain.caminoRocoso?(@terrain_tags[tile_id])
        return true 
      elsif gamemontura[2]=="Remolino" && PBTerrain.remolino?(@terrain_tags[tile_id])
      elsif $PokemonGlobal.surfing && PBTerrain.isPassableWater?(@terrain_tags[tile_id])
        return true
      elsif $PokemonGlobal.bicycle &&
         PBTerrain.onlyWalk?(@terrain_tags[tile_id])
        return false
      elsif puente && puente.bridge!=0 &&
         (@terrain_tags[tile_id])==PBTerrain::Bridge
        if @passages[tile_id] & bit != 0 ||
           @passages[tile_id] & 0x0f == 0x0f
          return false
        else
          return true
        end
      elsif @terrain_tags[tile_id]!=PBTerrain::Neutral
        if @passages[tile_id] & bit != 0 ||
           @passages[tile_id] & 0x0f == 0x0f
          return false
        elsif @priorities[tile_id] == 0
          return true
        end
      end
    end
    return true
  end    
  
end

#================================================================================#
#==============================Efecto Empuje=====================================#
#================================================================================#
def Kernel.pbStrength
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[2]=="Fuerza"
     Kernel.pbMessage(_INTL("La fuerza de esta montura hará posible mover esta roca."))
     r=false
  else
     Kernel.pbMessage(_INTL("Usando una montura se podría mover esta roca."))
     r=true
  end
  return r 
end

module InterpreterFieldMixin

def pbPushThisEvent
    event = get_character(0)
    oldx  = event.x
    oldy  = event.y
    return if !event.passableStrict?(event.x,event.y,$game_player.direction)
    $scene.spriteset.addUserAnimation(MON_ANIM_3,oldx,oldy,true)
    case $game_player.direction
    when 2; event.move_down  
    when 4; event.move_left  
    when 6; event.move_right 
    when 8; event.move_up
    end
    $PokemonMap.addMovedEvent(@event_id) if $PokemonMap
    if oldx!=event.x || oldy!=event.y
      $game_player.lock
      begin
        Graphics.update
        Input.update
        pbUpdateSceneMap
      end until !event.moving?
      $game_player.unlock
    end
  end

end

#================================================================================#
#==============================Efecto de Cascada=================================#
#================================================================================#
def Kernel.pbAscendWaterfall(event=nil)
  event = $game_player if !event
  return if !event
  return if event.direction!=8
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  terrain = Kernel.pbFacingTerrainTag
  return if !PBTerrain.isWaterfall?(terrain)
  event.through = true
  event.move_speed = 2
  loop do
    event.move_up
    terrain = pbGetTerrainTag(event)
    break if !PBTerrain.isWaterfall?(terrain)
  end
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbDescendWaterfall(event=nil)
  event = $game_player if !event
  return if !event
  return if event.direction!=2
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  terrain = Kernel.pbFacingTerrainTag
  return if !PBTerrain.isWaterfall?(terrain)
  event.through = true
  event.move_speed = 2
  loop do
    event.move_down
    terrain = pbGetTerrainTag(event)
    break if !PBTerrain.isWaterfall?(terrain)
  end
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbWaterfall
  r=false
  if $game_temp.cascada==true
     $game_player.monturas()
     gamemontura=$game_temp.monturas
     if gamemontura[2]=="Cascada"
        if Kernel.pbConfirmMessage(_INTL("¿Te gustaría subir por la cascada?"))
          pbAscendWaterfall
          r= true
        end
     else
      Kernel.pbMessage(_INTL("Una pared de agua está cayendo con gran fuerza."))
     end
     $game_temp.cascada=false
   end
   return r
end

Events.onAction+=proc{|sender,e|
   terrain = Kernel.pbFacingTerrainTag
   if terrain==PBTerrain::Waterfall
     $game_temp.cascada=true
     Kernel.pbWaterfall
     return
   #elsif terrain==PBTerrain::WaterfallCrest
    #Kernel.pbMessage(_INTL("Una pared de agua está cayendo con gran fuerza."))
    #return
   end
}

#================================================================================#
#==============================Efecto de Buceo===================================#
#================================================================================#
Events.onAction+=proc{|sender,e|
  $game_player.monturas()
  gamemontura=$game_temp.monturas
if gamemontura[0]>MON_BUCEO
  p=2
  if $PokemonGlobal.diving && ($MapFactory.getTerrainTag(pbMapaBuceo(1),$game_player.x,$game_player.y))==PBTerrain::DeepWater
     Kernel.pbMessage(_INTL("Se ve una luz filtrandose entre el agua."))
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura marina?"))
        p=1
     end
  elsif $PokemonGlobal.surfing && pbGetTerrainTag($game_player)==PBTerrain::DeepWater
     Kernel.pbMessage(_INTL("El agua aquí parece ser más profunda de lo normal."))
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura submarina?"))
        p=0
     end
  end
  if p<2
    gamemontura[2]= "Buceo"
    if p==1 #Emergir
      gamemontura[2]= "SurfPesca"
      pbBucear(p)
      $game_player.monturas(gamemontura)
      $game_player.transparent = true
      pbmontura_animacion
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
    else
      $game_player.monturas(gamemontura)
      $game_player.transparent = true
      pbmontura_animacion
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
      pbBucear(p)
    end
    pbWait(5)
  end
end
  return
}

def pbMapaBuceo(val)
 divemap=pbGetMetadata($game_map.map_id,MetadataDiveMap)
 meta = pbLoadMetadata
 if val==1
    for i in 0...meta.length
      if meta[i] && meta[i][MetadataDiveMap] && meta[i][MetadataDiveMap]==$game_map.map_id
        divemap = i; break
      end
    end
  end
  return divemap
end
  
def pbBucear(val)
pbFadeOutIn(99999){
       divemap=pbMapaBuceo(val)
       $game_temp.player_new_map_id    = divemap
       $game_temp.player_new_x         = $game_player.x
       $game_temp.player_new_y         = $game_player.y
       $game_temp.player_new_direction = $game_player.direction
       Kernel.pbCancelVehicles
       $PokemonGlobal.diving = true if val==0
       $PokemonGlobal.surfing = true if val==1
       Kernel.pbUpdateVehicle
       $scene.transfer_player(false)
       surfbgm = pbGetMetadata(0,MetadataSurfBGM) if val==1
       (surfbgm) ?  pbBGMPlay(surfbgm) : $game_map.autoplayAsCue if val==1
       $game_map.autoplay
       $game_map.refresh
    }
end
  
def Kernel.pbDive
  return
end

def Kernel.pbSurfacing
  return
end  

#================================================================================#
#==============================Efecto de TrepaRocas===================================#
#================================================================================#
def Kernel.pbEfectoTreparocas
  event = $game_player
  return if !event
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  event.through = true
  event.move_speed += 2
  terrainInicio = Kernel.pbFacingTerrainTag
  n=0
  loop do
    case event.direction
    when 2; event.move_down
    when 4
          event.move_left if n==0
          n=2             if $game_map.passable?($game_player.x-1,$game_player.y,$game_player.direction,$game_player)
          event.move_left if $game_map.passable?($game_player.x-1,$game_player.y,$game_player.direction,$game_player)
          event.move_upper_left if n==1 && terrainInicio==PBTerrain::TreparocasA
          event.move_lower_left if n==1 && terrainInicio==PBTerrain::TreparocasB
    when 6
          event.move_right if n==0
          n=2              if $game_map.passable?($game_player.x+1,$game_player.y,$game_player.direction,$game_player)
          event.move_right if $game_map.passable?($game_player.x+1,$game_player.y,$game_player.direction,$game_player)
          event.move_upper_right if n==1 && terrainInicio==PBTerrain::TreparocasA
          event.move_lower_right if n==1 && terrainInicio==PBTerrain::TreparocasB
    when 8; event.move_up
    end
    pbWait(10)
    $scene.spriteset.addUserAnimation(MON_TREPAROCAS,$game_player.x,$game_player.y,false) if n!=2
    pbWait(MON_TREPAROCAS_VEL)
    n=1
    break if $game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
  end 
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbTrepaRocas(val)
  r=false
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  Kernel.pbMessage(_INTL("Parece ser una pared rocosa."))
  if gamemontura[2]=="TrepaRocas"
    m= val==PBTerrain::TreparocasA ? "subir" : "bajar"
    m="subir" if $game_player.direction==8
    m="bajar" if $game_player.direction==2
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría #{m} por la pared rocosa?"))
        Kernel.pbEfectoTreparocas
        r= true
     end
     return r
  end
end

Events.onAction+=proc{|sender,e|
    m=Kernel.pbFacingTerrainTag
   if m==PBTerrain::TreparocasA || m==PBTerrain::TreparocasB
     Kernel.pbTrepaRocas(m)
     return
   end
}

#================================================================================#
#==============================Efecto de Remolino================================#
#================================================================================#
Events.onAction+=proc{|sender,e|
   if Kernel.pbFacingTerrainTag==PBTerrain::Remolino && pbGetTerrainTag($game_player)!=PBTerrain::Remolino
     Kernel.pbMessage(_INTL("Parece ser un remolino de agua."))
     return
   end
}

#================================================================================#
#=========================Condicional para la bicicleta==========================#
#================================================================================#
def pbBikeCheck
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    Kernel.pbMessage(_INTL("No puede usarse al estar sobre una pokémontura."))
    return false
  end
  if $PokemonGlobal.surfing ||
     (!$PokemonGlobal.bicycle && PBTerrain.onlyWalk?(pbGetTerrainTag))
    Kernel.pbMessage(_INTL("Can't use that here."))
    return false
  end
  if $game_player.pbHasDependentEvents?
    Kernel.pbMessage(_INTL("It can't be used when you have someone with you."))
    return false
  end

  if $PokemonGlobal.bicycle
    if pbGetMetadata($game_map.map_id,MetadataBicycleAlways)
      Kernel.pbMessage(_INTL("You can't dismount your Bike here."))
      return false
    end
    return true
  else
    val=pbGetMetadata($game_map.map_id,MetadataBicycle)
    val=pbGetMetadata($game_map.map_id,MetadataOutdoor) if val==nil
    if !val
      Kernel.pbMessage(_INTL("Can't use that here."))
      return false
    end
    return true
  end
end

#================================================================================#
#========================Condicional para las cañas de pescar====================#
#================================================================================#
def pbPuedePescar
  terrain=Kernel.pbFacingTerrainTag
  notCliff=$game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
  $game_player.monturas()
  gamemontura=$game_temp.monturas 
  if (PBTerrain.isWater?(terrain) && !$PokemonGlobal.surfing && notCliff) ||
     (PBTerrain.isWater?(terrain) && $PokemonGlobal.surfing)
     if gamemontura[3]==true
        if gamemontura[2]=="SurfPesca" && $PokemonGlobal.surfing
          n=2
        else
          Kernel.pbMessage(_INTL("No puede ser usada con esta montura."))
          n=0
        end
      else
       n=2
      end
  else
     Kernel.pbMessage(_INTL("No se puede usar aquí."))
     n=0
  end
  return n 
end

ItemHandlers::UseFromBag.add(:OLDROD,proc{|item|
   n=pbPuedePescar
   next n
   
})

ItemHandlers::UseFromBag.copy(:OLDROD,:GOODROD,:SUPERROD)

ItemHandlers::UseInField.add(:OLDROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::OldRod)
   if pbFishing(encounter,1)
     pbEncounter(EncounterTypes::OldRod)
   end
   next 1
})

ItemHandlers::UseInField.add(:GOODROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::GoodRod)
   if pbFishing(encounter,2)
     pbEncounter(EncounterTypes::GoodRod)
   end
   next 1
})

ItemHandlers::UseInField.add(:SUPERROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::SuperRod)
   if pbFishing(encounter,3)
     pbEncounter(EncounterTypes::SuperRod)
   end
   next 1
})

def pbFishingBegin
  $PokemonGlobal.fishing = true
  patternb = 2*$game_player.direction - 1
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    charset= "montura_SurfPescaB_00#{$PokemonGlobal.playerID}"
  else
    meta = pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    num = 6
    if meta && meta[num] && meta[num]!=""
      charset = pbGetPlayerCharset(meta,num)
    end
  end
  4.times do |pattern|
    $game_player.setDefaultCharName(charset,patternb-pattern,true) if PESCAMOV==true
    $game_player.setDefaultCharName(charset,patternb-pattern)      if PESCAMOV==false
    2.times do
     Graphics.update
     Input.update
     pbUpdateSceneMap
    end
  end
end

def pbFishingEnd
  patternb = 2*($game_player.direction - 2)
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    charset= "montura_SurfPescaB_00#{$PokemonGlobal.playerID}"
  else
    meta = pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    num = 6
    if meta && meta[num] && meta[num]!=""
      charset = pbGetPlayerCharset(meta,num)
    end
  end
  4.times do |pattern|
    $game_player.setDefaultCharName(charset,patternb+pattern,true) if PESCAMOV==true
    $game_player.setDefaultCharName(charset,patternb+pattern)      if PESCAMOV==false
    2.times do
     Graphics.update
     Input.update
     pbUpdateSceneMap
    end
  end
  $PokemonGlobal.fishing = false
end

def pbFishing(hasencounter,rodtype=1)
  speedup = ($Trainer.party[0] &&
            (isConst?($Trainer.party[0].ability,PBAbilities,:STICKYHOLD) ||
            isConst?($Trainer.party[0].ability,PBAbilities,:SUCTIONCUPS)))
  bitechance = 20+(25*rodtype)   # 45, 70, 95
  bitechance *= 1.5 if speedup
  hookchance = 100
  oldpattern = $game_player.fullPattern
  pbFishingBegin
  msgwindow = Kernel.pbCreateMessageWindow
  ret = false
  loop do
    time = 5+rand(6)
    time = [time,5+rand(6)].min if speedup
    message = ""
    time.times do 
      message += ".   "
    end
    if pbWaitMessage(msgwindow,time)
      pbFishingEnd
      $game_player.setDefaultCharName(nil,oldpattern)
      Kernel.pbMessageDisplay(msgwindow,_INTL("No estan picando..."))
      break
    end
    if hasencounter && rand(100)<bitechance
      $scene.spriteset.addUserAnimation(EXCLAMATION_ANIMATION_ID,$game_player.x,$game_player.y,true)
      frames = 20+rand(21)
      if !pbWaitForInput(msgwindow,message+_INTL("\r\n¡Un pokémon ha picado el anzuelo!"),frames)
        pbFishingEnd
        $game_player.setDefaultCharName(nil,oldpattern)
        Kernel.pbMessageDisplay(msgwindow,_INTL("Se ha escapado..."))
        break
      end
      if FISHINGAUTOHOOK || rand(100)<hookchance
        pbFishingEnd
        Kernel.pbMessageDisplay(msgwindow,_INTL("¡Un pokémon ha picado el anzuelo!")) if !FISHINGAUTOHOOK
        $game_player.setDefaultCharName(nil,oldpattern)
        ret = true
        break
      end
#      bitechance+=15
#      hookchance+=15
    else
      pbFishingEnd
      $game_player.setDefaultCharName(nil,oldpattern)
      Kernel.pbMessageDisplay(msgwindow,_INTL("No estan picando..."))
      break
    end
  end
  Kernel.pbDisposeMessageWindow(msgwindow)
  return ret
end

def pbWaitForInput(msgwindow,message,frames)
  Kernel.pbMessageDisplay(msgwindow,message,false)
  twitchframe = 0
  if FISHINGAUTOHOOK
    loop do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      twitchframe = (twitchframe+1)%32
      if twitchframe<16 && (twitchframe&4)==0
        $game_player.pattern = 1
      else
        $game_player.pattern = 0
      end
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        $game_player.pattern = 0
        return true
      end
    end
  else
    frames.times do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      twitchframe = (twitchframe+1)%32
      if twitchframe<16 && (twitchframe&4)==0
        $game_player.pattern = 1
      else
        $game_player.pattern = 0
      end
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        $game_player.pattern = 0
        return true
      end
    end
  end
  return false
end

def pbWaitMessage(msgwindow,time)
  message = ""
  (time+1).times do |i|
    message += ".   " if i>0
    Kernel.pbMessageDisplay(msgwindow,message,false)
    16.times do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        return true
      end
    end
  end
  return false
end

#================================================================================#
#=======================Busca Obejots(objeto clave)==============================#
#================================================================================#
ItemHandlers::UseFromBag.add(:ITEMFINDER,proc{|item|
$game_player.monturas()
gamemontura=$game_temp.monturas
next 0 if gamemontura[3]==true
next 2

})

ItemHandlers::UseFromBag.copy(:ITEMFINDER,:DOWSINGMCHN,:DOWSINGMACHINE)

#================================================================================#
#=============================UpdateVehicle======================================#
#================================================================================#

def Kernel.pbUpdateVehicle
    meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    if meta
    if $PokemonGlobal.diving
      $game_player.character_name="montura_#{gamemontura[2]}_00#{$PokemonGlobal.playerID}"
    elsif $PokemonGlobal.surfing
      $game_player.character_name="montura_#{gamemontura[2]}_00#{$PokemonGlobal.playerID}"
    elsif $PokemonGlobal.bicycle
      $game_player.character_name=pbGetPlayerCharset(meta,2) # Bicycle graphic
    else
      $game_player.character_name=pbGetPlayerCharset(meta,1) # Regular graphic
    end
  end
end

#===============================================================================
#  Huellas en la arena (Usando el script de KleinStudio)
#  Carga la imagen de huellas dependiendo de la montura que se use.
#  Si el archivo no existe, se usarán las huellas al caminar.
#
#===============================================================================
class Footprint
  def initialize(event,position)
    return if !$scene || !$scene.is_a?(Scene_Map) ||
    event!=$game_player && (event.character_name=="" || 
    event.name.include?("/nofoot/"))
    return if event!=$game_player && pbEventCommentInput(event,0,"NoFoot")    
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    return if event==$game_player && SINHUELLAS.include?(gamemontura[2])
    character_sprites=$scene.spriteset.character_sprites
    viewport=$scene.spriteset.viewportMonturas
    footsprites=$scene.spriteset.footsprites
    nid=getNewId
    fev=$game_map.events[nid]
    rpgEvent=RPG::Event.new(position[0],position[1])
    rpgEvent.id=nid       
    fev=Game_Event.new($game_map.map_id,rpgEvent,$game_map)
    eventsprite=Sprite_Character.new(viewport,fev)
    character_sprites.push(eventsprite) 
    footsprites.push(Footsprite.new(eventsprite,fev,viewport,
    $game_map,position[2],nid,character_sprites,(event==$game_player)))
  end
end

class Footsprite
  def initialize(sprite,event,viewport,map,direction,nid,chardata,player)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    @rsprite=sprite
      [MENTION=24071]Sprite[/MENTION]=Sprite.new(viewport)
    if player && $PokemonGlobal.bicycle
        [MENTION=24071]Sprite[/MENTION].bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footsetbike")
    elsif player && gamemontura[3]==true
           [MENTION=24071]Sprite[/MENTION].bitmap= pbResolveBitmap(bitmapFileName=sprintf("Graphics/Pictures/footset#{gamemontura[2]}")) ? BitmapCache.load_bitmap("Graphics/Pictures/footset#{gamemontura[2]}") : BitmapCache.load_bitmap("Graphics/Pictures/footset")
    else
        [MENTION=24071]Sprite[/MENTION].bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footset")
    end
    @realwidth   [MENTION=24071]Sprite[/MENTION].bitmap.width/4
      [MENTION=24071]Sprite[/MENTION].src_rect.width=@realwidth
    @opacity=FOOTOPACITY
    setFootset(direction)
    @event=event
    @disposed=false
    @map=map
    @eventid=nid
    @viewport=viewport
      [MENTION=41652]Char[/MENTION]data=chardata
    update
  end
end
  
class Spriteset_Map
 def viewportMonturas; return @@viewport1; end
 end
#==============================================================================#
 
Última edición por un moderador:

Jessie

What goes around, comes around
Respuesta: Re: Montar en pokemon

Podrias simplemente implementar la funcion de pokemonturas, no se si me entendiste, pero es un script que hace que puedas montar ciertos pokemon y hasta tienen sus efetos propios:
Creo que no era necesario copiar y pegar todo el script, por eso lo publique dentro de un archivo .txt, para evitar este tipo de situaciones en las cuales se ocupa una enorme cantidad de espacio del post, si querías mencionarlo solo tenías que colocar el link de descargar, LINK

Además, si no me equivoco, su duda era sobre como implementarlo al menú del equipo, osea de que manera agregarías la opción "montar" a las opciones de cada pokémon del menu pokémon.
 

Morel X

Pues bueno aquí estamosxD
Respuesta: Re: Montar en pokemon

Podrias simplemente implementar la funcion de pokemonturas, no se si me entendiste, pero es un script que hace que puedas montar ciertos pokemon y hasta tienen sus efetos propios:
Código:
#==============================================================================#
#==============================================================================#
# PokéMonturas para Pokémon Essentials.
#==============================================================================#
#==============================================================================#
# Creado por JessWshs
# Versión 3.0 :
#      Interface(nueva)
#      Eliminado el codigo extra
#      No es necesario usar variables adicionales
#      Añadida la opción debug para agregar todas las monturas juntas
#      Mensaje que te avisa cuando ya no puedes registrar más(modo $debug).
#      Opción de "Reset" para cuando se edite la información de las monturas.
#      Mensaje de usar/dejar de usar la montura seleccionada.
#      Cambio de charset dependiendo de la montura que se use.
#      Agregado 12 diferentes monturas.
#      Condicionales para las 12 monturas.
#      No pueden usarse en interiores.
#      Excepciones de mapas interiores.
#      Si se accede a un mapa que no sea "Outdoor", se cancela la montura.
#      No pueden usarse si se hace surf a menos que sea una montura marina.
#      No pueden usarse si se hace buceo a menos que se desee emergir.
#      Las nuevas monturas ya no se salen del margen de la pantalla.
#      Compatible con la version 17 de Essentials.
#      Compatible con la version 16 de Essentials.
#      Compatible con la version 15 de Essentials.
#      Velocidades de movimiento según la montura usada.
#      Compatible con el script de Huellas en la arena de KleinStudio.
#      Efecto de obtener objetos al usar Corte.
#      Efecto de obtener objetos o encuentros salvajes al Romper Rocas.
#      Registrar hasta 4 monturas a la vez en modo acceso rápido.
#      Acceder a la pantalla de Buscamontura oprimiendo la tecla "S" (opcional).
#      Abrir la pantalla de acceso rápido oprimiendo la tecla "A"
#      Compatibilidad con las cañas de pescar.
#      Solo se pueden usar las cañas con la montura llamada "SurfPesca"(Lapras).
#      Compatibilidad con el uso de la bicicleta.
#      Compatibilidad con el uso del BuscaObjetos(objeto clave).
#      Algunos efectos externos de monturas se realizan desde Scene_Map.
#      Los npc de GolpeRoca y Corte pueden estar vacios.
#      Agregada animación al usar una montura.
#      Agregada animación al usar vuelo(opcional).
# 
#==============================================================================#
#==================Como registrar==============================================#
#==============================================================================#
# Registra una nueva montura usando el comando :  pbRegMontura
#  Se registrará una nueva cada vez que se llame ese comando.
#  Si esta en modo debug, al registrar una montura te preguntará si quieres
#  registrarlas todas o si ya tienes todas registradas.
#
# La pantalla del buscamontura se abre usando el comando :  pbPkMontura
#  Se puede acceder al oprimir la tecla "S" si la variable ACTIVARLR esta
#  activada "true".
# 
# Para abrir la pantalla de acceso rápido se usa el comando : pbPkMonturaKey
#  por defecto, se puede acceder usando la tecla "A".
# 
# Los charset/Overworld/minis deben estar en al carpeta Graphics/characters y
#  son nombrados de la siguiente manera :  montura_EFECTO_00GENERO
#  donde EFECTO es el efecto de la montura
#  y GENERO es 0 si es un Chico o 1 si es una Chica.
#  ejemplos : montura_RompeRocas_000, montura_RompeRocas_001
#             montura_SurfPesca_000, montura_SurfPesca_001
#  Cuando el efecto de la montura cambia su imagen, se nombra de esta manera :
#   montura_EFECTOA_00GENERO, en caso especial que la montura tenga más de un
#   efecto, el siguiente efecto se llamará montura_EFECTOB_00GENERO, hasta ahora
#   la unica montura con este caso es "SurfPesca"(lapras) donde
#    montura_SurfPesca_000 es la imagen normal de la montura
#    montura_SurfPescaA_000 es la imagen de la montura al moverse rápido
#    montura_SurfPescaB_000 es la imagen de la montura al usar una Caña.
# 
#
#  En caso de agregar o eliminar monturas, cambiar los números de la lista de
#   monturas o cambiar la lista de mapas especiales, se tiene que dar un "Reset"
#   para cargar los cambios hechos, usando el comando :  pbRegMontura(true),
#   el efecto de entregar/registrar montura nueva se aplicará normalmente
#   luego de hacer el reset.
#   Esto solo aplica si ya se tiene una partida guardada.
# 
# 
#  Si se desea borrar todas las monturas ya obtenidas/registradas se hace
#   de la siguiente manera :  pbRegMontura(nil,true)
#   Luego de borrarlas, el efecto de entregar la primera montura disponible
#   se aplicará normalmente.
#
#
#==============================================================================#
#================Huellas en la arena (Script de KleinStudio)===================#
#==============================================================================#
# Para que funcione, este script de Pokémonturas debe estar debajo del
#  script de Huellas en la arena.
#
# Las imagenes de las huellas van en la carpeta Graphics/Pictures.
# Se deben nombrar de esta manera : footsetEFECTO, donde EFECTO es el nombre
#  del efecto de la montura, por ejemplo : "footsetRompeRocas", "footsetCorte".
# Si la imagen no existe, se usará la llamada "footset".
# Si la montura esta dentro la lista en la variable SINHUELLAS, no tendrá imagen
#  de huellas al caminar por el terrain de arena.
#
#
#==============================================================================#
#   Funciones de las 12 monturas.
#==============================================================================#
#
#  *Carga Tauros : al oprimir "Z" y moverte, cambiará de imagen del jugador y
#  rompera rocas (npc) llamadas "Rock" que tenga enfrente.
#
#  *Olfatero Stoutland : al oprimir "Z" , cambiara de imagen del personaje y
#    mostrará un signo de "?" si hay un objeto oculto cerca, y un signo de "!"
#    si el objeto esta a 3 tiles de distancia hacía cualquier dirección.
#
#  *Nado lapras : al apretar "Z" mientras te mueves, cambiara la imagen del
#    personaje e incrementará su velocidad de movimiento.
#   Al usar una caña, se cambiará la imagen del jugador pescando sobre la
#    montura.
#
#  *Vuelo Charizard : Te trasnportará a un mapa ya visitado.
#   
#  *Propulción Sharpedo : Al oprimir "Z" mientras te mueves, romperá rocas(npc)
#     con el nombre "Rock" que tenga enfrente.
#
#  *Todoterreno Mudsdale : Solo esta montura puede pasar por el
#    terrain número 22 (PBTerrain::CaminoRocoso) y al caminar apretando "Z"
#    avanzará más rapido.
#
#  *Empuje Machamp : Al estar cerca de un npc llamado "Boulder"
#      cambiará de imagen el personaje y al avanzar hacía ese npc, este se
#      moverá (si es posible).  
#
#  *Corte Syther : Al oprimir "Z" estando enfrente de un npc llamado
#      "Tree", se aplicará el efecto de corte.
#       No es necesario que el npc tenga algún texto o script dentro.
#
#  *Cascada Goldeen : Solo con esta montura se puede subir por las
#      cascadas.
#
#  *Buceo Wailmer : Solo al estar haciendo surf y estar sobre un terrain
#       de "DeepWater"(terrain 5), te sumergirá(existiendo un mapa para buceo).
#       Estando en un mapa submarino, te regresará a la superficie surfeando.
#
#  *TrepraRocas Golem : Al usarse, te permitirá subir o bajar por los terrenos
#        23 (PBTerrain::TreparocasA) y 24 (PBTerrain::TreparocasB).
#       El 23 es para subir mirando hacía la derecha o la izquierda, el jugador
#        seguirá subiendo en diagonal hasta que tenga un espacio pasable enfrente.
#       El 24 es para bajar mirando hacía la derecha o la izquierda, el jugador
#        seguirá bajando en diagonal hasta que tenga un espacio pasable enfrente.
#       La animación al subir solo se verá si el jugador pasa sobre alguno de
#        los terrenos 23 o 24.
#       Ambos, 23 y 24, sirven para subir o bajar mirando hacía adelante o atras.
#
#  *Remolino Empoleon : Solo está montura puede pasar por el
#       terrain número 25 (PBTerrain::Remolino).
#
#==============================================================================#
# *Creditos no son necesarios pero se agradece.
#==============================================================================#
#==============================================================================#
#
#==============================================================================#
# Compatibilidad con algunas caracteristicas de versiones anteriores de
#  Pokémon Essentials.
#==============================================================================#

# Apartir de la versión 16 la variable debe ser "true"
PASABLEPUENTE = true
# Apartir de la versión 17 la variable debe ser "true"
SURFABLEMAPAS = true
# Apartir de la versión 17 la variable debe ser "true"
VUELOMAPA     = true
# Apartir de la versión 17 la variable debe ser "true"
PESCAMOV      = true
# Apartir de la versión 17 la variable debe ser "true"
BOTONES       = true

#==============================================================================#
# Variables
#==============================================================================#

# Número máximo de monturas que se pueden recibir.
MAX_MONTURAS = 12

# Número máximo de monturas que se verán en la pantalla.
MAX_POR_LINEA = 7

# Nombre del sonido escuchado al recibir una montura nueva, ubicado en la
#  carpeta Audio/ME.
MON_MU = "Item get"

# Distancia máxima a la que se detectarán los objetos ocultos cercanos.
MON_DIST = 3

# Numeros de las animaciones al hallar un objeto oculto cerca,
#  MON_ANIM_1 es si el objeto esta dentro del rango de la pantalla
#  MON_ANIM_2 es si el objeto esta cerca del jugador a MON_DIST de distancia.
MON_ANIM_1 = 3
MON_ANIM_2 = 4

# Número de la animación al empujar rocas.
MON_ANIM_3 = 7

# Número de la animación al usar TrepaRocas
MON_TREPAROCAS=2

# Velocidad de espera para cada vez que se sube/baja un tile con TrepaRocas.
MON_TREPAROCAS_VEL = 0

# Si quieres que se vea la base al momento de hacer surf/buceo
# Para versiones previas a la 17, se recomienda dejarlo en false
BASESURF=false
BASEDIVE=false

# Número de montura minima que debes tener registrada
#  para poder hacer surf/buceo (el 0 cuenta como la primera montura).
MON_SURF = 2
MON_BUCEO = 9

# Probabilidad de encuentro salvaje al usar RompeRocas/SurfRocas.
MON_GR_EN = 25

# Probabilidad de obtener objetos al usar RompeRocas/SurfRocas.
MON_GR_OB = 20

# Probabilidad de obtener objetos al usar Corte.
MON_CR_OB = 20

# Usar la función de la tecla "S" para abrir el Buscamontura.
ACTIVARLR = true

# Activar la Animación al usar el efecto "Vuelo".
ANIMA_VUELO = true

# ID de los mapas que no son "outdoor" pero puedes usar las monturas en ellos
# por ejemplo cuevas, tuneles, Mapas para Buceo, las casetas de conexión, etc.
LISTADEMAPAS = [34,29,30,49,70]

# Lista de monturas que no dejan huellas en la arena(script de KleinStudio)
SINHUELLAS = ["SurfPesca","SurfRocas","Buceo","Cascada","Remolino"]
#==============================================================================#
#=========================Terrenos/Terraintag==================================#
#==============================================================================#
##Para versiones desde la 15 o menores, se cambia "module" por "class".
# class PBTerrain
module PBTerrain
  CaminoRocoso = 22  # Solo la montura con el efecto "CaminoRocoso" (Mudsdale)
                     #  puede pasar por este terreno
  TreparocasA  = 23  # Usado para Subir en diagonal usando TrepaRocas
  TreparocasB  = 24  # Usado para Bajar en diagonal usando TrepaRocas
                     #  Ambos sirven para Subir/Bajar de frente
  Remolino     = 25  # Solo la montura con el efecto "Remolino" (Empoleon)
                     #  puede pasar por este terreno

 def PBTerrain.caminoRocoso?(tag)
   return tag==PBTerrain::CaminoRocoso
 end
 def PBTerrain.remolino?(tag)
   return tag==PBTerrain::Remolino
 end
 def PBTerrain.isWaterfall?(tag)
    return tag==PBTerrain::WaterfallCrest ||
           tag==PBTerrain::Waterfall
  end
  def PBTerrain.isPassableWater?(tag)
    return tag==PBTerrain::Water ||
           tag==PBTerrain::StillWater ||
           tag==PBTerrain::DeepWater ||
           tag==PBTerrain::WaterfallCrest
  end 
  def PBTerrain.isSurfable?(tag)
    return PBTerrain.isWater?(tag)
  end
  def PBTerrain.isWater?(tag)
    return tag==PBTerrain::Water ||
           tag==PBTerrain::StillWater ||
           tag==PBTerrain::DeepWater ||
           tag==PBTerrain::WaterfallCrest ||
           tag==PBTerrain::Waterfall
  end
  
end

#==============================================================================#
#=========================Game_Temp============================================#
#==============================================================================#
class Game_Temp
  attr_accessor :monturas
  attr_accessor :buscador
  attr_accessor :cascada

end

#==============================================================================#
#============================Game_Player=======================================#
#==============================================================================#
class Game_Player
 attr_accessor :monturas_efectos
  
def monturaskey(cargar=false,val=0,montura="",borrar=false)
  @derecha=""   if !@derecha   || borrar==true
  @izquierda="" if !@izquierda || borrar==true
  @abajo=""     if !@abajo     || borrar==true
  @arriba=""    if !@arriba    || borrar==true
  if cargar
    n=[@derecha,@izquierda,@abajo,@arriba]
    return n
  else
    case val
    when 0; @derecha=montura
    when 1; @izquierda=montura
    when 2; @abajo=montura
    when 3; @arriba=montura
    end
  end
end

def monturas(var=nil,reset=false,borrar=false)
   montura_num= 0 
   ## Números nacionales(Dex) de los Pokémon que serán monturas.
   montura_lista=[128,508,131,6,319,1,68,123,118,320,76,395]
   montura_efecto= ""
   montura_activo= false
   montura_mapas = LISTADEMAPAS
   if (!var && !@monturas) || borrar==true
      @monturas=[montura_num,montura_lista,montura_efecto,montura_activo,montura_mapas]
   elsif reset==true
      @monturas=[$game_temp.monturas[0],montura_lista,$game_temp.monturas[2],$game_temp.monturas[3],montura_mapas]
   elsif var
     @monturas = []
     for i in 0..4
       @monturas.push(var[i])
     end
   end
   $game_temp.monturas=@monturas
end
 
alias monturas_update update
def update
  monturas_update
  $game_player.monturas()
  monturas=$game_temp.monturas
  if  monturas[3]==true
      ##Velocidades a las que se mueven ciertas monturas
      @move_speed = 4.8 if monturas[2]=="RompeRocas" || monturas[2]=="SurfRocas"
      @move_speed = 6.2 if ( monturas[2]=="RompeRocas" || monturas[2]=="SurfRocas" ) && Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
      @move_speed = 5.2 if monturas[2]=="Buscador"
      @move_speed = 2.0 if monturas[2]=="Buscador" && Input.press?(Input::A)
      @move_speed = 4.2 if monturas[2]=="SurfPesca"
      @move_speed = 5.6 if ( monturas[2]=="SurfPesca" && Input.press?(Input::A) ) || monturas[2]=="SurfRocas"
      @move_speed = 3.4 if monturas[2]=="CaminoRocoso"
      @move_speed = 5.6 if monturas[2]=="CaminoRocoso" && Input.press?(Input::A)
      @move_speed = 4.0 if monturas[2]=="Fuerza" || monturas[2]=="Remolino" || monturas[2]=="Corte" || monturas[2]=="Buceo"
      @move_speed = 3.0 if monturas[2]== (monturas[2]=="Remolino" && pbGetTerrainTag($game_player)==PBTerrain::Remolino)
      @move_speed = 3.8 if monturas[2]=="TrepaRocas"
      @move_speed = 5.0 if monturas[2]=="RompedorRocas"
      @move_speed = 6.2 if monturas[2]=="RompedorRocas" && Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
  end
end

end
  
#======================================================================================================#
#============================Lista de monturas=========================================================#
#======================================================================================================#
def pbListadeMonturas(val)
 ## La primera es de base, osea montura "0" y no se modifica.
 m=[["Ninguno","Nada","texto"]]
 m.push(["Carga Tauros"         ,"RompeRocas"   , "Tauros romperá rocas."                ]) if val>=0
 m.push(["Olfateo Stouland"     ,"Buscador"     ,"Stouland hallará objetos ocultos."     ]) if val>=1
 m.push(["Nado Lapras"          ,"SurfPesca"    ,"Navega y Pesca con Lapras."            ]) if val>=2
 m.push(["Vuelo Charizard"      ,"Vuelo"        ,"Charizard te llevará volando."         ]) if val>=3
 m.push(["Propulsión Sharpedo"  ,"SurfRocas"    ,"Sharpedo nadará rapidamente."          ]) if val>=4
 m.push(["Todoterreno Mudsdale" ,"CaminoRocoso" ,"Mudsdale te llevará entre rocas."      ]) if val>=5
 m.push(["Empuje Machamp"       ,"Fuerza"       ,"Machamp moverá enormes piedras."       ]) if val>=6
 m.push(["Corte Scyther"        ,"Corte"        ,"Scyther cortará pequeños árboles."     ]) if val>=7
 m.push(["Cascada Goldeen"      ,"Cascada"      ,"Goldeen nadará encima de cascadas."    ]) if val>=8
 m.push(["Buceo Wailmer"        ,"Buceo"        ,"Wailmer buceará por los mares."        ]) if val>=9
 m.push(["TrepaRocas Golem"     ,"TrepaRocas"   ,"Golem trepará sobre laderas rocosas."  ]) if val>=10
 m.push(["Remolino Empoleon"    ,"Remolino"     ,"Empoleon atravesará remolinos marinos."]) if val>=11
 m.push(["Krookodile Destructor","RompedorRocas","Krookodile destruirá rocas."           ]) if val>=12
 ## El primero es el nombre de la montura, el segundo es el efecto y el tercero es el texto de información.
  
 ## Apartir de aqui se pueden agregar más usando el siguiente formato.
 ## m.push["Nombre de la montura","Efecto","texto de información"] if val>=NUMERO DE MONTURA
 ##  el NUMERO DE MONTURA es el lugar que ocupará la montura nueva (0 es el primer lugar)
 ## ejemplo :
 ## m.push["Destello Zubat","Destello","Zubat iluminará tu camino"] if val>=12

 lista=[]
 for i in 1..val
   lista.push(m[i][1])
 end
 $game_player.monturas_efectos=lista
 return m
end

#================================================================================#
#=======================Animación al Usar montura================================#
#================================================================================#
def pbmontura_animacion
    anim={}
    anim["anim"]=Sprite.new
    anim["anim"].z = 99999
    anim["anim"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/monturas_fx")
    anim["anim"].x= 160
    anim["anim"].y= 80
    for i in 2..4
      anim["anim"].src_rect.set(192*i,192,192,192)
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    for i in 0..4
      anim["anim"].src_rect.set(192*i,192*2,192,192)
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    anim["anim"].opacity=0
end
  
#================================================================================#
#============================Registrar monturas==================================#
#================================================================================#
def pbRegMontura(reset=nil,borrar=false)
  $game_player.monturas()
  monturas=$game_temp.monturas
  if MAX_MONTURAS!=monturas[1].length || reset==true
    $game_player.monturas(nil,true)
    monturas=$game_temp.monturas
    Kernel.pbMessage("Parece que ha cambiado la lista de monturas/mapas en el script, se ha dado un reset para evitar errores.") if $DEBUG
  end
  if borrar==true
    $game_player.monturas(nil,false,true)
    monturas=$game_temp.monturas
    $game_player.monturaskey(true,0,"",true)
    Kernel.pbMessage("Se han borrado las monturas.") if $DEBUG
  end
  n=0
  if monturas[0]==MAX_MONTURAS
    Kernel.pbMessage("Ya tienes registrado todas las monturas disponibles en el buscamontura.") if $DEBUG
  else
    if $DEBUG
      if Kernel.pbConfirmMessage(_INTL("¿Deseas tener todas las monturas disponibles?"))
         Kernel.pbMessage("\\me[#{MON_MU}]Has registrado todas las monturas en el Buscamontura.")
         monturas[0]=MAX_MONTURAS
         n=1
       end
    end
    if n==0
      monturas[0] +=1
      pk=monturas[1][monturas[0]-1]
      poke=(PokeBattle_Pokemon.new(pk,1)).name
      Kernel.pbMessage("\\me[#{MON_MU}]Has registrado a #{poke} en el Buscamontura.")
    end
  end
  $game_player.monturas(monturas)
end

#================================================================================#
#===============Pantalla de Acceso Rápido de monturas============================#
#================================================================================#
def pbPkMonturaKey
    sprites={}
    vista=Viewport.new(0,0,Graphics.width,Graphics.height)
    vista.z=99998
    sprites["overlay"]=BitmapSprite.new(Graphics.width, Graphics.height)
    sprites["overlay"].z = 99999
    overlay=sprites["overlay"].bitmap
    overlay.clear
    sprites["Fondo"]=Sprite.new
    sprites["Fondo"].z = 99999
    sprites["Fondo"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo3")
    sprites["Fondo"].opacity=250
    key=$game_player.monturaskey(true)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    efectos=$game_player.monturas_efectos
    iconos=[0,0,0,0]
    numm=[]
    for i in 0..3
     if key[i]!=""
      for j in 0..gamemontura[0]
        iconos[i]=gamemontura[1][j] if efectos[j]==key[i]
      end
      icono=_INTL("{1}",iconos[i])
      icono="0" + icono if iconos[i]<100 && iconos[i]>9
      icono="00"+ icono if iconos[i]<10
      numm.push(i)
      sprites["montura#{i}"]=Sprite.new
      sprites["montura#{i}"].z = 99999
      sprites["montura#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Icons/icon#{icono}")
      sprites["montura#{i}"].opacity=250
      sprites["montura#{i}"].src_rect.set(0,0,64,64)
      iconx= i==0 ? 143 : 223
      iconx= 303 if i==1
      icony= i==2 ? 76 : 236
      icony= 156 if i==0 || i==1
      sprites["montura#{i}"].x=iconx
      sprites["montura#{i}"].y=icony
    end
  end
  boton=0
  loop do
    Graphics.update
    Input.update
    pbUpdateSpriteHash(sprites)

if Input.trigger?(Input::RIGHT); boton=2; end 
if Input.trigger?(Input::LEFT);  boton=1; end
if Input.trigger?(Input::UP);    boton=3; end
if Input.trigger?(Input::DOWN);  boton=4; end

## Efectos al seleccionar la montura.
if boton!=0 && gamemontura[0]>0
  unless (key[0]=="" && boton==1) || (key[1]=="" && boton==2) || (key[2]=="" && boton==3) || (key[3]=="" && boton==4)
    pbSEPlay("select")
   nombre=""
   for i in 0..3
     nombre=key[i]  if key[i]!="" && boton==i+1
   end
   p=  nombre==gamemontura[2] ? 1 : 0
   if pbPuedeMontar?(nombre,gamemontura[4],gamemontura[2])
     if nombre=="Vuelo"
        sprites["Fondo"].opacity=0
        for i in 0..3
          sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
        end
        pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
        pbWait(5)
        if gamemontura[3]==true
          $game_player.transparent = true
          pbmontura_animacion
          gamemontura[2]= ""
          gamemontura[3]= false
          $game_player.monturas(gamemontura)
          CambiaCharset(1)
          $game_player.transparent = false
        end
        pbWait(10)
        pbVuelo
        break 
      elsif nombre=="Buceo"
        sprites["Fondo"].opacity=0
       for i in 0..3
         sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
       end
        pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
        pbWait(5)
        gamemontura[2]= nombre
        if p==1 #Emergir
           gamemontura[2]= "SurfPesca"
           pbBucear(p)
           $game_player.monturas(gamemontura)
           $game_player.transparent = true
           pbmontura_animacion
           CambiaCharset(0,gamemontura[2])
           $game_player.transparent = false
        else
           $game_player.monturas(gamemontura)
           $game_player.transparent = true
           pbmontura_animacion
           CambiaCharset(0,gamemontura[2])
           $game_player.transparent = false
           pbBucear(p)
        end
        pbWait(5)
        break
    ## Si agregas un efecto especial como el Vuelo o buceo que se activan al momento
    ##  de usar la montura, lo puedes colocar aquí con un "elsif".
    #elsif
     else
       gamemontura[2]= (p==1) ? "" : nombre
       gamemontura[3]= (p==1) ? false : true
       $game_player.monturas(gamemontura)
       sprites["Fondo"].opacity=0
       for i in 0..3
         sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
       end
       pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
       pbWait(5)
       $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
       $game_player.transparent = true
       pbmontura_animacion
       if gamemontura[2]=="SurfPesca" || gamemontura[2]=="SurfRocas" || gamemontura[2]=="Cascada" || gamemontura[2]=="Remolino"
         surfbgm = pbGetMetadata(0,MetadataSurfBGM)
         pbCueBGM(surfbgm,0.5) if surfbgm
         pbStartSurfing if !$PokemonGlobal.surfing
       end
       CambiaCharset(p,gamemontura[2])
       $game_player.transparent = false
       pbWait(5)
       break
     end
   else
     sprites["Fondo"].opacity=0
     for i in 0..3
      sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
    end
  pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
  Kernel.pbMessage(_INTL("Parece que no puedes usarlo aquí ni ahora."))
  break
   end
  end
end
    
if Input.trigger?(Input::B)
  pbSEPlay("Choose")
  sprites["Fondo"].opacity=0
  for i in 0..3
      sprites["montura#{numm[i]}"].opacity=0 if sprites["montura#{numm[i]}"]
  end
  pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
      break
     end
  end
end

#================================================================================#
#========================Pantalla del Buscamontura===============================#
#================================================================================#
def pbPkMontura
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    sprites={}
    vista=Viewport.new(0,0,Graphics.width,Graphics.height)
    vista.z=99998
    sprites["overlay"]=BitmapSprite.new(Graphics.width, Graphics.height)
    sprites["overlay"].z = 99999
    overlay=sprites["overlay"].bitmap
    overlay.clear
    sprites["Fondo"]=Sprite.new
    sprites["Fondo"].z = 99999
    sprites["Fondo"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo")
    sprites["retorno"]=Sprite.new
    sprites["retorno"].z = 99999
    sprites["retorno"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Regreso")
    sprites["retorno"].x=0
    sprites["retorno"].y=336
    sprites["infobase"]=Sprite.new
    sprites["infobase"].z = 99999
    sprites["infobase"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Basetxt")
    sprites["infobase"].x=66
    sprites["infobase"].y=340
    sprites["info"]=Window_UnformattedTextPokemon.new("")
    sprites["info"].width=Graphics.width
    sprites["info"].height=Graphics.height
    sprites["info"].baseColor=Color.new(220,220,220)
    sprites["info"].shadowColor=Color.new(60,60,68)
    sprites["info"].z=99999
    sprites["info"].windowskin=nil
    sprites["info"].text=_INTL("Información de la montura seleccionada.")
    sprites["info"].x=70
    sprites["info"].y=327
    # Lista de monturas obtenidas.
    # Solo si se tiene 1 o más monturas registradas.
    if gamemontura[0]!=0
      monturas=pbListadeMonturas(gamemontura[0])
      for i in 1..gamemontura[0]
       unless i >MAX_POR_LINEA
        sprites["base#{i}"]=Sprite.new
        sprites["base#{i}"].z = 99999
        sprites["base#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Base")
        sprites["base#{i}"].src_rect.set(0,0,410,48)
        sprites["base#{i}"].src_rect.set(0,48,410,48) if i==1
        sprites["base#{i}"].x=90
        sprites["base#{i}"].y=(48*(i-1))+2
        sprites["base#{i}"].opacity=0 if i>MAX_POR_LINEA
       end
       icono=gamemontura[1][i-1]
       sprites["icono#{i}"]=Sprite.new
       sprites["icono#{i}"].z = 99999
       icono2=_INTL("{1}",icono)
       icono2="0" + icono2 if icono<100 && icono>9
       icono2="00"+ icono2 if icono<10
       sprites["icono#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Icons/icon#{icono2}")
       sprites["icono#{i}"].src_rect.set(0,0,64,64)
       sprites["icono#{i}"].x=120
       sprites["icono#{i}"].y=(48*(i-1))-18
       sprites["icono#{i}"].opacity=0 if i>MAX_POR_LINEA
       nombre=monturas[i][0]
       sprites["txt#{i}"]=Window_UnformattedTextPokemon.new("")
       sprites["txt#{i}"].width=Graphics.width
       sprites["txt#{i}"].height=Graphics.height
       sprites["txt#{i}"].baseColor=Color.new(60,60,68)
       sprites["txt#{i}"].shadowColor=Color.new(160,160,168)
       sprites["txt#{i}"].z=99999
       sprites["txt#{i}"].windowskin=nil
       sprites["txt#{i}"].text=_INTL("{1}",nombre)
       sprites["txt#{i}"].x=184
       sprites["txt#{i}"].y=(48*(i-1))-12
       sprites["txt#{i}"].text=_INTL("") if i>MAX_POR_LINEA
       sprites["key#{i}"]=Sprite.new
       sprites["key#{i}"].z=99999
       sprites["key#{i}"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/KeyMarca")
       sprites["key#{i}"].x=45
       sprites["key#{i}"].y=(48*(i-1))+6
       sprites["key#{i}"].opacity= 0
       sprites["key#{i}"].opacity= 255 if i-1<MAX_POR_LINEA 
       sprites["key#{i}"].src_rect.set(38,0,38,41)
       mkey=$game_player.monturaskey(true)
       monk=0
       for j in mkey
        monk=1 if monturas[i][1]== j
       end
       sprites["key#{i}"].src_rect.set(0,0,38,41) if monk==1
       sprites["key#{i}"].opacity= 255 if monk==1 && i-1<MAX_POR_LINEA
     end
     lugar=1
     sprites["info"].text=_INTL("{1}",monturas[1][2])
    end
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(sprites)
     if MInput.trigger?(:M) && gamemontura[0]>0
      sprites["fondokey"]=Sprite.new
      sprites["fondokey"].z=99999
      sprites["fondokey"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/Fondo2")
      sprites["fondokey"].opacity= 200
      cancelar=false
      for existe in 0..mkey.size
         $game_player.monturaskey(false,existe,"") if mkey[existe]==(monturas[lugar][1])
      end
      while cancelar==false
       Graphics.update
       Input.update
       pbUpdateSpriteHash(sprites)
       if Input.trigger?(Input::RIGHT)
         $game_player.monturaskey(false,1,monturas[lugar][1])
         cancelar=true
       elsif Input.trigger?(Input::LEFT)
        $game_player.monturaskey(false,0,monturas[lugar][1])
        cancelar=true
       elsif Input.trigger?(Input::UP)
         $game_player.monturaskey(false,2,monturas[lugar][1])
         cancelar=true
       elsif Input.trigger?(Input::DOWN)
         $game_player.monturaskey(false,3,monturas[lugar][1])
         cancelar=true
       end
      end
      pbWait(10)
      sprites["fondokey"].dispose
      nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA      
      for k in 1..gamemontura[0]
       sprites["key#{k}"].src_rect.set(38,0,38,41)
       sprites["key#{k}"].opacity= 255
       monk=0
       mkey=$game_player.monturaskey(true)
       for l in mkey
         monk=1 if monturas[k][1]== l
       end
      sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
      sprites["key#{k}"].opacity= 255 if monk==1
      sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva
      end
    end
  if Input.trigger?(Input::DOWN) && gamemontura[0]>0
       for i in 1..MAX_MONTURAS
         if lugar==i && gamemontura[0]>lugar
          pbSEPlay("Choose")
          if lugar>=MAX_POR_LINEA
            for j in 1..MAX_MONTURAS
              sprites["icono#{j}"].y-=48
              sprites["txt#{j}"].y-=48
              sprites["key#{j}"].y-=48
              nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA
              for k in 1..gamemontura[0]
               sprites["key#{k}"].src_rect.set(38,0,38,41)
               sprites["key#{k}"].opacity= 255
               monk=0
               mkey=$game_player.monturaskey(true)
              for l in mkey
               monk=1 if monturas[k][1]== l
              end
              sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
              sprites["key#{k}"].opacity= 255 if monk==1
              sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva+1
             end              
            end
            sprites["icono#{lugar+1}"].opacity=255
            sprites["icono#{lugar+1-MAX_POR_LINEA}"].opacity=0
            sprites["txt#{lugar+1}"].text=_INTL("{1}",monturas[lugar+1][0])
          else
            sprites["base#{i}"].src_rect.set(0,0,410,48)
            sprites["base#{i+1}"].src_rect.set(0,48,410,48)
          end
          lugar+=1
          sprites["info"].text=_INTL("{1}",monturas[lugar][2])
          break
        end
       end
     end
  if Input.trigger?(Input::UP) && gamemontura[0]>0
       for i in 1..MAX_MONTURAS
         if lugar==i && lugar!=1
           pbSEPlay("Choose")
           if lugar>MAX_POR_LINEA
              for j in 1..MAX_MONTURAS
                sprites["icono#{j}"].y+=48
                sprites["txt#{j}"].y+=48
                sprites["key#{j}"].y+=48
              nva= lugar>MAX_POR_LINEA ? lugar : MAX_POR_LINEA
              for k in 1..gamemontura[0]
               sprites["key#{k}"].src_rect.set(38,0,38,41)
               sprites["key#{k}"].opacity= 255
               monk=0
               mkey=$game_player.monturaskey(true)
              for l in mkey
               monk=1 if monturas[k][1]== l
              end
              sprites["key#{k}"].src_rect.set(0,0,38,41) if monk==1
              sprites["key#{k}"].opacity= 255 if monk==1
              sprites["key#{k}"].opacity= 0 if sprites["key#{k}"].y<0 || k>nva-1
             end
              end
             sprites["icono#{lugar}"].opacity=0
             sprites["icono#{lugar-MAX_POR_LINEA}"].opacity=255
             sprites["txt#{lugar}"].text=""
           else
             sprites["base#{i}"].src_rect.set(0,0,410,48)
             sprites["base#{i-1}"].src_rect.set(0,48,410,48)
           end
           lugar=i-1
           sprites["info"].text=_INTL("{1}",monturas[lugar][2])
           break
         end
       end
     end 
  # Los efectos que suceden al seleccionar alguna de las monturas.
  if Input.trigger?(Input::C) && gamemontura[0]>0
       pbSEPlay("select")
       p=0
       p= 1 if gamemontura[2]==monturas[lugar][1]
       m= (p==1) ? "¿Dejar de usar esta pokemontura?" : "¿Deseas usar esta pokemontura?"
       if Kernel.pbConfirmMessage(_INTL("#{m}"))
          if pbPuedeMontar?(monturas[lugar][1],gamemontura[4],gamemontura[2])
            if monturas[lugar][1]=="Vuelo"
              pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
              pbWait(15)
              if gamemontura[3]==true
               gamemontura[2]= ""
               gamemontura[3]= false
               $game_player.monturas(gamemontura)
               $game_player.transparent = true
               pbmontura_animacion
               CambiaCharset(1)
               $game_player.transparent = false
              end
              pbWait(20)
              pbVuelo
              break
            elsif monturas[lugar][1]=="Buceo"
              pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
              pbWait(5)
              gamemontura[2]= monturas[lugar][1]
              if p==1 #Emergir
                gamemontura[2]= "SurfPesca"
                pbBucear(p)
                $game_player.monturas(gamemontura)
                $game_player.transparent = true
                pbmontura_animacion
                CambiaCharset(0,gamemontura[2])
                $game_player.transparent = false
              else
                $game_player.monturas(gamemontura)
                $game_player.transparent = true
                pbmontura_animacion
                CambiaCharset(0,gamemontura[2])
                $game_player.transparent = false
                pbBucear(p)
              end
              pbWait(5)
              break
            ## Si agregas un efecto especial como el Vuelo o buceo que se activan al momento
            ##  de usar la montura, lo puedes colocar aquí con un "elsif".
            #elsif
            else
             gamemontura[2]= (p==1) ? "" : monturas[lugar][1]
             gamemontura[3]= (p==1) ? false : true
             $game_player.monturas(gamemontura)
             pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
             pbWait(5)
             $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
             $game_player.transparent = true
             pbmontura_animacion
             if gamemontura[2]=="SurfPesca" || gamemontura[2]=="SurfRocas" || gamemontura[2]=="Cascada" || gamemontura[2]=="Remolino"
               surfbgm = pbGetMetadata(0,MetadataSurfBGM)
               pbCueBGM(surfbgm,0.5) if surfbgm
               pbStartSurfing if !$PokemonGlobal.surfing
             end
             CambiaCharset(p,gamemontura[2])
             $game_player.transparent = false
             pbWait(5)
             break
           end
          else
            Kernel.pbMessage(_INTL("Parece que no puedes usarlo aquí ni ahora."))
          end
        end
      end
    
     if Input.trigger?(Input::B)
       pbSEPlay("Choose")
       pbFadeOutAndHide(sprites){pbUpdateSpriteHash(sprites)}
      break
     end
    end
end

#================================================================================#
#========================Cambiar la imagen del personaje=========================#
#================================================================================#
def CambiaCharset(val1,val2="nada")
  $game_player.setDefaultCharName(nil,$game_player.fullPattern) if val1==1
  $game_player.setDefaultCharName("montura_#{val2}_00#{$PokemonGlobal.playerID}",$game_player.fullPattern) if val1==0
end

#================================================================================#
#===============Verifica si es posible usar la montura seleccionada==============#
#================================================================================#
def pbPuedeMontar?(lugar="",listamapas=[],lugar2="")
  r=true
  #Condicionales basicos
  if $game_player.pbHasDependentEvents? ||
    (!pbGetMetadata($game_map.map_id,MetadataOutdoor) && !listamapas.include?($game_map.map_id) ) ||
    pbGetMetadata($game_map.map_id,MetadataBicycleAlways) ||
    pbGetTerrainTag($game_player)==PBTerrain::CaminoRocoso ||
    $PokemonGlobal.bicycle==true
    r=false
  else # Si los condicionales basicos no aplican
    if lugar=="SurfPesca" || lugar=="SurfRocas" || lugar=="Cascada" || lugar=="Remolino"
      if lugar==lugar2 || !PBTerrain.isSurfable?(Kernel.pbFacingTerrainTag)
        r=false unless (lugar!=lugar2 && $PokemonGlobal.surfing)#!$game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
      end
    elsif lugar=="Buceo"
       if $PokemonGlobal.diving
          unless PBTerrain.isDeepWater?($MapFactory.getTerrainTag(pbMapaBuceo(1),$game_player.x,$game_player.y))
            r=false
          end
       elsif !PBTerrain.isDeepWater?($game_player.terrain_tag)
          r=false
       elsif !pbGetMetadata($game_map.map_id,MetadataDiveMap)
         r=false
       end
    elsif $PokemonGlobal.surfing
      r=false 
    elsif $PokemonGlobal.diving
      r= false
    elsif lugar=="Vuelo" && listamapas.include?($game_map.map_id)
      r=false    
    #else

    end
  end
  return r
end

#================================================================================#
# Si se entra a un mapa "Indoor" que no aparesca en la lista de mapas especiales
#  la montura se cancela.
#================================================================================#
Events.onMapSceneChange+=proc{|sender,e|
  scene      = e[0]
  mapChanged = e[1]
  return if !scene || !scene.spriteset
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if !pbGetMetadata($game_map.map_id,MetadataOutdoor) && !gamemontura[4].include?($game_map.map_id)
    gamemontura[2]= ""
    gamemontura[3]= false
    CambiaCharset(1)
    $game_player.monturas(gamemontura)
  end
}

#================================================================================#
#====================================Scene_Map===================================#
#================================================================================#
class Scene_Map
alias monturas_update update
def update
  monturas_update
  $game_player.monturas()
  gamemonturas=$game_temp.monturas
  if gamemonturas[3]
    unless pbMapInterpreterRunning?
      pbefectoMonturas(gamemonturas[2])
    end
  end
  if gamemonturas[0]>0
    unless pbMapInterpreterRunning? || $game_player.moving?
      botonr= BOTONES==true ? Input::R : Input::X
      botonl= BOTONES==true ? Input::L : Input::Y
      if Input.press?(botonr) && ACTIVARLR
        pbPkMontura
      elsif Input.press?(botonl) 
        pbPkMonturaKey
      end
    end
  end
end
end

#================================================================================#
#==================Efectos de las monturas en el mapa============================#
#================================================================================#
def pbefectoMonturas(val)
    if val=="RompeRocas" || val=="SurfRocas"
      unless Input.press?(Input::A) && (Input.press?(Input::UP) || Input.press?(Input::DOWN) || Input.press?(Input::LEFT) || Input.press?(Input::RIGHT) )
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A") if val=="RompeRocas"
        n=0
        n=1 unless !$game_player.pbFacingEvent || $game_player.pbFacingEvent.name!="Rock"
        pbSmashEvent($game_player.pbFacingEvent) unless !$game_player.pbFacingEvent || $game_player.pbFacingEvent.name!="Rock"
        pbRockSmashNuevo if n==1
      end
    elsif val=="Buscador"
      unless Input.press?(Input::A)
        $game_temp.buscador=0
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
        pbBuscador
      end
    elsif val=="SurfPesca"
      unless Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
      end
    elsif val=="CaminoRocoso"
      unless Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
      end
    elsif val=="Fuerza"
      unless  $game_player.pbFacingEvent && $game_player.pbFacingEvent.name=="Boulder"
        CambiaCharset(0,"#{val}")
        $PokemonMap.strengthUsed = false
      else
        $PokemonMap.strengthUsed = true
        CambiaCharset(0,"#{val}A")
      end  
    elsif val=="Corte"
      unless  $game_player.pbFacingEvent && $game_player.pbFacingEvent.name=="Tree" && Input.press?(Input::A)
        CambiaCharset(0,"#{val}")
      else
        CambiaCharset(0,"#{val}A")
        pbSmashEvent($game_player.pbFacingEvent)
        pbCorteLoot
      end
    #else
    end
end

#================================================================================#
#==============================Efecto RompeRocas=================================#
#================================================================================#
def pbRockSmashNuevo
  objetos=[PBItems::POTION,PBItems::ANTIDOTE,PBItems::ETHER,PBItems::REPEL]
  r=rand(100)
  pbEncounter(EncounterTypes::RockSmash) if r<MON_GR_EN
  Kernel.pbItemBall(objetos[rand(objetos.length)]) if r>MON_GR_EN && r<MON_GR_EN+MON_GR_OB
end

def pbSmashEvent(event)
  return if !event
  if event.name=="Tree";    pbSEPlay("Cut",80)
  elsif event.name=="Rock"; pbSEPlay("Rock Smash",80)
  end
  pbMoveRoute(event,[
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnLeft,
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnRight,
     PBMoveRoute::Wait,2,
     PBMoveRoute::TurnUp,
     PBMoveRoute::Wait,2
  ])
  pbWait(2*2*4)
  event.erase
  $PokemonMap.addErasedEvent(event.id) if $PokemonMap
end
#================================================================================#
#==============================Efecto Corte======================================#
#================================================================================#
def pbCorteLoot
  objetos=[PBItems::POTION,PBItems::ANTIDOTE,PBItems::ETHER,PBItems::REPEL]
  r=rand(100)
  Kernel.pbItemBall(objetos[rand(objetos.length)]) if r<MON_CR_OB
end

#================================================================================#
#==============================Efecto Busca Objetos==============================#
#================================================================================#
def pbBuscador
  event=pbClosestHiddenItem
  if event
    $game_temp.buscador=0 if !$game_temp.buscador || $game_temp.buscador>50
    offsetX=event.x- $game_player.x
    offsetY=event.y-$game_player.y
    if offsetX.abs<MON_DIST && offsetY.abs<MON_DIST
       $scene.spriteset.addUserAnimation(MON_ANIM_1,$game_player.x,$game_player.y,false) if $game_temp.buscador==0
       $game_temp.buscador+=1
    else
       $scene.spriteset.addUserAnimation(MON_ANIM_2,$game_player.x,$game_player.y,true) if $game_temp.buscador==0
       $game_temp.buscador+=1
    end
  end
end

def pbClosestHiddenItem
  result = []
  playerX=$game_player.x
  playerY=$game_player.y
  for event in $game_map.events.values
    next if event.name!="HiddenItem"
    next if (playerX-event.x).abs>=8
    next if (playerY-event.y).abs>=6
    next if $game_self_switches[[$game_map.map_id,event.id,"A"]]
    result.push(event)
  end
  return nil if result.length==0
  ret=nil
  retmin=0
  for event in result
    dist=(playerX-event.x).abs+(playerY-event.y).abs
    if !ret || retmin>dist
      ret=event
      retmin=dist
    end
  end
  return ret
end

#================================================================================#
#==============================Efecto Surfing====================================#
#================================================================================#
def pbStartSurfing 
  Kernel.pbCancelVehicles
  $PokemonEncounters.clearStepCount
  $PokemonGlobal.surfing = true
  $PokemonTemp.surfJump = $MapFactory.getFacingCoords($game_player.x,$game_player.y,$game_player.direction) if SURFABLEMAPAS==true
  Kernel.pbUpdateVehicle
  Kernel.pbJumpToward
  $PokemonTemp.surfJump = nil  if SURFABLEMAPAS==true
  Kernel.pbUpdateVehicle
  $game_player.check_event_trigger_here([1,2])
end

def pbEndSurf(xOffset,yOffset)
  return false if !$PokemonGlobal.surfing
  return false if PBTerrain.remolino?(Kernel.pbFacingTerrainTag)
  x = $game_player.x
  y = $game_player.y
  currentTag = $game_map.terrain_tag(x,y)
  facingTag = Kernel.pbFacingTerrainTag
  if PBTerrain.isSurfable?(currentTag) && !PBTerrain.isSurfable?(facingTag)
    $PokemonTemp.surfJump = [x,y] if SURFABLEMAPAS==true
    $game_player.transparent = true
    if Kernel.pbJumpToward(1,false,true)
      pbmontura_animacion
      $game_map.autoplayAsCue
      $game_player.increase_steps
      result = $game_player.check_event_trigger_here([1,2])
      Kernel.pbOnStepTaken(result)
      $game_player.monturas()
      gamemonturas=$game_temp.monturas
      gamemonturas[2]=""
      gamemonturas[3]=false
      $game_player.monturas(gamemonturas)
      CambiaCharset(1)
      $game_player.transparent = false
    end
    $PokemonTemp.surfJump = nil if SURFABLEMAPAS==true
    return true
  end
  return false
end

def Kernel.pbSurf
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  Kernel.pbMessage(_INTL("El agua se ve algo profunda desde aquí."))
  if gamemontura[0]>MON_SURF
    if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura marina?"))
      $PokemonGlobal.bicycle=false if $PokemonGlobal.bicycle
      gamemontura[2]= "SurfPesca"
      gamemontura[3]= true
      $game_player.monturas(gamemontura)
      pbWait(15)
      $game_player.transparent = true
      pbmontura_animacion
      surfbgm = pbGetMetadata(0,MetadataSurfBGM)
      pbCueBGM(surfbgm,0.5) if surfbgm
      pbStartSurfing
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
      pbWait(10)
    end
  end
end

class Sprite_SurfBase

  def initialize(sprite,event,viewport=nil)
    @rsprite  = sprite
    [MENTION=24071]Sprite[/MENTION]   = nil
    @event    = event
    @viewport = viewport
    @disposed = false
    s = BASESURF==true ? "base_surf" : ""
    d = BASEDIVE==true ? "base_dive" : ""
    @surfbitmap = AnimatedBitmap.new("Graphics/Characters/#{s}")
    @divebitmap = AnimatedBitmap.new("Graphics/Characters/#{d}")
    @cws = @surfbitmap.width/4
    @chs = @surfbitmap.height/4
    @cwd = @divebitmap.width/4
    @chd = @divebitmap.height/4
    update unless !update
  end
end

#================================================================================#
#==============================Efecto de Vuelo===================================#
#================================================================================#
def pbVuelo
    if VUELOMAPA==true
      scene = PokemonRegionMap_Scene.new(-1,false)
      screen = PokemonRegionMapScreen.new(scene)
    else
      scene = PokemonRegionMapScene.new(-1,false)
      screen = PokemonRegionMap.new(scene)
    end
    ret = screen.pbStartFlyScreen
    if ret
      $PokemonTemp.flydata=ret
      pbWait(15)
      pbFadeOutIn(99999){
      pbanimacion_vuelo if ANIMA_VUELO
      $game_temp.player_new_map_id    = $PokemonTemp.flydata[0]
      $game_temp.player_new_x         = $PokemonTemp.flydata[1]
      $game_temp.player_new_y         = $PokemonTemp.flydata[2]
      $game_temp.player_new_direction = 2
      Kernel.pbCancelVehicles
      $PokemonTemp.flydata = nil
      $scene.transfer_player
      $game_map.autoplay
      $game_map.refresh
      }
     end
end

#================================================================================#
#============================Animación de vuelo==================================#
#================================================================================#

def pbanimacion_vuelo
    anim={}
    anim["anim"]=Sprite.new
    anim["anim"].z = 99999
    anim["anim"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/vuelo00")
    anim["anim"].opacity=0
    anim["anim2"]=Sprite.new
    anim["anim2"].z = 99999
    anim["anim2"].bitmap= BitmapCache.load_bitmap("Graphics/Pictures/PokeMonturas/vuelo01")
    anim["anim2"].x= -192
    anim["anim2"].y= 110
    anim["anim2"].src_rect.set(0,0,64,53)
    anim["anim2"].zoom_x=3
    anim["anim2"].zoom_y=3
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity+=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    n=0
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(anim)
     anim["anim"].mirror = !anim["anim"].mirror if n==5
     n= n==5 ? 0 : n+=1
     anim["anim2"].x+=14
     anim["anim2"].y+=4
     break if anim["anim2"].x>DEFAULTSCREENWIDTH 
    end
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity-=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    pbWait(40)
    15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity+=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    anim["anim2"].src_rect.set(64,0,64,53)
    anim["anim2"].y=150
    n=0
    loop do
     Graphics.update
     Input.update
     pbUpdateSpriteHash(anim)
     anim["anim"].mirror = !anim["anim"].mirror if n==5
     n= n==5 ? 0 : n+=1
     anim["anim2"].x-=14
     anim["anim2"].y-=4
     break if anim["anim2"].x<-192
   end
   15.times do
      anim["anim"].mirror = !anim["anim"].mirror
      anim["anim"].opacity-=17
      Graphics.update
      Input.update
      pbUpdateSpriteHash(anim)
      pbWait(2)
    end
    pbWait(15)
end

#================================================================================#
#==============================Game_Map==========================================#
#================================================================================#
class Game_Map
  
    def playerPassable?(x, y, d, self_event = nil)
    puente = PASABLEPUENTE==true ? $PokemonGlobal : $PokemonMap
    bit = (1 << (d / 2 - 1)) & 0x0f
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      
      next if puente && puente.bridge==0 &&
         tile_id && (@terrain_tags[tile_id])==PBTerrain::Bridge
      $game_player.monturas()
      gamemontura=$game_temp.monturas
      if tile_id == nil
        return false
      elsif gamemontura[2]=="CaminoRocoso" && PBTerrain.caminoRocoso?(@terrain_tags[tile_id])
        return true 
      elsif gamemontura[2]=="Remolino" && PBTerrain.remolino?(@terrain_tags[tile_id])
      elsif $PokemonGlobal.surfing && PBTerrain.isPassableWater?(@terrain_tags[tile_id])
        return true
      elsif $PokemonGlobal.bicycle &&
         PBTerrain.onlyWalk?(@terrain_tags[tile_id])
        return false
      elsif puente && puente.bridge!=0 &&
         (@terrain_tags[tile_id])==PBTerrain::Bridge
        if @passages[tile_id] & bit != 0 ||
           @passages[tile_id] & 0x0f == 0x0f
          return false
        else
          return true
        end
      elsif @terrain_tags[tile_id]!=PBTerrain::Neutral
        if @passages[tile_id] & bit != 0 ||
           @passages[tile_id] & 0x0f == 0x0f
          return false
        elsif @priorities[tile_id] == 0
          return true
        end
      end
    end
    return true
  end    
  
end

#================================================================================#
#==============================Efecto Empuje=====================================#
#================================================================================#
def Kernel.pbStrength
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[2]=="Fuerza"
     Kernel.pbMessage(_INTL("La fuerza de esta montura hará posible mover esta roca."))
     r=false
  else
     Kernel.pbMessage(_INTL("Usando una montura se podría mover esta roca."))
     r=true
  end
  return r 
end

module InterpreterFieldMixin

def pbPushThisEvent
    event = get_character(0)
    oldx  = event.x
    oldy  = event.y
    return if !event.passableStrict?(event.x,event.y,$game_player.direction)
    $scene.spriteset.addUserAnimation(MON_ANIM_3,oldx,oldy,true)
    case $game_player.direction
    when 2; event.move_down  
    when 4; event.move_left  
    when 6; event.move_right 
    when 8; event.move_up
    end
    $PokemonMap.addMovedEvent(@event_id) if $PokemonMap
    if oldx!=event.x || oldy!=event.y
      $game_player.lock
      begin
        Graphics.update
        Input.update
        pbUpdateSceneMap
      end until !event.moving?
      $game_player.unlock
    end
  end

end

#================================================================================#
#==============================Efecto de Cascada=================================#
#================================================================================#
def Kernel.pbAscendWaterfall(event=nil)
  event = $game_player if !event
  return if !event
  return if event.direction!=8
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  terrain = Kernel.pbFacingTerrainTag
  return if !PBTerrain.isWaterfall?(terrain)
  event.through = true
  event.move_speed = 2
  loop do
    event.move_up
    terrain = pbGetTerrainTag(event)
    break if !PBTerrain.isWaterfall?(terrain)
  end
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbDescendWaterfall(event=nil)
  event = $game_player if !event
  return if !event
  return if event.direction!=2
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  terrain = Kernel.pbFacingTerrainTag
  return if !PBTerrain.isWaterfall?(terrain)
  event.through = true
  event.move_speed = 2
  loop do
    event.move_down
    terrain = pbGetTerrainTag(event)
    break if !PBTerrain.isWaterfall?(terrain)
  end
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbWaterfall
  r=false
  if $game_temp.cascada==true
     $game_player.monturas()
     gamemontura=$game_temp.monturas
     if gamemontura[2]=="Cascada"
        if Kernel.pbConfirmMessage(_INTL("¿Te gustaría subir por la cascada?"))
          pbAscendWaterfall
          r= true
        end
     else
      Kernel.pbMessage(_INTL("Una pared de agua está cayendo con gran fuerza."))
     end
     $game_temp.cascada=false
   end
   return r
end

Events.onAction+=proc{|sender,e|
   terrain = Kernel.pbFacingTerrainTag
   if terrain==PBTerrain::Waterfall
     $game_temp.cascada=true
     Kernel.pbWaterfall
     return
   #elsif terrain==PBTerrain::WaterfallCrest
    #Kernel.pbMessage(_INTL("Una pared de agua está cayendo con gran fuerza."))
    #return
   end
}

#================================================================================#
#==============================Efecto de Buceo===================================#
#================================================================================#
Events.onAction+=proc{|sender,e|
  $game_player.monturas()
  gamemontura=$game_temp.monturas
if gamemontura[0]>MON_BUCEO
  p=2
  if $PokemonGlobal.diving && ($MapFactory.getTerrainTag(pbMapaBuceo(1),$game_player.x,$game_player.y))==PBTerrain::DeepWater
     Kernel.pbMessage(_INTL("Se ve una luz filtrandose entre el agua."))
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura marina?"))
        p=1
     end
  elsif $PokemonGlobal.surfing && pbGetTerrainTag($game_player)==PBTerrain::DeepWater
     Kernel.pbMessage(_INTL("El agua aquí parece ser más profunda de lo normal."))
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría usar una Pokémontura submarina?"))
        p=0
     end
  end
  if p<2
    gamemontura[2]= "Buceo"
    if p==1 #Emergir
      gamemontura[2]= "SurfPesca"
      pbBucear(p)
      $game_player.monturas(gamemontura)
      $game_player.transparent = true
      pbmontura_animacion
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
    else
      $game_player.monturas(gamemontura)
      $game_player.transparent = true
      pbmontura_animacion
      CambiaCharset(0,gamemontura[2])
      $game_player.transparent = false
      pbBucear(p)
    end
    pbWait(5)
  end
end
  return
}

def pbMapaBuceo(val)
 divemap=pbGetMetadata($game_map.map_id,MetadataDiveMap)
 meta = pbLoadMetadata
 if val==1
    for i in 0...meta.length
      if meta[i] && meta[i][MetadataDiveMap] && meta[i][MetadataDiveMap]==$game_map.map_id
        divemap = i; break
      end
    end
  end
  return divemap
end
  
def pbBucear(val)
pbFadeOutIn(99999){
       divemap=pbMapaBuceo(val)
       $game_temp.player_new_map_id    = divemap
       $game_temp.player_new_x         = $game_player.x
       $game_temp.player_new_y         = $game_player.y
       $game_temp.player_new_direction = $game_player.direction
       Kernel.pbCancelVehicles
       $PokemonGlobal.diving = true if val==0
       $PokemonGlobal.surfing = true if val==1
       Kernel.pbUpdateVehicle
       $scene.transfer_player(false)
       surfbgm = pbGetMetadata(0,MetadataSurfBGM) if val==1
       (surfbgm) ?  pbBGMPlay(surfbgm) : $game_map.autoplayAsCue if val==1
       $game_map.autoplay
       $game_map.refresh
    }
end
  
def Kernel.pbDive
  return
end

def Kernel.pbSurfacing
  return
end  

#================================================================================#
#==============================Efecto de TrepaRocas===================================#
#================================================================================#
def Kernel.pbEfectoTreparocas
  event = $game_player
  return if !event
  oldthrough   = event.through
  oldmovespeed = event.move_speed
  event.through = true
  event.move_speed += 2
  terrainInicio = Kernel.pbFacingTerrainTag
  n=0
  loop do
    case event.direction
    when 2; event.move_down
    when 4
          event.move_left if n==0
          n=2             if $game_map.passable?($game_player.x-1,$game_player.y,$game_player.direction,$game_player)
          event.move_left if $game_map.passable?($game_player.x-1,$game_player.y,$game_player.direction,$game_player)
          event.move_upper_left if n==1 && terrainInicio==PBTerrain::TreparocasA
          event.move_lower_left if n==1 && terrainInicio==PBTerrain::TreparocasB
    when 6
          event.move_right if n==0
          n=2              if $game_map.passable?($game_player.x+1,$game_player.y,$game_player.direction,$game_player)
          event.move_right if $game_map.passable?($game_player.x+1,$game_player.y,$game_player.direction,$game_player)
          event.move_upper_right if n==1 && terrainInicio==PBTerrain::TreparocasA
          event.move_lower_right if n==1 && terrainInicio==PBTerrain::TreparocasB
    when 8; event.move_up
    end
    pbWait(10)
    $scene.spriteset.addUserAnimation(MON_TREPAROCAS,$game_player.x,$game_player.y,false) if n!=2
    pbWait(MON_TREPAROCAS_VEL)
    n=1
    break if $game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
  end 
  event.through    = oldthrough
  event.move_speed = oldmovespeed
end

def Kernel.pbTrepaRocas(val)
  r=false
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  Kernel.pbMessage(_INTL("Parece ser una pared rocosa."))
  if gamemontura[2]=="TrepaRocas"
    m= val==PBTerrain::TreparocasA ? "subir" : "bajar"
    m="subir" if $game_player.direction==8
    m="bajar" if $game_player.direction==2
     if Kernel.pbConfirmMessage(_INTL("¿Te gustaría #{m} por la pared rocosa?"))
        Kernel.pbEfectoTreparocas
        r= true
     end
     return r
  end
end

Events.onAction+=proc{|sender,e|
    m=Kernel.pbFacingTerrainTag
   if m==PBTerrain::TreparocasA || m==PBTerrain::TreparocasB
     Kernel.pbTrepaRocas(m)
     return
   end
}

#================================================================================#
#==============================Efecto de Remolino================================#
#================================================================================#
Events.onAction+=proc{|sender,e|
   if Kernel.pbFacingTerrainTag==PBTerrain::Remolino && pbGetTerrainTag($game_player)!=PBTerrain::Remolino
     Kernel.pbMessage(_INTL("Parece ser un remolino de agua."))
     return
   end
}

#================================================================================#
#=========================Condicional para la bicicleta==========================#
#================================================================================#
def pbBikeCheck
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    Kernel.pbMessage(_INTL("No puede usarse al estar sobre una pokémontura."))
    return false
  end
  if $PokemonGlobal.surfing ||
     (!$PokemonGlobal.bicycle && PBTerrain.onlyWalk?(pbGetTerrainTag))
    Kernel.pbMessage(_INTL("Can't use that here."))
    return false
  end
  if $game_player.pbHasDependentEvents?
    Kernel.pbMessage(_INTL("It can't be used when you have someone with you."))
    return false
  end

  if $PokemonGlobal.bicycle
    if pbGetMetadata($game_map.map_id,MetadataBicycleAlways)
      Kernel.pbMessage(_INTL("You can't dismount your Bike here."))
      return false
    end
    return true
  else
    val=pbGetMetadata($game_map.map_id,MetadataBicycle)
    val=pbGetMetadata($game_map.map_id,MetadataOutdoor) if val==nil
    if !val
      Kernel.pbMessage(_INTL("Can't use that here."))
      return false
    end
    return true
  end
end

#================================================================================#
#========================Condicional para las cañas de pescar====================#
#================================================================================#
def pbPuedePescar
  terrain=Kernel.pbFacingTerrainTag
  notCliff=$game_map.passable?($game_player.x,$game_player.y,$game_player.direction,$game_player)
  $game_player.monturas()
  gamemontura=$game_temp.monturas 
  if (PBTerrain.isWater?(terrain) && !$PokemonGlobal.surfing && notCliff) ||
     (PBTerrain.isWater?(terrain) && $PokemonGlobal.surfing)
     if gamemontura[3]==true
        if gamemontura[2]=="SurfPesca" && $PokemonGlobal.surfing
          n=2
        else
          Kernel.pbMessage(_INTL("No puede ser usada con esta montura."))
          n=0
        end
      else
       n=2
      end
  else
     Kernel.pbMessage(_INTL("No se puede usar aquí."))
     n=0
  end
  return n 
end

ItemHandlers::UseFromBag.add(:OLDROD,proc{|item|
   n=pbPuedePescar
   next n
   
})

ItemHandlers::UseFromBag.copy(:OLDROD,:GOODROD,:SUPERROD)

ItemHandlers::UseInField.add(:OLDROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::OldRod)
   if pbFishing(encounter,1)
     pbEncounter(EncounterTypes::OldRod)
   end
   next 1
})

ItemHandlers::UseInField.add(:GOODROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::GoodRod)
   if pbFishing(encounter,2)
     pbEncounter(EncounterTypes::GoodRod)
   end
   next 1
})

ItemHandlers::UseInField.add(:SUPERROD,proc{|item|
   n=pbPuedePescar
   next n if n==0
   encounter=$PokemonEncounters.hasEncounter?(EncounterTypes::SuperRod)
   if pbFishing(encounter,3)
     pbEncounter(EncounterTypes::SuperRod)
   end
   next 1
})

def pbFishingBegin
  $PokemonGlobal.fishing = true
  patternb = 2*$game_player.direction - 1
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    charset= "montura_SurfPescaB_00#{$PokemonGlobal.playerID}"
  else
    meta = pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    num = 6
    if meta && meta[num] && meta[num]!=""
      charset = pbGetPlayerCharset(meta,num)
    end
  end
  4.times do |pattern|
    $game_player.setDefaultCharName(charset,patternb-pattern,true) if PESCAMOV==true
    $game_player.setDefaultCharName(charset,patternb-pattern)      if PESCAMOV==false
    2.times do
     Graphics.update
     Input.update
     pbUpdateSceneMap
    end
  end
end

def pbFishingEnd
  patternb = 2*($game_player.direction - 2)
  $game_player.monturas()
  gamemontura=$game_temp.monturas
  if gamemontura[3]==true
    charset= "montura_SurfPescaB_00#{$PokemonGlobal.playerID}"
  else
    meta = pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    num = 6
    if meta && meta[num] && meta[num]!=""
      charset = pbGetPlayerCharset(meta,num)
    end
  end
  4.times do |pattern|
    $game_player.setDefaultCharName(charset,patternb+pattern,true) if PESCAMOV==true
    $game_player.setDefaultCharName(charset,patternb+pattern)      if PESCAMOV==false
    2.times do
     Graphics.update
     Input.update
     pbUpdateSceneMap
    end
  end
  $PokemonGlobal.fishing = false
end

def pbFishing(hasencounter,rodtype=1)
  speedup = ($Trainer.party[0] &&
            (isConst?($Trainer.party[0].ability,PBAbilities,:STICKYHOLD) ||
            isConst?($Trainer.party[0].ability,PBAbilities,:SUCTIONCUPS)))
  bitechance = 20+(25*rodtype)   # 45, 70, 95
  bitechance *= 1.5 if speedup
  hookchance = 100
  oldpattern = $game_player.fullPattern
  pbFishingBegin
  msgwindow = Kernel.pbCreateMessageWindow
  ret = false
  loop do
    time = 5+rand(6)
    time = [time,5+rand(6)].min if speedup
    message = ""
    time.times do 
      message += ".   "
    end
    if pbWaitMessage(msgwindow,time)
      pbFishingEnd
      $game_player.setDefaultCharName(nil,oldpattern)
      Kernel.pbMessageDisplay(msgwindow,_INTL("No estan picando..."))
      break
    end
    if hasencounter && rand(100)<bitechance
      $scene.spriteset.addUserAnimation(EXCLAMATION_ANIMATION_ID,$game_player.x,$game_player.y,true)
      frames = 20+rand(21)
      if !pbWaitForInput(msgwindow,message+_INTL("\r\n¡Un pokémon ha picado el anzuelo!"),frames)
        pbFishingEnd
        $game_player.setDefaultCharName(nil,oldpattern)
        Kernel.pbMessageDisplay(msgwindow,_INTL("Se ha escapado..."))
        break
      end
      if FISHINGAUTOHOOK || rand(100)<hookchance
        pbFishingEnd
        Kernel.pbMessageDisplay(msgwindow,_INTL("¡Un pokémon ha picado el anzuelo!")) if !FISHINGAUTOHOOK
        $game_player.setDefaultCharName(nil,oldpattern)
        ret = true
        break
      end
#      bitechance+=15
#      hookchance+=15
    else
      pbFishingEnd
      $game_player.setDefaultCharName(nil,oldpattern)
      Kernel.pbMessageDisplay(msgwindow,_INTL("No estan picando..."))
      break
    end
  end
  Kernel.pbDisposeMessageWindow(msgwindow)
  return ret
end

def pbWaitForInput(msgwindow,message,frames)
  Kernel.pbMessageDisplay(msgwindow,message,false)
  twitchframe = 0
  if FISHINGAUTOHOOK
    loop do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      twitchframe = (twitchframe+1)%32
      if twitchframe<16 && (twitchframe&4)==0
        $game_player.pattern = 1
      else
        $game_player.pattern = 0
      end
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        $game_player.pattern = 0
        return true
      end
    end
  else
    frames.times do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      twitchframe = (twitchframe+1)%32
      if twitchframe<16 && (twitchframe&4)==0
        $game_player.pattern = 1
      else
        $game_player.pattern = 0
      end
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        $game_player.pattern = 0
        return true
      end
    end
  end
  return false
end

def pbWaitMessage(msgwindow,time)
  message = ""
  (time+1).times do |i|
    message += ".   " if i>0
    Kernel.pbMessageDisplay(msgwindow,message,false)
    16.times do
      Graphics.update
      Input.update
      pbUpdateSceneMap
      if Input.trigger?(Input::C) || Input.trigger?(Input::B)
        return true
      end
    end
  end
  return false
end

#================================================================================#
#=======================Busca Obejots(objeto clave)==============================#
#================================================================================#
ItemHandlers::UseFromBag.add(:ITEMFINDER,proc{|item|
$game_player.monturas()
gamemontura=$game_temp.monturas
next 0 if gamemontura[3]==true
next 2

})

ItemHandlers::UseFromBag.copy(:ITEMFINDER,:DOWSINGMCHN,:DOWSINGMACHINE)

#================================================================================#
#=============================UpdateVehicle======================================#
#================================================================================#

def Kernel.pbUpdateVehicle
    meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    if meta
    if $PokemonGlobal.diving
      $game_player.character_name="montura_#{gamemontura[2]}_00#{$PokemonGlobal.playerID}"
    elsif $PokemonGlobal.surfing
      $game_player.character_name="montura_#{gamemontura[2]}_00#{$PokemonGlobal.playerID}"
    elsif $PokemonGlobal.bicycle
      $game_player.character_name=pbGetPlayerCharset(meta,2) # Bicycle graphic
    else
      $game_player.character_name=pbGetPlayerCharset(meta,1) # Regular graphic
    end
  end
end

#===============================================================================
#  Huellas en la arena (Usando el script de KleinStudio)
#  Carga la imagen de huellas dependiendo de la montura que se use.
#  Si el archivo no existe, se usarán las huellas al caminar.
#
#===============================================================================
class Footprint
  def initialize(event,position)
    return if !$scene || !$scene.is_a?(Scene_Map) ||
    event!=$game_player && (event.character_name=="" || 
    event.name.include?("/nofoot/"))
    return if event!=$game_player && pbEventCommentInput(event,0,"NoFoot")    
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    return if event==$game_player && SINHUELLAS.include?(gamemontura[2])
    character_sprites=$scene.spriteset.character_sprites
    viewport=$scene.spriteset.viewportMonturas
    footsprites=$scene.spriteset.footsprites
    nid=getNewId
    fev=$game_map.events[nid]
    rpgEvent=RPG::Event.new(position[0],position[1])
    rpgEvent.id=nid       
    fev=Game_Event.new($game_map.map_id,rpgEvent,$game_map)
    eventsprite=Sprite_Character.new(viewport,fev)
    character_sprites.push(eventsprite) 
    footsprites.push(Footsprite.new(eventsprite,fev,viewport,
    $game_map,position[2],nid,character_sprites,(event==$game_player)))
  end
end

class Footsprite
  def initialize(sprite,event,viewport,map,direction,nid,chardata,player)
    $game_player.monturas()
    gamemontura=$game_temp.monturas
    @rsprite=sprite
    [MENTION=24071]Sprite[/MENTION]=Sprite.new(viewport)
    if player && $PokemonGlobal.bicycle
      [MENTION=24071]Sprite[/MENTION].bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footsetbike")
    elsif player && gamemontura[3]==true
         [MENTION=24071]Sprite[/MENTION].bitmap= pbResolveBitmap(bitmapFileName=sprintf("Graphics/Pictures/footset#{gamemontura[2]}")) ? BitmapCache.load_bitmap("Graphics/Pictures/footset#{gamemontura[2]}") : BitmapCache.load_bitmap("Graphics/Pictures/footset")
    else
      [MENTION=24071]Sprite[/MENTION].bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footset")
    end
    @realwidth [MENTION=24071]Sprite[/MENTION].bitmap.width/4
    [MENTION=24071]Sprite[/MENTION].src_rect.width=@realwidth
    @opacity=FOOTOPACITY
    setFootset(direction)
    @event=event
    @disposed=false
    @map=map
    @eventid=nid
    @viewport=viewport
    [MENTION=41652]Char[/MENTION]data=chardata
    update
  end
end
  
class Spriteset_Map
 def viewportMonturas; return @@viewport1; end
 end
#==============================================================================#
Gracias por molestarte en buscarlo jaja, pero como dice Jess no quería nada especial aparte de montar pokémon sin más los que fueran suficientemente grandes, igual gracias, será mi segunda opcion xD

Creo que no era necesario copiar y pegar todo el script, por eso lo publique dentro de un archivo .txt, para evitar este tipo de situaciones en las cuales se ocupa una enorme cantidad de espacio del post, si querías mencionarlo solo tenías que colocar el link de descargar, LINK

Además, si no me equivoco, su duda era sobre como implementarlo al menú del equipo, osea de que manera agregarías la opción "montar" a las opciones de cada pokémon del menu pokémon.
Crees que es muy dificil de hacer lo que he pedido? o debería optar por coger directamente tu script?
 
Última edición por un moderador:

Jessie

What goes around, comes around
Respuesta: Re: Montar en pokemon

Gracias por molestarte en buscarlo jaja, pero como dice Jess no quería nada especial aparte de montar pokémon sin más los que fueran suficientemente grandes, igual gracias, será mi segunda opcion xD

Crees que es muy dificil de hacer lo que he pedido? o debería optar por coger directamente tu script?
Pues depende lo que quieras hacer, el script que hice, fue para emular los efectos de las Pokemonturas de Sun/Moon, si eso es lo que quieres pues adelante y usalo.

Pero como lo que preguntas es agregar "Montar" a las opciones del menu pokémon, lo cual es sencillo como ves :


Pero de ahí necesitas pensar que tipo de efecto quieres para ese "Montar", si quieres que el personaje solamente cambie de imagen o si quieres que al "montar" a ese pokémon se tenga algún efecto secundario como las pokemonturas, además pensar en el tipo de limitantes que debes crear para el jugador, por ejemplo si estas sobre un enorme Onix, no podrás entrar a las casas o hacer surf, lo mismo si estas haciendo surf sobre Lapras, debes evitar que el jugador deje de hacer surf y se sube en onix en medio del agua.

Todo depende de que es lo que realmente estas buscando hacer.
Saludos.
 

Morel X

Pues bueno aquí estamosxD
Respuesta: Re: Montar en pokemon

Pues depende lo que quieras hacer, el script que hice, fue para emular los efectos de las Pokemonturas de Sun/Moon, si eso es lo que quieres pues adelante y usalo.

Pero como lo que preguntas es agregar "Montar" a las opciones del menu pokémon, lo cual es sencillo como ves :


Pero de ahí necesitas pensar que tipo de efecto quieres para ese "Montar", si quieres que el personaje solamente cambie de imagen o si quieres que al "montar" a ese pokémon se tenga algún efecto secundario como las pokemonturas, además pensar en el tipo de limitantes que debes crear para el jugador, por ejemplo si estas sobre un enorme Onix, no podrás entrar a las casas o hacer surf, lo mismo si estas haciendo surf sobre Lapras, debes evitar que el jugador deje de hacer surf y se sube en onix en medio del agua.

Todo depende de que es lo que realmente estas buscando hacer.
Saludos.
Pues en principio solo busco que se pueda subir en un pokemon y ya está, quizas que fuera un poco mas rapido si va en un rapidash y un poco mas lento si va subido en un onix, y que al surfear se quitara lo de montar y al entrar en los edificios tambien, con eso me bastaría jaja
 
Estado
Cerrado para nuevas respuestas.
Arriba