Efectos de Movimientos

Los efectos de los movimientos en Pokémon Essentials v21.1 están controlados por el sistema de FunctionCode. Cada movimiento tiene asignado un FunctionCode en el archivo PBS moves.txt, y su comportamiento está definido por una clase Ruby que hereda de Battle::Move.

Jerarquía de clases Battle::Move

Todos los efectos de movimientos se basan en la clase Battle::Move. La estructura de herencia es:

Battle::Move                         # Clase base de todos los movimientos
├── Battle::Move::None               # Movimiento genérico sin efecto extra (solo daño)
├── Battle::Move::PoisonTarget       # Envenenar al objetivo
├── Battle::Move::BurnTarget         # Quemar al objetivo
├── Battle::Move::ParalyzeTarget     # Paralizar al objetivo
├── Battle::Move::SleepTarget        # Dormir al objetivo
├── Battle::Move::FreezeTarget       # Congelar al objetivo
├── Battle::Move::ConfuseTarget      # Confundir al objetivo
├── Battle::Move::FlinchTarget       # Hacer retroceder al objetivo
├── Battle::Move::RaiseUserAttack1   # Subir Ataque del usuario +1
├── Battle::Move::ProtectUser        # Proteger al usuario
└── ... (cientos de clases más)

El sistema de FunctionCode

Cada FunctionCode del PBS (como PoisonTarget, RaiseUserAttack2, etc.) corresponde a una clase Ruby ubicada en los scripts del juego. El motor busca la clase correspondiente en el módulo Battle::Move.

Por ejemplo, si un movimiento tiene FunctionCode = BurnTarget, el motor buscará y utilizará la clase Battle::Move::BurnTarget.

Ubicación de los scripts

Los efectos de movimientos se encuentran organizados en varios archivos dentro de la sección de scripts:

Métodos principales de Battle::Move

Al crear o modificar un efecto de movimiento, estos son los métodos más importantes que puedes sobrescribir:

pbMoveFailed?(user, targets)

Se ejecuta antes de que el movimiento se realice. Si retorna true, el movimiento falla y no causa ningún efecto.

def pbMoveFailed?(user, targets)
  if user.hp <= user.totalhp / 2
    @battle.pbDisplay(_INTL("¡{1} no tiene suficiente energía!", user.pbThis))
    return true
  end
  return false
end

pbCalcDamage(user, target, numTargets)

Calcula el daño que el movimiento inflige. Normalmente no necesitas sobrescribir este método directamente, ya que la clase base se encarga del cálculo estándar de daño. Se usa para movimientos con fórmulas de daño especiales.

pbBaseDamage(baseDmg, user, target)

Permite modificar la potencia base del movimiento según condiciones. Útil para movimientos cuya potencia varía.

def pbBaseDamage(baseDmg, user, target)
  # Duplicar potencia si el objetivo tiene un problema de estado
  if target.pbHasAnyStatus?
    baseDmg *= 2
  end
  return baseDmg
end

pbAdditionalEffect(user, target)

Se ejecuta después de causar daño. Define los efectos secundarios del movimiento (quemar, paralizar, bajar stats, etc.). Solo se ejecuta si el movimiento acierta y la tirada de EffectChance tiene éxito.

def pbAdditionalEffect(user, target)
  return if target.damageState.substitute
  target.pbBurn(user) if target.pbCanBurn?(user, false, self)
end

pbEffectGeneral(user)

Se usa para efectos que no dependen de un objetivo, como cambiar el clima, subir stats del usuario, o curar PS. Se ejecuta después del uso del movimiento.

def pbEffectGeneral(user)
  @battle.pbStartWeatherAbility(:Sun, 5, user)
  @battle.pbDisplay(_INTL("¡La luz solar se volvió intensa!"))
end

pbEffectAgainstTarget(user, target)

Se ejecuta por cada objetivo del movimiento. Ideal para efectos que dependen del objetivo pero no son efectos secundarios con probabilidad.

def pbEffectAgainstTarget(user, target)
  target.pbLowerStatStage(:DEFENSE, 1, user)
end

Otros métodos útiles

Método Descripción
pbCalcType(user) Calcula el tipo del movimiento (para movimientos que cambian de tipo).
pbModifyDamage(damageMult, user, target) Modifica el multiplicador de daño final.
pbCritialOverride(user, target) Permite forzar o impedir un golpe crítico.
pbAccuracyCheck(user, target) Comprueba si el movimiento acierta. Retorna true si acierta.
pbNumHits(user, targets) Número de golpes que realiza el movimiento.
pbEffectWhenDealingDamage(user, target) Se ejecuta cuando el movimiento causa daño, sin importar EffectChance.

Crear un efecto personalizado paso a paso

Vamos a crear un movimiento personalizado llamado "Puño Volcánico" — un movimiento físico de tipo Fuego que quema al objetivo y sube el Ataque del usuario en 1 nivel.

Paso 1: Definir el movimiento en el PBS

Añade esta entrada al archivo PBS/moves.txt:

[VOLCANICPUNCH]
Name = Puño Volcánico
Type = FIRE
Category = Physical
Power = 85
Accuracy = 100
TotalPP = 10
Target = NearOther
FunctionCode = VolcanicPunch
Flags = Contact,CanProtect,CanMirrorMove,Punch,ThawsUser
EffectChance = 30
Description = Un puñetazo envuelto en lava. Puede quemar y sube el Ataque del usuario.

Paso 2: Crear la clase del efecto

Crea un nuevo script (o añade a un script existente de efectos de movimientos) con la siguiente clase:

class Battle::Move::VolcanicPunch < Battle::Move
  # Efecto adicional: quemar al objetivo (con probabilidad de EffectChance)
  def pbAdditionalEffect(user, target)
    return if target.damageState.substitute
    if target.pbCanBurn?(user, false, self)
      target.pbBurn(user)
    end
  end

  # Efecto que siempre ocurre: subir Ataque del usuario
  def pbEffectWhenDealingDamage(user, target)
    if user.pbCanRaiseStatStage?(:ATTACK, user, self)
      user.pbRaiseStatStage(:ATTACK, 1, user)
    end
  end
end

Paso 3: Compilar

Guarda los cambios, abre el juego en modo Debug y compila los datos (Debug > Compilar datos). El nuevo movimiento estará disponible.

Tabla de FunctionCodes comunes

A continuación se listan los FunctionCodes más utilizados, organizados por categoría:

Problemas de estado

FunctionCode Efecto
PoisonTargetEnvenena al objetivo.
BadPoisonTargetEnvenena gravemente al objetivo.
ParalyzeTargetParaliza al objetivo.
BurnTargetQuema al objetivo.
FreezeTargetCongela al objetivo.
SleepTargetDuerme al objetivo.
ConfuseTargetConfunde al objetivo.
FlinchTargetHace retroceder al objetivo.

Cambios de estadísticas

FunctionCode Efecto
RaiseUserAttack1Sube Ataque del usuario +1.
RaiseUserAttack2Sube Ataque del usuario +2.
RaiseUserDefense1Sube Defensa del usuario +1.
RaiseUserDefense2Sube Defensa del usuario +2.
RaiseUserSpAtk1Sube At. Especial del usuario +1.
RaiseUserSpeed1Sube Velocidad del usuario +1.
RaiseUserSpeed2Sube Velocidad del usuario +2.
RaiseUserEvasion1Sube Evasión del usuario +1.
LowerTargetAttack1Baja Ataque del objetivo -1.
LowerTargetDefense1Baja Defensa del objetivo -1.
LowerTargetSpAtk1Baja At. Especial del objetivo -1.
LowerTargetSpDef1Baja Def. Especial del objetivo -1.
LowerTargetSpeed1Baja Velocidad del objetivo -1.
LowerTargetAccuracy1Baja Precisión del objetivo -1.

Clima y terreno

FunctionCode Efecto
StartSunWeatherActiva sol intenso durante 5 turnos.
StartRainWeatherActiva lluvia durante 5 turnos.
StartSandstormWeatherActiva tormenta de arena durante 5 turnos.
StartHailWeatherActiva granizo durante 5 turnos.
StartElectricTerrainActiva campo eléctrico durante 5 turnos.
StartGrassyTerrainActiva campo de hierba durante 5 turnos.
StartMistyTerrainActiva campo de niebla durante 5 turnos.
StartPsychicTerrainActiva campo psíquico durante 5 turnos.

Curación y daño especial

FunctionCode Efecto
HealUserHalfOfTotalHPCura el 50% de los PS máx. del usuario.
HealUserFullHPAndSleepCura todos los PS del usuario pero se duerme (Descanso).
UserFaintsExplosiveEl usuario se debilita (Explosión).
UserFaintsFixedDamageUserHPEl usuario se debilita; daño igual a sus PS restantes.
RecoilQuarterOfDamageDealtRetroceso de 1/4 del daño causado.
RecoilThirdOfDamageDealtRetroceso de 1/3 del daño causado.
RecoilHalfOfDamageDealtRetroceso de 1/2 del daño causado.

Protección y defensa

FunctionCode Efecto
ProtectUserProtege al usuario de ataques este turno.
ProtectUserFromTargetingMovesSpikyShieldProtección que daña al atacante (Rey Escudo).
ProtectUserBanefulBunkerProtección que envenena al atacante (Búnker).
UserAddStockpileAcumula Reserva (Acumulación).

Golpes múltiples

FunctionCode Efecto
HitTwoTimesGolpea 2 veces.
HitThreeTimesGolpea 3 veces.
HitTwoToFiveTimesGolpea de 2 a 5 veces.
Consejo: Para encontrar el FunctionCode de un movimiento existente, busca su entrada en PBS/moves.txt. Para estudiar su implementación, busca la clase correspondiente dentro de los scripts del proyecto con el nombre Battle::Move::NombreDelFunctionCode.