diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8b504a37f9..08753aac8a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -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 diff --git a/include/battle_environment.h b/include/battle_environment.h new file mode 100644 index 0000000000..e9435aa454 --- /dev/null +++ b/include/battle_environment.h @@ -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 diff --git a/include/battle_setup.h b/include/battle_setup.h index 7cddc06725..aa01178d8d 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -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); diff --git a/include/config/battle.h b/include/config/battle.h index 06373f2c19..a58b174b46 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -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. diff --git a/include/constants/battle.h b/include/constants/battle.h index b87176ff7a..28b39117ff 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -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, diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index a1c4c5bc45..10de5f785f 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -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 diff --git a/include/pokemon_sprite_visualizer.h b/include/pokemon_sprite_visualizer.h index fdd53d2ce8..4205c6dc20 100644 --- a/include/pokemon_sprite_visualizer.h +++ b/include/pokemon_sprite_visualizer.h @@ -81,7 +81,7 @@ struct PokemonSpriteVisualizer u8 animIdBack; u8 animIdFront; u8 battleBgType; - u8 battleTerrain; + u8 battleEnvironment; u8 currentSubmenu; u8 submenuYpos[3]; }; diff --git a/src/battle_bg.c b/src/battle_bg.c index 6de96168f7..11a28ea2fa 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -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(); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7824a354bf..26144cecd1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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; } diff --git a/src/battle_setup.c b/src/battle_setup.c index 0074eebf38..0860d5511a 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -621,7 +621,7 @@ static void CB2_EndScriptedWildBattle(void) } } -enum BattleEnvironment BattleSetup_GetEnvironmentId(void) +enum BattleEnvironments BattleSetup_GetEnvironmentId(void) { u16 tileBehavior; s16 x, y; diff --git a/src/data/battle_environment.h b/src/data/battle_environment.h new file mode 100644 index 0000000000..1773e6ced3 --- /dev/null +++ b/src/data/battle_environment.h @@ -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} +}; diff --git a/src/data/graphics/battle_environment.h b/src/data/graphics/battle_environment.h index d220611c6d..4d271ea82d 100644 --- a/src/data/graphics/battle_environment.h +++ b/src/data/graphics/battle_environment.h @@ -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"); diff --git a/src/debug.c b/src/debug.c index ba91351b98..a14b0ebe53 100644 --- a/src/debug.c +++ b/src/debug.c @@ -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, }; // ******************************* diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index 6984290f13..a5f36a0db6 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -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); } // *******************************