(pokeruby) Implementando habilidades nuevas

Avisos


Like Tree33Gracias
Respuesta
 
Herramientas Desplegado
  #41  
Hace 1 semana
Predeterminado Respuesta: (pokeruby) Implementando habilidades nuevas
Dicho por Lunos Ver mensaje
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
Gracias: Lunos
  #42  
Hace 1 semana
Corazón Respuesta: (pokeruby) Implementando habilidades nuevas
Dicho por Lumbreon Ver mensaje
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 por Lunos; Hace 1 semana a las 08:41
  #43  
Hace 1 semana
Corazón Respuesta: (pokeruby) Implementando habilidades nuevas
Dicho por Lunos Ver mensaje
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:

src\data\battle_strings_en.h

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


src\battle\calculate_base_damage.c

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


src\battle\battle_util.c - case ABILITYEFFECT_ENDTURN

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.
Dicho por Lumbreon Ver mensaje
¡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:
  #44  
Hace 1 semana
Predeterminado 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/pokeru...dfad13a3f8541f

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 por Lunos; Hace 1 semana a las 11:33 Razón: Situación actual de mi proyecto.
  #45  
Hace 1 semana
Predeterminado 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
Gracias: Lunos
  #46  
Hace 1 semana
Corazón Respuesta: (pokeruby) Implementando habilidades nuevas
Dicho por Lumbreon Ver mensaje
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.
  #47  
Hace 1 semana
Predeterminado Respuesta: (pokeruby) Implementando habilidades nuevas
Dicho por Lunos Ver mensaje
- Blablabla...
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á.
Gracias: Lunos
  #48  
Hace 5 días
Predeterminado 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/pokeru...a9b02fd7deb11e
https://github.com/LOuroboros/pokeru...83d5e3f0f6771e
Respuesta

Herramientas
Desplegado

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado
Trackbacks are Activado
Pingbacks are Activado
Refbacks are Desactivado



Extra
Estilo clásico
La franja horaria es GMT +1. Ahora son las 02:19.