Registrarse

Efecto de poison en el agua

Estado
Cerrado para nuevas respuestas.
Buenas, quería mostrarles mi problema para ver si ustedes encuentran la solución porque yo ya no se que hacer.
Estoy haciendo un mapa en mi hackrom, donde hacer surf en el agua hace un daño constante a cada paso (como el efecto de poison). Hasta cierto punto, funciona bien. Los pokemon reciben daño, mientras que aparece el flash de pantalla típico del veneno. El problema es cuando el hp de los pokemon llega a 0 y soy teletransportado de regreso al ultimo punto de control. Cuando eso sucede, el efecto de flash continua y no se va.
Otro gran problema, es que luego de llegar al punto de control y revivir a mis pokemon, si regreso al mapa en cuestión, el efecto de daño comienza a aplicarse sin necesidad de hacer surf (eso no debería ser así).
Otra consulta que quería hacerles es cómo hacer para que el efecto este del que les estoy hablando deje de aplicarse cuando se posee cierto item.
Les paso el codigo completo que tengo hasta ahora:
Código:
def Kernel.pbSurf
  if $game_player.pbHasDependentEvents?
    return false
  end
  if $DEBUG ||
    (HIDDENMOVESCOUNTBADGES ? $Trainer.numbadges>=BADGEFORSURF : $Trainer.badges[BADGEFORSURF])
    movefinder=Kernel.pbCheckMove(:SURF)
    if $DEBUG || movefinder
      if Kernel.pbConfirmMessage(_INTL("The water is a deep blue...\nWould you like to surf on it?"))
        speciesname=!movefinder ? $Trainer.name : movefinder.name
        Kernel.pbMessage(_INTL("{1} used Surf!",speciesname))
        pbHiddenMoveAnimation(movefinder)
        if $game_map && $game_map.map_id != 43 && $game_map.map_id != 48
        surfbgm=pbGetMetadata(0,MetadataSurfBGM)
      end
      # Si estamos en el mapa con ID 43
      if $game_map && $game_map.map_id == 43 
        surfbgm = "AOsurfing"
# Poison event on each step taken
Events.onStepTakenTransferPossible+=proc {|sender,e|
  handled=e[0]
  next if handled[0]
  if $PokemonGlobal.stepcount % 4 == 0 && surfbgm = "AOsurfing"
    flashed=false
    for i in $Trainer.party
      if i.hp>0 && !i.isEgg?
        !isConst?(i.ability,PBAbilities,:IMMUNITY)
        if !flashed && i.hp !=0
          $game_screen.start_flash(Color.new(255,0,0,128), 4)
          flashed=true
         end
        if $game_map && $game_map.map_id == 43
        i.hp-=1
        end
        if i.hp==0
          i.changeHappiness("faint")
          i.status=0
          Kernel.pbMessage(_INTL("{1} fainted...\\1",i.name))
          flashed=false
        end
        handled[0]=true if pbAllFainted
        pbCheckAllFainted()
      end
    end
  end
  }
      end
      # Si estamos en el mapa con ID 48
      if $game_map && $game_map.map_id == 48 
        surfbgm = "AOsurfing"
        end
        if surfbgm
          pbCueBGM(surfbgm,0.5)
        end
        pbStartSurfing()
        return true
      end
    end
  end
  return false
end
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster
La parte de "onStepTakenTransferPossible" puedes sacarla fuera del def, de hecho deberías hacerlo.
Luego por otra parte he visto el "&& surfbgm = "AOsurfing"", ahí no estás comparándolo, estás haciendo que surfbgm sea igual a AOsurfing, debería de ser "&& surfbgm == "AOsurfing".
Yo te aconsejaría que para hacer lo del veneno en lugar de poner un condicional con el nombre de la música de Surf detectase si estás en cierto mapa y surfeando, te dejo un ejemplo.

Código:
def Kernel.pbSurf
  if $game_player.pbHasDependentEvents?
    return false
  end
  if $DEBUG ||
    (HIDDENMOVESCOUNTBADGES ? $Trainer.numbadges>=BADGEFORSURF : $Trainer.badges[BADGEFORSURF])
    movefinder=Kernel.pbCheckMove(:SURF)
    if $DEBUG || movefinder
      if Kernel.pbConfirmMessage(_INTL("The water is a deep blue...\nWould you like to surf on it?"))
        speciesname=!movefinder ? $Trainer.name : movefinder.name
        Kernel.pbMessage(_INTL("{1} used Surf!",speciesname))
        pbHiddenMoveAnimation(movefinder)
        if $game_map && $game_map.map_id != 43 && $game_map.map_id != 48
        surfbgm=pbGetMetadata(0,MetadataSurfBGM)
      end
      # Si estamos en el mapa con ID 43
      if $game_map && $game_map.map_id == 43
        surfbgm = "AOsurfing"
      end
      # Si estamos en el mapa con ID 48
      if $game_map && $game_map.map_id == 48
        surfbgm = "AOsurfing"
        end
        if surfbgm
          pbCueBGM(surfbgm,0.5)
        end
        pbStartSurfing()
        return true
      end
    end
  end
  return false
end

# Poison event on each step taken
Events.onStepTakenTransferPossible+=proc {|sender,e|
  # No hagas efecto veneno si no estás surfeando y en el mapa 2
  next if !$PokemonGlobal.surfing && $game_map.map_id != 42
  handled=e[0]
  next if handled[0]
  if $PokemonGlobal.stepcount % 4 == 0 
    flashed=false
    for i in $Trainer.party
      if i.hp>0 && !i.isEgg?
        !isConst?(i.ability,PBAbilities,:IMMUNITY)
        if !flashed && i.hp !=0
          $game_screen.start_flash(Color.new(255,0,0,128), 4)
          flashed=true
         end
        if $game_map && $game_map.map_id == 43
          i.hp-=1
        end
        if i.hp==0
          i.changeHappiness("faint")
          i.status=0
          Kernel.pbMessage(_INTL("{1} fainted...\\1",i.name))
          flashed=false
        end
        handled[0]=true if pbAllFainted
        pbCheckAllFainted()
      end
    end
  end
}
No he probado el código pero debería de funcionar.
Por cierto, ten en cuenta que un juego creado con RPG Maker no es un hack rom ya que no estás editando ninguna rom, normalmente se les llama RPG aunque esto tampoco esté bien dicho ya que RPG es simplemente un tipo de videojuego.
 
Por alguna razón que desconozco al principio tu código me tiraba error, pero probando, lo tome y lo puse en un lugar aparte arriba del main (fuera del codigo de surf) y funciono a la perfección. Muchas gracias por tomarte las molestias.
Con respecto a lo del item, supongo que seria agregarle una condicion en la cual determinado interruptor sea "true". Pero como seria la sintaxis?
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster
Bueno esto no son interruptores, son variables, esta función te da la cantidad de X objeto que tienes en la mochila, por ejemplo pociones.
Código:
$PokemonBag.pbQuantity(:POTION)
Por lo que para comprobar si tienes pociones sólo tendrías que ver si tienes más que cero.
Código:
$PokemonBag.pbQuantity(:POTION) > 0
 
Sí, sí, pasa que yo pensaba que tendría que llamar, desde el editor de scripts, al interruptor del evento en el que se entrega el item y usarlo como variable. Pero eso que me dijiste es más sencillo. Gracias de nuevo. Funcionó.
 
Estado
Cerrado para nuevas respuestas.
Arriba