Registrarse

[pokeruby] Insertar velocidad instantánea sin reemplazo

Laquin

Usuario mítico
¡Hola!

Inspirado por este tutorial que nos trajo @Lunos sobre unas modificaciones ideadas por Doesnty, donde se reemplaza la velocidad rápida por instantánea, me propuse insertar la velocidad instantánea manteniendo las otras tres velocidades intactas.

La única pega que encontré fue la siguiente:


Así es; no entran los cuatro textos en pantalla. xD Así que se me ocurrió cambiar los nombres de las velocidades por números:


Quizás no es tan estético como tener palabras en sí, pero bueno, no puedo pensar en nada mejor, ya lo siento.

Meteré el tutorial en distintos spoilers, porque no me gusta que el post se vea excesivamente grande xD

Empezaremos creando un texto para la velocidad instantánea, en data/strings2.s. En la línea 46, podréis ver lo siguiente:
Código:
gSystemText_Slow:: @ 842C409
	.string "{PALETTE 15}SLOW$"

gSystemText_Mid:: @ 842C411
	.string "{PALETTE 15}MID$"

gSystemText_Fast:: @ 842C418
.string "{PALETTE 15}FAST$"
En lugar de eso, pondremos esto otro:
Código:
gSystemText_Slow:: @ 842C409
	.string "{PALETTE 15}1$"

gSystemText_Mid:: @ 842C411
	.string "{PALETTE 15}2$"

gSystemText_Fast:: @ 842C418
	.string "{PALETTE 15}3$"

gSystemText_Inst::
	.string "{PALETTE 15}4$"
Lo que hice fue cambiar, como expliqué antes, las palabras por números. Además, añadí un texto nuevo, gSystemText_Inst, que antes no estaba (es el texto de la velocidad nueva que vamos a crear). En lugar de los números también podríais poner A, B, C y D, por ejemplo. Mientras os entre en la pantalla, no hay mayor problema. Es importante poner $ al final de cada uno de los textos, para indicar que ahí se acaba la cadena de caracteres. Es una especie de separador.
Nos dirigimos ahora a include/strings2.h. En la línea 26, debéis observar algo así:
Código:
extern const u8 gSystemText_Fast[];
Justo debajo, escribiremos:
Código:
extern const u8 gSystemText_Inst[];
Así nos quedaría en su totalidad:
Código:
[...]
extern const u8 gSystemText_ButtonMode[];
extern const u8 gSystemText_Slow[];
extern const u8 gSystemText_Mid[];
extern const u8 gSystemText_Fast[];
extern const u8 gSystemText_Inst[];
extern const u8 gSystemText_On[];
[...]
Añadir esa línea hace que podamos hacer referencias al texto que hemos creado antes desde otras partes del código.
Vamos a abrir ahora el archivo src/option_menu.c, donde, en la línea 319, veremos esto:
Código:
#if ENGLISH
#define TEXTSPEED_SLOW_LEFT (120)
#define TEXTSPEED_MIX_LEFT (155)
#define TEXTSPEED_FAST_LEFT (184)
#endif
Estas son las posiciones de los textos que aparecen en el menú, en el juego. Debemos hacer dos modificaciones: por una parte, definir la posición del texto de la velocidad instantánea; por otra, cambiar los valores para que los textos no estén demasiado a la izquierda ni a la derecha. Estos valores creo que son bastante acertados:
Código:
#if ENGLISH
#define TEXTSPEED_SLOW_LEFT (120)
#define TEXTSPEED_MIX_LEFT (147)
#define TEXTSPEED_FAST_LEFT (175)
#define TEXTSPEED_INST_LEFT (202)
#endif
A continuación, en el mismo archivo, debemos buscar la línea 331. Veremos esta función:
Código:
static void TextSpeed_DrawChoices(u8 selection)
{
    u8 styles[3];

    styles[0] = 0xF;
    styles[1] = 0xF;
    styles[2] = 0xF;
    styles[selection] = 0x8;

    DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]);
    DrawOptionMenuChoice(gSystemText_Mid,  TEXTSPEED_MIX_LEFT,  40, styles[1]);
    DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]);
}
Primero de todo, añadiremos un elemento a ese array llamado styles, puesto que también necesitamos tener el estilo para el texto de la velocidad instantánea.
Acto seguido, como hicieron con los demás estilos, le daremos el valor 0xF al nuestro, escribiendo styles[3] = 0xF;. Por último, llamaremos a la función DrawOptionMenuChoice una vez más para que nos escriba el texto de la velocidad instantánea.
La función entera terminará como la veis aquí:
Código:
static void TextSpeed_DrawChoices(u8 selection)
{
    u8 styles[4];

    styles[0] = 0xF;
    styles[1] = 0xF;
    styles[2] = 0xF;
    styles[3] = 0xF;
    styles[selection] = 0x8;

    DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]);
    DrawOptionMenuChoice(gSystemText_Mid,  TEXTSPEED_MIX_LEFT,  40, styles[1]);
    DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]);
    DrawOptionMenuChoice(gSystemText_Inst, TEXTSPEED_INST_LEFT, 40, styles[3]);
}
Ahora, un poco más arriba, en la línea 300, veremos esta otra función:
Código:
static u8 TextSpeed_ProcessInput(u8 selection)
{
    if (gMain.newKeys & DPAD_RIGHT)
    {
        if (selection < 2)
            selection++;
        else
            selection = 0;
    }
    if (gMain.newKeys & DPAD_LEFT)
    {
        if (selection > 0)
            selection--;
        else
            selection = 2;
    }
    return selection;
}
Cambiaremos los doses por treses:
Código:
static u8 TextSpeed_ProcessInput(u8 selection)
{
    if (gMain.newKeys & DPAD_RIGHT)
    {
        if (selection < 3)
            selection++;
        else
            selection = 0;
    }
    if (gMain.newKeys & DPAD_LEFT)
    {
        if (selection > 0)
            selection--;
        else
            selection = 3;
    }
    return selection;
}
Esto hará que, si tenemos seleccionada la opción del texto lento, y le damos a la izquierda, se vaya a la opción que está más a la derecha. Antes, se habría ido a FAST; ahora, en cambio, como tenemos una opción más, debe irse a una opción más a la derecha, y entonces llegará a la velocidad instantánea.
También haremos que, al estar en la velocidad instantánea en el menú, y pulsemos el botón hacia la derecha, se vaya a la primera opción de todas, la del texto lento.
Ahora nos iremos al último archivo que manipularemos, src/text.c, y en la línea 436 pondremos lo siguiente:
Código:
static const u8 sTextSpeedDelays[] = { 6, 3, 1, 0 }; // slow, mid, fast, inst.
Lo único que hicimos fue añadir un valor para la velocidad instantánea, que servirá después para el sistema que programó Doesnty. Todos los créditos para él.
El sistema en cuestión lo insertaremos en la línea 2487 del mismo archivo. Veréis que pone esto:
Código:
PrintNextChar(win);
switch (win->state)
{
case WIN_STATE_END:
    return TRUE;  // done printing text
case WIN_STATE_WAIT_BUTTON:
case WIN_STATE_WAIT_CLEAR:
case WIN_STATE_WAIT_SCROLL:
    if (PlayerCanInterruptDelay(win))
        return 0;
    win->delayCounter = 60;
    break;
case WIN_STATE_PAUSE:
case WIN_STATE_NEWLINE:
case WIN_STATE_WAIT_SOUND:
    break;
default:
    win->state = WIN_STATE_CHAR_DELAY;
    win->delayCounter = GetTextDelay(win);
    break;
}
Lo sustituímos por:
Código:
do{
        PrintNextChar(win);
        switch (win->state){
            case WIN_STATE_END:
                return TRUE;  // done printing text
            case WIN_STATE_WAIT_BUTTON:
            case WIN_STATE_WAIT_CLEAR:
            case WIN_STATE_WAIT_SCROLL:
                if (PlayerCanInterruptDelay(win))
                    return 0;
                win->delayCounter = 60;
                break;
            case WIN_STATE_PAUSE:
            case WIN_STATE_NEWLINE:
            case WIN_STATE_WAIT_SOUND:
                break;
            default:
                win->state = WIN_STATE_CHAR_DELAY;
                win->delayCounter = GetTextDelay(win);
                break;
        }
    } while (win->state == WIN_STATE_CHAR_DELAY && win->delayCounter == 0);
Ahora, solo falta compilar:
Código:
make NODEP=1 -j(núm. de procesadores)
Y este sería el resultado:



¡Saludos! :D
 
Última edición:
Arriba