Registrarse

[Dis - Código] Dificultad editando una función

ivaantxo

Usuario de oro
Hola de nuevo! Estoy intentando implementar en mi proyecto la posibilidad de usar las HMs sin necesidad de conocerlas. Por el momento lo he conseguido, pero tengo dificultades con lo siguiente: la mayoría de HMs tienen un EventScript particular que busca el movimiento que se quiera, incluido el movimiento Surf. El problema que tengo es que este no solo viene definido por su EventScript, sino por una función que es PartyHasMonWithSurf, que a su vez depende de MonKnowsMove. Se me ha ocurrido una nueva función para sustituir a MonKnowsMove, que ha quedado así (perdonad por los más que posibles errores, mis habilidades son nulas):
bool8 MonCanLearnMove(struct Pokemon *mon, u16 move)
{
u8 i;
u16 species = GetMonData(mon, MON_DATA_SPECIES);

for (i = 0; i < MAX_LEVEL_UP_MOVES; i++)
{
if (gLevelUpLearnsets[species].move == LEVEL_UP_END)
break;
if (move == gLevelUpLearnsets[species].move)
return TRUE;
}

for (i = 0; i < (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES); i++)
{
if (move == ItemIdToBattleMoveId(ITEM_TM01 + i))
return TRUE;
}
return FALSE;
}


El problema que tengo ahora es que cualquier Pokémon puede hacer Surf. Agradezco de antemano cualquier ayuda.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Hola de nuevo! Estoy intentando implementar en mi proyecto la posibilidad de usar las HMs sin necesidad de conocerlas. Por el momento lo he conseguido, pero tengo dificultades con lo siguiente: la mayoría de HMs tienen un EventScript particular que busca el movimiento que se quiera, incluido el movimiento Surf. El problema que tengo es que este no solo viene definido por su EventScript, sino por una función que es PartyHasMonWithSurf, que a su vez depende de MonKnowsMove. Se me ha ocurrido una nueva función para sustituir a MonKnowsMove, que ha quedado así (perdonad por los más que posibles errores, mis habilidades son nulas):
bool8 MonCanLearnMove(struct Pokemon *mon, u16 move)
{
u8 i;
u16 species = GetMonData(mon, MON_DATA_SPECIES);

for (i = 0; i < MAX_LEVEL_UP_MOVES; i++)
{
if (gLevelUpLearnsets[species].move == LEVEL_UP_END)
break;
if (move == gLevelUpLearnsets[species].move)
return TRUE;
}

for (i = 0; i < (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES); i++)
{
if (move == ItemIdToBattleMoveId(ITEM_TM01 + i))
return TRUE;
}
return FALSE;
}

El problema que tengo ahora es que cualquier Pokémon puede hacer Surf. Agradezco de antemano cualquier ayuda.
Importante meter funciones de codigo como estas entre los tags [code] y [/code], que si no se leen para el orto.

Código:
bool8 MonCanLearnMove(struct Pokemon *mon, u16 move)
{
    u8 i;
    u16 species = GetMonData(mon, MON_DATA_SPECIES);

    for (i = 0; i < MAX_LEVEL_UP_MOVES;  i++)
    {
        if (gLevelUpLearnsets[species].move == LEVEL_UP_END)
            break;
        if (move == gLevelUpLearnsets[species].move)
            return TRUE;
    }

    for (i = 0; i < (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES);  i++)
    {
        if (move == ItemIdToBattleMoveId(ITEM_TM01 + i))
            return TRUE;
    }
    return FALSE;
}
En fin, te digo lo que veo mal asi como que a primera vista.
Primero inicias un for loop con una variable local i que escanea la lista de movimientos por nivel de un Pokémon. Sin embargo, en ese primer loop vos no estás haciendo ningun chequeo con dicha variable local en lo absoluto.

Lo segundo que noto en ese mismo loop es que vos solo estás pasando un solo valor por gLevelUpLearnsets pese a que normalmente lee 2, como se puede ver en funciones de codigo presentes en src/pokemon.c.

Me imagino que ahi lo que quisiste hacer fue algo tal que así:
Código:
    for (i = 0; i < MAX_LEVEL_UP_MOVES; i++)
    {
        if (gLevelUpLearnsets[species][i].move == LEVEL_UP_END)
            break;
        if (move == gLevelUpLearnsets[species][i].move)
            return TRUE;
    }
Esto deberia salir del primer loop e irse al segundo si no encuentra el movimiento especificado por la función en la lista de movimientos por nivel de la especie que estés chequeando, o hacer que la función termine de actuar y devuelva TRUE si el movimiento está presente en dicha lista.

El segundo loop luce correcto. Yo escribí algo muy similar cuando hice esto en mi proyecto personal.
 

ivaantxo

Usuario de oro
Gracias Lunos, me ha quedado más claro. Aún así, sigo teniendo el mismo problema: todos los Pokémon pueden surfear. He pensado que el fallo podría estar en esta otra parte de código:
Código:
bool8 PartyHasMonWithSurf(void)
{
    u8 i;
    if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
    {
        for (i = 0; i < PARTY_SIZE; i++)
        {
            if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE)
                break;
            if (MonCanLearnMove(&gPlayerParty[i], MOVE_SURF))
                return TRUE;
        }
    }
    return FALSE;
}
Yo simplemente he sustituido MonKnowsMove por MonCanLearnMove, lo que quizá es incorrecto.
 
Arriba