Map Tilesets - volromhacking/porydelete GitHub Wiki
Introduction:
I always thought that Map-Tilesets are not really hard to delete, but they are...
They are really weird, for some reason, gTileset_General
is defined in a different file
than other tilesets. So expect this documentation to be larger. I am trying to articulate as much as possible.
Lets split the tileset definition
Here is an example of how a tileset is defined (src/data/tilesets/headers.h
):
const struct Tileset gTileset_General =
{
.isCompressed = TRUE,
.isSecondary = FALSE,
.tiles = gTilesetTiles_General,
.palettes = gTilesetPalettes_General,
.metatiles = gMetatiles_General,
.metatileAttributes = gMetatileAttributes_General,
.callback = InitTilesetAnim_General,
};
.isCompressed
= As far as I know: This tells if the tileset is LZ compressed
.isSecondary
= A boolean, telling if this tileset is a secondary tileset
.tiles
= Tells where the tiles are located
.palettes
= Tells where palettes are located
.metatiles
= Tells where metatiles.bin
is located
.metatilesAttributes
= Tells where metatile_attributes.bin
is located
.callback
= Animation callback \
The most important members of the Tileset
struct are tiles
, palettes
, metatiles
, metatilesAttributes
and callback
. With this information, I was able to locate everything which has to be deleted. The tutorial on how to delete tilesets is split into two parts because gTileset_General
is defined in a different file than the other tilesets which is pretty interesting. So lets start with how to delete a tileset except gTileset_General
! If you scroll down even more you will see how to delete gTileset_General
and its animations as well!
(Note: After deleting a tileset, you have to replace every usage of gTileset_{DeletedTileset} with a different one, because the tileset is removed from the game. Otherwise, the compiler will fail compiling)
Deletion
Any other tileset
Step 1
In this part we will I will use gTileset_Petalburg
as a placeholder name just to make things clear.
Remove tileset struct definition in src/data/tilesets/headers.h
:
const struct Tileset gTileset_Petalburg =
{
.isCompressed = TRUE,
.isSecondary = TRUE,
.tiles = gTilesetTiles_Petalburg,
.palettes = gTilesetPalettes_Petalburg,
.metatiles = gMetatiles_Petalburg,
.metatileAttributes = gMetatileAttributes_Petalburg,
.callback = InitTilesetAnim_Petalburg,
};
Step 2
In src/data/tilesets/graphics.h
, remove these two definitions:
const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz");
const u16 gTilesetPalettes_Petalburg[][16] =
{
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/00.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/01.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/02.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/03.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/04.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/05.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/06.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/07.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/08.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/09.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/10.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/11.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/12.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/13.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/14.gbapal"),
INCBIN_U16("data/tilesets/secondary/petalburg/palettes/15.gbapal"),
};
Step 3
In src/data/tilesets/metatiles.h
, remove these two defintions as well:
const u16 gMetatiles_Petalburg[] = INCBIN_U16("data/tilesets/secondary/petalburg/metatiles.bin");
const u16 gMetatileAttributes_Petalburg[] = INCBIN_U16("data/tilesets/secondary/petalburg/metatile_attributes.bin");;
Step 4
Remove /data/tilesets/primary/petalburg
so that all tiles and animations sprites get deleted.
Step 5 (only applies to tilesets with animations)
Note: this step might be different for tileset animations which were manually created. I am following the vanilla animation definition
In this step we're going to delete everything which is needed by the tileset for animations. Please see the note above before starting deleting!
In include/tileset_anims.h
, remove declaration:
void InitTilesetAnim_Petalburg(void);
In src/tileset_anims.c
, remove definition of the InitTilesetAnim_Petalburg
function:
void InitTilesetAnim_Petalburg(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = sPrimaryTilesetAnimCounterMax;
sSecondaryTilesetAnimCallback = NULL;
}
Since the Animation Callback for the Petalburg tileset is set to NULL
, we have nothing to delete anymore, however if you have a tileset which has a animation calllback, see Step 6 of the deletion tutorial of gTileset_General
down below.
gTileset_General
Step 1
Remove tileset struct definition in src/data/tilesets/headers.h
:
const struct Tileset gTileset_General =
{
.isCompressed = TRUE,
.isSecondary = FALSE,
.tiles = gTilesetTiles_General,
.palettes = gTilesetPalettes_General,
.metatiles = gMetatiles_General,
.metatileAttributes = gMetatileAttributes_General,
.callback = InitTilesetAnim_General,
};
Step 2
In src/graphics.h
, remove these two definitions:
const u16 gTilesetPalettes_General[][16] =
{
INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/02.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/03.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/04.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/05.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/06.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/07.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/08.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/09.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/10.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/11.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/12.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/13.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/14.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/15.gbapal"),
};
const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.lz");
Step 3
In src/data/tilesets/metatiles.h
, remove these two defintions as well:
const u16 gMetatiles_General[] = INCBIN_U16("data/tilesets/primary/general/metatiles.bin");
const u16 gMetatileAttributes_General[] = INCBIN_U16("data/tilesets/primary/general/metatile_attributes.bin");
Step 4
In include/tilesets.h
, remove the two declarations:
extern const u32 gTilesetTiles_General[];
extern const u16 gTilesetPalettes_General[][16];
Step 5
Remove /data/tilesets/primary/general
so that all tiles and animations sprites get deleted.
Step 6 (only applies to tilesets with animations)
Note: this step might be different for tileset animations which were manually created. I am following the vanilla animation definition
In this step we're going to delete everything which is needed by the tileset for animations. Please see the note above before starting deleting!
In include/tileset_anims.h
, remove declaration:
void InitTilesetAnim_General(void);
In src/tileset_anims.c
, remove definition of the InitTilesetAnim_General
function (from now on everything is in src/tileset_anims.c
):
void InitTilesetAnim_General(void)
{
sPrimaryTilesetAnimCounter = 0;
sPrimaryTilesetAnimCounterMax = 256;
sPrimaryTilesetAnimCallback = TilesetAnim_General;
}
The next step is to delete this functions callback. Remove declaration of TilesetAnim_General
:
static void TilesetAnim_General(u16);
and the definition:
static void TilesetAnim_General(u16 timer)
{
if (timer % 16 == 0)
QueueAnimTiles_General_Flower(timer / 16);
if (timer % 16 == 1)
QueueAnimTiles_General_Water(timer / 16);
if (timer % 16 == 2)
QueueAnimTiles_General_SandWaterEdge(timer / 16);
if (timer % 16 == 3)
QueueAnimTiles_General_Waterfall(timer / 16);
if (timer % 16 == 4)
QueueAnimTiles_General_LandWaterEdge(timer / 16);
}
Next up is to delete all the QueueAnimTiles function which you can see above in static void TilesetAnim_General(u16) {...}
. So for gTileset_General
you have do delete the declarations:
static void QueueAnimTiles_General_Flower(u16);
static void QueueAnimTiles_General_Water(u16);
static void QueueAnimTiles_General_SandWaterEdge(u16);
static void QueueAnimTiles_General_Waterfall(u16);
static void QueueAnimTiles_General_LandWaterEdge(u16);
and the definitions of those functions:
static void QueueAnimTiles_General_Flower(u16 timer)
{
u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_Flower);
AppendTilesetAnimToBuffer(gTilesetAnims_General_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_Water(u16 timer)
{
u8 i = timer % ARRAY_COUNT(gTilesetAnims_General_Water);
AppendTilesetAnimToBuffer(gTilesetAnims_General_Water[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(432)), 30 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_SandWaterEdge(u16 timer)
{
u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_SandWaterEdge);
AppendTilesetAnimToBuffer(gTilesetAnims_General_SandWaterEdge[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 10 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_Waterfall(u16 timer)
{
u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_Waterfall);
AppendTilesetAnimToBuffer(gTilesetAnims_General_Waterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(496)), 6 * TILE_SIZE_4BPP);
}
The last thing(s) you have to remove are the animation frame tables. So for gTileset_General
delete:
const u16 gTilesetAnims_General_Flower_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/1.4bpp");
const u16 gTilesetAnims_General_Flower_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/0.4bpp");
const u16 gTilesetAnims_General_Flower_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/2.4bpp");
const u16 *const gTilesetAnims_General_Flower[] = {
gTilesetAnims_General_Flower_Frame0,
gTilesetAnims_General_Flower_Frame1,
gTilesetAnims_General_Flower_Frame0,
gTilesetAnims_General_Flower_Frame2
};
const u16 gTilesetAnims_General_Water_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/water/0.4bpp");
const u16 gTilesetAnims_General_Water_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/water/1.4bpp");
const u16 gTilesetAnims_General_Water_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/water/2.4bpp");
const u16 gTilesetAnims_General_Water_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/water/3.4bpp");
const u16 gTilesetAnims_General_Water_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/water/4.4bpp");
const u16 gTilesetAnims_General_Water_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/water/5.4bpp");
const u16 gTilesetAnims_General_Water_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/water/6.4bpp");
const u16 gTilesetAnims_General_Water_Frame7[] = INCBIN_U16("data/tilesets/primary/general/anim/water/7.4bpp");
const u16 *const gTilesetAnims_General_Water[] = {
gTilesetAnims_General_Water_Frame0,
gTilesetAnims_General_Water_Frame1,
gTilesetAnims_General_Water_Frame2,
gTilesetAnims_General_Water_Frame3,
gTilesetAnims_General_Water_Frame4,
gTilesetAnims_General_Water_Frame5,
gTilesetAnims_General_Water_Frame6,
gTilesetAnims_General_Water_Frame7
};
const u16 gTilesetAnims_General_SandWaterEdge_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/0.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/1.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/2.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/3.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/4.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/5.4bpp");
const u16 gTilesetAnims_General_SandWaterEdge_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/sand_water_edge/6.4bpp");
const u16 *const gTilesetAnims_General_SandWaterEdge[] = {
gTilesetAnims_General_SandWaterEdge_Frame0,
gTilesetAnims_General_SandWaterEdge_Frame1,
gTilesetAnims_General_SandWaterEdge_Frame2,
gTilesetAnims_General_SandWaterEdge_Frame3,
gTilesetAnims_General_SandWaterEdge_Frame4,
gTilesetAnims_General_SandWaterEdge_Frame5,
gTilesetAnims_General_SandWaterEdge_Frame6,
gTilesetAnims_General_SandWaterEdge_Frame0
};
const u16 gTilesetAnims_General_Waterfall_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/waterfall/0.4bpp");
const u16 gTilesetAnims_General_Waterfall_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/waterfall/1.4bpp");
const u16 gTilesetAnims_General_Waterfall_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/waterfall/2.4bpp");
const u16 gTilesetAnims_General_Waterfall_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/waterfall/3.4bpp");
const u16 *const gTilesetAnims_General_Waterfall[] = {
gTilesetAnims_General_Waterfall_Frame0,
gTilesetAnims_General_Waterfall_Frame1,
gTilesetAnims_General_Waterfall_Frame2,
gTilesetAnims_General_Waterfall_Frame3
};
const u16 gTilesetAnims_General_LandWaterEdge_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/land_water_edge/0.4bpp");
const u16 gTilesetAnims_General_LandWaterEdge_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/land_water_edge/1.4bpp");
const u16 gTilesetAnims_General_LandWaterEdge_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/land_water_edge/2.4bpp");
const u16 gTilesetAnims_General_LandWaterEdge_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/land_water_edge/3.4bpp");
const u16 *const gTilesetAnims_General_LandWaterEdge[] = {
gTilesetAnims_General_LandWaterEdge_Frame0,
gTilesetAnims_General_LandWaterEdge_Frame1,
gTilesetAnims_General_LandWaterEdge_Frame2,
gTilesetAnims_General_LandWaterEdge_Frame3
};