summaryrefslogtreecommitdiff
path: root/src/rom_header_gf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rom_header_gf.c')
-rw-r--r--src/rom_header_gf.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c
new file mode 100644
index 000000000..782a05c75
--- /dev/null
+++ b/src/rom_header_gf.c
@@ -0,0 +1,165 @@
+#include "global.h"
+#include "data.h"
+#include "pokemon_icon.h"
+#include "decoration.h"
+#include "battle_main.h"
+#include "item.h"
+#include "pokeball.h"
+
+struct GFRomHeader
+{
+ u32 version;
+ u32 language;
+ u8 gameName[32];
+ const struct CompressedSpriteSheet * monFrontPics;
+ const struct CompressedSpriteSheet * monBackPics;
+ const struct CompressedSpritePalette * monNormalPalettes;
+ const struct CompressedSpritePalette * monShinyPalettes;
+ const u8 * const * monIcons;
+ const u8 * monIconPaletteIds;
+ const struct SpritePalette * monIconPalettes;
+ const u8 (* monSpeciesNames)[];
+ const u8 (* moveNames)[];
+ const struct Decoration * decorations;
+ u32 flagsOffset;
+ u32 varsOffset;
+ u32 pokedexOffset;
+ u32 seen1Offset;
+ u32 seen2Offset;
+ u32 pokedexVar;
+ u32 pokedexFlag;
+ u32 mysteryEventFlag;
+ u32 pokedexCount;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+ u8 unk8;
+ u8 unk9;
+ u8 unk10;
+ u8 unk11;
+ u8 unk12;
+ u8 unk13;
+ u8 unk14;
+ u8 unk15;
+ u8 unk16;
+ u8 unk17;
+ u32 saveBlock2Size;
+ u32 saveBlock1Size;
+ u32 partyCountOffset;
+ u32 partyOffset;
+ u32 warpFlagsOffset;
+ u32 trainerIdOffset;
+ u32 playerNameOffset;
+ u32 playerGenderOffset;
+ u32 frontierStatusOffset;
+ u32 frontierStatusOffset2;
+ u32 externalEventFlagsOffset;
+ u32 externalEventDataOffset;
+ u32 unk18;
+ const struct BaseStats * baseStats;
+ const u8 (* abilityNames)[];
+ const u8 * const * abilityDescriptions;
+ const struct Item * items;
+ const struct BattleMove * moves;
+ const struct CompressedSpriteSheet * ballGfx;
+ const struct CompressedSpritePalette * ballPalettes;
+ u32 gcnLinkFlagsOffset;
+ u32 gameClearFlag;
+ u32 ribbonFlag;
+ u8 bagCountItems;
+ u8 bagCountKeyItems;
+ u8 bagCountPokeballs;
+ u8 bagCountTMHMs;
+ u8 bagCountBerries;
+ u8 pcItemsCount;
+ u32 pcItemsOffset;
+ u32 giftRibbonsOffset;
+ u32 enigmaBerryOffset;
+ u32 mapViewOffset;
+ u32 unk19;
+ u32 unk20;
+};
+
+// This seems to need to be in the text section for some reason.
+// To avoid a changed section attributes warning it's put in a special .text.consts section.
+__attribute__((section(".text.consts")))
+static const struct GFRomHeader sGFRomHeader = {
+ .version = GAME_VERSION,
+ .language = GAME_LANGUAGE,
+ .gameName = "pokemon emerald version",
+ .monFrontPics = gMonFrontPicTable,
+ .monBackPics = gMonBackPicTable,
+ .monNormalPalettes = gMonPaletteTable,
+ .monShinyPalettes = gMonShinyPaletteTable,
+ .monIcons = gMonIconTable,
+ .monIconPaletteIds = gMonIconPaletteIndices,
+ .monIconPalettes = gMonIconPaletteTable,
+ .monSpeciesNames = gSpeciesNames,
+ .moveNames = gMoveNames,
+ .decorations = gDecorations,
+ .flagsOffset = offsetof(struct SaveBlock1, flags),
+ .varsOffset = offsetof(struct SaveBlock1, vars),
+ .pokedexOffset = offsetof(struct SaveBlock2, pokedex),
+ .seen1Offset = offsetof(struct SaveBlock1, seen1),
+ .seen2Offset = offsetof(struct SaveBlock1, seen2),
+ .pokedexVar = VAR_NATIONAL_DEX - VARS_START,
+ .pokedexFlag = FLAG_RECEIVED_POKEDEX_FROM_BIRCH,
+ .mysteryEventFlag = FLAG_SYS_MYSTERY_EVENT_ENABLE,
+ .pokedexCount = NATIONAL_DEX_COUNT,
+ .unk1 = 0x07,
+ .unk2 = 0x0a,
+ .unk3 = 0x0a,
+ .unk4 = 0x0a,
+ .unk5 = 0x0c,
+ .unk6 = 0x0c,
+ .unk7 = 0x06,
+ .unk8 = 0x0c,
+ .unk9 = 0x06,
+ .unk10 = 0x10,
+ .unk11 = 0x12,
+ .unk12 = 0x0c,
+ .unk13 = 0x0f,
+ .unk14 = 0x0b,
+ .unk15 = 0x01,
+ .unk16 = 0x08,
+ .unk17 = 0x0c,
+ .saveBlock2Size = sizeof(struct SaveBlock2),
+ .saveBlock1Size = sizeof(struct SaveBlock1),
+ .partyCountOffset = offsetof(struct SaveBlock1, playerPartyCount),
+ .partyOffset = offsetof(struct SaveBlock1, playerParty),
+ .warpFlagsOffset = offsetof(struct SaveBlock2, specialSaveWarpFlags),
+ .trainerIdOffset = offsetof(struct SaveBlock2, playerTrainerId),
+ .playerNameOffset = offsetof(struct SaveBlock2, playerName),
+ .playerGenderOffset = offsetof(struct SaveBlock2, playerGender),
+ .frontierStatusOffset = offsetof(struct SaveBlock2, frontier.challengeStatus),
+ .frontierStatusOffset2 = offsetof(struct SaveBlock2, frontier.challengeStatus),
+ .externalEventFlagsOffset = offsetof(struct SaveBlock1, externalEventFlags),
+ .externalEventDataOffset = offsetof(struct SaveBlock1, externalEventData),
+ .unk18 = 0x00000000,
+ .baseStats = gBaseStats,
+ .abilityNames = gAbilityNames,
+ .abilityDescriptions = gAbilityDescriptionPointers,
+ .items = gItems,
+ .moves = gBattleMoves,
+ .ballGfx = gBallSpriteSheets,
+ .ballPalettes = gBallSpritePalettes,
+ .gcnLinkFlagsOffset = offsetof(struct SaveBlock2, gcnLinkFlags),
+ .gameClearFlag = FLAG_SYS_GAME_CLEAR,
+ .ribbonFlag = FLAG_SYS_RIBBON_GET,
+ .bagCountItems = BAG_ITEMS_COUNT,
+ .bagCountKeyItems = BAG_KEYITEMS_COUNT,
+ .bagCountPokeballs = BAG_POKEBALLS_COUNT,
+ .bagCountTMHMs = BAG_TMHM_COUNT,
+ .bagCountBerries = BAG_BERRIES_COUNT,
+ .pcItemsCount = PC_ITEMS_COUNT,
+ .pcItemsOffset = offsetof(struct SaveBlock1, pcItems),
+ .giftRibbonsOffset = offsetof(struct SaveBlock1, giftRibbons),
+ .enigmaBerryOffset = offsetof(struct SaveBlock1, enigmaBerry),
+ .mapViewOffset = offsetof(struct SaveBlock1, mapView),
+ .unk19 = 0x00000000,
+ .unk20 = 0x00000000, // 0xFFFFFFFF in FRLG
+};