Registrarse

[pokeemerald] Agregando nuevos ows (Sin remplazar)

Nexxo

Ahora genero otro tipo de impacto🦢🍂
Buenos días/tardes/noches.

Hoy les traigo un tutorial muy sencillito pero, a la vez, muy importante porque tener más opciones de OWs en nuestro juego es súper importante. Hay que tener en cuenta que, lamentablemente, Pokeemerald solo cuenta con un máximo de 239 por defecto (o, bueno, 255 en realidad, si aprovechamos un par de cosillas). Pero hoy iremos mucho más allá: gracias a Ghoulslash (Pokeemerald) y Pawkkie (Porteado a Pokeemerald-Expansion), tendremos un total de 65,535 espacios para nuestros OWs, aunque dudo que, siquiera, lleguen a usar 1000.

Aclaro también que no iré explicando mucho sobre el código en sí, solo por encima. Luego, editaré el post para mejorarlo, pero así quedará por ahora. Disculpas para los más nuevos <3.

Requisitos:
Saber aplicar branches a nuestro repositorio.

Primero, vamos a hacer un pull de la branch que necesitaremos (o, también, podemos hacerlo manual, copiando y pegando donde es debido).
Tenemos:
ows expansion para pokeemerald
y
ows expansion porteado para pokeemald-expansion

Opcionalmente, también recomendaría usar las paletas dinámicas.
Pero, a priori, se debería poder hacer sin necesidad de estas; aunque, claro: tendríamos que
usar las paletas que vienen por defecto y no una personalizada.

Ahora si, el verdadero tutorial:

Para empezar a agregar nuestros gráficos, vamos a necesitar primero PNG del OW que vamos a agregar. Obviamente, debe estar indexado a 16 colores, donde ubicaremos el color de la transparencia al inicio de la paleta. Imagino que esto no hace falta explicarlo, pero bueno.
También necesitamos extraer su paleta.
1699569787893.png



El png del ow lo dejaremos en "graphics/object_events/pics/people/test_new_ow.png"
aunque pueden crear una carpeta y ponerle "nuevos ows" o algo asi, para tener organizado esto, aunque es obvio que la ruta cambiara.

la paleta la dejaremos en "graphics/object_events/palettes/test_new_ow.pal"

perfecto, ahora nos vamos al codigo de una vez.

Vamos a dirigirnos a:
"include/constants/event_objects.h"
Podrán notar que aquí es donde podremos definir nuestros nuevos overworlds, así que vamos a ello. Iremos una línea después de:
C:
#define OBJ_EVENT_GFX_HOOH                       238
y definiremos nuestro nuevo ow de la siguiente manera:
C:
#define OBJ_EVENT_GFX_TEST_NEW                   239
Recuerden seguir el orden numérico.

Obviamente, también pueden reemplazar "TEST_NEW" por el nombre que quieran, pero yo lo llamaré así todo el tutorial.

Ahora nos iremos unas cuantas líneas más abajo, concretamente buscaremos:
C:
#define NUM_OBJ_EVENT_GFX                        239
Aquí vamos a reemplazar "239" por la cantidad de OWs que quieran. Yo lo dejaré en 5000, pero pueden dejarlo como quieran, sin superar 65535. Aunque ya les digo, no llegarán a ocupar más de 1,000.

Continuaremos con esto en "src/data/object_events/object_event_graphics.h"

Vamos a dirigirnos al final de este archivo para agregar 2 nuevas líneas de código.

C:
const u16 gObjectEventPal_Test_Ow[] = INCBIN_U16("graphics/object_events/palettes/test_new_ow.gbapal"); //Importamos la paleta del overworld
const u32 gObjectEventPic_Test_New_Ow[] = INCBIN_U32("graphics/object_events/pics/people/test_new_ow.4bpp"); //Importamos el grafico del overworld
Perfecto, con estas líneas de código estamos importando nuestro gráfico para poder utilizarlo.

Perfecto, ahora vamos a "src/data/object_events/object_event_pic_tables.h" para empezar a darles un uso.

Vamos al final del archivo para agregar las siguientes líneas de código.
C:
static const struct SpriteFrameImage sPicTable_Test_New_Ow[] = {
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 0),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 1),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 2),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 3),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 4),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 5),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 6),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 7),
    overworld_frame(gObjectEventPic_Test_New_Ow, 2, 4, 8),
};
como ya saben hay varios tamaños de overworlds, desde 16 x 16 hasta 64 x 64 píxeles. Al utilizar "gObjectEventPic_Test_New_Ow,X,Y,F)," se deben asignar valores para elegir el tipo de overworld, como el Ancho (X) y el Alto (Y). Pueden dividir el Ancho y el Alto por 8 para obtener los números que necesitan.

"F"
representa el frame del overworld, en mi caso un NPC común con una cantidad específica de frames(9), pero se podría agregar más si se sabe cómo utilizarlos.
Verán que luego de overworld_frame dice "gObjectEventPic_Test_New_Ow", pues eso es lo que importamos antes. Es importante que lo escriban igual.
También es importante que se queden con "sPicTable_Test_New_Ow", ya que luego lo utilizaremos en otro archivo.

Ahora vamos a "src/data/object_events/object_event_graphics_info.h"

Nos dirigiremos al final del archivo para agregar:
C:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Test_New = {TAG_NONE, OBJ_EVENT_PAL_TAG_TEST_NEW_OW, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Test_New_Ow, gDummySpriteAffineAnimTable};
Aqui lo explicare de manera vertical, pero por pura comodidad, pero es lo mismo de antres
C:
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Test_New =
{TAG_NONE,
OBJ_EVENT_PAL_TAG_TEST_NEW_OW, // Este es el TAG con el cual le asignaremos la paleta a nuestro OW
OBJ_EVENT_PAL_TAG_NONE, // Pueden remplazarlo por OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION si quieren reflejo
256, 16, 32, 4, // 256 = Size / 16 = Ancho / 32 = Alto / 4 = Slot en la paleta
SHADOW_SIZE_M, // Tamaño de la sombra
FALSE, FALSE, // El primer FALSE es si es un objeto inanimado / 2ndo FALSE es si queremos desactivar la paleta de reflejos
TRACKS_FOOT, // Las huellitas en la arena
&gObjectEventBaseOam_16x32, // La Oam dependera del tamaño de nuestro overworld (16x32,32x32,32x64etc)
sOamTables_16x32,  //Las tablas de la Oam, solo fijense en lo msimo que el anterior
sAnimTable_Standard,
sPicTable_Test_New_Ow,  //La pic que cargamos anteriormente de nuestro overworld
gDummySpriteAffineAnimTable};

Aqui es donde hemos utilizado "sPicTable_Test_New_Ow" es importante que escriban todo correctamente, tambien hemos utilizado otros pointers
que aun no hemos definido, asique es normal que nos tire errores, iremos a ello ahora mismo.

Ahora vamos a "src/data/object_events/object_event_graphics_info_pointers.h"

Y luego de:
C:
extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh;
Agregaremos:
C:
extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Test_New;
Perfecto, ahora vamos unas cuantas lineas abajo para agregar luego de
Código:
[OBJ_EVENT_GFX_HOOH] =                     &gObjectEventGraphicsInfo_HoOh,
El siguiente codigo:
Código:
[OBJ_EVENT_GFX_TEST_NEW] =                 &gObjectEventGraphicsInfo_Test_New,
Bien, hemos acabado aqui

Perfecto, hasta ahora solo hemos utilizado el gráfico de nuestro overworld, pero aún no hemos configurado su paleta. Así que, para ponernos con esto, vamos directamente a:
"src/event_object_movement.c"

Nos iremos una linea luego de:
C:
#define OBJ_EVENT_PAL_TAG_DYNAMIC                 0x1124
Si tienen las paletas dinamicas, en caso de que no sea asi, deberia salirles:
C:
#define OBJ_EVENT_PAL_TAG_RS_MAY                  0x1123
Agregaremos la siguiente linea de codigo:
C:
#define OBJ_EVENT_PAL_TAG_TEST_NEW_OW             0x1128
Obviamente, conti mas mas paletas agreguemos hay que ir sumandole a "0x1128" en HEX.

Ahora nos vamos unas cuantas lineas abajo para agregar luego de:
C:
{gObjectEventPal_RubySapphireMay,       OBJ_EVENT_PAL_TAG_RS_MAY},
El siguiente codigo:
C:
{gObjectEventPal_Test_Ow,               OBJ_EVENT_PAL_TAG_TEST_NEW_OW},
Por cierto, respeten a:
C:
{NULL,                                  OBJ_EVENT_PAL_TAG_NONE},
Siempre lo dejaremos de ultimo.

Perfecto para terminar nos hace falta una ultima cosa, para esto nos vamos a:
"spritesheet_rules.mk"
Nos iremos al final del archivo y agregaremos:
Makefile:
#New Ows

$(OBJEVENTGFXDIR)/people/test_new_ow.4bpp: %.4bpp: %.png
    $(GFX) $< $@ -mwidth 2 -mheight 4
En caso de que nuestro overworld tenga otras dimensiones que no sean 16 x 32, como es mi caso, ustedes no usarían mwidth 2 -mheight 4. Si ya vieron los anteriores "Código más a fondo", ya sabrán el porqué, pues 2 = 16 y 4 = 32. Imagino que ya sabrán cómo sigue, ¿no?
Pues sí, 2 = 16 / 4 = 32 / 8 = 64.

Con esto al fin tendremos un nuevo overworld.

En caso de que no se vea reflejado el cambio en nuestra rom, haremos un make clean y luego un make -jN (Numero de nucleos)

1699563136099.png

Pido disculpas por las faltas ortograficas, prometo ir editando el post para dejarlo bonito.
Gracias por pasarse, y ojala les sirva < 3​
 
Última edición:

Nexxo

Ahora genero otro tipo de impacto🦢🍂
Tutorial "actualizado" para que tengan menos miedo de variar con sus overworlds, especialmente en las dimensiones de estos.
 
Arriba