Registrarse

[pokeruby] Implementando habilidades nuevas

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Quick Feet
Cuando un pokémon con esta habilidad sufre un estado alterado, recibe un aumento de velocidad del 50%.
Todo perfecto, solo falta la parte en la que ignoras el bajón de velocidad del estado de parálisis si el pokémon sufre de este estado ya que la habilidad hace eso y aplica su bonus.

Sniper En el archivo "calculate_base_damage.c" pegamos esto:
Código:
if (attacker->ability == ABILITY_SNIPER && gCritMultiplier == 2)
		gBattleMovePower = (gBattleMovePower * 15) / 10;
Super Lucky ahora en el archivo "battle_4.c" vamos a la función "atk04_critcalc" y aquí:
Código:
critChance  = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
                + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY)
                + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD);
pegamos esto "+ (gBattleMons[gBankAttacker].ability == ABILITY_SUPER_LUCKY)" así:
Código:
critChance  = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
                + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
                + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY)
                + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD)
+ (gBattleMons[gBankAttacker].ability == ABILITY_SUPER_LUCKY);
Actualizo con pruebas tan pronto mi internet deje de apestar :(
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Todo perfecto, solo falta la parte en la que ignoras el bajón de velocidad del estado de parálisis si el pokémon sufre de este estado ya que la habilidad hace eso y aplica su bonus.
Uh, gracias, ni lo habia notado.
Basta con modificar el decremento que provoca la Paralisis a la velocidad del pokémon, que está definido en el mismo archivo (src\battle\battle_2.c) de la siguiente forma.

Código:
if (gBattleMons[bank1].status1 & STATUS_PARALYSIS && (gBattleMons[bank1].ability != ABILITY_QUICK_FEET))
        bank1AdjustedSpeed /= 4;
Como antes, hay que hacer la modificación para el efecto al pokémon del Jugador, y la modificación para el efecto al pokémon del Oponente.

Código:
if (gBattleMons[bank2].status1 & STATUS_PARALYSIS && (gBattleMons[bank2].ability != ABILITY_QUICK_FEET))
        bank2AdjustedSpeed /= 4;
Cosa que luciria de esta forma.

De esta forma, el decremento que provoca el estado alterado Paralisis solo se producirá si el pokémon está paralizado y tiene cualquier habilidad excepto Quick Feet.
Si tiene Quick Feet, el codigo se tira pa'tras sin hacer cambios a la velocidad del pokémon.
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Dry Skin (Gen. 4)

Empezamos por lo basico. Definir la habilidad, su nombre, descripción y luego definimos una linea de texto para el efecto de la habilidad en batalla. En mi caso yo la llamé "DrySkinDmg".
Dicho eso:

Código:
const u8 BattleText_DrySkinDmg[] = _("{DEFENDING_MON}'s {STRING 22}\ncaused damage!");

Código:
if (defender->ability == ABILITY_DRY_SKIN && (gBattleMoves[gCurrentMove].type == TYPE_FIRE))
        gBattleMovePower = (125 * gBattleMovePower) / 100;

Código:
case ABILITY_DRY_SKIN:
                    if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY)
                     && gBattleMons[bank].maxHP > gBattleMons[bank].hp)
                    {
                        gLastUsedAbility = ABILITY_DRY_SKIN; // why
                        BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);
                        gBattleMoveDamage = gBattleMons[bank].maxHP / 8;
                        if (gBattleMoveDamage == 0)
                            gBattleMoveDamage = 1;
                        gBattleMoveDamage *= -1;
                        effect++;
                    }
                    if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY)
                     && gBattleMons[bank].maxHP > gBattleMons[bank].hp)
                    {
                        gLastUsedAbility = ABILITY_DRY_SKIN; // why
                        BattleScriptPushCursorAndCallback(BattleScript_DrySkinDmg);
                        gBattleMoveDamage = gBattleMons[bank].maxHP / 8;
                        if (gBattleMoveDamage == 0)
                            gBattleMoveDamage = 1;
                        effect++;
                    }
                    break;

Y a probar.

Como recordatorio, los efectos de Dry Skin son:
1) El pokémon recupera 1/8 de vida al final de cada turno si está lloviendo.
2) El pokémon pierde 1/8 de vida al final de cada turno si está soleado.
3) Si un pokémon usa un ataque de Tipo Fuego y la victima tiene Dry Skin, el poder de ese movimiento aumenta un 25%.

Como siempre, si alguien ve algo incorrecto, hagamelo saber.
¡Muy bien, ya se esta moviendo un poco este post!

Solo que te faltó un efecto de esta habilidad, el cual inmuniza al pokémon que la posea ante ataques del tipo agua a la vez que restaura 25% de su salud para lo que bastaría solo colocar en el archivo battle_util.c un "case ABILITY_DRY_SKIN:" arriba de "case ABILITY_WATER_ABSORB:" ya que el efecto es el mismo.
debe quedar así.
Código:
case ABILITY_DRY_SKIN:
                case ABILITY_WATER_ABSORB:
                    if (moveType == TYPE_WATER && gBattleMoves[move].power != 0)
                    {
                        if (gProtectStructs[gBankAttacker].notFirstStrike)
                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
                        else
                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
                        effect = 1;
                    }
                    break;
Pequeño error tonto. El daño de Dry Skin durante clima soleado no se efectua si el pokémon tiene todos sus puntos de vida.
Para corregirlo, modifiquen en el segundo if check:
Código:
&& gBattleMons[bank].maxHP > gBattleMons[bank].hp
Reemplazandolo con:
Código:
&& gBattleMons[bank].hp != 0
Quedando tal que asi:
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Tangled Feet
Si el pokémon con esta habilidad está confuso, baja la precisión de los movimientos usados en su contra a la mitad.

Para hacer esto me guié en las reducciones de precisión que tienen habilidades como Hustle y Sand Veil. Si ven algo mal, me avisan.
https://github.com/LOuroboros/pokeruby493/commit/50f140f1160cf06bfae363ecdfdfad13a3f8541f

EDITO:
Y con esta ya solo me faltan 14 de las 47 habilidades introducidas en la 4ta Generación.
Las que quedan son complicadas, dependen de X cosa que aun no he implementado por Y motivo o dependen de alguna función que todavia no ha sido decompilada por completo.

Un ejemplo de esto seria Leaf Guard. Mi idea original era añadir unos if check dentro de los distintos efectos de los estados alterados no-volatiles que aparecen en src\battle\battle_4.c especificamente dentro de la función SetMoveEffect, pero como no está decompilada del todo, pues de momento no se puede tocar.

Por ahora descansaré un poco, y luego miraré alguna otra via para implementar la habilidad.
 
Última edición:

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Leaf Guard

El cambio será en "battle_util.c" buscamos "ABILITYEFFECT_IMMUNITY" donde pegaremos el siguiente "case"

Código:
case ABILITY_LEAF_GUARD:
                        if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY) && gBattleMons[bank].status1 & STATUS_ANY)
						{    
							if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_SLEEP)
							{
								gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
								StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_BURN)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_FREEZE)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00))  // TODO: what is 0xF00?
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
								effect = 1;
							}
						}
                        break;
Y el resultado sería el siguiente:
https://streamable.com/6p9um
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Leaf Guard

El cambio será en "battle_util.c" buscamos "ABILITYEFFECT_IMMUNITY" donde pegaremos el siguiente "case"

Código:
case ABILITY_LEAF_GUARD:
                        if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY) && gBattleMons[bank].status1 & STATUS_ANY)
						{    
							if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_SLEEP)
							{
								gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
								StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_BURN)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & STATUS_FREEZE)
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
								effect = 1;
							}
							if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00))  // TODO: what is 0xF00?
							{
								StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
								effect = 1;
							}
						}
                        break;
Y el resultado sería el siguiente:
https://streamable.com/6p9um
Aquí hay varios problemas.
-Leaf Guard no parece estar tomando en cuenta el estado alterado dormido correctamente. Si el oponente utiliza Yawn/Bostezo para dormir al pokémon con Leaf Guard, Leaf Guard no se activa hasta que el pokémon ya cayó dormido, cuando no deberia poder caer en el sueño en lo absoluto.

En otras palabras, Leaf Guard se deberia estar activando en el turno en el que el pokémon caeria dormido y tirar un mensaje mencionando como Leaf Guard no dejó que eso pasara.

-Del mismo modo, el oponente no deberia ni tener la oportunidad de envenenar al jugador con el movimiento Toxic/Toxico. Leaf Guard deberia saltar justo antes de que eso pase, y evitarlo.

Vamos, asi es como funciona en los juegos oficiales, por lo menos.






No pude comprobar como funciona exactamente con el tema de ser congelado por un movimiento del rival, pero me imagino que es algo similar. En lugar de congelarse, la habilidad previene que pase en primer lugar.
 

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Pues la verdad que tienes razón para eso habría que modificar el endturn de "Yawn" para que no duerma al pokemon si se activa la habilidad, la cosa es que no me mereció la pena, ya que como ya dijiste antes, para implementarla correctamente, se necesita modificar el "setmoveeffect" ubicado en "battle_4.c" que no está decompilado en su totalidad. Así que mientras no tenga los recursos para hacer que la habilidad sea 100% funcional como en los juegos originales, la dejaré con ese efecto de curar los estados al instante en lugar de prevenirlos.
No me agrada mucho la verdad este acabado, ya que así no puedo hacer que "Mold Breaker" ignore esta habilidad cosa que si haría en los juegos de 4ta gen en adelante, pero ya que... De momento así quedará.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Puees.. he estado trabajando en Slow Start, la habilidad exclusiva de Regigigas.
Está casi hecha, solo falta añadir el decremento al Ataque durante los primeros 5 turnos.

Honestamente he intentado un par de cosas, pero nada me ha funcionado.
Quisiera hacerlo en src\battle\calculate_base_damage.c, pero ese archivo no puede leer gDisableStructs, y no tengo idea de como hacer que lo haga. Desde luego, un simple "#include "battle.h"" no funciona.

Si alguien quiere darle el intento o tirarme alguna corrección donde lo vea necesario, adelante.
https://github.com/LOuroboros/pokeruby493/commit/42a285f753657b850224c99f72a9b02fd7deb11e
https://github.com/LOuroboros/pokeruby493/commit/f2d0f94dbed7798166d0610eca83d5e3f0f6771e
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Puees.. he estado trabajando en Slow Start, la habilidad exclusiva de Regigigas.
Está casi hecha, solo falta añadir el decremento al Ataque durante los primeros 5 turnos.

Honestamente he intentado un par de cosas, pero nada me ha funcionado.
Quisiera hacerlo en src\battle\calculate_base_damage.c, pero ese archivo no puede leer gDisableStructs, y no tengo idea de como hacer que lo haga. Desde luego, un simple "#include "battle.h"" no funciona.

Si alguien quiere darle el intento o tirarme alguna corrección donde lo vea necesario, adelante.
https://github.com/LOuroboros/pokeruby493/commit/42a285f753657b850224c99f72a9b02fd7deb11e
https://github.com/LOuroboros/pokeruby493/commit/f2d0f94dbed7798166d0610eca83d5e3f0f6771e
Pues resulta que calculate_base_damage.c si puede chequear gDisableStructs. Probablemente hice mal el chequeo, quizá haya usado "attacker" en lugar de "bankAtk" por ejemplo, o quizá haya escrito "gDisableStruct" en lugar de "gDisableStructs".

En fin, fuese como fuese, @Lumbreon me demostró con una commit en GitHub que si uso "bankAtk" en su lugar, el chequeo funciona de lo mas tranquilamente.
Dicho eso, Slow Start está implementado.
https://github.com/LOuroboros/pokeruby493/commit/096d3a31d6b2bbac6e3798e87d39b80f2feaa745

Lo que hace esta habilidad es reducir el ataque y velocidad del pokémon a la mitad por 5 turnos.
Es.. creo que es literalmente la peor habilidad de todo el juego, junto con Truant/Ausente.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Steadfast
Incrementa la velocidad del pokémon en 1 nivel si ha sido retrocedido por el movimiento del oponente.
https://github.com/LOuroboros/pokeruby493/commit/380ab886df5ba576505bd63426272c259fd66d9e


Nota: Soy un poco tonto asi que al parecer añadi el chequeo por Steadfast para el oponente 2 veces.
Eliminen una de las dos, que son exactamente iguales.
Fue un descuido mio al moverlo de linea.


EDITO:
Unaware
Ignora los cambios en los stats.

-Si el atacante tiene Unaware, ignora cambios de stat en la evasión, la defensa y la defensa especial del objetivo.
-Si el objetivo tiene Unaware, ignora cambios de stat en la precisión, el ataque y el ataque especial del atacante.

https://github.com/LOuroboros/pokeruby493/commit/d2c02d4cae4ca027d4a48e1a82be34ba23bf3e6a
https://streamable.com/27jzc
Como pueden ver, sin importar que el oponente tuviese una Defensa aumentada con 3 usos de Fortaleza, el Arañazo de mi Torchic le hizo daño normalmente.
No se me ocurren muchos más escenarios para testear esto, asi que acepto sugerencias.

Como siempre, si ven algo mal o incorrecto, avisenme.
Odio este filtro anti doble posting con toda mi alma.

EDITO2:
Stall
El pokémon con esta habilidad siempre hará su movimiento despues que el rival, sin excepciones.
https://streamable.com/7h4nu
https://github.com/LOuroboros/pokeruby493/commit/de09256e78de0c0a62bf11d1fc3f7befaa69300c
 
Última edición:

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Código:
// Unaware
	if (attacker->ability == ABILITY_UNAWARE)
        defender->statStages[STAT_STAGE_DEF] = 6;
        defender->statStages[STAT_STAGE_SPDEF] = 6;
	if (defender->ability == ABILITY_UNAWARE)
        attacker->statStages[STAT_STAGE_ATK] = 6;
        attacker->statStages[STAT_STAGE_SPATK] = 6;
Aquí hay un gran problema.
y es que al modificar algún valor de "attacker" o "defender" estos cambios persistirán, lo que no ocurre al modificar variables como "attack", "defense" o "gBattleMovePower".
Y esto pasa porque básicamente porque los valores de "attacker" y "defender" son variables externas que no solo se leen en esta función.
No se si me explico, pero básicamente con estos cambios no ignoras los cambios de estadísticas, sino que los anulas, así que si por ejemplo, el oponente usase 3 iron defense y tu lo atacas con un pokemon con unaware el primero perdera el boosteo

Y Stall pues, solo atacará siempre al ultimo sí:

1)Es el único pokémon en campo con la habilidad.
2)La prioridad del movimiento es igual o menor que el movimiento de otro pokémon en campo.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

No se si me explico, pero básicamente con estos cambios no ignoras los cambios de estadísticas, sino que los anulas, así que si por ejemplo, el oponente usase 3 iron defense y tu lo atacas con un pokemon con unaware el primero perdera el boosteo
Para lo que cuenta, anularlos no es distinto a ignorarlos.
El punto es que esos aumentos no se estén tomando en cuenta durante el calculo de daño si uno de los dos pokémon tiene la habilidad, y dependiendo de quien la posea.
Y Stall pues, solo atacará siempre al ultimo sí:
1)Es el único pokémon en campo con la habilidad.
¿Me intentas decir que olvidé tomar en cuenta una situación en la que ambos pokémon tengan Stall?
Pues es verdad.

A ver que tal...
Código:
if (gBattleMons[bank1].ability == ABILITY_STALL && bank1AdjustedSpeed != UINT_MAX && (bank1AdjustedSpeed > bank2AdjustedSpeed))
        bank1AdjustedSpeed = 0;
if (gBattleMons[bank2].ability == ABILITY_STALL && bank2AdjustedSpeed != UINT_MAX && (bank2AdjustedSpeed > bank1AdjustedSpeed))
        bank2AdjustedSpeed = 0;
2)La prioridad del movimiento es igual o menor que el movimiento de otro pokémon en campo.
¿Es decir que...?

ON: Multitype (Gen. 4)
https://github.com/LOuroboros/pokeruby493/commit/ff9d00646bd8e8b9132bc18a0d53512c0f8ac5d9

Notas:
-Agradecimientos a @InmortalKaktus por el codigo para cambiar el icono del tipo si el pokémon con Multitype lleva X Tabla Equipada.
-Agradecimientos a @kakarotto quien dió la idea original para manejar el cambio de tipos, aunque al final lo acabé cambiando bastante.
-Por como funciona Multitype, tocó añadir las 16 Tablas al juego.

Tests:
-Tablas y Cambio de Tipo.
-Transform heredando el tipo actual de Arceus.
-Trace, Thief, Trick y Skill Swap no deben funcionar si el oponente tiene Multitype.

Si alguien nota algun error, que me avise.
 
Última edición:

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Para lo que cuenta, anularlos no es distinto a ignorarlos.
El punto es que esos aumentos no se estén tomando en cuenta durante el calculo de daño si uno de los dos pokémon tiene la habilidad, y dependiendo de quien la posea.

¿Me intentas decir que olvidé tomar en cuenta una situación en la que ambos pokémon tengan Stall?
Pues es verdad.

A ver que tal...
Código:
if (gBattleMons[bank1].ability == ABILITY_STALL && bank1AdjustedSpeed != UINT_MAX && (bank1AdjustedSpeed > bank2AdjustedSpeed))
        bank1AdjustedSpeed = 0;
if (gBattleMons[bank2].ability == ABILITY_STALL && bank2AdjustedSpeed != UINT_MAX && (bank2AdjustedSpeed > bank1AdjustedSpeed))
        bank2AdjustedSpeed = 0;
¿Es decir que...?

ON: Multitype (Gen. 4)
https://github.com/LOuroboros/pokeruby493/commit/ff9d00646bd8e8b9132bc18a0d53512c0f8ac5d9

Notas:
-Agradecimientos a @InmortalKaktus por el codigo para cambiar el icono del tipo si el pokémon con Multitype lleva X Tabla Equipada.
-Agradecimientos a @kakarotto quien dió la idea original para manejar el cambio de tipos, aunque al final lo acabé cambiando bastante.
-Por como funciona Multitype, tocó añadir las 16 Tablas al juego.

Tests:
-Tablas y Cambio de Tipo.
-Transform heredando el tipo actual de Arceus.
-Trace, Thief, Trick y Skill Swap no deben funcionar si el oponente tiene Multitype.

Si alguien nota algun error, que me avise.
En cuanto a unaware el problema radica en que a lo que me refiero con anularlos que si golpeas a un pokemon con la defensa aumentada, esta volverá a sus valores normales, ergo, si la defensa estuviera al maximo, perdería todo el boosteo y tendría que volverla a subir, dale a un pokemon salvaje solo iron defensa y después de unos turnos golpealo con un pokemon con unaware para que veas a lo que me refiero.

Y con stall no dije que fallaras en los dos puntos que te mencioné sólo digo que esa habilidad no funciona sin excepciones, ya que esta sólo ignora la el cálculo de velocidad.
Si un pokemon con stall usa por ejemplo quick attack, atacará primero a menos que el rival use un movimiento con la misma prioridad o más.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

En cuanto a unaware el problema radica en que a lo que me refiero con anularlos que si golpeas a un pokemon con la defensa aumentada, esta volverá a sus valores normales, ergo, si la defensa estuviera al maximo, perdería todo el boosteo y tendría que volverla a subir, dale a un pokemon salvaje solo iron defensa y después de unos turnos golpealo con un pokemon con unaware para que veas a lo que me refiero.
Ya entiendo, si. Si tu pokémon tiene Unaware, el oponente se mete 3 turnos de Harden y tú cambias de pokémon, se nota claramente que los 3 turnos de Harden fueron anulados.

He estado intentando arreglarlo durante las ultimas horas, pero nada de lo que intenté funcionó.
Mas tarde seguiré intentando, a ver si consigo algo.
Y con stall no dije que fallaras en los dos puntos que te mencioné sólo digo que esa habilidad no funciona sin excepciones, ya que esta sólo ignora la el cálculo de velocidad.
Si un pokemon con stall usa por ejemplo quick attack, atacará primero a menos que el rival use un movimiento con la misma prioridad o más.
Tienes razón, me expresé mal yo. Me disculpo.
 

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Ya entiendo, si. Si tu pokémon tiene Unaware, el oponente se mete 3 turnos de Harden y tú cambias de pokémon, se nota claramente que los 3 turnos de Harden fueron anulados.

He estado intentando arreglarlo durante las ultimas horas, pero nada de lo que intenté funcionó.
Mas tarde seguiré intentando, a ver si consigo algo.

Tienes razón, me expresé mal yo. Me disculpo.

Bien, en cuanto a unaware.

Estas modificaciones deberían bastar para que funcione.

Lo que hice fue copiar la parte en la que se ignoran la disminución de ataque y los aumentos de defensa a la hora de acertar un golpe crítico y usarlo para que funcione con la habilidad y que ignore también los aumentos de ataque y disminuciones de defensa.
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Anticipation/Anticipación (Estilo Gen. 4)
Te alerta si el oponente tiene un movimiento que haria Super Efectivo contra ti, o un movimiento que podria hacer OHKO, o Explosión/Autodestrucción.
Download/Descarga
Aumenta tu ataque o tu ataque especial dependiendo del stat defensivo mas bajo del oponente.
Forewarn/Alerta
Te alerta del movimiento mas poderoso que tenga el oponente.
Storm Drain/Colector (Estilo Gen. 4)
En batallas dobles, atrae los movimientos Tipo Agua de los oponentes hacia el pokémon con esta habilidad.

Tests:
-Anticipation
-Download
-Forewarn
-Storm Drain
Nota: Con Anticipation podria haber hecho varios tests, pero me daba una pereza inmensa.

Explicaciones:
-En el caso de Download, por si la prueba no queda clara, el Ataque sube contra Regice porque su Defensa es menor que su Defensa Especial, y el Ataque Especial sube contra Aggron porque su Defensa Especial es menor que su Defensa.

-Eliminé el mensaje en batalla para Lightning Rod y Storm Drain, porque no logré hacerlo funcionar correctamente cuando 2 pokémon con ambas habilidades están en batalla a la vez.

-Counter/Contraataque, Metal Burst/Represión Metal y Mirror Coat/Manto Espejo no activan Anticipation/Anticipación. De nuevo, Estilo Gen. 4 especificamente.

-Judgment, Hidden Power, Natural Gift y Weather Ball son considerados movimientos de Tipo Normal en lo que a Anticipation/Anticipación concierne.

https://github.com/LOuroboros/pokeruby493/commit/503afa17a27c749083bc69784cef6646efa4e627
https://github.com/LOuroboros/pokeruby493/commit/c88c30bd7eb122ae900fa0f96fc2514fe268fc7a
https://github.com/LOuroboros/pokeruby493/commit/81f2e76b01c69322522159d465053b94bb25d8a5

Las implementaciones de Anticipation/Anticipación, Download/Descarga y Forewarn/Alerta le pertenecen a DoesntKnowHowToPlay, asi que los creditos son suyos.
 

Lumbreon

Soy nuevo XD :3
Respuesta: (pokeruby) Implementando habilidades nuevas

Anticipation/Anticipación (Estilo Gen. 4)
Te alerta si el oponente tiene un movimiento que haria Super Efectivo contra ti, o un movimiento que podria hacer OHKO, o Explosión/Autodestrucción.
Download/Descarga
Aumenta tu ataque o tu ataque especial dependiendo del stat defensivo mas bajo del oponente.
Forewarn/Alerta
Te alerta del movimiento mas poderoso que tenga el oponente.
Storm Drain/Colector (Estilo Gen. 4)
En batallas dobles, atrae los movimientos Tipo Agua de los oponentes hacia el pokémon con esta habilidad.

Tests:
-Anticipation
-Download
-Forewarn
-Storm Drain
Nota: Con Anticipation podria haber hecho varios tests, pero me daba una pereza inmensa.

Explicaciones:
-En el caso de Download, por si la prueba no queda clara, el Ataque sube contra Regice porque su Defensa es menor que su Defensa Especial, y el Ataque Especial sube contra Aggron porque su Defensa Especial es menor que su Defensa.

-Eliminé el mensaje en batalla para Lightning Rod y Storm Drain, porque no logré hacerlo funcionar correctamente cuando 2 pokémon con ambas habilidades están en batalla a la vez.

-Counter/Contraataque, Metal Burst/Represión Metal y Mirror Coat/Manto Espejo no activan Anticipation/Anticipación. De nuevo, Estilo Gen. 4 especificamente.

-Judgment, Hidden Power, Natural Gift y Weather Ball son considerados movimientos de Tipo Normal en lo que a Anticipation/Anticipación concierne.

https://github.com/LOuroboros/pokeruby493/commit/503afa17a27c749083bc69784cef6646efa4e627
https://github.com/LOuroboros/pokeruby493/commit/c88c30bd7eb122ae900fa0f96fc2514fe268fc7a
https://github.com/LOuroboros/pokeruby493/commit/81f2e76b01c69322522159d465053b94bb25d8a5

Las implementaciones de Anticipation/Anticipación, Download/Descarga y Forewarn/Alerta le pertenecen a DoesntKnowHowToPlay, asi que los creditos son suyos.
Esta totalmente genial, no sabía como implementar Forewarn y Anticipation, buenisimo aporte.

En cuanto a Storm Drain creo que tengo una manera de hacerlo funcionar a parte de Lightningrod, pero despues actualizare con eso.

Y por ultimo, aquí Magic Guard y Frisk.

Magic Guard/Muro Mágico:Hace que el pokémon solo se vea afectado por daño directo del oponente, además en 4ta gen no permite que el usuario de la habilidad sea inmovilizado por la parálisis.

Frisk/Cacheo:Alerta sobre el objeto que lleve el rival. En batallas dobles si ambos rivales tienen objeto se alerta sobre uno al azar.

Notas:En la implementación de Magic Guard/Muro Mágico hace falta que ignore el daño de trampa rocas y el envenenamiento de púas tóxicas.

En cuanto a Frisk/Cacheo hace falta cambiar el texto por el original o uno que se vea mejor, ya que ese es solo de prueba y es ocupa mas espacio que una linea.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: (pokeruby) Implementando habilidades nuevas

Esta totalmente genial, no sabía como implementar Forewarn y Anticipation, buenisimo aporte.

En cuanto a Storm Drain creo que tengo una manera de hacerlo funcionar a parte de Lightningrod, pero despues actualizare con eso.

Y por ultimo, aquí Magic Guard y Frisk.

Magic Guard/Muro Mágico:Hace que el pokémon solo se vea afectado por daño directo del oponente, además en 4ta gen no permite que el usuario de la habilidad sea inmovilizado por la parálisis.

Frisk/Cacheo:Alerta sobre el objeto que lleve el rival. En batallas dobles si ambos rivales tienen objeto se alerta sobre uno al azar.

Notas:En la implementación de Magic Guard/Muro Mágico hace falta que ignore el daño de trampa rocas y el envenenamiento de púas tóxicas.

En cuanto a Frisk/Cacheo hace falta cambiar el texto por el original o uno que se vea mejor, ya que ese es solo de prueba y es ocupa mas espacio que una linea.
Creeeo que a tu implementación de Magic Guard le falta una excepción para el daño ocasionado por las Tormentas de Arena, y por Granizo si es que tienes ese clima añadido en tu repositorio.
Tambien faltaria añadir una excepción en el daño de recoil ocasionado por movimientos como Hi Jump Kick. Probé Magic Guard y Hi Jump Kick en Pokémon Platinum, y al menos ahi, si el movimiento falla no ocasiona daño de recoil, cosa que normalmente haria.

Anduve mirando varias fuentes para informarme sobre el efecto de la habilidad y seguí el ejemplo de DizzyEgg y el tuyo. Este fue mi resultado:
https://github.com/LOuroboros/pokeruby493/commit/d1e83078f3090d2bd908a06a81b0db84d445f6d7
 
Arriba