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:
Battle_Move— Clase baseBattle::Movecon todos los métodos generales.Battle_Move_[XXX]— Archivos que contienen los efectos específicos, organizados por grupos.
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 |
|---|---|
PoisonTarget | Envenena al objetivo. |
BadPoisonTarget | Envenena gravemente al objetivo. |
ParalyzeTarget | Paraliza al objetivo. |
BurnTarget | Quema al objetivo. |
FreezeTarget | Congela al objetivo. |
SleepTarget | Duerme al objetivo. |
ConfuseTarget | Confunde al objetivo. |
FlinchTarget | Hace retroceder al objetivo. |
Cambios de estadísticas
| FunctionCode | Efecto |
|---|---|
RaiseUserAttack1 | Sube Ataque del usuario +1. |
RaiseUserAttack2 | Sube Ataque del usuario +2. |
RaiseUserDefense1 | Sube Defensa del usuario +1. |
RaiseUserDefense2 | Sube Defensa del usuario +2. |
RaiseUserSpAtk1 | Sube At. Especial del usuario +1. |
RaiseUserSpeed1 | Sube Velocidad del usuario +1. |
RaiseUserSpeed2 | Sube Velocidad del usuario +2. |
RaiseUserEvasion1 | Sube Evasión del usuario +1. |
LowerTargetAttack1 | Baja Ataque del objetivo -1. |
LowerTargetDefense1 | Baja Defensa del objetivo -1. |
LowerTargetSpAtk1 | Baja At. Especial del objetivo -1. |
LowerTargetSpDef1 | Baja Def. Especial del objetivo -1. |
LowerTargetSpeed1 | Baja Velocidad del objetivo -1. |
LowerTargetAccuracy1 | Baja Precisión del objetivo -1. |
Clima y terreno
| FunctionCode | Efecto |
|---|---|
StartSunWeather | Activa sol intenso durante 5 turnos. |
StartRainWeather | Activa lluvia durante 5 turnos. |
StartSandstormWeather | Activa tormenta de arena durante 5 turnos. |
StartHailWeather | Activa granizo durante 5 turnos. |
StartElectricTerrain | Activa campo eléctrico durante 5 turnos. |
StartGrassyTerrain | Activa campo de hierba durante 5 turnos. |
StartMistyTerrain | Activa campo de niebla durante 5 turnos. |
StartPsychicTerrain | Activa campo psíquico durante 5 turnos. |
Curación y daño especial
| FunctionCode | Efecto |
|---|---|
HealUserHalfOfTotalHP | Cura el 50% de los PS máx. del usuario. |
HealUserFullHPAndSleep | Cura todos los PS del usuario pero se duerme (Descanso). |
UserFaintsExplosive | El usuario se debilita (Explosión). |
UserFaintsFixedDamageUserHP | El usuario se debilita; daño igual a sus PS restantes. |
RecoilQuarterOfDamageDealt | Retroceso de 1/4 del daño causado. |
RecoilThirdOfDamageDealt | Retroceso de 1/3 del daño causado. |
RecoilHalfOfDamageDealt | Retroceso de 1/2 del daño causado. |
Protección y defensa
| FunctionCode | Efecto |
|---|---|
ProtectUser | Protege al usuario de ataques este turno. |
ProtectUserFromTargetingMovesSpikyShield | Protección que daña al atacante (Rey Escudo). |
ProtectUserBanefulBunker | Protección que envenena al atacante (Búnker). |
UserAddStockpile | Acumula Reserva (Acumulación). |
Golpes múltiples
| FunctionCode | Efecto |
|---|---|
HitTwoTimes | Golpea 2 veces. |
HitThreeTimes | Golpea 3 veces. |
HitTwoToFiveTimes | Golpea de 2 a 5 veces. |
PBS/moves.txt. Para estudiar su implementación, busca la clase correspondiente dentro de los scripts del proyecto con el nombre Battle::Move::NombreDelFunctionCode.