Registrarse

[pokeemerald] Contador de felicidad para los huevos (eclosión)

Kaktus

Miembro insignia
Miembro insignia
¡¡Buenas!!

Tras un largo tiempo sin aportar nada a la decompilación debido a que me encuentro en un curso de estudios bastante intenso, traigo un tutorial (ahora mismo estoy en plena fecha de exámenes). Ya llevaba mucho sin hacer nada y tenía ese nosequé que me decía que tenía que volver a traer algo por absurdo que fuera, aunque estoy seguro que a alguien le servirá

Como bien se puede deducir por el título, en este "tuto" os voy a enseñar a modificar el texto de la interfaz para poder mostrar un contador de felicidad, y tener una referencia de cuanto le queda al huevo para eclosionar (que es la verdadera "unidad" que el juego usa, y no los pasos como tal, como mucha gente piensa)

Aquí un vídeo para que entendáis a qué me refiero.


No voy a estructurar demasiado bien el tema, y soy consciente de ello, pero estoy haciendo esto a contrarreloj.

Para empezar, iremos al archivo "include/strings.h" para definir dos nuevas variables, yo las he nombrado así:

Código:
extern const u8 gText_EggHappiness[];
extern const u8 gText_EggHatch[];
Concretamente, después de "extern const u8 gText_OTSlash[];", pero eso realmente da igual.

Ahora, iremos a "src/strings.c" para darles un valor a estas variables.

Código:
const u8 gText_EggHatch[] = _("/40");
const u8 gText_EggHappiness[] = _("HAPPINESS");
Bien, ahora que tenemos todo lo externo al archivo "importante" definido, pasamos a la acción, "src/pokemon_summary_screen.c":

Buscamos la función "PrintEggState", en la que encontraremos

Código:
static void PrintEggState(void)
{
    const u8 *text;
    struct PokeSummary *sum = &pssData->summary;

    if (pssData->summary.sanity == TRUE)
        text = gText_EggWillTakeALongTime;
    else if (sum->friendship <= 5)
        text = gText_EggAboutToHatch;
    else if (sum->friendship <= 10)
        text = gText_EggWillHatchSoon;
    else if (sum->friendship <= 40)
        text = gText_EggWillTakeSomeTime;
    else
        text = gText_EggWillTakeALongTime;

    SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 2), text, 0, 1, 0, 0);
}

Lo que modificaremos completamente por

Código:
static void PrintEggState(void)
{
    u32 friendshipAmount;
    int x;
    struct PokeSummary *sum = &pssData->summary;
	
    if (pssData->summary.sanity == TRUE){
		SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 2), gText_EggWillTakeALongTime, 0, 1, 0, 0);
	}
    else {
		friendshipAmount = 40 - (sum->friendship);
		if (friendshipAmount < 10)
			ConvertIntToDecimalStringN(gStringVar1, friendshipAmount, 1, 1);	
		else
			ConvertIntToDecimalStringN(gStringVar1, friendshipAmount, 1, 2);
		SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 2), gText_EggHappiness, 0, 1, 0, 1);	
		SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 2), text, 0, 17, 0, 3);
		x = GetStringWidth(1, gStringVar1, 0);
		SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 2), gText_EggHatch, x, 17, 0, 0);
	}
}

En resumen, estamos definiendo diversas variables para almacenar datos, que a mi parecer, el propio nombre los definen bien.

Si la línea "friendshipAmount = 40 - (sum->friendship);" no existiera, sería una cuenta regresiva (40, 39, 38...), por lo que restamos a 40 el valor real y tenemos la cuenta progresiva (0, 1, 2, 3...)

Más tarde comprobamos si tal variable es menor que 10 (tiene un dígito) o igual o mayor que 10 (tiene dos dígitos), básicamente para editar la posición X de los valores al ser impresos en pantalla.

Usamos una función para convertir un entero en una cadena de texto, que almacenamos en "gStringVar1", para más tarde imprimirla con la función "SummaryScreen_PrintTextOnWindow"

Estamos a un último paso, ya que hemos colocado la string "HAPPINESS" en la parte superior del cuadro de texto, no obstante, la letra tiene color blanco, y junto con el propio color blanco del fondo se confunde, además, para que quede parejo al resto de cajas de texto, lo lógico sería colocarle un fondo verde.

Tenemos dos opciones, yo claramente tiraré por la más rápida porque como digo, no me puedo poner detallista. Aún así, la opción que yo considero idónea, es la otra (que sería tomar el bg que se usa de fondo para el huevo y modificarlo para que tenga en esa zona el fondo verde)

Bien, yo lo que hice (aunque dudo que vosotros hagáis lo mismo porque es antiestético) es editar la función donde se comprueba si es un huevo o un Pokémon para cambiar el bg, concretamente

Código:
static void sub_81C2524(void)
{
    if (pssData->summary.isEgg)
        ChangeBgX(3, 0x10000, 0);
    else
        ChangeBgX(3, 0, 0);
}

En el cuál simplemente podéis suprimir tanto la función como la declaración de la misma (al principio del .c), o, si sois tan vagos como yo, comentar el if entero o eliminarlo.

Y con esto obtendremos ese resultado:


Espero que os guste este tutorial exprés.

¡Un saludo!
 
Última edición:

Diego Mertens

Dartrix Joven
Respuesta: [pokeemerald] Contador de felicidad para los huevos (eclosión)

¿Porque nadie está comentando? Este sistema es genial, saber cuántas vueltas de 256 pasos te faltan por dar es muy bueno. Por cierto, es algo injusto que con tu situación (no sé si actual) hayas echo esta maravilla y nadie te diga lo genial que es bienvenido a mi mundo
 
Respuesta: [pokeemerald] Contador de felicidad para los huevos (eclosión)

si usara pokeemerald usaria esto (no lo uso porque tengo pc de 32 bits y no quiero cargarmela xD) este aporte es algo que a muchos le servira ERES GRANDE INMORTAL (el que entendio la referencia entendio) haci que espero que para el futuro traigas mas aportes para la gente que lo necesita y que sean bien recibidos
 
Arriba