Refactor battle environment (#4891)

This commit is contained in:
Frank DeBlasio 2025-07-12 12:38:06 -04:00 committed by GitHub
parent 2dc67ab156
commit c9ec896312
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 584 additions and 619 deletions

View File

@ -27586,7 +27586,7 @@ gBattleAnimMove_RazorLeaf::
end
gBattleAnimMove_NaturePower::
@ No actual animation, uses the animation of a move from sNaturePowerMoves instead
@ No actual animation, uses the animation of a move from gBattleEnvironmentInfo.naturePower instead
gBattleAnimMove_AncientPower::
loadspritegfx ANIM_TAG_ROCKS

View File

@ -0,0 +1,17 @@
#ifndef GUARD_BATTLE_ENVIRONMENT_H
#define GUARD_BATTLE_ENVIRONMENT_H
#include "constants/battle.h"
#include "battle_bg.h"
struct BattleEnvironment {
u8 name[26];
u16 naturePower;
u16 secretPowerEffect;
u8 camouflageType;
struct BattleBackground background;
};
extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT];
#endif // GUARD_BATTLE_ENVIRONMENT_H

View File

@ -60,7 +60,7 @@ void BattleSetup_StartLatiBattle(void);
void BattleSetup_StartLegendaryBattle(void);
void StartGroudonKyogreBattle(void);
void StartRegiBattle(void);
enum BattleEnvironment BattleSetup_GetEnvironmentId(void);
enum BattleEnvironments BattleSetup_GetEnvironmentId(void);
u8 GetWildBattleTransition(void);
u8 GetTrainerBattleTransition(void);
u8 GetSpecialBattleTransition(s32 id);

View File

@ -262,7 +262,7 @@
#define B_TERRAIN_TYPE_BOOST GEN_LATEST // In Gen8, damage is boosted by 30% instead of 50%.
#define B_SECRET_POWER_EFFECT GEN_LATEST // Secret Power's effects change depending on terrain and generation. See MOVE_EFFECT_SECRET_POWER's case in `SetMoveEffect`.
#define B_SECRET_POWER_ANIMATION GEN_LATEST // Secret Power's animations change depending on terrain and generation.
#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See sNaturePowerMoves.
#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See gBattleEnvironmentInfo.
#define B_CAMOUFLAGE_TYPES GEN_LATEST // Camouflage changes the user to different types depending on terrain and generation. See sTerrainToType.
#define B_NEW_TERRAIN_BACKGROUNDS FALSE // If set to TRUE, uses new terrain backgrounds for Electric, Misty, Grassy and Psychic Terrain.

View File

@ -531,7 +531,7 @@ enum MoveEffects
#define MOVE_EFFECT_CONTINUE 0x8000
// Battle environment defines for gBattleEnvironment.
enum BattleEnvironment
enum BattleEnvironments
{
BATTLE_ENVIRONMENT_GRASS,
BATTLE_ENVIRONMENT_LONG_GRASS,
@ -543,6 +543,19 @@ enum BattleEnvironment
BATTLE_ENVIRONMENT_CAVE,
BATTLE_ENVIRONMENT_BUILDING,
BATTLE_ENVIRONMENT_PLAIN,
BATTLE_ENVIRONMENT_FRONTIER,
BATTLE_ENVIRONMENT_GYM,
BATTLE_ENVIRONMENT_LEADER,
BATTLE_ENVIRONMENT_MAGMA,
BATTLE_ENVIRONMENT_AQUA,
BATTLE_ENVIRONMENT_SIDNEY,
BATTLE_ENVIRONMENT_PHOEBE,
BATTLE_ENVIRONMENT_GLACIA,
BATTLE_ENVIRONMENT_DRAKE,
BATTLE_ENVIRONMENT_CHAMPION,
BATTLE_ENVIRONMENT_GROUDON,
BATTLE_ENVIRONMENT_KYOGRE,
BATTLE_ENVIRONMENT_RAYQUAZA,
// New battle environments are used for Secret Power but not fully implemented.
BATTLE_ENVIRONMENT_SOARING,
BATTLE_ENVIRONMENT_SKY_PILLAR,

View File

@ -61,8 +61,8 @@ enum FormChanges
// param2: a move that will be replaced, optional
// param3: a new move to replace it with, optional
FORM_CHANGE_END_BATTLE,
// Form change that activates at the end of a battle based on the terrain if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE.
// param1: battle terrain to check.
// Form change that activates at the end of a battle based on the environment if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE.
// param1: battle environment to check.
FORM_CHANGE_END_BATTLE_ENVIRONMENT,
// Form change that activates when the Pokémon is switched out in battle.
// param1: ability to check, optional

View File

@ -81,7 +81,7 @@ struct PokemonSpriteVisualizer
u8 animIdBack;
u8 animIdFront;
u8 battleBgType;
u8 battleTerrain;
u8 battleEnvironment;
u8 currentSubmenu;
u8 submenuYpos[3];
};

View File

@ -5,6 +5,7 @@
#include "battle_main.h"
#include "battle_message.h"
#include "battle_setup.h"
#include "battle_environment.h"
#include "bg.h"
#include "data.h"
#include "decompress.h"
@ -26,6 +27,7 @@
#include "constants/trainers.h"
#include "constants/battle_anim.h"
#include "constants/battle_partner.h"
#include "data/battle_environment.h"
// .rodata
@ -609,98 +611,75 @@ const struct WindowTemplate *const gBattleWindowTemplates[] =
[B_WIN_TYPE_ARENA] = sBattleArenaWindowTemplates,
};
const struct BattleBackground sBattleEnvironmentTable[] =
// If current map scene equals any of the values in sMapBattleSceneMapping,
// use its battle terrain value. Otherwise, use the default.
static u8 GetBattleEnvironmentByMapScene(u8 mapBattleScene)
{
[BATTLE_ENVIRONMENT_GRASS] =
int i;
for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++)
{
.tileset = gBattleEnvironmentTiles_TallGrass,
.tilemap = gBattleEnvironmentTilemap_TallGrass,
.entryTileset = gBattleEnvironmentAnimTiles_TallGrass,
.entryTilemap = gBattleEnvironmentAnimTilemap_TallGrass,
.palette = gBattleEnvironmentPalette_TallGrass,
},
if (mapBattleScene == sMapBattleSceneMapping[i].mapScene)
return sMapBattleSceneMapping[i].battleEnvironment;
}
return BATTLE_ENVIRONMENT_PLAIN;
}
[BATTLE_ENVIRONMENT_LONG_GRASS] =
{
.tileset = gBattleEnvironmentTiles_LongGrass,
.tilemap = gBattleEnvironmentTilemap_LongGrass,
.entryTileset = gBattleEnvironmentAnimTiles_LongGrass,
.entryTilemap = gBattleEnvironmentAnimTilemap_LongGrass,
.palette = gBattleEnvironmentPalette_LongGrass,
},
// Loads the initial battle terrain.
static void LoadBattleEnvironmentGfx(u16 terrain)
{
if (terrain >= NELEMS(gBattleEnvironmentInfo))
terrain = BATTLE_ENVIRONMENT_PLAIN; // If higher than the number of entries in gBattleEnvironmentInfo, use the default.
// Copy to bg3
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tileset, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tilemap, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentInfo[terrain].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
}
[BATTLE_ENVIRONMENT_SAND] =
{
.tileset = gBattleEnvironmentTiles_Sand,
.tilemap = gBattleEnvironmentTilemap_Sand,
.entryTileset = gBattleEnvironmentAnimTiles_Sand,
.entryTilemap = gBattleEnvironmentAnimTilemap_Sand,
.palette = gBattleEnvironmentPalette_Sand,
},
// Loads the entry associated with the battle terrain.
// This can be the grass moving on the screen at the start of a wild encounter in tall grass.
static void LoadBattleEnvironmentEntryGfx(u16 terrain)
{
if (terrain >= NELEMS(gBattleEnvironmentInfo))
terrain = BATTLE_ENVIRONMENT_PLAIN;
// Copy to bg1
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTileset, (void *)BG_CHAR_ADDR(1));
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTilemap, (void *)BG_SCREEN_ADDR(28));
}
[BATTLE_ENVIRONMENT_UNDERWATER] =
{
.tileset = gBattleEnvironmentTiles_Underwater,
.tilemap = gBattleEnvironmentTilemap_Underwater,
.entryTileset = gBattleEnvironmentAnimTiles_Underwater,
.entryTilemap = gBattleEnvironmentAnimTilemap_Underwater,
.palette = gBattleEnvironmentPalette_Underwater,
},
static u8 GetBattleEnvironmentOverride(void)
{
u8 battleScene = GetCurrentMapBattleScene();
[BATTLE_ENVIRONMENT_WATER] =
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER))
return BATTLE_ENVIRONMENT_FRONTIER;
else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
{
.tileset = gBattleEnvironmentTiles_Water,
.tilemap = gBattleEnvironmentTilemap_Water,
.entryTileset = gBattleEnvironmentAnimTiles_Water,
.entryTilemap = gBattleEnvironmentAnimTilemap_Water,
.palette = gBattleEnvironmentPalette_Water,
},
switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL))
{
case SPECIES_GROUDON:
return BATTLE_ENVIRONMENT_GROUDON;
case SPECIES_KYOGRE:
return BATTLE_ENVIRONMENT_KYOGRE;
case SPECIES_RAYQUAZA:
return BATTLE_ENVIRONMENT_RAYQUAZA;
default:
return gBattleEnvironment;
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
return BATTLE_ENVIRONMENT_LEADER;
else if (trainerClass == TRAINER_CLASS_CHAMPION)
return BATTLE_ENVIRONMENT_CHAMPION;
}
[BATTLE_ENVIRONMENT_POND] =
{
.tileset = gBattleEnvironmentTiles_PondWater,
.tilemap = gBattleEnvironmentTilemap_PondWater,
.entryTileset = gBattleEnvironmentAnimTiles_PondWater,
.entryTilemap = gBattleEnvironmentAnimTilemap_PondWater,
.palette = gBattleEnvironmentPalette_PondWater,
},
if (battleScene == MAP_BATTLE_SCENE_NORMAL)
return gBattleEnvironment;
[BATTLE_ENVIRONMENT_MOUNTAIN] =
{
.tileset = gBattleEnvironmentTiles_Rock,
.tilemap = gBattleEnvironmentTilemap_Rock,
.entryTileset = gBattleEnvironmentAnimTiles_Rock,
.entryTilemap = gBattleEnvironmentAnimTilemap_Rock,
.palette = gBattleEnvironmentPalette_Rock,
},
[BATTLE_ENVIRONMENT_CAVE] =
{
.tileset = gBattleEnvironmentTiles_Cave,
.tilemap = gBattleEnvironmentTilemap_Cave,
.entryTileset = gBattleEnvironmentAnimTiles_Cave,
.entryTilemap = gBattleEnvironmentAnimTilemap_Cave,
.palette = gBattleEnvironmentPalette_Cave,
},
[BATTLE_ENVIRONMENT_BUILDING] =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_Building,
},
[BATTLE_ENVIRONMENT_PLAIN] =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_Plain,
},
};
return GetBattleEnvironmentByMapScene(battleScene);
}
void BattleInitBgsAndWindows(void)
{
@ -751,109 +730,7 @@ void LoadBattleMenuWindowGfx(void)
void DrawMainBattleBackground(void)
{
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK))
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
}
else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
{
switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL))
{
case SPECIES_GROUDON:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case SPECIES_KYOGRE:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case SPECIES_RAYQUAZA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
default:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
return;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
return;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_GYM:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_MAGMA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_AQUA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_SIDNEY:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_PHOEBE:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_GLACIA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_DRAKE:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_FRONTIER:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
}
}
LoadBattleEnvironmentGfx(GetBattleEnvironmentOverride());
}
void LoadBattleTextboxAndBackground(void)
@ -1147,8 +1024,7 @@ void DrawBattleEntryBackground(void)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE))
{
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING);
}
else
{
@ -1167,20 +1043,17 @@ void DrawBattleEntryBackground(void)
switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL))
{
case SPECIES_GROUDON:
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_CAVE);
break;
case SPECIES_KYOGRE:
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_UNDERWATER);
break;
case SPECIES_RAYQUAZA:
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_RAYQUAZA);
break;
default:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28)));
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTileset, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTilemap, (void *)(BG_SCREEN_ADDR(28)));
break;
}
}
@ -1191,27 +1064,23 @@ void DrawBattleEntryBackground(void)
enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
{
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING);
return;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING);
return;
}
}
if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)
{
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(gBattleEnvironment);
}
else
{
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1)));
DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28)));
LoadBattleEnvironmentEntryGfx(gBattleEnvironment);
}
}
}
@ -1233,195 +1102,13 @@ bool8 LoadChosenBattleElement(u8 caseId)
LoadPalette(gBattleTextboxPalette, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP);
break;
case 3:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER))
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
}
else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
{
switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL))
{
case SPECIES_GROUDON:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2)));
break;
case SPECIES_KYOGRE:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(2)));
break;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_GYM:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_MAGMA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_AQUA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_SIDNEY:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_PHOEBE:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_GLACIA:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_DRAKE:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2)));
break;
case MAP_BATTLE_SCENE_FRONTIER:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2)));
break;
}
}
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tileset, (void *)(BG_CHAR_ADDR(2)));
break;
case 4:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER))
{
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
}
else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
{
if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON)
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26)));
else
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void *)(BG_SCREEN_ADDR(26)));
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_GYM:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_MAGMA:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_AQUA:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_SIDNEY:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_PHOEBE:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_GLACIA:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_DRAKE:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26)));
break;
case MAP_BATTLE_SCENE_FRONTIER:
DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26)));
break;
}
}
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tilemap, (void *)(BG_SCREEN_ADDR(26)));
break;
case 5:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER))
{
LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
}
else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
{
if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON)
LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
else
LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA);
if (trainerClass == TRAINER_CLASS_LEADER)
{
LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_GYM:
LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_MAGMA:
LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_AQUA:
LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_SIDNEY:
LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_PHOEBE:
LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_GLACIA:
LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_DRAKE:
LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case MAP_BATTLE_SCENE_FRONTIER:
LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
}
}
LoadPalette(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);
break;
case 6:
LoadBattleMenuWindowGfx();

View File

@ -5,6 +5,7 @@
#include "battle_ai_main.h"
#include "battle_ai_util.h"
#include "battle_scripts.h"
#include "battle_environment.h"
#include "battle_z_move.h"
#include "item.h"
#include "util.h"
@ -938,78 +939,6 @@ static const u16 sFinalStrikeOnlyEffects[] =
MOVE_EFFECT_WRAP,
};
static const u16 sNaturePowerMoves[BATTLE_ENVIRONMENT_COUNT] =
{
#if B_NATURE_POWER_MOVES >= GEN_7
[BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL,
[BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL,
[BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_SNOW] = MOVE_ICE_BEAM,
#elif B_NATURE_POWER_MOVES == GEN_6
[BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL,
[BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL,
[BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER,
[BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_SNOW] = MOVE_FROST_BREATH,
#elif B_NATURE_POWER_MOVES == GEN_5
[BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB,
[BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB,
[BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD,
#elif B_NATURE_POWER_MOVES == GEN_4
[BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB,
[BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB,
[BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE,
[BATTLE_ENVIRONMENT_CAVE] = MOVE_ROCK_SLIDE,
[BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD,
#else // Gen 1-3
[BATTLE_ENVIRONMENT_GRASS] = MOVE_STUN_SPORE,
[BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_RAZOR_LEAF,
[BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE,
[BATTLE_ENVIRONMENT_WATER] = MOVE_SURF,
[BATTLE_ENVIRONMENT_POND] = MOVE_BUBBLE_BEAM,
[BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE,
[BATTLE_ENVIRONMENT_CAVE] = MOVE_SHADOW_BALL,
[BATTLE_ENVIRONMENT_BUILDING] = MOVE_SWIFT,
[BATTLE_ENVIRONMENT_PLAIN] = MOVE_SWIFT,
[BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD,
#endif
[BATTLE_ENVIRONMENT_UNDERWATER] = MOVE_HYDRO_PUMP,
[BATTLE_ENVIRONMENT_SOARING] = MOVE_AIR_SLASH,
[BATTLE_ENVIRONMENT_SKY_PILLAR] = MOVE_AIR_SLASH,
[BATTLE_ENVIRONMENT_BURIAL_GROUND] = MOVE_SHADOW_BALL,
[BATTLE_ENVIRONMENT_PUDDLE] = MOVE_MUD_BOMB,
[BATTLE_ENVIRONMENT_MARSH] = MOVE_MUD_BOMB,
[BATTLE_ENVIRONMENT_SWAMP] = MOVE_MUD_BOMB,
[BATTLE_ENVIRONMENT_ICE] = MOVE_ICE_BEAM,
[BATTLE_ENVIRONMENT_VOLCANO] = MOVE_LAVA_PLUME,
[BATTLE_ENVIRONMENT_DISTORTION_WORLD] = MOVE_TRI_ATTACK,
[BATTLE_ENVIRONMENT_SPACE] = MOVE_DRACO_METEOR,
[BATTLE_ENVIRONMENT_ULTRA_SPACE] = MOVE_PSYSHOCK,
};
#define _ 0
static const struct PickupItem sPickupTable[] =
@ -1048,32 +977,6 @@ static const struct PickupItem sPickupTable[] =
#undef _
static const u8 sEnvironmentToType[BATTLE_ENVIRONMENT_COUNT] =
{
[BATTLE_ENVIRONMENT_GRASS] = TYPE_GRASS,
[BATTLE_ENVIRONMENT_LONG_GRASS] = TYPE_GRASS,
[BATTLE_ENVIRONMENT_SAND] = TYPE_GROUND,
[BATTLE_ENVIRONMENT_UNDERWATER] = TYPE_WATER,
[BATTLE_ENVIRONMENT_WATER] = TYPE_WATER,
[BATTLE_ENVIRONMENT_POND] = TYPE_WATER,
[BATTLE_ENVIRONMENT_CAVE] = TYPE_ROCK,
[BATTLE_ENVIRONMENT_BUILDING] = TYPE_NORMAL,
[BATTLE_ENVIRONMENT_SOARING] = TYPE_FLYING,
[BATTLE_ENVIRONMENT_SKY_PILLAR] = TYPE_FLYING,
[BATTLE_ENVIRONMENT_BURIAL_GROUND] = TYPE_GHOST,
[BATTLE_ENVIRONMENT_PUDDLE] = TYPE_GROUND,
[BATTLE_ENVIRONMENT_MARSH] = TYPE_GROUND,
[BATTLE_ENVIRONMENT_SWAMP] = TYPE_GROUND,
[BATTLE_ENVIRONMENT_SNOW] = TYPE_ICE,
[BATTLE_ENVIRONMENT_ICE] = TYPE_ICE,
[BATTLE_ENVIRONMENT_VOLCANO] = TYPE_FIRE,
[BATTLE_ENVIRONMENT_DISTORTION_WORLD] = TYPE_NORMAL,
[BATTLE_ENVIRONMENT_SPACE] = TYPE_DRAGON,
[BATTLE_ENVIRONMENT_ULTRA_SPACE] = TYPE_PSYCHIC,
[BATTLE_ENVIRONMENT_MOUNTAIN] = (B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK),
[BATTLE_ENVIRONMENT_PLAIN] = (B_CAMOUFLAGE_TYPES >= GEN_4 ? TYPE_GROUND : TYPE_NORMAL),
};
static bool32 NoTargetPresent(u8 battler, u32 move)
{
if (!IsBattlerAlive(gBattlerTarget))
@ -3703,64 +3606,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai
}
}
else
{
switch (gBattleEnvironment)
{
case BATTLE_ENVIRONMENT_GRASS:
gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON);
break;
case BATTLE_ENVIRONMENT_UNDERWATER:
gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1);
break;
case BATTLE_ENVIRONMENT_POND:
gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1);
break;
case BATTLE_ENVIRONMENT_MOUNTAIN:
if (B_SECRET_POWER_EFFECT >= GEN_5)
gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1;
else if (B_SECRET_POWER_EFFECT >= GEN_4)
gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH;
else
gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION;
break;
case BATTLE_ENVIRONMENT_PUDDLE:
gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1);
break;
case BATTLE_ENVIRONMENT_LONG_GRASS:
gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP;
break;
case BATTLE_ENVIRONMENT_SAND:
gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1;
break;
case BATTLE_ENVIRONMENT_WATER:
gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1;
break;
case BATTLE_ENVIRONMENT_CAVE:
case BATTLE_ENVIRONMENT_BURIAL_GROUND:
case BATTLE_ENVIRONMENT_SPACE:
gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH;
break;
case BATTLE_ENVIRONMENT_SOARING:
case BATTLE_ENVIRONMENT_SKY_PILLAR:
case BATTLE_ENVIRONMENT_MARSH:
case BATTLE_ENVIRONMENT_SWAMP:
gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1;
break;
case BATTLE_ENVIRONMENT_SNOW:
case BATTLE_ENVIRONMENT_ICE:
gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE;
break;
case BATTLE_ENVIRONMENT_VOLCANO:
gBattleScripting.moveEffect = MOVE_EFFECT_BURN;
break;
case BATTLE_ENVIRONMENT_ULTRA_SPACE:
gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1;
break;
default:
gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS;
break;
}
}
gBattleScripting.moveEffect = gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect;
SetMoveEffect(battler, effectBattler, primary, certain);
break;
case MOVE_EFFECT_PSYCHIC_NOISE:
@ -14483,7 +14329,7 @@ static void Cmd_callenvironmentattack(void)
u32 GetNaturePowerMove(u32 battler)
{
u32 move = sNaturePowerMoves[gBattleEnvironment];
u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower;
if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)
move = MOVE_MOONBLAST;
else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
@ -14492,7 +14338,7 @@ u32 GetNaturePowerMove(u32 battler)
move = MOVE_ENERGY_BALL;
else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)
move = MOVE_PSYCHIC;
else if (sNaturePowerMoves[gBattleEnvironment] == MOVE_NONE)
else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE)
move = MOVE_TRI_ATTACK;
if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE)
@ -15359,7 +15205,7 @@ static void Cmd_tryrecycleitem(void)
bool32 CanCamouflage(u8 battler)
{
if (IS_BATTLER_OF_TYPE(battler, sEnvironmentToType[gBattleEnvironment]))
if (IS_BATTLER_OF_TYPE(battler, gBattleEnvironmentInfo[gBattleEnvironment].camouflageType))
return FALSE;
return TRUE;
}
@ -15384,7 +15230,7 @@ static void Cmd_settypetoenvironment(void)
environmentType = TYPE_PSYCHIC;
break;
default:
environmentType = sEnvironmentToType[gBattleEnvironment];
environmentType = gBattleEnvironmentInfo[gBattleEnvironment].camouflageType;
break;
}

View File

@ -621,7 +621,7 @@ static void CB2_EndScriptedWildBattle(void)
}
}
enum BattleEnvironment BattleSetup_GetEnvironmentId(void)
enum BattleEnvironments BattleSetup_GetEnvironmentId(void)
{
u16 tileBehavior;
s16 x, y;

View File

@ -0,0 +1,434 @@
const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal");
const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal");
const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal");
const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM");
const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal");
const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles
const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM");
#define ENVIRONMENT_BACKGROUND(background) \
{ \
.tileset = gBattleEnvironmentTiles_##background, \
.tilemap = gBattleEnvironmentTilemap_##background, \
.entryTileset = gBattleEnvironmentAnimTiles_##background, \
.entryTilemap = gBattleEnvironmentAnimTilemap_##background, \
.palette = gBattleEnvironmentPalette_##background, \
}
const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT] =
{
[BATTLE_ENVIRONMENT_GRASS] =
{
#if B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_ENERGY_BALL,
#elif B_NATURE_POWER_MOVES >= GEN_4
.naturePower = MOVE_SEED_BOMB,
#else
.naturePower = MOVE_STUN_SPORE,
#endif
.secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON,
.camouflageType = TYPE_GRASS,
.background = ENVIRONMENT_BACKGROUND(TallGrass),
},
[BATTLE_ENVIRONMENT_LONG_GRASS] =
{
#if B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_ENERGY_BALL,
#elif B_NATURE_POWER_MOVES >= GEN_4
.naturePower = MOVE_SEED_BOMB,
#else
.naturePower = MOVE_RAZOR_LEAF,
#endif
.secretPowerEffect = MOVE_EFFECT_SLEEP,
.camouflageType = TYPE_GRASS,
.background = ENVIRONMENT_BACKGROUND(LongGrass),
},
[BATTLE_ENVIRONMENT_SAND] =
{
.naturePower = B_NATURE_POWER_MOVES >= GEN_6 ? MOVE_EARTH_POWER : MOVE_EARTHQUAKE,
.secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1,
.camouflageType = TYPE_GROUND,
.background = ENVIRONMENT_BACKGROUND(Sand),
},
[BATTLE_ENVIRONMENT_UNDERWATER] =
{
.naturePower = MOVE_HYDRO_PUMP,
.secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1,
.camouflageType = TYPE_WATER,
.background = ENVIRONMENT_BACKGROUND(Underwater),
},
[BATTLE_ENVIRONMENT_WATER] =
{
.naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_SURF,
.secretPowerEffect = MOVE_EFFECT_ATK_MINUS_1,
.camouflageType = TYPE_WATER,
.background = ENVIRONMENT_BACKGROUND(Water),
},
[BATTLE_ENVIRONMENT_POND] =
{
.naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_BUBBLE_BEAM,
.secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1,
.camouflageType = TYPE_WATER,
.background = ENVIRONMENT_BACKGROUND(PondWater),
},
[BATTLE_ENVIRONMENT_MOUNTAIN] =
{
#if B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_EARTH_POWER,
#elif B_NATURE_POWER_MOVES >= GEN_5
.naturePower = MOVE_EARTHQUAKE,
#else
.naturePower = MOVE_ROCK_SLIDE,
#endif
#if B_SECRET_POWER_EFFECT >= GEN_5
.secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1,
#elif B_SECRET_POWER_EFFECT >= GEN_4
.secretPowerEffect = MOVE_EFFECT_FLINCH,
#else
.secretPowerEffect = MOVE_EFFECT_CONFUSION,
#endif
.camouflageType = B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK,
.background = ENVIRONMENT_BACKGROUND(Rock),
},
[BATTLE_ENVIRONMENT_CAVE] =
{
#if B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_EARTH_POWER,
#elif B_NATURE_POWER_MOVES >= GEN_5
.naturePower = MOVE_EARTHQUAKE,
#elif B_NATURE_POWER_MOVES >= GEN_4
.naturePower = MOVE_ROCK_SLIDE,
#else
.naturePower = MOVE_SHADOW_BALL,
#endif
.secretPowerEffect = MOVE_EFFECT_FLINCH,
.camouflageType = TYPE_ROCK,
.background = ENVIRONMENT_BACKGROUND(Cave),
},
[BATTLE_ENVIRONMENT_BUILDING] =
{
.naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT,
.secretPowerEffect = MOVE_EFFECT_PARALYSIS,
.camouflageType = TYPE_NORMAL,
.background = ENVIRONMENT_BACKGROUND(Building),
},
[BATTLE_ENVIRONMENT_PLAIN] =
{
#if B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_TRI_ATTACK,
#elif B_NATURE_POWER_MOVES >= GEN_4
.naturePower = MOVE_EARTHQUAKE,
#else
.naturePower = MOVE_SWIFT,
#endif
.secretPowerEffect = MOVE_EFFECT_PARALYSIS,
.camouflageType = B_CAMOUFLAGE_TYPES >= GEN_4 ? TYPE_GROUND : TYPE_NORMAL,
.background =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_Plain,
},
},
[BATTLE_ENVIRONMENT_FRONTIER] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_Frontier,
},
},
[BATTLE_ENVIRONMENT_GYM] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_BuildingGym,
},
},
[BATTLE_ENVIRONMENT_LEADER] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Building,
.tilemap = gBattleEnvironmentTilemap_Building,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_BuildingLeader,
},
},
[BATTLE_ENVIRONMENT_MAGMA] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumMagma,
},
},
[BATTLE_ENVIRONMENT_AQUA] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumAqua,
},
},
[BATTLE_ENVIRONMENT_SIDNEY] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumSidney,
},
},
[BATTLE_ENVIRONMENT_PHOEBE] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumPhoebe,
},
},
[BATTLE_ENVIRONMENT_GLACIA] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumGlacia,
},
},
[BATTLE_ENVIRONMENT_DRAKE] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumDrake,
},
},
[BATTLE_ENVIRONMENT_CHAMPION] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Stadium,
.tilemap = gBattleEnvironmentTilemap_Stadium,
.entryTileset = gBattleEnvironmentAnimTiles_Building,
.entryTilemap = gBattleEnvironmentAnimTilemap_Building,
.palette = gBattleEnvironmentPalette_StadiumWallace,
},
},
[BATTLE_ENVIRONMENT_GROUDON] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Cave,
.tilemap = gBattleEnvironmentTilemap_Cave,
.entryTileset = gBattleEnvironmentAnimTiles_Cave,
.entryTilemap = gBattleEnvironmentAnimTilemap_Cave,
.palette = gBattleEnvironmentPalette_Groudon,
},
},
[BATTLE_ENVIRONMENT_KYOGRE] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Water,
.tilemap = gBattleEnvironmentTilemap_Water,
.entryTileset = gBattleEnvironmentAnimTiles_Underwater,
.entryTilemap = gBattleEnvironmentAnimTilemap_Underwater,
.palette = gBattleEnvironmentPalette_Kyogre,
},
},
[BATTLE_ENVIRONMENT_RAYQUAZA] =
{
.background =
{
.tileset = gBattleEnvironmentTiles_Rayquaza,
.tilemap = gBattleEnvironmentTilemap_Rayquaza,
.entryTileset = gBattleEnvironmentAnimTiles_Rayquaza,
.entryTilemap = gBattleEnvironmentAnimTilemap_Rayquaza,
.palette = gBattleEnvironmentPalette_Rayquaza,
},
},
[BATTLE_ENVIRONMENT_SOARING] =
{
.naturePower = MOVE_AIR_SLASH,
.secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1,
.camouflageType = TYPE_FLYING,
},
[BATTLE_ENVIRONMENT_SKY_PILLAR] =
{
.naturePower = MOVE_AIR_SLASH,
.secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1,
.camouflageType = TYPE_FLYING,
},
[BATTLE_ENVIRONMENT_BURIAL_GROUND] =
{
.naturePower = MOVE_SHADOW_BALL,
.secretPowerEffect = MOVE_EFFECT_FLINCH,
.camouflageType = TYPE_GHOST,
},
[BATTLE_ENVIRONMENT_PUDDLE] =
{
.naturePower = MOVE_MUD_BOMB,
.secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1,
.camouflageType = TYPE_GROUND,
},
[BATTLE_ENVIRONMENT_MARSH] =
{
.naturePower = MOVE_MUD_BOMB,
.secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1,
.camouflageType = TYPE_GROUND,
},
[BATTLE_ENVIRONMENT_SWAMP] =
{
.naturePower = MOVE_MUD_BOMB,
.secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1,
.camouflageType = TYPE_GROUND,
},
[BATTLE_ENVIRONMENT_SNOW] =
{
#if B_NATURE_POWER_MOVES >= GEN_7
.naturePower = MOVE_ICE_BEAM,
#elif B_NATURE_POWER_MOVES >= GEN_6
.naturePower = MOVE_FROST_BREATH,
#else
.naturePower = MOVE_BLIZZARD,
#endif
.secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE,
.camouflageType = TYPE_ICE,
},
[BATTLE_ENVIRONMENT_ICE] =
{
.naturePower = MOVE_ICE_BEAM,
.secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE,
.camouflageType = TYPE_ICE,
},
[BATTLE_ENVIRONMENT_VOLCANO] =
{
.naturePower = MOVE_LAVA_PLUME,
.secretPowerEffect = MOVE_EFFECT_BURN,
.camouflageType = TYPE_FIRE,
},
[BATTLE_ENVIRONMENT_DISTORTION_WORLD] =
{
.naturePower = MOVE_TRI_ATTACK,
.secretPowerEffect = MOVE_EFFECT_PARALYSIS,
.camouflageType = TYPE_NORMAL,
},
[BATTLE_ENVIRONMENT_SPACE] =
{
.naturePower = MOVE_DRACO_METEOR,
.secretPowerEffect = MOVE_EFFECT_FLINCH,
.camouflageType = TYPE_DRAGON,
},
[BATTLE_ENVIRONMENT_ULTRA_SPACE] =
{
.naturePower = MOVE_PSYSHOCK,
.secretPowerEffect = MOVE_EFFECT_DEF_MINUS_1,
.camouflageType = TYPE_PSYCHIC,
},
};
static const struct {
u8 mapScene;
u8 battleEnvironment;
} sMapBattleSceneMapping[] = {
{MAP_BATTLE_SCENE_GYM, BATTLE_ENVIRONMENT_GYM},
{MAP_BATTLE_SCENE_MAGMA, BATTLE_ENVIRONMENT_MAGMA},
{MAP_BATTLE_SCENE_AQUA, BATTLE_ENVIRONMENT_AQUA},
{MAP_BATTLE_SCENE_SIDNEY, BATTLE_ENVIRONMENT_SIDNEY},
{MAP_BATTLE_SCENE_PHOEBE, BATTLE_ENVIRONMENT_PHOEBE},
{MAP_BATTLE_SCENE_GLACIA, BATTLE_ENVIRONMENT_GLACIA},
{MAP_BATTLE_SCENE_DRAKE, BATTLE_ENVIRONMENT_DRAKE},
{MAP_BATTLE_SCENE_FRONTIER, BATTLE_ENVIRONMENT_FRONTIER}
};

View File

@ -1,41 +1,3 @@
const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal");
const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal");
const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal");
const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal");
const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM");
const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal");
const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol");
const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles
const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM");
const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.smol");
const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.smolTM");

View File

@ -141,18 +141,18 @@ enum DebugBattleAIFlags
DEBUG_BATTLE_1_MENU_ITEM_CONTINUE,
};
enum DebugBattleTerrain
enum DebugBattleEnvironment
{
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8,
DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_0,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_1,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_2,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_3,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_4,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_5,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_6,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_7,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_8,
DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_9,
};
// *******************************

View File

@ -3,6 +3,7 @@
#include "battle.h"
#include "battle_anim.h"
#include "battle_gfx_sfx_util.h"
#include "battle_environment.h"
#include "bg.h"
#include "data.h"
#include "decompress.h"
@ -42,7 +43,7 @@
#include "constants/rgb.h"
#include "constants/songs.h"
extern const struct BattleBackground sBattleEnvironmentTable[];
extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT];
extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow;
extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadowsSized;
extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;
@ -385,6 +386,7 @@ const u8 gBattleBackgroundNames[][30] =
[MAP_BATTLE_SCENE_KYOGRE] = _("KYOGRE "),
[MAP_BATTLE_SCENE_RAYQUAZA] = _("RAYQUAZA "),
};
const u8 gBattleBackgroundTerrainNames[][26] =
{
[BATTLE_ENVIRONMENT_GRASS] = _("NORMAL - GRASS "),
@ -398,6 +400,7 @@ const u8 gBattleBackgroundTerrainNames[][26] =
[BATTLE_ENVIRONMENT_BUILDING] = _("NORMAL - BUILDING "),
[BATTLE_ENVIRONMENT_PLAIN] = _("NORMAL - PLAIN "),
};
const u8 sShadowSizeLabels[][4] =
{
[SHADOW_SIZE_S] = _(" S"),
@ -405,6 +408,7 @@ const u8 sShadowSizeLabels[][4] =
[SHADOW_SIZE_L] = _(" L"),
[SHADOW_SIZE_XL_BATTLE_ONLY] = _(" XL"),
};
//Function declarations
static void PrintDigitChars(struct PokemonSpriteVisualizer *data);
static void SetUpModifyArrows(struct PokemonSpriteVisualizer *data);
@ -921,15 +925,15 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer
}
//Battle background functions
static void LoadBattleBg(u8 battleBgType, enum BattleEnvironment battleEnvironment)
static void LoadBattleBg(u8 battleBgType, enum BattleEnvironments battleEnvironment)
{
switch (battleBgType)
{
default:
case MAP_BATTLE_SCENE_NORMAL:
DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tileset, (void*)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tilemap, (void*)(BG_SCREEN_ADDR(26)));
LoadPalette(sBattleEnvironmentTable[battleEnvironment].palette, 0x20, 0x60);
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tileset, (void*)(BG_CHAR_ADDR(2)));
DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tilemap, (void*)(BG_SCREEN_ADDR(26)));
LoadPalette(gBattleEnvironmentInfo[battleEnvironment].background.palette, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_GYM:
DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2)));
@ -998,6 +1002,7 @@ static void LoadBattleBg(u8 battleBgType, enum BattleEnvironment battleEnvironme
break;
}
}
static void PrintBattleBgName(u8 taskId)
{
struct PokemonSpriteVisualizer *data = GetStructPtr(taskId);
@ -1005,11 +1010,12 @@ static void PrintBattleBgName(u8 taskId)
u8 text[30+1];
if (data->battleBgType == 0)
StringCopy(text, gBattleBackgroundTerrainNames[data->battleTerrain]);
StringCopy(text, gBattleBackgroundTerrainNames[data->battleEnvironment]);
else
StringCopy(text, gBattleBackgroundNames[data->battleBgType]);
AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 0, 24, 0, NULL);
}
static void UpdateBattleBg(u8 taskId, bool8 increment)
{
struct PokemonSpriteVisualizer *data = GetStructPtr(taskId);
@ -1018,17 +1024,17 @@ static void UpdateBattleBg(u8 taskId, bool8 increment)
{
if (increment)
{
if (data->battleTerrain == BATTLE_ENVIRONMENT_PLAIN)
if (data->battleEnvironment == BATTLE_ENVIRONMENT_PLAIN)
data->battleBgType += 1;
else
data->battleTerrain += 1;
data->battleEnvironment += 1;
}
else
{
if (data->battleTerrain == BATTLE_ENVIRONMENT_GRASS)
if (data->battleEnvironment == BATTLE_ENVIRONMENT_GRASS)
data->battleBgType = MAP_BATTLE_SCENE_RAYQUAZA;
else
data->battleTerrain -= 1;
data->battleEnvironment -= 1;
}
}
else if (data->battleBgType == MAP_BATTLE_SCENE_GYM)
@ -1038,7 +1044,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment)
else
{
data->battleBgType = MAP_BATTLE_SCENE_NORMAL;
data->battleTerrain = BATTLE_ENVIRONMENT_PLAIN;
data->battleEnvironment = BATTLE_ENVIRONMENT_PLAIN;
}
}
else if (data->battleBgType == MAP_BATTLE_SCENE_RAYQUAZA)
@ -1046,7 +1052,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment)
if (increment)
{
data->battleBgType = MAP_BATTLE_SCENE_NORMAL;
data->battleTerrain = BATTLE_ENVIRONMENT_GRASS;
data->battleEnvironment = BATTLE_ENVIRONMENT_GRASS;
}
else
data->battleBgType -= 1;
@ -1061,7 +1067,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment)
PrintBattleBgName(taskId);
LoadBattleBg(data->battleBgType, data->battleTerrain);
LoadBattleBg(data->battleBgType, data->battleEnvironment);
}
// *******************************