diff options
Diffstat (limited to 'src/battle_bg.c')
-rw-r--r-- | src/battle_bg.c | 1076 |
1 files changed, 1076 insertions, 0 deletions
diff --git a/src/battle_bg.c b/src/battle_bg.c new file mode 100644 index 000000000..1c0b41bb4 --- /dev/null +++ b/src/battle_bg.c @@ -0,0 +1,1076 @@ +#include "global.h" +#include "gflib.h" +#include "battle.h" +#include "battle_bg.h" +#include "battle_message.h" +#include "decompress.h" +#include "graphics.h" +#include "link.h" +#include "new_menu_helpers.h" +#include "overworld.h" +#include "text_window.h" +#include "trig.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "constants/trainer_classes.h" + +#define TAG_VS_LETTERS 10000 + +struct BattleBackground +{ + const void *tileset; + const void *tilemap; + const void *entryTileset; + const void *entryTilemap; + const void *palette; +}; + +static void CB2_unused(void); +static u8 GetBattleTerrainOverride(void); + +static const u8 gUnknown_824829C[] = {1, 2}; + +static const struct OamData gOamData_82482A0 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_82482A8 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0x040, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AffineAnimCmd gUnknown_82482B0[] = { + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd gUnknown_82482C0[] = { + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80), + AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gAffineAnimTable_82482E0[] = { + gUnknown_82482B0, + gUnknown_82482C0 +}; + +static const struct SpriteTemplate sVsLetter_V_SpriteTemplate = { + .tileTag = TAG_VS_LETTERS, + .paletteTag = TAG_VS_LETTERS, + .oam = &gOamData_82482A0, + .anims = gDummySpriteAnimTable, + .affineAnims = gAffineAnimTable_82482E0, + .callback = nullsub_9 +}; + +static const struct SpriteTemplate sVsLetter_S_SpriteTemplate = { + .tileTag = TAG_VS_LETTERS, + .paletteTag = TAG_VS_LETTERS, + .oam = &gOamData_82482A8, + .anims = gDummySpriteAnimTable, + .affineAnims = gAffineAnimTable_82482E0, + .callback = nullsub_9 +}; + +static const struct CompressedSpriteSheet sVsLettersSpriteSheet = { + gVsLettersGfx, + 0x1000, + TAG_VS_LETTERS +}; + +const struct BgTemplate gBattleBgTemplates[4] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 2, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 28, + .screenSize = 2, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 30, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 3, + .charBaseIndex = 2, + .mapBaseIndex = 26, + .screenSize = 1, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x000 + } +}; + +static const struct WindowTemplate gUnknown_8248330[] = { + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 28, + .height = 4, + .paletteNum = 0, + .baseBlock = 0x090 + }, { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 35, + .width = 14, + .height = 4, + .paletteNum = 0, + .baseBlock = 0x1c0 + }, { + .bg = 0, + .tilemapLeft = 17, + .tilemapTop = 35, + .width = 12, + .height = 4, + .paletteNum = 5, + .baseBlock = 0x190 + }, { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 55, + .width = 8, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x300 + }, { + .bg = 0, + .tilemapLeft = 11, + .tilemapTop = 55, + .width = 8, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x310 + }, { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 57, + .width = 8, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x320 + }, { + .bg = 0, + .tilemapLeft = 11, + .tilemapTop = 57, + .width = 8, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x330 + }, { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 55, + .width = 3, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x290 + }, { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 57, + .width = 8, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x296 + }, { + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 55, + .width = 5, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x2a6 + }, { + .bg = 0, + .tilemapLeft = 25, + .tilemapTop = 57, + .width = 0, + .height = 0, + .paletteNum = 5, + .baseBlock = 0x2b0 + }, { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 55, + .width = 8, + .height = 4, + .paletteNum = 5, + .baseBlock = 0x2b0 + }, { + .bg = 1, + .tilemapLeft = 19, + .tilemapTop = 8, + .width = 10, + .height = 11, + .paletteNum = 5, + .baseBlock = 0x100 + }, { + .bg = 2, + .tilemapLeft = 18, + .tilemapTop = 0, + .width = 12, + .height = 3, + .paletteNum = 6, + .baseBlock = 0x16e + }, { + .bg = 0, + .tilemapLeft = 25, + .tilemapTop = 9, + .width = 4, + .height = 4, + .paletteNum = 5, + .baseBlock = 0x100 + }, { + .bg = 1, + .tilemapLeft = 2, + .tilemapTop = 3, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x020 + }, { + .bg = 2, + .tilemapLeft = 2, + .tilemapTop = 3, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x040 + }, { + .bg = 1, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x020 + }, { + .bg = 2, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x040 + }, { + .bg = 1, + .tilemapLeft = 2, + .tilemapTop = 6, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x060 + }, { + .bg = 2, + .tilemapLeft = 2, + .tilemapTop = 6, + .width = 7, + .height = 2, + .paletteNum = 5, + .baseBlock = 0x080 + }, { + .bg = 0, + .tilemapLeft = 11, + .tilemapTop = 2, + .width = 8, + .height = 2, + .paletteNum = 0, + .baseBlock = 0x0a0 + }, { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 2, + .width = 8, + .height = 2, + .paletteNum = 0, + .baseBlock = 0x0a0 + }, { + .bg = 0, + .tilemapLeft = 19, + .tilemapTop = 2, + .width = 8, + .height = 2, + .paletteNum = 0, + .baseBlock = 0x0b0 + }, { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 26, + .height = 4, + .paletteNum = 7, + .baseBlock = 0x090 + }, DUMMY_WIN_TEMPLATE +}; + +static const u32 sBattleTerrainPalette_Grass[] = INCBIN_U32("graphics/battle/unk_8248400.gbapal.lz"); +static const u32 sBattleTerrainTiles_Grass[] = INCBIN_U32("graphics/battle/unk_824844C.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Grass[] = INCBIN_U32("graphics/battle/unk_82489A8.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Grass[] = INCBIN_U32("graphics/battle/unk_8248C68.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Grass[] = INCBIN_U32("graphics/battle/unk_8248F58.bin.lz"); +static const u32 sBattleTerrainPalette_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249074.gbapal.lz"); +static const u32 sBattleTerrainTiles_LongGrass[] = INCBIN_U32("graphics/battle/unk_82490C4.4bpp.lz"); +static const u32 sBattleTerrainTilemap_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249620.bin.lz"); +static const u32 sBattleTerrainAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle/unk_82498DC.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249E10.bin.lz"); +static const u32 sBattleTerrainPalette_Sand[] = INCBIN_U32("graphics/battle/unk_8249F98.gbapal.lz"); +static const u32 sBattleTerrainTiles_Sand[] = INCBIN_U32("graphics/battle/unk_8249FE4.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Sand[] = INCBIN_U32("graphics/battle/unk_824A37C.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Sand[] = INCBIN_U32("graphics/battle/unk_824A618.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Sand[] = INCBIN_U32("graphics/battle/unk_824A844.bin.lz"); +static const u32 sBattleTerrainPalette_Underwater[] = INCBIN_U32("graphics/battle/unk_824A940.gbapal.lz"); +static const u32 sBattleTerrainTiles_Underwater[] = INCBIN_U32("graphics/battle/unk_824A990.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Underwater[] = INCBIN_U32("graphics/battle/unk_824ACD0.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Underwater[] = INCBIN_U32("graphics/battle/unk_824AF70.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle/unk_824B0DC.bin.lz"); +static const u32 sBattleTerrainPalette_Water[] = INCBIN_U32("graphics/battle/unk_824B19C.gbapal.lz"); +static const u32 sBattleTerrainTiles_Water[] = INCBIN_U32("graphics/battle/unk_824B1EC.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Water[] = INCBIN_U32("graphics/battle/unk_824B608.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Water[] = INCBIN_U32("graphics/battle/unk_824B8A8.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Water[] = INCBIN_U32("graphics/battle/unk_824BBE0.bin.lz"); +static const u32 sBattleTerrainPalette_Pond[] = INCBIN_U32("graphics/battle/unk_824BCE0.gbapal.lz"); +static const u32 sBattleTerrainTiles_Pond[] = INCBIN_U32("graphics/battle/unk_824BD38.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Pond[] = INCBIN_U32("graphics/battle/unk_824C07C.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Pond[] = INCBIN_U32("graphics/battle/unk_824C314.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Pond[] = INCBIN_U32("graphics/battle/unk_824C520.bin.lz"); +static const u32 sBattleTerrainPalette_Mountain[] = INCBIN_U32("graphics/battle/unk_824C5D8.gbapal.lz"); +static const u32 sBattleTerrainTiles_Mountain[] = INCBIN_U32("graphics/battle/unk_824C624.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Mountain[] = INCBIN_U32("graphics/battle/unk_824C958.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Mountain[] = INCBIN_U32("graphics/battle/unk_824CBF8.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Mountain[] = INCBIN_U32("graphics/battle/unk_824CEC8.bin.lz"); +static const u32 sBattleTerrainPalette_Cave[] = INCBIN_U32("graphics/battle/unk_824CF98.gbapal.lz"); +static const u32 sBattleTerrainTiles_Cave[] = INCBIN_U32("graphics/battle/unk_824CFEC.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Cave[] = INCBIN_U32("graphics/battle/unk_824D418.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Cave[] = INCBIN_U32("graphics/battle/unk_824D6B8.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Cave[] = INCBIN_U32("graphics/battle/unk_824DC98.bin.lz"); +static const u32 sBattleTerrainPalette_Building[] = INCBIN_U32("graphics/battle/unk_824DDF0.gbapal.lz"); +static const u32 sBattleTerrainTiles_Building[] = INCBIN_U32("graphics/battle/unk_824DE34.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Building[] = INCBIN_U32("graphics/battle/unk_824E16C.bin.lz"); +static const u32 sBattleTerrainAnimTiles_Building[] = INCBIN_U32("graphics/battle/unk_824E410.4bpp.lz"); +static const u32 sBattleTerrainAnimTilemap_Building[] = INCBIN_U32("graphics/battle/unk_824E490.bin.lz"); +static const u32 sBattleTerrainPalette_Link[] = INCBIN_U32("graphics/battle/unk_824E528.gbapal.lz"); +static const u32 sBattleTerrainPalette_Gym[] = INCBIN_U32("graphics/battle/unk_824E56C.gbapal.lz"); +static const u32 sBattleTerrainPalette_Leader[] = INCBIN_U32("graphics/battle/unk_824E5B8.gbapal.lz"); +static const u32 sBattleTerrainPalette_Indoor2[] = INCBIN_U32("graphics/battle/unk_824E604.gbapal.lz"); +static const u32 sBattleTerrainPalette_Indoor1[] = INCBIN_U32("graphics/battle/unk_824E650.gbapal.lz"); +static const u32 sBattleTerrainPalette_Lorelei[] = INCBIN_U32("graphics/battle/unk_824E6A4.gbapal.lz"); +static const u32 sBattleTerrainPalette_Bruno[] = INCBIN_U32("graphics/battle/unk_824E6F0.gbapal.lz"); +static const u32 sBattleTerrainPalette_Agatha[] = INCBIN_U32("graphics/battle/unk_824E740.gbapal.lz"); +static const u32 sBattleTerrainPalette_Lance[] = INCBIN_U32("graphics/battle/unk_824E78C.gbapal.lz"); +static const u32 sBattleTerrainPalette_Champion[] = INCBIN_U32("graphics/battle/unk_824E7DC.gbapal.lz"); +static const u32 sBattleTerrainPalette_Plain[] = INCBIN_U32("graphics/battle/unk_824E81C.gbapal.lz"); +static const u32 sBattleTerrainTiles_Indoor2[] = INCBIN_U32("graphics/battle/unk_824E858.4bpp.lz"); +static const u32 sBattleTerrainTilemap_Indoor2[] = INCBIN_U32("graphics/battle/unk_824EB90.bin.lz"); + +static const struct BattleBackground sBattleTerrainTable[] = { + [BATTLE_TERRAIN_GRASS] = + { + .tileset = sBattleTerrainTiles_Grass, + .tilemap = sBattleTerrainTilemap_Grass, + .entryTileset = sBattleTerrainAnimTiles_Grass, + .entryTilemap = sBattleTerrainAnimTilemap_Grass, + .palette = sBattleTerrainPalette_Grass + }, + [BATTLE_TERRAIN_LONG_GRASS] = + { + .tileset = sBattleTerrainTiles_LongGrass, + .tilemap = sBattleTerrainTilemap_LongGrass, + .entryTileset = sBattleTerrainAnimTiles_LongGrass, + .entryTilemap = sBattleTerrainAnimTilemap_LongGrass, + .palette = sBattleTerrainPalette_LongGrass + }, + [BATTLE_TERRAIN_SAND] = + { + .tileset = sBattleTerrainTiles_Sand, + .tilemap = sBattleTerrainTilemap_Sand, + .entryTileset = sBattleTerrainAnimTiles_Sand, + .entryTilemap = sBattleTerrainAnimTilemap_Sand, + .palette = sBattleTerrainPalette_Sand + }, + [BATTLE_TERRAIN_UNDERWATER] = + { + .tileset = sBattleTerrainTiles_Underwater, + .tilemap = sBattleTerrainTilemap_Underwater, + .entryTileset = sBattleTerrainAnimTiles_Underwater, + .entryTilemap = sBattleTerrainAnimTilemap_Underwater, + .palette = sBattleTerrainPalette_Underwater + }, + [BATTLE_TERRAIN_WATER] = + { + .tileset = sBattleTerrainTiles_Water, + .tilemap = sBattleTerrainTilemap_Water, + .entryTileset = sBattleTerrainAnimTiles_Water, + .entryTilemap = sBattleTerrainAnimTilemap_Water, + .palette = sBattleTerrainPalette_Water + }, + [BATTLE_TERRAIN_POND] = + { + .tileset = sBattleTerrainTiles_Pond, + .tilemap = sBattleTerrainTilemap_Pond, + .entryTileset = sBattleTerrainAnimTiles_Pond, + .entryTilemap = sBattleTerrainAnimTilemap_Pond, + .palette = sBattleTerrainPalette_Pond + }, + [BATTLE_TERRAIN_MOUNTAIN] = + { + .tileset = sBattleTerrainTiles_Mountain, + .tilemap = sBattleTerrainTilemap_Mountain, + .entryTileset = sBattleTerrainAnimTiles_Mountain, + .entryTilemap = sBattleTerrainAnimTilemap_Mountain, + .palette = sBattleTerrainPalette_Mountain + }, + [BATTLE_TERRAIN_CAVE] = + { + .tileset = sBattleTerrainTiles_Cave, + .tilemap = sBattleTerrainTilemap_Cave, + .entryTileset = sBattleTerrainAnimTiles_Cave, + .entryTilemap = sBattleTerrainAnimTilemap_Cave, + .palette = sBattleTerrainPalette_Cave + }, + [BATTLE_TERRAIN_BUILDING] = + { + .tileset = sBattleTerrainTiles_Building, + .tilemap = sBattleTerrainTilemap_Building, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Building + }, + [BATTLE_TERRAIN_PLAIN] = + { + .tileset = sBattleTerrainTiles_Building, + .tilemap = sBattleTerrainTilemap_Building, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Plain + }, + [BATTLE_TERRAIN_LINK] = + { + .tileset = sBattleTerrainTiles_Building, + .tilemap = sBattleTerrainTilemap_Building, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Link + }, + [BATTLE_TERRAIN_GYM] = + { + .tileset = sBattleTerrainTiles_Building, + .tilemap = sBattleTerrainTilemap_Building, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Gym + }, + [BATTLE_TERRAIN_LEADER] = + { + .tileset = sBattleTerrainTiles_Building, + .tilemap = sBattleTerrainTilemap_Building, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Leader + }, + [BATTLE_TERRAIN_INDOOR_2] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Indoor2 + }, + [BATTLE_TERRAIN_INDOOR_1] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Indoor1 + }, + [BATTLE_TERRAIN_LORELEI] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Lorelei + }, + [BATTLE_TERRAIN_BRUNO] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Bruno + }, + [BATTLE_TERRAIN_AGATHA] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Agatha + }, + [BATTLE_TERRAIN_LANCE] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Lance + }, + [BATTLE_TERRAIN_CHAMPION] = + { + .tileset = sBattleTerrainTiles_Indoor2, + .tilemap = sBattleTerrainTilemap_Indoor2, + .entryTileset = sBattleTerrainAnimTiles_Building, + .entryTilemap = sBattleTerrainAnimTilemap_Building, + .palette = sBattleTerrainPalette_Champion + } +}; + +static const struct { + u8 mapScene; + u8 battleTerrain; +} sMapBattleSceneMapping[] = { + {MAP_BATTLE_SCENE_GYM, BATTLE_TERRAIN_GYM}, + {MAP_BATTLE_SCENE_INDOOR_1, BATTLE_TERRAIN_INDOOR_1}, + {MAP_BATTLE_SCENE_INDOOR_2, BATTLE_TERRAIN_INDOOR_2}, + {MAP_BATTLE_SCENE_LORELEI, BATTLE_TERRAIN_LORELEI}, + {MAP_BATTLE_SCENE_BRUNO, BATTLE_TERRAIN_BRUNO}, + {MAP_BATTLE_SCENE_AGATHA, BATTLE_TERRAIN_AGATHA}, + {MAP_BATTLE_SCENE_LANCE, BATTLE_TERRAIN_LANCE}, + {MAP_BATTLE_SCENE_LINK, BATTLE_TERRAIN_LINK} +}; + +UNUSED void CreateUnknownDebugSprite(void) +{ + u8 spriteId; + + ResetSpriteData(); + spriteId = CreateSprite(&gUnknown_824EFF0, 0, 0, 0); + gSprites[spriteId].invisible = TRUE; + SetMainCallback2(CB2_unused); +} + +static void CB2_unused(void) +{ + AnimateSprites(); + BuildOamBuffer(); +} + +static u8 GetBattleTerrainByMapScene(u8 mapBattleScene) +{ + int i; + for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++) + { + if (mapBattleScene == sMapBattleSceneMapping[i].mapScene) + return sMapBattleSceneMapping[i].battleTerrain; + } + return 9; +} + +static void LoadBattleTerrainGfx(u16 terrain) +{ + if (terrain >= NELEMS(sBattleTerrainTable)) + terrain = 9; + // Copy to bg3 + LZDecompressVram(sBattleTerrainTable[terrain].tileset, (void *)BG_CHAR_ADDR(2)); + LZDecompressVram(sBattleTerrainTable[terrain].tilemap, (void *)BG_SCREEN_ADDR(26)); + LoadCompressedPalette(sBattleTerrainTable[terrain].palette, 0x20, 0x60); +} + +static void LoadBattleTerrainEntryGfx(u16 terrain) +{ + if (terrain >= NELEMS(sBattleTerrainTable)) + terrain = 9; + // Copy to bg1 + LZDecompressVram(sBattleTerrainTable[terrain].entryTileset, (void *)BG_CHAR_ADDR(1)); + LZDecompressVram(sBattleTerrainTable[terrain].entryTilemap, (void *)BG_SCREEN_ADDR(28)); +} + +UNUSED void GetBattleTerrainGfxPtrs(u8 terrain, const u32 **tilesPtr, const u32 **mapPtr, const u32 **palPtr) +{ + if (terrain > 9) + terrain = 9; + *tilesPtr = sBattleTerrainTable[terrain].tileset; + *mapPtr = sBattleTerrainTable[terrain].tilemap; + *palPtr = sBattleTerrainTable[terrain].palette; +} + +void sub_800F324(void) +{ + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, gBattleBgTemplates, NELEMS(gBattleBgTemplates)); + InitWindows(gUnknown_8248330); + DeactivateAllTextPrinters(); +} + +void InitBattleBgsVideo(void) +{ + EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + sub_800F324(); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON); +} + +void LoadBattleMenuWindowGfx(void) +{ + TextWindow_SetUserSelectedFrame(2, 0x012, 0x10); + TextWindow_SetUserSelectedFrame(2, 0x022, 0x10); + gPlttBufferUnfaded[0x5C] = RGB( 9, 9, 9); + gPlttBufferUnfaded[0x5D] = RGB( 9, 9, 9); + gPlttBufferUnfaded[0x5E] = RGB(31, 31, 31); + gPlttBufferUnfaded[0x5F] = RGB( 26, 26, 25); + CpuCopy16(&gPlttBufferUnfaded[0x5C], &gPlttBufferFaded[0x5C], 8); + if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_POKEDUDE)) + { + Menu_LoadStdPalAt(0x70); + TextWindow_LoadResourcesStdFrame0(0, 0x030, 0x70); + gPlttBufferUnfaded[0x76] = RGB( 0, 0, 0); + CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2); + } +} + +void DrawMainBattleBackground(void) +{ + LoadBattleTerrainGfx(GetBattleTerrainOverride()); +} + +void LoadBattleTextboxAndBackground(void) +{ + LZDecompressVram(gBattleTextboxTiles, (void *)BG_CHAR_ADDR(0)); + CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0x000); + CopyBgTilemapBufferToVram(0); + LoadCompressedPalette(gBattleTextboxPalette, 0x00, 0x40); + LoadBattleMenuWindowGfx(); + DrawMainBattleBackground(); +} + +static void DrawLinkBattleParticipantPokeballs(u8 taskId, u8 multiplayerId, u8 bgId, u8 destX, u8 destY) +{ + s32 i; + u16 pokeballStatuses = 0; + u16 tiles[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (gTasks[taskId].data[5] != 0) + { + switch (multiplayerId) + { + case 0: + pokeballStatuses = 0x3F & gTasks[taskId].data[3]; + break; + case 1: + pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6; + break; + case 2: + pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6; + break; + case 3: + pokeballStatuses = 0x3F & gTasks[taskId].data[4]; + break; + } + } + else + { + switch (multiplayerId) + { + case 0: + pokeballStatuses = 0x3F & gTasks[taskId].data[3]; + break; + case 1: + pokeballStatuses = 0x3F & gTasks[taskId].data[4]; + break; + case 2: + pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6; + break; + case 3: + pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6; + break; + } + } + + for (i = 0; i < 3; i++) + tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001; + + CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 3, 1, 0x11); + CopyBgTilemapBufferToVram(bgId); + } + else + { + if (multiplayerId == gBattleStruct->multiplayerId) + pokeballStatuses = gTasks[taskId].data[3]; + else + pokeballStatuses = gTasks[taskId].data[4]; + + for (i = 0; i < 6; i++) + tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001; + + CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 6, 1, 0x11); + CopyBgTilemapBufferToVram(bgId); + } +} + +static void DrawLinkBattleVsScreenOutcomeText(void) +{ + if (gBattleOutcome == B_OUTCOME_DREW) + { + BattlePutTextOnWindow(gText_Draw, 0x15); + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (gBattleOutcome == B_OUTCOME_WON) + { + switch (gLinkPlayers[gBattleStruct->multiplayerId].id) + { + case 0: + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + break; + case 1: + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + break; + case 2: + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + break; + case 3: + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + break; + } + } + else + { + switch (gLinkPlayers[gBattleStruct->multiplayerId].id) + { + case 0: + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + break; + case 1: + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + break; + case 2: + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + break; + case 3: + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + break; + } + } + } + else if (gBattleOutcome == B_OUTCOME_WON) + { + if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0) + { + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + } + else + { + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + } + } + else + { + if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0) + { + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); + } + else + { + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); + } + } +} + +void InitLinkBattleVsScreen(u8 taskId) +{ + struct LinkPlayer *linkPlayer; + u8 *name; + s32 i, palId; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + name = gLinkPlayers[i].name; + linkPlayer = &gLinkPlayers[i]; + + switch (linkPlayer->id) + { + case 0: + BattlePutTextOnWindow(name, 0x11); + DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 4); + break; + case 1: + BattlePutTextOnWindow(name, 0x12); + DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 4); + break; + case 2: + BattlePutTextOnWindow(name, 0x13); + DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 8); + break; + case 3: + BattlePutTextOnWindow(name, 0x14); + DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 8); + break; + } + } + } + else + { + u8 playerId = gBattleStruct->multiplayerId; + u8 opponentId = playerId ^ BIT_SIDE; + u8 opponentId_copy = opponentId; + + if (gLinkPlayers[playerId].id != 0) + opponentId = playerId, playerId = opponentId_copy; + + name = gLinkPlayers[playerId].name; + BattlePutTextOnWindow(name, 0xF); + + name = gLinkPlayers[opponentId].name; + BattlePutTextOnWindow(name, 0x10); + + DrawLinkBattleParticipantPokeballs(taskId, playerId, 1, 2, 7); + DrawLinkBattleParticipantPokeballs(taskId, opponentId, 2, 2, 7); + } + gTasks[taskId].data[0]++; + break; + case 1: + palId = AllocSpritePalette(TAG_VS_LETTERS); + gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = RGB(31, 31, 31); + gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&sVsLetter_V_SpriteTemplate, 108, 80, 0); + gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&sVsLetter_S_SpriteTemplate, 132, 80, 0); + gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = TRUE; + gTasks[taskId].data[0]++; + break; + case 2: + if (gTasks[taskId].data[5] != 0) + { + gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG1_Y = -36; + gBattle_BG2_Y = -36; + } + else + { + gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164; + gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164; + } + + if (gTasks[taskId].data[2] != 0) + { + gTasks[taskId].data[2] -= 2; + gTasks[taskId].data[1] += 2; + } + else + { + if (gTasks[taskId].data[5] != 0) + DrawLinkBattleVsScreenOutcomeText(); + + PlaySE(SE_W231); + DestroyTask(taskId); + gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = FALSE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = FALSE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.tileNum += 0x40; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[0] = 0; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[0] = 1; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_V].pos1.x; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_S].pos1.x; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[2] = 0; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[2] = 0; + } + break; + } +} + +void DrawBattleEntryBackground(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + LZDecompressVram(gFile_graphics_battle_transitions_vs_frame_sheet, (void*)(BG_CHAR_ADDR(1))); + LZDecompressVram(gVsLettersGfx, (void*)(VRAM + 0x10000)); + LoadCompressedPalette(gFile_graphics_battle_transitions_vs_frame_palette, 0x60, 0x20); + SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT512x256); + CopyToBgTilemapBuffer(1, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0); + CopyToBgTilemapBuffer(2, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + gBattle_BG1_Y = -164; + gBattle_BG2_Y = -164; + LoadCompressedSpriteSheetUsingHeap(&sVsLettersSpriteSheet); + } + else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_GRASS); + } + else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); + } + else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + { + if (gGameVersion == VERSION_FIRE_RED) + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_CAVE); + } + else + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_WATER); + } + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass; + if (trainerClass == CLASS_LEADER_2) + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); + return; + } + else if (trainerClass == CLASS_CHAMPION_2) + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); + return; + } + } + + if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL) + { + LoadBattleTerrainEntryGfx(gBattleTerrain); + } + else + { + LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); + } + } +} + +static u8 GetBattleTerrainOverride(void) +{ + u8 battleScene; + if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) + { + return BATTLE_TERRAIN_LINK; + } + else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) + { + gBattleTerrain = BATTLE_TERRAIN_GRASS; + return BATTLE_TERRAIN_GRASS; + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER_2) + { + return BATTLE_TERRAIN_LEADER; + } + else if (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION_2) + { + return BATTLE_TERRAIN_CHAMPION; + } + } + battleScene = GetCurrentMapBattleScene(); + if (battleScene == MAP_BATTLE_SCENE_NORMAL) + { + return gBattleTerrain; + } + return GetBattleTerrainByMapScene(battleScene); +} + +bool8 LoadChosenBattleElement(u8 caseId) +{ + bool8 ret = FALSE; + u8 battleScene; + switch (caseId) + { + case 0: + LZDecompressVram(gBattleTextboxTiles, (void *)BG_CHAR_ADDR(0)); + break; + case 1: + CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0x000); + CopyBgTilemapBufferToVram(0); + break; + case 2: + LoadCompressedPalette(gBattleTextboxPalette, 0x00, 0x40); + break; + case 3: + battleScene = GetBattleTerrainOverride(); + LZDecompressVram(sBattleTerrainTable[battleScene].tileset, (void *)BG_CHAR_ADDR(2)); + // fallthrough + case 4: + battleScene = GetBattleTerrainOverride(); + LZDecompressVram(sBattleTerrainTable[battleScene].tilemap, (void *)BG_SCREEN_ADDR(26)); + break; + case 5: + battleScene = GetBattleTerrainOverride(); + LoadCompressedPalette(sBattleTerrainTable[battleScene].palette, 0x20, 0x60); + break; + case 6: + LoadBattleMenuWindowGfx(); + break; + default: + ret = TRUE; + break; + } + return ret; +} |