mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-18 12:37:38 +01:00
755 lines
28 KiB
C
755 lines
28 KiB
C
|
#include "global.h"
|
||
|
#include "battle.h"
|
||
|
#include "sprite.h"
|
||
|
#include "trainer_classes.h"
|
||
|
#include "graphics.h"
|
||
|
#include "decompress.h"
|
||
|
#include "bg.h"
|
||
|
#include "palette.h"
|
||
|
#include "main.h"
|
||
|
#include "gpu_regs.h"
|
||
|
#include "link.h"
|
||
|
#include "battle_message.h"
|
||
|
#include "task.h"
|
||
|
#include "trig.h"
|
||
|
#include "sound.h"
|
||
|
#include "songs.h"
|
||
|
#include "strings.h"
|
||
|
#include "window.h"
|
||
|
#include "text_window.h"
|
||
|
#include "new_menu_helpers.h"
|
||
|
|
||
|
struct BattleBackground
|
||
|
{
|
||
|
const void *tileset;
|
||
|
const void *tilemap;
|
||
|
const void *entryTileset;
|
||
|
const void *entryTilemap;
|
||
|
const void *palette;
|
||
|
};
|
||
|
|
||
|
extern const struct SpriteTemplate gUnknown_0831A9D0;
|
||
|
extern const struct SpriteTemplate gUnknown_0831A9E8;
|
||
|
extern const struct CompressedSpriteSheet gUnknown_0831AA00;
|
||
|
extern const struct BgTemplate gUnknown_0831AA08[4];
|
||
|
extern const struct WindowTemplate *gUnknown_0831ABA0[];
|
||
|
extern const struct BattleBackground gBattleTerrainTable[];
|
||
|
|
||
|
extern u8 gBattleTerrain;
|
||
|
extern u16 gTrainerBattleOpponent_A;
|
||
|
extern u16 gBattle_BG1_X;
|
||
|
extern u16 gBattle_BG1_Y;
|
||
|
extern u16 gBattle_BG2_X;
|
||
|
extern u16 gBattle_BG2_Y;
|
||
|
extern u16 gPartnerTrainerId;
|
||
|
|
||
|
extern u8 GetCurrentMapBattleScene(void);
|
||
|
|
||
|
void sub_8035658(void)
|
||
|
{
|
||
|
ResetBgsAndClearDma3BusyFlags(0);
|
||
|
InitBgsFromTemplates(0, gUnknown_0831AA08, ARRAY_COUNT(gUnknown_0831AA08));
|
||
|
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
|
||
|
{
|
||
|
gBattleScripting.field_24 = 1;
|
||
|
SetBgTilemapBuffer(1, gUnknown_02023060);
|
||
|
SetBgTilemapBuffer(2, gUnknown_02023060);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
gBattleScripting.field_24 = 0;
|
||
|
}
|
||
|
|
||
|
InitWindows(gUnknown_0831ABA0[gBattleScripting.field_24]);
|
||
|
DeactivateAllTextPrinters();
|
||
|
}
|
||
|
|
||
|
void sub_80356D0(void)
|
||
|
{
|
||
|
DisableInterrupts(INTR_FLAG_HBLANK);
|
||
|
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
|
||
|
sub_8035658();
|
||
|
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||
|
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||
|
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||
|
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
|
||
|
}
|
||
|
|
||
|
void ApplyPlayerChosenFrameToBattleMenu(void)
|
||
|
{
|
||
|
sub_809882C(2, 0x12, 0x10);
|
||
|
sub_809882C(2, 0x22, 0x10);
|
||
|
LoadCompressedPalette(gUnknown_08D85600, 0x50, 0x20);
|
||
|
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
|
||
|
{
|
||
|
sub_81978B0(0x70);
|
||
|
copy_textbox_border_tile_patterns_to_vram(0, 0x30, 0x70);
|
||
|
gPlttBufferUnfaded[0x76] = 0;
|
||
|
CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DrawMainBattleBackground(void)
|
||
|
{
|
||
|
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000))
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_KYORGE)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, 0x20, 0x60);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||
|
{
|
||
|
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||
|
if (trainerClass == CLASS_LEADER)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
|
||
|
return;
|
||
|
}
|
||
|
else if (trainerClass == CLASS_CHAMPION)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (GetCurrentMapBattleScene())
|
||
|
{
|
||
|
default:
|
||
|
case MAP_BATTLE_SCENE_NORMAL:
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GYM:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_MAGMA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_AQUA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_SIDNEY:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_PHOEBE:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GLACIA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_DRAKE:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_FRONTIER:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void LoadBattleTextboxAndBackground(void)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
|
||
|
CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
|
||
|
CopyBgTilemapBufferToVram(0);
|
||
|
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
|
||
|
ApplyPlayerChosenFrameToBattleMenu();
|
||
|
|
||
|
DrawMainBattleBackground();
|
||
|
}
|
||
|
|
||
|
static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY)
|
||
|
{
|
||
|
s32 i;
|
||
|
u16 var = 0;
|
||
|
u16 src[6];
|
||
|
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
|
||
|
{
|
||
|
if (gTasks[taskId].data[5] != 0)
|
||
|
{
|
||
|
switch (bank)
|
||
|
{
|
||
|
case 0:
|
||
|
var = 0x3F & gTasks[taskId].data[3];
|
||
|
break;
|
||
|
case 1:
|
||
|
var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
|
||
|
break;
|
||
|
case 2:
|
||
|
var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
|
||
|
break;
|
||
|
case 3:
|
||
|
var = 0x3F & gTasks[taskId].data[4];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (bank)
|
||
|
{
|
||
|
case 0:
|
||
|
var = 0x3F & gTasks[taskId].data[3];
|
||
|
break;
|
||
|
case 1:
|
||
|
var = 0x3F & gTasks[taskId].data[4];
|
||
|
break;
|
||
|
case 2:
|
||
|
var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
|
||
|
break;
|
||
|
case 3:
|
||
|
var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < 3; i++)
|
||
|
{
|
||
|
src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
|
||
|
}
|
||
|
|
||
|
CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 3, 1, 0x11);
|
||
|
CopyBgTilemapBufferToVram(bgId);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (bank == gBattleScripting.multiplayerId)
|
||
|
var = gTasks[taskId].data[3];
|
||
|
else
|
||
|
var = gTasks[taskId].data[4];
|
||
|
|
||
|
for (i = 0; i < 6; i++)
|
||
|
{
|
||
|
src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
|
||
|
}
|
||
|
|
||
|
CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 6, 1, 0x11);
|
||
|
CopyBgTilemapBufferToVram(bgId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void sub_8035C4C(void)
|
||
|
{
|
||
|
if (gBattleOutcome == BATTLE_DREW)
|
||
|
{
|
||
|
BattleHandleAddTextPrinter(gText_Draw, 0x15);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
|
||
|
{
|
||
|
if (gBattleOutcome == BATTLE_WON)
|
||
|
{
|
||
|
switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18)
|
||
|
{
|
||
|
case 0:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
break;
|
||
|
case 1:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
break;
|
||
|
case 2:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
break;
|
||
|
case 3:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18)
|
||
|
{
|
||
|
case 0:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
break;
|
||
|
case 1:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
break;
|
||
|
case 2:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
break;
|
||
|
case 3:
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (gBattleOutcome == BATTLE_WON)
|
||
|
{
|
||
|
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0)
|
||
|
{
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0)
|
||
|
{
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x16);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x17);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
BattleHandleAddTextPrinter(gText_Win, 0x17);
|
||
|
BattleHandleAddTextPrinter(gText_Loss, 0x16);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void sub_8035D74(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 < BATTLE_BANKS_COUNT; i++)
|
||
|
{
|
||
|
name = gLinkPlayers[i].name;
|
||
|
linkPlayer = &gLinkPlayers[i];
|
||
|
|
||
|
switch (linkPlayer->lp_field_18)
|
||
|
{
|
||
|
case 0:
|
||
|
BattleHandleAddTextPrinter(name, 0x11);
|
||
|
sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 4);
|
||
|
break;
|
||
|
case 1:
|
||
|
BattleHandleAddTextPrinter(name, 0x12);
|
||
|
sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 4);
|
||
|
break;
|
||
|
case 2:
|
||
|
BattleHandleAddTextPrinter(name, 0x13);
|
||
|
sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 8);
|
||
|
break;
|
||
|
case 3:
|
||
|
BattleHandleAddTextPrinter(name, 0x14);
|
||
|
sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 8);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
u8 playerId = gBattleScripting.multiplayerId;
|
||
|
u8 opponentId = playerId ^ BIT_SIDE;
|
||
|
u8 opponentId_copy = opponentId;
|
||
|
|
||
|
if (gLinkPlayers[playerId].lp_field_18 != 0)
|
||
|
opponentId = playerId, playerId = opponentId_copy;
|
||
|
|
||
|
name = gLinkPlayers[playerId].name;
|
||
|
BattleHandleAddTextPrinter(name, 0xF);
|
||
|
|
||
|
name = gLinkPlayers[opponentId].name;
|
||
|
BattleHandleAddTextPrinter(name, 0x10);
|
||
|
|
||
|
sub_8035AE4(taskId, playerId, 1, 2, 7);
|
||
|
sub_8035AE4(taskId, opponentId, 2, 2, 7);
|
||
|
}
|
||
|
gTasks[taskId].data[0]++;
|
||
|
break;
|
||
|
case 1:
|
||
|
palId = AllocSpritePalette(0x2710);
|
||
|
gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = 0x7FFF;
|
||
|
gBattleStruct->field_7D = CreateSprite(&gUnknown_0831A9D0, 111, 80, 0);
|
||
|
gBattleStruct->field_7E = CreateSprite(&gUnknown_0831A9E8, 129, 80, 0);
|
||
|
gSprites[gBattleStruct->field_7D].invisible = 1;
|
||
|
gSprites[gBattleStruct->field_7E].invisible = 1;
|
||
|
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)
|
||
|
sub_8035C4C();
|
||
|
|
||
|
PlaySE(SE_W231);
|
||
|
DestroyTask(taskId);
|
||
|
gSprites[gBattleStruct->field_7D].invisible = 0;
|
||
|
gSprites[gBattleStruct->field_7E].invisible = 0;
|
||
|
gSprites[gBattleStruct->field_7E].oam.tileNum += 0x40;
|
||
|
gSprites[gBattleStruct->field_7D].data[0] = 0;
|
||
|
gSprites[gBattleStruct->field_7E].data[0] = 1;
|
||
|
gSprites[gBattleStruct->field_7D].data[1] = gSprites[gBattleStruct->field_7D].pos1.x;
|
||
|
gSprites[gBattleStruct->field_7E].data[1] = gSprites[gBattleStruct->field_7E].pos1.x;
|
||
|
gSprites[gBattleStruct->field_7D].data[2] = 0;
|
||
|
gSprites[gBattleStruct->field_7E].data[2] = 0;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void LoadBattleEntryBackground(void)
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||
|
{
|
||
|
LZDecompressVram(gUnknown_08D778F0, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gUnknown_08D77B0C, (void*)(VRAM + 0x10000));
|
||
|
LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20);
|
||
|
SetBgAttribute(1, BG_CTRL_ATTR_MAPBASEINDEX, 1);
|
||
|
SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04);
|
||
|
CopyToBgTilemapBuffer(1, gUnknown_08D779D8, 0, 0);
|
||
|
CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0);
|
||
|
CopyBgTilemapBufferToVram(1);
|
||
|
CopyBgTilemapBufferToVram(2);
|
||
|
SetGpuReg(REG_OFFSET_WININ, 0x36);
|
||
|
SetGpuReg(REG_OFFSET_WINOUT, 0x36);
|
||
|
gBattle_BG1_Y = 0xFF5C;
|
||
|
gBattle_BG2_Y = 0xFF5C;
|
||
|
LoadCompressedObjectPicUsingHeap(&gUnknown_0831AA00);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
|
||
|
{
|
||
|
if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == STEVEN_PARTNER_ID)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 2);
|
||
|
SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 2);
|
||
|
CopyToBgTilemapBuffer(1, gUnknown_08D857A8, 0, 0);
|
||
|
CopyToBgTilemapBuffer(2, gUnknown_08D85A1C, 0, 0);
|
||
|
CopyBgTilemapBufferToVram(1);
|
||
|
CopyBgTilemapBufferToVram(2);
|
||
|
}
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_KYORGE)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Rayquaza, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Rayquaza, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||
|
{
|
||
|
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||
|
if (trainerClass == CLASS_LEADER)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
|
||
|
return;
|
||
|
}
|
||
|
else if (trainerClass == CLASS_CHAMPION)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTileset, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
|
||
|
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool8 LoadChosenBattleElement(u8 caseId)
|
||
|
{
|
||
|
bool8 ret = FALSE;
|
||
|
|
||
|
switch (caseId)
|
||
|
{
|
||
|
case 0:
|
||
|
LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
|
||
|
break;
|
||
|
case 1:
|
||
|
CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
|
||
|
CopyBgTilemapBufferToVram(0);
|
||
|
break;
|
||
|
case 2:
|
||
|
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
|
||
|
break;
|
||
|
case 3:
|
||
|
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||
|
{
|
||
|
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||
|
if (trainerClass == CLASS_LEADER)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
}
|
||
|
else if (trainerClass == CLASS_CHAMPION)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (GetCurrentMapBattleScene())
|
||
|
{
|
||
|
default:
|
||
|
case MAP_BATTLE_SCENE_NORMAL:
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GYM:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_MAGMA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_AQUA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_SIDNEY:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_PHOEBE:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GLACIA:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_DRAKE:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_FRONTIER:
|
||
|
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 4:
|
||
|
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
|
||
|
{
|
||
|
if (gGameVersion == VERSION_RUBY)
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
|
||
|
else
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||
|
{
|
||
|
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||
|
if (trainerClass == CLASS_LEADER)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
}
|
||
|
else if (trainerClass == CLASS_CHAMPION)
|
||
|
{
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (GetCurrentMapBattleScene())
|
||
|
{
|
||
|
default:
|
||
|
case MAP_BATTLE_SCENE_NORMAL:
|
||
|
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GYM:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_MAGMA:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_AQUA:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_SIDNEY:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_PHOEBE:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GLACIA:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_DRAKE:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_FRONTIER:
|
||
|
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 5:
|
||
|
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
|
||
|
{
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
|
||
|
}
|
||
|
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
|
||
|
{
|
||
|
if (gGameVersion == VERSION_RUBY)
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
|
||
|
else
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||
|
{
|
||
|
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||
|
if (trainerClass == CLASS_LEADER)
|
||
|
{
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
|
||
|
break;
|
||
|
}
|
||
|
else if (trainerClass == CLASS_CHAMPION)
|
||
|
{
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (GetCurrentMapBattleScene())
|
||
|
{
|
||
|
default:
|
||
|
case MAP_BATTLE_SCENE_NORMAL:
|
||
|
LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GYM:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_MAGMA:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_AQUA:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_SIDNEY:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_PHOEBE:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_GLACIA:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_DRAKE:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
|
||
|
break;
|
||
|
case MAP_BATTLE_SCENE_FRONTIER:
|
||
|
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 6:
|
||
|
ApplyPlayerChosenFrameToBattleMenu();
|
||
|
break;
|
||
|
default:
|
||
|
ret = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|