Registrarse

[pokeemerald] Igualar niveles de los entrenadores a los tuyos

Diego Mertens

Dartrix Joven
¡Hola! Después de un montón de prueba y error, ¡orgullosamente puedo
decir que este sistema está listo!


[EDIT]: La implementación de Lunos es muchísimo mejor, así que usen eso:
 
Última edición:

Samu

Miembro insignia
Miembro insignia
Es curioso, tengo algo parecido desde hace tiempo, de hecho creo que también subí una versión ASM de algo parecido a esto hace dos años.

A ver, te comento. Por lo que puedo ver, me imagino que estás aprendiendo a programar por tu cuenta pegándote con pokeemerald y que te habrá llevado tu rato de prueba y error conseguirlo. Se ve que hasta has hecho un pequeño control de errores al evitar que salgan pokémon con nivel inferior a 0 (por cierto, te has dejado el caso de que tu equipo sea entero lvl 100 y le sumes 2, te sacaría FixedLVL 102).

Lo que te voy a decir ahora, no es para fastidiar, es para que aprendas. El código es bastante pesado, si te das cuenta estás realizando las mismas acciones una y otra vez. Has escrito casi lo mismo 6 veces. En programación hay algo llamado bucles, que te permiten realizar acciones de forma repetitiva, entiendo que esto te va a resultar confuso al principio, así que te dejo un código equivalente a la primera parrafada que has dejado:
Código:
u8 fixedLVL = 0;
u8 i;

for (i = 0; i < gPlayerPartyCount; i++)
{
	fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
}
	
fixedLVL /= gPlayerPartyCount;

fixedLVL = fixedLVL > 2 ? fixedLVL : 3;


Como puedes ver es bastante más corto y más claro (aunque ahora te resulte confuso, creemé, a la larga se ve más claro.
Te explico un poco por encima:
Código:
u8 fixedLVL = 0;
u8 i;

/*for, es un bucle que podría escribirse más o menos así:
i inicia en 0
Mientras i sea menor que gPlayerPartyCount -> Se ejecuta un paso del bucle
Por cada paso del bucle le sumo uno a i (i++)*/

/*Nota:gPlayerPartyCount es una variable global del juego, que contiene el número de pokémon de tu equipo, por lo que no tienes que comprobar si la especie es 'NONE'*/

for (i = 0; i < gPlayerPartyCount; i++)
{
	fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
}
En este fragmento de código, el bucle se ejecutará tantas veces como pokemon tengas en tu equipo y añadirá a fixedLVL el nivel de cada uno de estos pokemon. Para ir cambiando el pokemon que se comprueba en cada vuelta del bucle se utiliza la variable 'i', cuyo valor aumenta en 1 por cada vuelta.

Al salir del bucle, tendrás en fixedLVL los niveles totales de tu equipo, por lo que solo te quedará dividirlo entre el número total de pokémon (gPlayerPartyCount).
Código:
fixedLVL /= gPlayerPartyCount;
Por último estaría el pequeño control que realizas, comprobando que fixedLVL sea mayor a 2.
Código:
fixedLVL = fixedLVL > 2 ? fixedLVL : 3;
Esto de aquí es un operador ternario y se lee:
fixexLVL = (condición) ? (si es cierta) : (si es falsa).
Es decir, es equivalente a:
Código:
if (fixedLVL < 3)
{
	fixedLVL = 3;
}

Por último, decirte que tengas cuidado con este sistema. Meterlo en un juego genérico para evitar tener que diseñar una correcta curva de dificultad, seguramente no de buen resultado.
Yo utilizo una mecánica similar a esta porque tiene mucho sentido en el tipo de proyecto que hago.
Pero bueno, el único que puede juzgar eso eres tu mismo. Esto es más una advertencia a cualquier insensato que quiera insertar esta mecánica como quien mete el repartir experiencia de 6º generación al bulto, y jode el juego entero.
 

Diego Mertens

Dartrix Joven
Respuesta: Re: Igualar niveles de los entrenadores a los tuyos

Es curioso, tengo algo parecido desde hace tiempo, de hecho creo que también subí una versión ASM de algo parecido a esto hace dos años.

A ver, te comento. Por lo que puedo ver, me imagino que estás aprendiendo a programar por tu cuenta pegándote con pokeemerald y que te habrá llevado tu rato de prueba y error conseguirlo. Se ve que hasta has hecho un pequeño control de errores al evitar que salgan pokémon con nivel inferior a 0 (por cierto, te has dejado el caso de que tu equipo sea entero lvl 100 y le sumes 2, te sacaría FixedLVL 102).

Lo que te voy a decir ahora, no es para fastidiar, es para que aprendas. El código es bastante pesado, si te das cuenta estás realizando las mismas acciones una y otra vez. Has escrito casi lo mismo 6 veces. En programación hay algo llamado bucles, que te permiten realizar acciones de forma repetitiva, entiendo que esto te va a resultar confuso al principio, así que te dejo un código equivalente a la primera parrafada que has dejado:
Código:
u8 fixedLVL = 0;
u8 i;

for (i = 0; i < gPlayerPartyCount; i++)
{
	fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
}
	
fixedLVL /= gPlayerPartyCount;

fixedLVL = fixedLVL > 2 ? fixedLVL : 3;


Como puedes ver es bastante más corto y más claro (aunque ahora te resulte confuso, creemé, a la larga se ve más claro.
Te explico un poco por encima:
Código:
u8 fixedLVL = 0;
u8 i;

/*for, es un bucle que podría escribirse más o menos así:
i inicia en 0
Mientras i sea menor que gPlayerPartyCount -> Se ejecuta un paso del bucle
Por cada paso del bucle le sumo uno a i (i++)*/

/*Nota:gPlayerPartyCount es una variable global del juego, que contiene el número de pokémon de tu equipo, por lo que no tienes que comprobar si la especie es 'NONE'*/

for (i = 0; i < gPlayerPartyCount; i++)
{
	fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
}
En este fragmento de código, el bucle se ejecutará tantas veces como pokemon tengas en tu equipo y añadirá a fixedLVL el nivel de cada uno de estos pokemon. Para ir cambiando el pokemon que se comprueba en cada vuelta del bucle se utiliza la variable 'i', cuyo valor aumenta en 1 por cada vuelta.

Al salir del bucle, tendrás en fixedLVL los niveles totales de tu equipo, por lo que solo te quedará dividirlo entre el número total de pokémon (gPlayerPartyCount).
Código:
fixedLVL /= gPlayerPartyCount;
Por último estaría el pequeño control que realizas, comprobando que fixedLVL sea mayor a 2.
Código:
fixedLVL = fixedLVL > 2 ? fixedLVL : 3;
Esto de aquí es un operador ternario y se lee:
fixexLVL = (condición) ? (si es cierta) : (si es falsa).
Es decir, es equivalente a:
Código:
if (fixedLVL < 3)
{
	fixedLVL = 3;
}

Por último, decirte que tengas cuidado con este sistema. Meterlo en un juego genérico para evitar tener que diseñar una correcta curva de dificultad, seguramente no de buen resultado.
Yo utilizo una mecánica similar a esta porque tiene mucho sentido en el tipo de proyecto que hago.
Pero bueno, el único que puede juzgar eso eres tu mismo. Esto es más una advertencia a cualquier insensato que quiera insertar esta mecánica como quien mete el repartir experiencia de 6º generación al bulto, y jode el juego entero.
¡Muchas gracias! Sí, en realidad estaba pensando en usar bucles, pero no sabía cómo funcionaban en este lenguaje, además, tampoco conocía la función 'gPlayerPartyCount', así que aunque supiera usarla, creo que no habría quedado bien.
Lo de diseñar una curva de dificultad correcta... Yo planeaba usar este sistema más bien para no tener que levelear demasiado, pero sí, puede romper el juego. Estuve haciendo pruebas y había olvidado los diferentes sets de movimientos, habilidades, estadísticas y objetos que usan los líderes del Gimnasio. Las Pociones y Baya Aranja de Roxxane podrán recuperar mucha vida al inicio del juego, pero si la llegáramos a enfrentar con Pokémon nivel 40, no serán de mucha utilidad. Además, las Baya Zidra e Híper Poción de Flannery Y su set de movimientos serían demasiado para que Pokémon de nivel 5 resistieran, aunque los demás sean también nivel 5/7.
AH! Los nivel 100! No había pensado en ellos, y había olvidado también probar con ellos el sistema...
Así que sí, este sistema no es muy útil que digamos, a menos que se quiera hacer un juego de Mundo Abierto, pero habría que cambiar los Equipos Pokémon y movimientos dependiendo de tus niveles y las Medallas, y eso sería demasiado... Quizás esto sea mejor dejarlo para algún PostGame o algo...
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: Re: Igualar niveles de los entrenadores a los tuyos

¡Muchas gracias! Sí, en realidad estaba pensando en usar bucles, pero no sabía cómo funcionaban en este lenguaje, además, tampoco conocía la función 'gPlayerPartyCount', así que aunque supiera usarla, creo que no habría quedado bien.
Lo de diseñar una curva de dificultad correcta... Yo planeaba usar este sistema más bien para no tener que levelear demasiado, pero sí, puede romper el juego. Estuve haciendo pruebas y había olvidado los diferentes sets de movimientos, habilidades, estadísticas y objetos que usan los líderes del Gimnasio. Las Pociones y Baya Aranja de Roxxane podrán recuperar mucha vida al inicio del juego, pero si la llegáramos a enfrentar con Pokémon nivel 40, no serán de mucha utilidad. Además, las Baya Zidra e Híper Poción de Flannery Y su set de movimientos serían demasiado para que Pokémon de nivel 5 resistieran, aunque los demás sean también nivel 5/7.
AH! Los nivel 100! No había pensado en ellos, y había olvidado también probar con ellos el sistema...
Así que sí, este sistema no es muy útil que digamos, a menos que se quiera hacer un juego de Mundo Abierto, pero habría que cambiar los Equipos Pokémon y movimientos dependiendo de tus niveles y las Medallas, y eso sería demasiado... Quizás esto sea mejor dejarlo para algún PostGame o algo...
Como pequeña nota, tal y como lo has planteado, una persona podría tener 5 Pokémon de nivel 5 en el equipo y uno de nivel 35, a fin de explotar el sistema.
Estaría usando un Pokémon de nivel 35 contra Pokémon de nivel (8-12).
 

Mariofan

Usuario mítico
Aportando al comentario de Samu, decir que a esto:


Se le conoce como Piramide de la Muerte, e implica llenar el código de una complejidad tal, que luego modificarlo u arreglarlo en caso de que este malo se vuelve un infierno. Si bien en este caso un bucle es la solución, no siempre será así ya podría suceder que requieras hacer muchas comparaciones distintas, que nada se parecen entre sí. No obstante, en esos casos lo mejor es desglosar el código en funciones (Hace mucho que no uso C, pero si mal no recuerdo, si que permitía crear funciones), u otro tipo de simplifaciones que sean posibles con tal de evitar que se forme la temida piramide.

Siempre piensa, si el código se te empieza a correr mucho a la derecha, intenta replanteartelo. Más adelante, lo agradecerás.

Ya hablando del sistema en si: Considero que es el tipo de sistema ideal para un juego de pokémon de libertad total, donde puedas jugar la historia y pasar los gimnasios, en el orden que se desee. De lo contrario, podría suponer una curva de dificultad rota.

Un saludo.
 

Jason

PkPower déjame poner tildes en mi nick ¬¬
Justo había hecho mi propia versión del código usando un for y vi que samu tbn hizo el suyo ^^u

@Samu deberías tener cuidado, la variable fixedLVL debería ser como mínimo un u16, ya que si los niveles suman más de 255, tienes un overflow y vuelves a cero. Por ejemplo, si tuvieras todos tus pokémon al 50 (octavo gimnasio o liga) te da 44, y si lo divides entre 6 te queda que el campeón te intenta detener con pokémon de nivel 7. Además, si gPlayerPartyCount es cero por algún bug (que el jugador consiga intentar combatir contra un entrenador teniendo el equipo vacío), te va a dar error de división por cero y va a crashear, por lo que te recomiendo hacer una comprobación de eso antes. Y por último, si la especie de un pokémon es NONE, ¿estamos 100% seguros de que el nivel de este es 0 y no cualquier basura que esté perdida por la RAM? Yo no me arriesgaría.

Aportando a la discusión del balance, supongo que podrían tomar el pokémon de nivel más alto, multiplicarlo por 10, sumar los niveles de los siguientes pokémon y luego dividir por 10 + la cantidad de pokémon del equipo - 1. (Un promedio ponderado).

Eso hace que en la ponderación, el nivel del pokémon más fuerte valga mucho más. En el caso de un pokémon al 35 y luego 5 al 5, estaríamos combatiendo con pokémon al 25 más menos. En cambio si los niveles son muy parecidos no importaría tanto. Sigue siendo mejorable, claramente.

Como jugador, además, me gustaría ver cierta variedad en los niveles (y que el juego los recuerde), así que un random nunca estaría de más, un "fixedLVL = randomGauss(fixedLVL, desviación estándar)" (pero luego hay que asegurarse de que no se salga del rango [1, 100]. Implementar una distribución beta (implementación en C++) puede ayudar a eso, de hecho. Si no, un random con pesos siempre puede servir.

Código:
u8 findMaxLevelMonIndex() {
    u8 index = 0;
    u8 lvl;
    for (u8 i = 0; i < 6; i++) {
        if (GMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) {
            lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
            if (lvl > GetMonData(&gPlayerParty[index], MON_DATA_LEVEL)) {
                index = i;
            }
        }
    }

    return index;
}


u16 fixedLVL = 0;
u8 indexMax = findMaxLevelMonIndex()

for (u8 i = 0; i < 6; i++) {  // itero sobre los pokémon del equipo
    if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) {  // si no es NONE
        if (i == indexMax) {
            fixedLVL += 10 * GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);  // Le sumo 10 veces el nivel
        } else {
            fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);  // Le sumo el nivel
        }
    }
}
if (gPlayerPartyCount > 0) {  // si el equipo no está vacío
    fixedLVL /= 10 + gPlayerPartyCount - 1;
}

if (fixedLVL < 2) {
    fixedLVL = 3;
    // si el nivel resultante es menor a 2, pongo 3
}
 

Mobius1

Usuario de bronce
Siento revivir este hilo pero para mi proyecto esta idea me vendria muy bien, a dia de hoy se puede usar este codigo? hay alguno mas actualizado? es la unica referencia que e visto por aqui a esta idea, un saludo
 

Lunos

Enfrentando a La Organización
Miembro insignia
Siento revivir este hilo pero para mi proyecto esta idea me vendria muy bien, a dia de hoy se puede usar este codigo? hay alguno mas actualizado? es la unica referencia que e visto por aqui a esta idea, un saludo
Para aclarar, tiene pinta de que deberias usar el codigo aportado por Jason, pero sí, claro que puedes usarlo normalmente.
Si no te satisface el resultado, siempre puedes modificarlo como te plazca.
 

Mobius1

Usuario de bronce
Para aclarar, tiene pinta de que deberias usar el codigo aportado por Jason, pero sí, claro que puedes usarlo normalmente.
Si no te satisface el resultado, siempre puedes modificarlo como te plazca.
Siguiendo los pasos arriba citados en primer lugar y luego añadiendo este codigo me da muchos errores varios, soy nuevo en decomp y no se aun como arreglar esos errores ni por donde cogerlos, pero agradezco la respuesta, un saludo.
Justo había hecho mi propia versión del código usando un for y vi que samu tbn hizo el suyo ^^u

@Samu deberías tener cuidado, la variable fixedLVL debería ser como mínimo un u16, ya que si los niveles suman más de 255, tienes un overflow y vuelves a cero. Por ejemplo, si tuvieras todos tus pokémon al 50 (octavo gimnasio o liga) te da 44, y si lo divides entre 6 te queda que el campeón te intenta detener con pokémon de nivel 7. Además, si gPlayerPartyCount es cero por algún bug (que el jugador consiga intentar combatir contra un entrenador teniendo el equipo vacío), te va a dar error de división por cero y va a crashear, por lo que te recomiendo hacer una comprobación de eso antes. Y por último, si la especie de un pokémon es NONE, ¿estamos 100% seguros de que el nivel de este es 0 y no cualquier basura que esté perdida por la RAM? Yo no me arriesgaría.

Aportando a la discusión del balance, supongo que podrían tomar el pokémon de nivel más alto, multiplicarlo por 10, sumar los niveles de los siguientes pokémon y luego dividir por 10 + la cantidad de pokémon del equipo - 1. (Un promedio ponderado).

Eso hace que en la ponderación, el nivel del pokémon más fuerte valga mucho más. En el caso de un pokémon al 35 y luego 5 al 5, estaríamos combatiendo con pokémon al 25 más menos. En cambio si los niveles son muy parecidos no importaría tanto. Sigue siendo mejorable, claramente.

Como jugador, además, me gustaría ver cierta variedad en los niveles (y que el juego los recuerde), así que un random nunca estaría de más, un "fixedLVL = randomGauss(fixedLVL, desviación estándar)" (pero luego hay que asegurarse de que no se salga del rango [1, 100]. Implementar una distribución beta (implementación en C++) puede ayudar a eso, de hecho. Si no, un random con pesos siempre puede servir.

Código:
u8 findMaxLevelMonIndex() {
    u8 index = 0;
    u8 lvl;
    for (u8 i = 0; i < 6; i++) {
        if (GMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) {
            lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
            if (lvl > GetMonData(&gPlayerParty[index], MON_DATA_LEVEL)) {
                index = i;
            }
        }
    }

    return index;
}


u16 fixedLVL = 0;
u8 indexMax = findMaxLevelMonIndex()

for (u8 i = 0; i < 6; i++) {  // itero sobre los pokémon del equipo
    if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) {  // si no es NONE
        if (i == indexMax) {
            fixedLVL += 10 * GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);  // Le sumo 10 veces el nivel
        } else {
            fixedLVL += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);  // Le sumo el nivel
        }
    }
}
if (gPlayerPartyCount > 0) {  // si el equipo no está vacío
    fixedLVL /= 10 + gPlayerPartyCount - 1;
}

if (fixedLVL < 2) {
    fixedLVL = 3;
    // si el nivel resultante es menor a 2, pongo 3
}
 

Lunos

Enfrentando a La Organización
Miembro insignia
Siguiendo los pasos arriba citados en primer lugar y luego añadiendo este codigo me da muchos errores varios, soy nuevo en decomp y no se aun como arreglar esos errores ni por donde cogerlos, pero agradezco la respuesta, un saludo.
Dificil poderte ayudar si no te explicas a detalle. Tirá una imagen, o copiá y pegá el error que estás teniendo por aquí.
 

Mobius1

Usuario de bronce
Esto es lo que me tira, seguro que soy yo que aun no me entero del tema, pero bueno al igual aprendo algo hoy, gracias por responder.
Dificil poderte ayudar si no te explicas a detalle. Tirá una imagen, o copiá y pegá el error que estás teniendo por aquí.
Código:
src/battle_main.c: In function `CreateNPCTrainerParty':
src/battle_main.c:1938: syntax error before `findMaxLevelMonIndex'
src/battle_main.c:1941: syntax error before `u8'
src/battle_main.c:1941: syntax error before `)'
src/battle_main.c:1944: `lvl' undeclared (first use in this function)
src/battle_main.c:1944: (Each undeclared identifier is reported only once
src/battle_main.c:1944: for each function it appears in.)
src/battle_main.c:1944: array subscript is not an integer
src/battle_main.c:1945: invalid lvalue in assignment
src/battle_main.c: At top level:
src/battle_main.c:1948: syntax error before `}'
agbcc: warnings being treated as errors
src/battle_main.c:1955: warning: implicit declaration of function `findMaxLevelMonIndex'
src/battle_main.c:1957: initializer element is not constant
src/battle_main.c:1957: syntax error before `for'
make: *** [Makefile:340: build/emerald/src/battle_main.o] Error 1
make: *** Deleting file 'build/emerald/src/battle_main.o
 

Lunos

Enfrentando a La Organización
Miembro insignia
Esto es lo que me tira, seguro que soy yo que aun no me entero del tema, pero bueno al igual aprendo algo hoy, gracias por responder.


Código:
src/battle_main.c: In function `CreateNPCTrainerParty':
src/battle_main.c:1938: syntax error before `findMaxLevelMonIndex'
src/battle_main.c:1941: syntax error before `u8'
src/battle_main.c:1941: syntax error before `)'
src/battle_main.c:1944: `lvl' undeclared (first use in this function)
src/battle_main.c:1944: (Each undeclared identifier is reported only once
src/battle_main.c:1944: for each function it appears in.)
src/battle_main.c:1944: array subscript is not an integer
src/battle_main.c:1945: invalid lvalue in assignment
src/battle_main.c: At top level:
src/battle_main.c:1948: syntax error before `}'
agbcc: warnings being treated as errors
src/battle_main.c:1955: warning: implicit declaration of function `findMaxLevelMonIndex'
src/battle_main.c:1957: initializer element is not constant
src/battle_main.c:1957: syntax error before `for'
make: *** [Makefile:340: build/emerald/src/battle_main.o] Error 1
make: *** Deleting file 'build/emerald/src/battle_main.o
Pues creo que la terminal habla por si sola.
Tienes errores de sintaxis en las lineas 1938 y 1941.
Una variable llamada "lvl" sin declarar en la función, usada en la linea 1944.
Una operación invalida en la linea 1945.
Más errores en las lineas 1955 y 1957.
Más no puedo decir sin mirar la función o las funciones.
 

Mobius1

Usuario de bronce
Pues creo que la terminal habla por si sola.
Tienes errores de sintaxis en las lineas 1938 y 1941.
Una variable llamada "lvl" sin declarar en la función, usada en la linea 1944.
Una operación invalida en la linea 1945.
Más errores en las lineas 1955 y 1957.
Más no puedo decir sin mirar la función o las funciones.
Pues si pero no se aun tanto del tema como para saber especificamente que solucion tienen, intento aprender pero hay para mi muchisimo por delante, agradezco mucho tus respuestas, un saludo
 

Mobius1

Usuario de bronce
Cuando el se refiere a esto:
¿Cómo puedo implementarlo? ¡Fácil!
Soólo vayan a "src/battle_main.c" y dentro de: "CreateNPCTrainerParty", definan esto:
Se refiere a esta parte?
Código:
static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 firstTrainer)
{
    u32 nameHash = 0;
    u32 personalityValue;
    u8 fixedIV;
    s32 i, j;
    u8 monsCount;

    if (trainerNum == TRAINER_SECRET_BASE)
        return 0;

    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER
                                                                        | BATTLE_TYPE_EREADER_TRAINER
                                                                        | BATTLE_TYPE_TRAINER_HILL)))
    {
        if (firstTrainer == TRUE)
            ZeroEnemyPartyMons();

        if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
        {
            if (gTrainers[trainerNum].partySize > PARTY_SIZE / 2)
                monsCount = PARTY_SIZE / 2;
            else
                monsCount = gTrainers[trainerNum].partySize;
        }
        else
        {
            monsCount = gTrainers[trainerNum].partySize;
        }

        for (i = 0; i < monsCount; i++)
        {

            if (gTrainers[trainerNum].doubleBattle == TRUE)
                personalityValue = 0x80;
            else if (gTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
                personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
            else
                personalityValue = 0x88; // Use personality more likely to result in a male Pokémon

            for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++)
                nameHash += gTrainers[trainerNum].trainerName[j];

            switch (gTrainers[trainerNum].partyFlags)
            {
            case 0:
            {
                const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves;

                for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
                    nameHash += gSpeciesNames[partyData[i].species][j];

                personalityValue += nameHash << 8;
                fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
                CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
                break;
            }
            case F_TRAINER_PARTY_CUSTOM_MOVESET:
            {
                const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves;

                for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
                    nameHash += gSpeciesNames[partyData[i].species][j];

                personalityValue += nameHash << 8;
                fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
                CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);

                for (j = 0; j < MAX_MON_MOVES; j++)
                {
                    SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
                    SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
                }
                break;
            }
            case F_TRAINER_PARTY_HELD_ITEM:
            {
                const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves;

                for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
                    nameHash += gSpeciesNames[partyData[i].species][j];

                personalityValue += nameHash << 8;
                fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
                CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);

                SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
                break;
            }
            case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
            {
                const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerNum].party.ItemCustomMoves;

                for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
                    nameHash += gSpeciesNames[partyData[i].species][j];

                personalityValue += nameHash << 8;
                fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
                CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);

                SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);

                for (j = 0; j < MAX_MON_MOVES; j++)
                {
                    SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
                    SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
                }
                break;
            }
            }
        }

        gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
    }

    return gTrainers[trainerNum].partySize;
}
O a otra? hay 3 mas.....y ya de paso por dentro a donde se refiere exactamente? un saludo
 

Lunos

Enfrentando a La Organización
Miembro insignia
Se refiere a esta parte?
-snip-
O a otra? hay 3 mas.....
Sí, esa es claramente la función que tienes que modificar.
y ya de paso por dentro a donde se refiere exactamente?
En cualquier punto por debajo de la definición inicial de las variables usadas por la función.
Es decir, en cualquier sitio por debajo de u8 monsCount;.
Como Diego pide declarar una nueva variable u8 llamada fixedLVL, lo mejor es ponerlo justo encima de if (trainerNum == TRAINER_SECRET_BASE).
 
Última edición:

Mobius1

Usuario de bronce
Llevo horas con el codigo y no doy con la solucion a los fallos, llego a entender que al copiar y pegar se generan fallos, y llego a entender que en que lineas se generan dichos fallos y mas o menos comprendo lo que me dice el log de errores, pero no llego a dar con la solucion, si alguien pudiera echarme una mano se lo agradeceria mucho, un saludo.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Llevo horas con el codigo y no doy con la solucion a los fallos, llego a entender que al copiar y pegar se generan fallos, y llego a entender que en que lineas se generan dichos fallos y mas o menos comprendo lo que me dice el log de errores, pero no llego a dar con la solucion, si alguien pudiera echarme una mano se lo agradeceria mucho, un saludo.

No soy muy fan, viendo que todos los entrenadores son generados con Pokémon del mismo nivel que el mio, pero bueh.
Gozatelo.
Te sugiero que leas el codigo, veas los cambios hechos e intentes aprender de ello.
 

Mobius1

Usuario de bronce

No soy muy fan, viendo que todos los entrenadores son generados con Pokémon del mismo nivel que el mio, pero bueh.
Gozatelo.
Te sugiero que leas el codigo, veas los cambios hechos e intentes aprender de ello.
Muchas gracias voy a mirar que era lo que no entendia, y ya de paso seguro aprendo algo, soy mas de practica que de teorica.
 

Mobius1

Usuario de bronce
Vale me e tomado mi tiempo metiendo esto a mano, y algo mas sobre el codigo se, lo que esta claro es que el orden importa y tal y como esta en este tema no es el correcto o por lo menos yo no lo entendi bien, y a cualquiera que sea nuevo en decomp tampoco le ira bien, el codigo es correcto pero no su explicación para insertarlo, copiarlo....esto hace que algo "sencillo" se vuelva frustrante, yo siendo novato en decomp entiendo que el codigo de Jason se tiene que colocar todo junto....y en realidad no es asi y no hay nada que indique lo contrario, es imposible que funcione menos mal que me gustan los retos y que hay gente como tu Lunos que haceis un esfuerzo en hacer aun mas facil lo facil, sin ti ya podia estar mirando esto media vida, sin saber C y sin un ejemplo practico creo que me ubiese rendido y dejaria mi idea aparcada...Muchas gracias por tu tiempo y a todos los que habeis echo este trocito de codigo, que para mi me es muyyy util, un saludete.


No soy muy fan, viendo que todos los entrenadores son generados con Pokémon del mismo nivel que el mio, pero bueh.
Gozatelo.
Te sugiero que leas el codigo, veas los cambios hechos e intentes aprender de ello.
 
Arriba