diff --git a/data/maps/ViridianCity_Mart/scripts.inc b/data/maps/ViridianCity_Mart/scripts.inc index d51ddc267..75050581e 100644 --- a/data/maps/ViridianCity_Mart/scripts.inc +++ b/data/maps/ViridianCity_Mart/scripts.inc @@ -79,6 +79,8 @@ ViridianCity_Mart_Items:: .2byte ITEM_DIRE_HIT .2byte ITEM_POKE_DOLL .2byte ITEM_MASTER_BALL + .2byte ITEM_MOON_BALL + .2byte ITEM_CHERISH_BALL .2byte ITEM_REVIVE .2byte ITEM_ETHER .2byte ITEM_ELIXIR @@ -100,6 +102,7 @@ ViridianCity_Mart_Items:: .2byte ITEM_BEAST_BALL .2byte ITEM_POMEG_BERRY .2byte ITEM_MEGA_RING + .2byte ITEM_VENUSAURITE .2byte ITEM_CHARIZARDITE_X .2byte ITEM_CHARIZARDITE_Y .2byte ITEM_SILPH_SCOPE diff --git a/graphics/balls/beast.png b/graphics/balls/beast.png new file mode 100644 index 000000000..56a10224c Binary files /dev/null and b/graphics/balls/beast.png differ diff --git a/graphics/balls/cherish.png b/graphics/balls/cherish.png new file mode 100644 index 000000000..3016b6560 Binary files /dev/null and b/graphics/balls/cherish.png differ diff --git a/graphics/interface/ball/dive.png b/graphics/balls/dive.png similarity index 100% rename from graphics/interface/ball/dive.png rename to graphics/balls/dive.png diff --git a/graphics/balls/dream.png b/graphics/balls/dream.png new file mode 100644 index 000000000..104ee282f Binary files /dev/null and b/graphics/balls/dream.png differ diff --git a/graphics/balls/dusk.png b/graphics/balls/dusk.png new file mode 100644 index 000000000..2bb4d3d53 Binary files /dev/null and b/graphics/balls/dusk.png differ diff --git a/graphics/balls/fast.png b/graphics/balls/fast.png new file mode 100644 index 000000000..d6b7e283d Binary files /dev/null and b/graphics/balls/fast.png differ diff --git a/graphics/balls/friend.png b/graphics/balls/friend.png new file mode 100644 index 000000000..b016c0c63 Binary files /dev/null and b/graphics/balls/friend.png differ diff --git a/graphics/interface/ball/great.png b/graphics/balls/great.png similarity index 100% rename from graphics/interface/ball/great.png rename to graphics/balls/great.png diff --git a/graphics/balls/heal.png b/graphics/balls/heal.png new file mode 100644 index 000000000..5f1604d78 Binary files /dev/null and b/graphics/balls/heal.png differ diff --git a/graphics/balls/heavy.png b/graphics/balls/heavy.png new file mode 100644 index 000000000..d37db7238 Binary files /dev/null and b/graphics/balls/heavy.png differ diff --git a/graphics/balls/level.png b/graphics/balls/level.png new file mode 100644 index 000000000..588bad393 Binary files /dev/null and b/graphics/balls/level.png differ diff --git a/graphics/balls/love.png b/graphics/balls/love.png new file mode 100644 index 000000000..3bb20d2cc Binary files /dev/null and b/graphics/balls/love.png differ diff --git a/graphics/balls/lure.png b/graphics/balls/lure.png new file mode 100644 index 000000000..9d10c2571 Binary files /dev/null and b/graphics/balls/lure.png differ diff --git a/graphics/interface/ball/luxury.png b/graphics/balls/luxury.png similarity index 100% rename from graphics/interface/ball/luxury.png rename to graphics/balls/luxury.png diff --git a/graphics/interface/ball/master.png b/graphics/balls/master.png similarity index 100% rename from graphics/interface/ball/master.png rename to graphics/balls/master.png diff --git a/graphics/balls/moon.png b/graphics/balls/moon.png new file mode 100644 index 000000000..beb1016f4 Binary files /dev/null and b/graphics/balls/moon.png differ diff --git a/graphics/interface/ball/nest.png b/graphics/balls/nest.png similarity index 100% rename from graphics/interface/ball/nest.png rename to graphics/balls/nest.png diff --git a/graphics/interface/ball/net.png b/graphics/balls/net.png similarity index 100% rename from graphics/interface/ball/net.png rename to graphics/balls/net.png diff --git a/graphics/balls/open.png b/graphics/balls/open.png new file mode 100644 index 000000000..1030f4942 Binary files /dev/null and b/graphics/balls/open.png differ diff --git a/graphics/balls/park.png b/graphics/balls/park.png new file mode 100644 index 000000000..9b526f524 Binary files /dev/null and b/graphics/balls/park.png differ diff --git a/graphics/interface/ball/poke.png b/graphics/balls/poke.png similarity index 100% rename from graphics/interface/ball/poke.png rename to graphics/balls/poke.png diff --git a/graphics/interface/ball/premier.png b/graphics/balls/premier.png similarity index 100% rename from graphics/interface/ball/premier.png rename to graphics/balls/premier.png diff --git a/graphics/balls/quick.png b/graphics/balls/quick.png new file mode 100644 index 000000000..6c5dfccb9 Binary files /dev/null and b/graphics/balls/quick.png differ diff --git a/graphics/interface/ball/repeat.png b/graphics/balls/repeat.png similarity index 100% rename from graphics/interface/ball/repeat.png rename to graphics/balls/repeat.png diff --git a/graphics/interface/ball/safari.png b/graphics/balls/safari.png similarity index 100% rename from graphics/interface/ball/safari.png rename to graphics/balls/safari.png diff --git a/graphics/balls/sport.png b/graphics/balls/sport.png new file mode 100644 index 000000000..93228579b Binary files /dev/null and b/graphics/balls/sport.png differ diff --git a/graphics/interface/ball/timer.png b/graphics/balls/timer.png similarity index 100% rename from graphics/interface/ball/timer.png rename to graphics/balls/timer.png diff --git a/graphics/interface/ball/ultra.png b/graphics/balls/ultra.png similarity index 100% rename from graphics/interface/ball/ultra.png rename to graphics/balls/ultra.png diff --git a/graphics/battle_anims/sprites/particles2.png b/graphics/battle_anims/sprites/particles2.png new file mode 100644 index 000000000..9056c253c Binary files /dev/null and b/graphics/battle_anims/sprites/particles2.png differ diff --git a/include/battle.h b/include/battle.h index c9eeb3b0b..6beeed90b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -14,6 +14,7 @@ #include "battle_util2.h" #include "battle_bg.h" #include "battle_dynamax.h" +#include "pokeball.h" /* Banks are a name given to what could be called a 'battlerId' or 'monControllerId'. @@ -467,7 +468,7 @@ struct BattleResults u16 caughtMonSpecies; // 0x28 u8 caughtMonNick[10]; // 0x2A u8 filler34[2]; - u8 catchAttempts[11]; // 0x36 + u8 catchAttempts[POKEBALL_COUNT]; // 0x36 }; extern struct BattleResults gBattleResults; diff --git a/include/constants/global.h b/include/constants/global.h index 0da441977..b63a7fe93 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -45,8 +45,8 @@ #define PC_ITEMS_COUNT 30 #define BAG_ITEMS_COUNT 42 #define BAG_KEYITEMS_COUNT 30 -#define BAG_POKEBALLS_COUNT 13 -#define BAG_TMHM_COUNT 58 +#define BAG_POKEBALLS_COUNT 27 +#define BAG_TMHM_COUNT 108 #define BAG_BERRIES_COUNT 43 #define OBJECT_EVENTS_COUNT 16 #define OBJECT_EVENT_TEMPLATES_COUNT 64 diff --git a/include/constants/items.h b/include/constants/items.h index b41ef1248..f36ef42bd 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -4,74 +4,39 @@ #define ITEM_NONE 0 // Poké Balls -#define ITEM_POKE_BALL 1 -#define ITEM_GREAT_BALL 2 -#define ITEM_ULTRA_BALL 3 -#define ITEM_MASTER_BALL 4 -#define ITEM_PREMIER_BALL 5 -#define ITEM_HEAL_BALL 6 -#define ITEM_NET_BALL 7 +#define ITEM_MASTER_BALL 1 +#define ITEM_ULTRA_BALL 2 +#define ITEM_GREAT_BALL 3 +#define ITEM_POKE_BALL 4 +#define ITEM_SAFARI_BALL 5 +#define ITEM_NET_BALL 6 +#define ITEM_DIVE_BALL 7 #define ITEM_NEST_BALL 8 -#define ITEM_DIVE_BALL 9 -#define ITEM_DUSK_BALL 10 -#define ITEM_TIMER_BALL 11 -#define ITEM_QUICK_BALL 12 -#define ITEM_REPEAT_BALL 13 -#define ITEM_LUXURY_BALL 14 -#define ITEM_LEVEL_BALL 15 -#define ITEM_LURE_BALL 16 -#define ITEM_MOON_BALL 17 -#define ITEM_FRIEND_BALL 18 -#define ITEM_LOVE_BALL 19 -#define ITEM_FAST_BALL 20 -#define ITEM_HEAVY_BALL 21 -#define ITEM_DREAM_BALL 22 -#define ITEM_SAFARI_BALL 23 +#define ITEM_REPEAT_BALL 9 +#define ITEM_TIMER_BALL 10 +#define ITEM_LUXURY_BALL 11 +#define ITEM_PREMIER_BALL 12 +#define ITEM_HEAL_BALL 13 +#define ITEM_DUSK_BALL 14 +#define ITEM_QUICK_BALL 15 +#define ITEM_LEVEL_BALL 16 +#define ITEM_LURE_BALL 17 +#define ITEM_MOON_BALL 18 +#define ITEM_FRIEND_BALL 19 +#define ITEM_LOVE_BALL 20 +#define ITEM_FAST_BALL 21 +#define ITEM_HEAVY_BALL 22 +#define ITEM_DREAM_BALL 23 #define ITEM_SPORT_BALL 24 #define ITEM_PARK_BALL 25 #define ITEM_BEAST_BALL 26 -#define ITEM_CHERISH_BALL 27 // TODO: throwing CHERISH_BALL restarts game, intended? - -// Note: If moving ball IDs around, updating FIRST_BALL/LAST_BALL is not sufficient -// Several places expect the ball IDs to be first and contiguous (e.g. MON_DATA_POKEBALL) -// If adding new balls, it's easiest to insert them after the last ball and increment the below IDs (and removing ITEM_034 for example) -#define FIRST_BALL ITEM_POKE_BALL -#define LAST_BALL ITEM_CHERISH_BALL - -// // Poké Balls -// #define ITEM_MASTER_BALL 1 -// #define ITEM_ULTRA_BALL 2 -// #define ITEM_GREAT_BALL 3 -// #define ITEM_POKE_BALL 4 -// #define ITEM_SAFARI_BALL 5 -// #define ITEM_NET_BALL 6 -// #define ITEM_DIVE_BALL 7 -// #define ITEM_NEST_BALL 8 -// #define ITEM_REPEAT_BALL 9 -// #define ITEM_TIMER_BALL 10 -// #define ITEM_LUXURY_BALL 11 -// #define ITEM_PREMIER_BALL 12 -// #define ITEM_HEAL_BALL 13 -// #define ITEM_DUSK_BALL 14 -// #define ITEM_QUICK_BALL 15 -// #define ITEM_LEVEL_BALL 16 -// #define ITEM_LURE_BALL 17 -// #define ITEM_MOON_BALL 18 -// #define ITEM_FRIEND_BALL 19 -// #define ITEM_LOVE_BALL 20 -// #define ITEM_FAST_BALL 21 -// #define ITEM_HEAVY_BALL 22 -// #define ITEM_DREAM_BALL 23 -// #define ITEM_SPORT_BALL 24 -// #define ITEM_PARK_BALL 25 -// #define ITEM_BEAST_BALL 26 -// #define ITEM_CHERISH_BALL 27 +#define ITEM_CHERISH_BALL 27 // // Note: If moving ball IDs around, updating FIRST_BALL/LAST_BALL is not sufficient // // Several places expect the ball IDs to be first and contiguous (e.g. MON_DATA_POKEBALL) // // If adding new balls, it's easiest to insert them after the last ball and increment the below IDs (and removing ITEM_034 for example) -// #define FIRST_BALL ITEM_MASTER_BALL -// #define LAST_BALL ITEM_CHERISH_BALL +#define FIRST_BALL ITEM_MASTER_BALL +#define LAST_BALL ITEM_CHERISH_BALL // Medicine #define ITEM_POTION 28 diff --git a/include/global.h b/include/global.h index 1cf8e22a2..c1945085a 100644 --- a/include/global.h +++ b/include/global.h @@ -827,7 +827,7 @@ struct SaveBlock1 /*0x3A18*/ u8 seen2[DEX_FLAGS_NO]; /*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH + 1]; /*0x3A54*/ struct FameCheckerSaveData fameChecker[NUM_FAMECHECKER_PERSONS]; - /*0x3A94*/ u8 unused_3A94[64]; + // /*0x3A94*/ u8 unused_3A94[64]; /*0x3AD4*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21]; /*0x3BA8*/ struct TrainerNameRecord trainerNameRecords[20]; /*0x3C98*/ struct DaycareMon route5DayCareMon; diff --git a/include/graphics.h b/include/graphics.h index f98f7fafe..c9d346a8b 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3,30 +3,61 @@ #include "global.h" +// pokeballs extern const u32 gBallGfx_Poke[]; extern const u32 gBallPal_Poke[]; extern const u32 gBallGfx_Great[]; extern const u32 gBallPal_Great[]; -extern const u32 gBallGfx_Safari[]; -extern const u32 gBallPal_Safari[]; extern const u32 gBallGfx_Ultra[]; extern const u32 gBallPal_Ultra[]; extern const u32 gBallGfx_Master[]; extern const u32 gBallPal_Master[]; -extern const u32 gBallGfx_Net[]; -extern const u32 gBallPal_Net[]; -extern const u32 gBallGfx_Dive[]; -extern const u32 gBallPal_Dive[]; -extern const u32 gBallGfx_Nest[]; -extern const u32 gBallPal_Nest[]; -extern const u32 gBallGfx_Repeat[]; -extern const u32 gBallPal_Repeat[]; -extern const u32 gBallGfx_Timer[]; -extern const u32 gBallPal_Timer[]; -extern const u32 gBallGfx_Luxury[]; -extern const u32 gBallPal_Luxury[]; extern const u32 gBallGfx_Premier[]; extern const u32 gBallPal_Premier[]; +extern const u32 gBallGfx_Heal[]; +extern const u32 gBallPal_Heal[]; +extern const u32 gBallGfx_Net[]; +extern const u32 gBallPal_Net[]; +extern const u32 gBallGfx_Nest[]; +extern const u32 gBallPal_Nest[]; +extern const u32 gBallGfx_Dive[]; +extern const u32 gBallPal_Dive[]; +extern const u32 gBallGfx_Dusk[]; +extern const u32 gBallPal_Dusk[]; +extern const u32 gBallGfx_Timer[]; +extern const u32 gBallPal_Timer[]; +extern const u32 gBallGfx_Quick[]; +extern const u32 gBallPal_Quick[]; +extern const u32 gBallGfx_Repeat[]; +extern const u32 gBallPal_Repeat[]; +extern const u32 gBallGfx_Luxury[]; +extern const u32 gBallPal_Luxury[]; +extern const u32 gBallGfx_Level[]; +extern const u32 gBallPal_Level[]; +extern const u32 gBallGfx_Lure[]; +extern const u32 gBallPal_Lure[]; +extern const u32 gBallGfx_Moon[]; +extern const u32 gBallPal_Moon[]; +extern const u32 gBallGfx_Friend[]; +extern const u32 gBallPal_Friend[]; +extern const u32 gBallGfx_Love[]; +extern const u32 gBallPal_Love[]; +extern const u32 gBallGfx_Fast[]; +extern const u32 gBallPal_Fast[]; +extern const u32 gBallGfx_Heavy[]; +extern const u32 gBallPal_Heavy[]; +extern const u32 gBallGfx_Dream[]; +extern const u32 gBallPal_Dream[]; +extern const u32 gBallGfx_Safari[]; +extern const u32 gBallPal_Safari[]; +extern const u32 gBallGfx_Sport[]; +extern const u32 gBallPal_Sport[]; +extern const u32 gBallGfx_Park[]; +extern const u32 gBallPal_Park[]; +extern const u32 gBallGfx_Beast[]; +extern const u32 gBallPal_Beast[]; +extern const u32 gBallGfx_Cherish[]; +extern const u32 gBallPal_Cherish[]; extern const u32 gOpenPokeballGfx[]; // pokemon gfx @@ -4351,6 +4382,7 @@ extern const u32 gBattleAnimSpriteGfx_Smoke[]; extern const u32 gBattleAnimSpriteGfx_Smoke2[]; extern const u32 gBattleAnimSpriteGfx_Impact[]; extern const u32 gBattleAnimSpriteGfx_Particles[]; +extern const u32 gBattleAnimSpriteGfx_Particles2[]; extern const u32 gBattleAnimSpriteGfx_CircleImpact[]; extern const u32 gBattleAnimSpriteGfx_Scratch[]; extern const u32 gBattleAnimSpriteGfx_Cut[]; @@ -4613,6 +4645,7 @@ extern const u32 gBattleAnimSpritePal_Tongue[]; extern const u32 gBattleAnimSpritePal_Smoke[]; extern const u32 gBattleAnimSpritePal_Impact[]; extern const u32 gBattleAnimSpritePal_CircleImpact[]; +extern const u32 gBattleAnimSpritePal_Particles2[]; extern const u32 gBattleAnimSpritePal_SharpTeeth[]; extern const u32 gBattleAnimSpritePal_RainbowRings[]; extern const u32 gBattleAnimSpritePal_IceCrystals[]; diff --git a/include/item.h b/include/item.h index 6f5da26bc..dca56693e 100644 --- a/include/item.h +++ b/include/item.h @@ -93,6 +93,12 @@ u8 CountItemsInPC(void); void ApplyNewEncryptionKeyToBagItems_(u32 newKey); bool8 HasAtLeastOneBerry(void); +bool8 IsItemTM(u16 itemId); +bool8 IsItemHM(u16 itemId); +bool8 IsItemTMHM(u16 itemId); + +bool8 IsItemBall(u16 itemId); + const u8 *ItemId_GetEffect(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); u32 GetItemStatus2Mask(u16 itemId); diff --git a/include/pokeball.h b/include/pokeball.h index 88b2259ab..9e354a399 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -5,18 +5,34 @@ enum { + BALL_POKE, BALL_GREAT, - BALL_SAFARI, BALL_ULTRA, BALL_MASTER, - BALL_NET, - BALL_DIVE, - BALL_NEST, - BALL_REPEAT, - BALL_TIMER, - BALL_LUXURY, BALL_PREMIER, + BALL_HEAL, + BALL_NET, + BALL_NEST, + BALL_DIVE, + BALL_DUSK, + BALL_TIMER, + BALL_QUICK, + BALL_REPEAT, + BALL_LUXURY, + BALL_LEVEL, + BALL_LURE, + BALL_MOON, + BALL_FRIEND, + BALL_LOVE, + BALL_FAST, + BALL_HEAVY, + BALL_DREAM, + BALL_SAFARI, + BALL_SPORT, + BALL_PARK, + BALL_BEAST, + BALL_CHERISH, POKEBALL_COUNT }; diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index a1afa7cd7..c3d944fb4 100644 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -17,18 +17,33 @@ #include "constants/moves.h" #include "constants/songs.h" -#define TAG_PARTICLES_POKEBALL 55020 -#define TAG_PARTICLES_GREATBALL 55021 -#define TAG_PARTICLES_SAFARIBALL 55022 -#define TAG_PARTICLES_ULTRABALL 55023 -#define TAG_PARTICLES_MASTERBALL 55024 -#define TAG_PARTICLES_NETBALL 55025 -#define TAG_PARTICLES_DIVEBALL 55026 -#define TAG_PARTICLES_NESTBALL 55027 -#define TAG_PARTICLES_REPEATBALL 55028 -#define TAG_PARTICLES_TIMERBALL 55029 -#define TAG_PARTICLES_LUXURYBALL 55030 -#define TAG_PARTICLES_PREMIERBALL 55031 +#define TAG_PARTICLES_POKEBALL 65030 +#define TAG_PARTICLES_GREATBALL 65031 +#define TAG_PARTICLES_ULTRABALL 65032 +#define TAG_PARTICLES_MASTERBALL 65033 +#define TAG_PARTICLES_PREMIERBALL 65034 +#define TAG_PARTICLES_HEALBALL 65035 +#define TAG_PARTICLES_NETBALL 65036 +#define TAG_PARTICLES_NESTBALL 65037 +#define TAG_PARTICLES_DIVEBALL 65038 +#define TAG_PARTICLES_DUSKBALL 65039 +#define TAG_PARTICLES_TIMERBALL 65040 +#define TAG_PARTICLES_QUICKBALL 65041 +#define TAG_PARTICLES_REPEATBALL 65042 +#define TAG_PARTICLES_LUXURYBALL 65043 +#define TAG_PARTICLES_LEVELBALL 65044 +#define TAG_PARTICLES_LUREBALL 65045 +#define TAG_PARTICLES_MOONBALL 65046 +#define TAG_PARTICLES_FRIENDBALL 65047 +#define TAG_PARTICLES_LOVEBALL 65048 +#define TAG_PARTICLES_FASTBALL 65049 +#define TAG_PARTICLES_HEAVYBALL 65050 +#define TAG_PARTICLES_DREAMBALL 65051 +#define TAG_PARTICLES_SAFARIBALL 65052 +#define TAG_PARTICLES_SPORTBALL 65053 +#define TAG_PARTICLES_PARKBALL 65054 +#define TAG_PARTICLES_BEASTBALL 65055 +#define TAG_PARTICLES_CHERISHBALL 65056 u32 gMonShrinkDuration; u16 gMonShrinkDelta; @@ -116,34 +131,64 @@ static const struct CaptureStar sCaptureStar[] = const struct CompressedSpriteSheet gBallParticleSpritesheets[] = { - [BALL_POKE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL}, - [BALL_GREAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL}, - [BALL_SAFARI] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL}, - [BALL_ULTRA] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL}, - [BALL_MASTER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL}, - [BALL_NET] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL}, - [BALL_DIVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL}, - [BALL_NEST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL}, - [BALL_REPEAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL}, - [BALL_TIMER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL}, - [BALL_LUXURY] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL}, - [BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL}, + [BALL_POKE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL}, + [BALL_GREAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL}, + [BALL_ULTRA] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL}, + [BALL_MASTER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL}, + [BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL}, + [BALL_HEAL] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_HEALBALL}, + [BALL_NET] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL}, + [BALL_NEST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL}, + [BALL_DIVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL}, + [BALL_DUSK] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_DUSKBALL}, + [BALL_TIMER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL}, + [BALL_QUICK] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_QUICKBALL}, + [BALL_REPEAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL}, + [BALL_LUXURY] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL}, + [BALL_LEVEL] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_LEVELBALL}, + [BALL_LURE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUREBALL}, + [BALL_MOON] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_MOONBALL}, + [BALL_FRIEND] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_FRIENDBALL}, + [BALL_LOVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LOVEBALL}, + [BALL_FAST] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_FASTBALL}, + [BALL_HEAVY] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_HEAVYBALL}, + [BALL_DREAM] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DREAMBALL}, + [BALL_SAFARI] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL}, + [BALL_SPORT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SPORTBALL}, + [BALL_PARK] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PARKBALL}, + [BALL_BEAST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_BEASTBALL}, + [BALL_CHERISH] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_CHERISHBALL}, }; const struct CompressedSpritePalette gBallParticlePalettes[] = { - [BALL_POKE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL}, - [BALL_GREAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL}, - [BALL_SAFARI] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL}, - [BALL_ULTRA] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL}, - [BALL_MASTER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL}, - [BALL_NET] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL}, - [BALL_DIVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL}, - [BALL_NEST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL}, - [BALL_REPEAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL}, - [BALL_TIMER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL}, - [BALL_LUXURY] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL}, - [BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL}, + [BALL_POKE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL}, + [BALL_GREAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL}, + [BALL_ULTRA] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL}, + [BALL_MASTER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL}, + [BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL}, + [BALL_HEAL] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_HEALBALL}, + [BALL_NET] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL}, + [BALL_NEST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL}, + [BALL_DIVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL}, + [BALL_DUSK] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_DUSKBALL}, + [BALL_TIMER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL}, + [BALL_QUICK] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_QUICKBALL}, + [BALL_REPEAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL}, + [BALL_LUXURY] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL}, + [BALL_LEVEL] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_LEVELBALL}, + [BALL_LURE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUREBALL}, + [BALL_MOON] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_MOONBALL}, + [BALL_FRIEND] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_FRIENDBALL}, + [BALL_LOVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LOVEBALL}, + [BALL_FAST] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_FASTBALL}, + [BALL_HEAVY] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_HEAVYBALL}, + [BALL_DREAM] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DREAMBALL}, + [BALL_SAFARI] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL}, + [BALL_SPORT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SPORTBALL}, + [BALL_PARK] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PARKBALL}, + [BALL_BEAST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_BEASTBALL}, + [BALL_CHERISH] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_CHERISHBALL}, }; static const union AnimCmd sAnim_RegularBall[] = @@ -198,39 +243,70 @@ static const union AnimCmd *const sAnims_BallParticles[] = sAnim_UltraRepeatTimerBall, }; -static const u8 sBallParticleAnimNums[] = +static const u8 sBallParticleAnimNums[POKEBALL_COUNT] = { [BALL_POKE] = 0, [BALL_GREAT] = 0, - [BALL_SAFARI] = 0, [BALL_ULTRA] = 5, [BALL_MASTER] = 1, - [BALL_NET] = 2, - [BALL_DIVE] = 2, - [BALL_NEST] = 3, - [BALL_REPEAT] = 5, - [BALL_TIMER] = 5, - [BALL_LUXURY] = 4, [BALL_PREMIER] = 4, + [BALL_HEAL] = 0, + [BALL_NET] = 2, + [BALL_NEST] = 3, + [BALL_DIVE] = 2, + [BALL_DUSK] = 2, + [BALL_TIMER] = 5, + [BALL_QUICK] = 4, + [BALL_REPEAT] = 5, + [BALL_LUXURY] = 4, + [BALL_LEVEL] = 5, + [BALL_LURE] = 2, + [BALL_MOON] = 4, + [BALL_FRIEND] = 3, + [BALL_LOVE] = 3, + [BALL_FAST] = 4, + [BALL_HEAVY] = 0, + [BALL_DREAM] = 5, + [BALL_SAFARI] = 0, + [BALL_SPORT] = 0, + [BALL_PARK] = 5, + [BALL_BEAST] = 5, + [BALL_CHERISH] = 0, }; static const TaskFunc sBallParticleAnimationFuncs[] = { + // Todo: assign and possibly create different particles [BALL_POKE] = PokeBallOpenParticleAnimation, [BALL_GREAT] = GreatBallOpenParticleAnimation, - [BALL_SAFARI] = SafariBallOpenParticleAnimation, [BALL_ULTRA] = UltraBallOpenParticleAnimation, [BALL_MASTER] = MasterBallOpenParticleAnimation, - [BALL_NET] = SafariBallOpenParticleAnimation, - [BALL_DIVE] = DiveBallOpenParticleAnimation, - [BALL_NEST] = UltraBallOpenParticleAnimation, - [BALL_REPEAT] = RepeatBallOpenParticleAnimation, - [BALL_TIMER] = TimerBallOpenParticleAnimation, - [BALL_LUXURY] = GreatBallOpenParticleAnimation, [BALL_PREMIER] = PremierBallOpenParticleAnimation, + [BALL_HEAL] = PokeBallOpenParticleAnimation, + [BALL_NET] = SafariBallOpenParticleAnimation, + [BALL_NEST] = UltraBallOpenParticleAnimation, + [BALL_DIVE] = DiveBallOpenParticleAnimation, + [BALL_DUSK] = UltraBallOpenParticleAnimation, + [BALL_TIMER] = TimerBallOpenParticleAnimation, + [BALL_QUICK] = UltraBallOpenParticleAnimation, + [BALL_REPEAT] = RepeatBallOpenParticleAnimation, + [BALL_LUXURY] = GreatBallOpenParticleAnimation, + [BALL_LEVEL] = SafariBallOpenParticleAnimation, + [BALL_LURE] = GreatBallOpenParticleAnimation, + [BALL_MOON] = UltraBallOpenParticleAnimation, + [BALL_FRIEND] = UltraBallOpenParticleAnimation, + [BALL_LOVE] = GreatBallOpenParticleAnimation, + [BALL_FAST] = GreatBallOpenParticleAnimation, + [BALL_HEAVY] = GreatBallOpenParticleAnimation, + [BALL_DREAM] = UltraBallOpenParticleAnimation, + [BALL_SAFARI] = SafariBallOpenParticleAnimation, + [BALL_SPORT] = UltraBallOpenParticleAnimation, + [BALL_PARK] = UltraBallOpenParticleAnimation, + [BALL_BEAST] = UltraBallOpenParticleAnimation, + [BALL_CHERISH] = MasterBallOpenParticleAnimation, }; -static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = +static const struct SpriteTemplate sBallParticlesSpriteTemplates[POKEBALL_COUNT] = { [BALL_POKE] = { .tileTag = TAG_PARTICLES_POKEBALL, @@ -250,15 +326,6 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - [BALL_SAFARI] = { - .tileTag = TAG_PARTICLES_SAFARIBALL, - .paletteTag = TAG_PARTICLES_SAFARIBALL, - .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, [BALL_ULTRA] = { .tileTag = TAG_PARTICLES_ULTRABALL, .paletteTag = TAG_PARTICLES_ULTRABALL, @@ -277,18 +344,27 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - [BALL_NET] = { - .tileTag = TAG_PARTICLES_NETBALL, - .paletteTag = TAG_PARTICLES_NETBALL, + [BALL_PREMIER] = { + .tileTag = TAG_PARTICLES_PREMIERBALL, + .paletteTag = TAG_PARTICLES_PREMIERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - [BALL_DIVE] = { - .tileTag = TAG_PARTICLES_DIVEBALL, - .paletteTag = TAG_PARTICLES_DIVEBALL, + [BALL_HEAL] = { + .tileTag = TAG_PARTICLES_HEALBALL, + .paletteTag = TAG_PARTICLES_HEALBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_NET] = { + .tileTag = TAG_PARTICLES_NETBALL, + .paletteTag = TAG_PARTICLES_NETBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, @@ -304,9 +380,18 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - [BALL_REPEAT] = { - .tileTag = TAG_PARTICLES_REPEATBALL, - .paletteTag = TAG_PARTICLES_REPEATBALL, + [BALL_DIVE] = { + .tileTag = TAG_PARTICLES_DIVEBALL, + .paletteTag = TAG_PARTICLES_DIVEBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_DUSK] = { + .tileTag = TAG_PARTICLES_DUSKBALL, + .paletteTag = TAG_PARTICLES_DUSKBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, @@ -322,6 +407,24 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, + [BALL_QUICK] = { + .tileTag = TAG_PARTICLES_QUICKBALL, + .paletteTag = TAG_PARTICLES_QUICKBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_REPEAT] = { + .tileTag = TAG_PARTICLES_REPEATBALL, + .paletteTag = TAG_PARTICLES_REPEATBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, [BALL_LUXURY] = { .tileTag = TAG_PARTICLES_LUXURYBALL, .paletteTag = TAG_PARTICLES_LUXURYBALL, @@ -331,9 +434,117 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - [BALL_PREMIER] = { - .tileTag = TAG_PARTICLES_PREMIERBALL, - .paletteTag = TAG_PARTICLES_PREMIERBALL, + [BALL_LEVEL] = { + .tileTag = TAG_PARTICLES_LEVELBALL, + .paletteTag = TAG_PARTICLES_LEVELBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_LURE] = { + .tileTag = TAG_PARTICLES_LUREBALL, + .paletteTag = TAG_PARTICLES_LUREBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_MOON] = { + .tileTag = TAG_PARTICLES_MOONBALL, + .paletteTag = TAG_PARTICLES_MOONBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_FRIEND] = { + .tileTag = TAG_PARTICLES_FRIENDBALL, + .paletteTag = TAG_PARTICLES_FRIENDBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_LOVE] = { + .tileTag = TAG_PARTICLES_LOVEBALL, + .paletteTag = TAG_PARTICLES_LOVEBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_FAST] = { + .tileTag = TAG_PARTICLES_FASTBALL, + .paletteTag = TAG_PARTICLES_FASTBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_HEAVY] = { + .tileTag = TAG_PARTICLES_HEAVYBALL, + .paletteTag = TAG_PARTICLES_HEAVYBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_DREAM] = { + .tileTag = TAG_PARTICLES_DREAMBALL, + .paletteTag = TAG_PARTICLES_DREAMBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_SAFARI] = { + .tileTag = TAG_PARTICLES_SAFARIBALL, + .paletteTag = TAG_PARTICLES_SAFARIBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_SPORT] = { + .tileTag = TAG_PARTICLES_SPORTBALL, + .paletteTag = TAG_PARTICLES_SPORTBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_PARK] = { + .tileTag = TAG_PARTICLES_PARKBALL, + .paletteTag = TAG_PARTICLES_PARKBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_BEAST] = { + .tileTag = TAG_PARTICLES_BEASTBALL, + .paletteTag = TAG_PARTICLES_BEASTBALL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = sAnims_BallParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + [BALL_CHERISH] = { + .tileTag = TAG_PARTICLES_CHERISHBALL, + .paletteTag = TAG_PARTICLES_CHERISHBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, @@ -344,28 +555,34 @@ static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = static const u16 sBallOpenFadeColors[] = { - [BALL_POKE] = RGB(31, 22, 30), - [BALL_GREAT] = RGB(16, 23, 30), - [BALL_SAFARI] = RGB(23, 30, 20), - [BALL_ULTRA] = RGB(31, 31, 15), - [BALL_MASTER] = RGB(23, 20, 28), - [BALL_NET] = RGB(21, 31, 25), - [BALL_DIVE] = RGB(12, 25, 30), - [BALL_NEST] = RGB(30, 27, 10), - [BALL_REPEAT] = RGB(31, 24, 16), - [BALL_TIMER] = RGB(29, 30, 30), - [BALL_LUXURY] = RGB(31, 17, 10), + // Todo, assign different colors + [BALL_POKE] = RGB(31, 22, 30), + [BALL_GREAT] = RGB(16, 23, 30), + [BALL_ULTRA] = RGB(31, 31, 15), + [BALL_MASTER] = RGB(23, 20, 28), [BALL_PREMIER] = RGB(31, 9, 10), - - // Unused - RGB_BLACK, - RGB(1, 16, 0), - RGB(3, 0, 1), - RGB(1, 8, 0), - RGB(0, 8, 0), - RGB(3, 8, 1), - RGB(6, 8, 1), - RGB(4, 0, 0), + [BALL_HEAL] = RGB(31, 23, 27), + [BALL_NET] = RGB(21, 31, 25), + [BALL_NEST] = RGB(30, 27, 10), + [BALL_DIVE] = RGB(12, 25, 30), + [BALL_DUSK] = RGB(7, 1, 13), + [BALL_TIMER] = RGB(29, 30, 30), + [BALL_QUICK] = RGB(16, 25, 30), + [BALL_REPEAT] = RGB(31, 24, 16), + [BALL_LUXURY] = RGB(31, 17, 10), + [BALL_LEVEL] = RGB(24, 4, 4), + [BALL_LURE] = RGB(9, 22, 27), + [BALL_MOON] = RGB(30, 25, 8), + [BALL_FRIEND] = RGB(17, 24, 7), + [BALL_LOVE] = RGB(31, 19, 26), + [BALL_FAST] = RGB(29, 17, 8), + [BALL_HEAVY] = RGB(7, 11, 20), + [BALL_DREAM] = RGB(31, 31, 15), + [BALL_SAFARI] = RGB(23, 30, 20), + [BALL_SPORT] = RGB(31, 31, 15), + [BALL_PARK] = RGB(31, 31, 15), + [BALL_BEAST] = RGB(31, 31, 15), + [BALL_CHERISH] = RGB(25, 4, 3), }; const struct SpriteTemplate gSafariBaitSpriteTemplate = @@ -703,29 +920,60 @@ u8 ItemIdToBallId(u16 ballItem) { switch (ballItem) { - case ITEM_MASTER_BALL: - return BALL_MASTER; - case ITEM_ULTRA_BALL: - return BALL_ULTRA; + case ITEM_POKE_BALL: + return BALL_POKE; case ITEM_GREAT_BALL: return BALL_GREAT; - case ITEM_SAFARI_BALL: - return BALL_SAFARI; - case ITEM_NET_BALL: - return BALL_NET; - case ITEM_DIVE_BALL: - return BALL_DIVE; - case ITEM_NEST_BALL: - return BALL_NEST; - case ITEM_REPEAT_BALL: - return BALL_REPEAT; - case ITEM_TIMER_BALL: - return BALL_TIMER; - case ITEM_LUXURY_BALL: - return BALL_LUXURY; + case ITEM_ULTRA_BALL: + return BALL_ULTRA; + case ITEM_MASTER_BALL: + return BALL_MASTER; case ITEM_PREMIER_BALL: return BALL_PREMIER; - case ITEM_POKE_BALL: + case ITEM_HEAL_BALL: + return BALL_HEAL; + case ITEM_NET_BALL: + return BALL_NET; + case ITEM_NEST_BALL: + return BALL_NEST; + case ITEM_DIVE_BALL: + return BALL_DIVE; + case ITEM_DUSK_BALL: + return BALL_DUSK; + case ITEM_TIMER_BALL: + return BALL_TIMER; + case ITEM_QUICK_BALL: + return BALL_QUICK; + case ITEM_REPEAT_BALL: + return BALL_REPEAT; + case ITEM_LUXURY_BALL: + return BALL_LUXURY; + case ITEM_LEVEL_BALL: + return BALL_LEVEL; + case ITEM_LURE_BALL: + return BALL_LURE; + case ITEM_MOON_BALL: + return BALL_MOON; + case ITEM_FRIEND_BALL: + return BALL_FRIEND; + case ITEM_LOVE_BALL: + return BALL_LOVE; + case ITEM_FAST_BALL: + return BALL_FAST; + case ITEM_HEAVY_BALL: + return BALL_HEAVY; + case ITEM_DREAM_BALL: + return BALL_DREAM; + case ITEM_SAFARI_BALL: + return BALL_SAFARI; + case ITEM_SPORT_BALL: + return BALL_SPORT; + case ITEM_PARK_BALL: + return BALL_PARK; + case ITEM_BEAST_BALL: + return BALL_BEAST; + case ITEM_CHERISH_BALL: + return BALL_CHERISH; default: return BALL_POKE; } diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index 2a522b1fc..9a5c6de51 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -208,7 +208,7 @@ static void HandleInputChooseAction(u32 battler) if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM) { // Add item to bag if it is a ball - if (itemId <= ITEM_PREMIER_BALL) + if (IsItemBall(itemId)) AddBagItem(itemId, 1); else return; diff --git a/src/battle_util.c b/src/battle_util.c index 6a061fed0..50a662390 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4437,7 +4437,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_BALL_FETCH: if (gBattleMons[battler].item == ITEM_NONE - && gBattleResults.catchAttempts[gLastUsedBall - ITEM_ULTRA_BALL] >= 1 + && gBattleResults.catchAttempts[gLastUsedBall - FIRST_BALL] >= 1 && !gHasFetchedBall) { gBattleScripting.battler = battler; @@ -9746,7 +9746,7 @@ u8 GetCategoryBasedOnStats(u32 battler) static u32 GetFlingPowerFromItemId(u32 itemId) { - if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) + if (IsItemTMHM(itemId)) { u32 power = gMovesInfo[ItemIdToBattleMoveId(itemId)].power; if (power > 1) diff --git a/src/data/graphics/interface_pokeballs.h b/src/data/graphics/interface_pokeballs.h index 69d09d51f..44f47cde4 100644 --- a/src/data/graphics/interface_pokeballs.h +++ b/src/data/graphics/interface_pokeballs.h @@ -1,37 +1,82 @@ -const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz"); -const u32 gBallPal_Poke[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz"); +const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.lz"); +const u32 gBallPal_Poke[] = INCBIN_U32("graphics/balls/poke.gbapal.lz"); -const u32 gBallGfx_Great[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz"); -const u32 gBallPal_Great[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz"); +const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.lz"); +const u32 gBallPal_Great[] = INCBIN_U32("graphics/balls/great.gbapal.lz"); -const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz"); -const u32 gBallPal_Safari[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz"); +const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.lz"); +const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/balls/ultra.gbapal.lz"); -const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz"); -const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz"); +const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.lz"); +const u32 gBallPal_Master[] = INCBIN_U32("graphics/balls/master.gbapal.lz"); -const u32 gBallGfx_Master[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz"); -const u32 gBallPal_Master[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz"); +const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.lz"); +const u32 gBallPal_Premier[] = INCBIN_U32("graphics/balls/premier.gbapal.lz"); -const u32 gBallGfx_Net[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz"); -const u32 gBallPal_Net[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz"); +const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.lz"); +const u32 gBallPal_Heal[] = INCBIN_U32("graphics/balls/heal.gbapal.lz"); -const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz"); -const u32 gBallPal_Dive[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz"); +const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.lz"); +const u32 gBallPal_Net[] = INCBIN_U32("graphics/balls/net.gbapal.lz"); -const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz"); -const u32 gBallPal_Nest[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz"); +const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.lz"); +const u32 gBallPal_Nest[] = INCBIN_U32("graphics/balls/nest.gbapal.lz"); -const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz"); -const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz"); +const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.lz"); +const u32 gBallPal_Dive[] = INCBIN_U32("graphics/balls/dive.gbapal.lz"); -const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz"); -const u32 gBallPal_Timer[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz"); +const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.lz"); +const u32 gBallPal_Dusk[] = INCBIN_U32("graphics/balls/dusk.gbapal.lz"); -const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz"); -const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz"); +const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.lz"); +const u32 gBallPal_Timer[] = INCBIN_U32("graphics/balls/timer.gbapal.lz"); -const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz"); -const u32 gBallPal_Premier[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz"); +const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.lz"); +const u32 gBallPal_Quick[] = INCBIN_U32("graphics/balls/quick.gbapal.lz"); -const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz"); +const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.lz"); +const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/balls/repeat.gbapal.lz"); + +const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.lz"); +const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/balls/luxury.gbapal.lz"); + +const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.lz"); +const u32 gBallPal_Level[] = INCBIN_U32("graphics/balls/level.gbapal.lz"); + +const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.lz"); +const u32 gBallPal_Lure[] = INCBIN_U32("graphics/balls/lure.gbapal.lz"); + +const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.lz"); +const u32 gBallPal_Moon[] = INCBIN_U32("graphics/balls/moon.gbapal.lz"); + +const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.lz"); +const u32 gBallPal_Friend[] = INCBIN_U32("graphics/balls/friend.gbapal.lz"); + +const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.lz"); +const u32 gBallPal_Love[] = INCBIN_U32("graphics/balls/love.gbapal.lz"); + +const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.lz"); +const u32 gBallPal_Fast[] = INCBIN_U32("graphics/balls/fast.gbapal.lz"); + +const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.lz"); +const u32 gBallPal_Heavy[] = INCBIN_U32("graphics/balls/heavy.gbapal.lz"); + +const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.lz"); +const u32 gBallPal_Dream[] = INCBIN_U32("graphics/balls/dream.gbapal.lz"); + +const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.lz"); +const u32 gBallPal_Safari[] = INCBIN_U32("graphics/balls/safari.gbapal.lz"); + +const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.lz"); +const u32 gBallPal_Sport[] = INCBIN_U32("graphics/balls/sport.gbapal.lz"); + +const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.lz"); +const u32 gBallPal_Park[] = INCBIN_U32("graphics/balls/park.gbapal.lz"); + +const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.lz"); +const u32 gBallPal_Beast[] = INCBIN_U32("graphics/balls/beast.gbapal.lz"); + +const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.lz"); +const u32 gBallPal_Cherish[] = INCBIN_U32("graphics/balls/cherish.gbapal.lz"); + +const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.lz"); diff --git a/src/data/items.h b/src/data/items.h index 1dd22e42c..234f908e3 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -381,7 +381,7 @@ const struct Item gItems[] = [ITEM_MOON_BALL] = { .name = _("Moon Ball"), - .price = (I_PRICE >= GEN_7) ? 0 : 300, + .price = (I_PRICE >= GEN_7) ? 2 : 2, .description = COMPOUND_STRING( "A Ball that works\n" "well on Moon\n" @@ -524,7 +524,7 @@ const struct Item gItems[] = [ITEM_CHERISH_BALL] = { .name = _("Cherish Ball"), - .price = 0, + .price = 2, .description = COMPOUND_STRING( "A rare Ball made\n" "in commemoration\n" diff --git a/src/field_specials.c b/src/field_specials.c index be72cd200..e1fcaf641 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -18,6 +18,7 @@ #include "field_camera.h" #include "field_effect.h" #include "event_object_movement.h" +#include "item.h" #include "menu_indicators.h" #include "random.h" #include "mail_data.h" @@ -2075,7 +2076,7 @@ bool8 UsedPokemonCenterWarp(void) bool8 BufferTMHMMoveName(void) { // 8004 = item ID - if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + if (IsItemTMHM(gSpecialVar_0x8004)) { StringCopy(gStringVar1, gMovesInfo[ItemIdToBattleMoveId(gSpecialVar_0x8004)].name); return TRUE; diff --git a/src/graphics.c b/src/graphics.c index 7c82ea52a..80d99f9fb 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -464,6 +464,9 @@ const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/spri const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.lz"); +const u32 gBattleAnimSpritePal_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.gbapal.lz"); diff --git a/src/item.c b/src/item.c index 2f86d4a53..23754d70f 100644 --- a/src/item.c +++ b/src/item.c @@ -744,3 +744,26 @@ u32 GetItemStatus2Mask(u16 itemId) else return 0; } + +bool8 IsItemTM(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return ITEM_TM01 <= itemId && itemId <= ITEM_TM100; +} + +bool8 IsItemHM(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return ITEM_HM01 <= itemId && itemId <= ITEM_HM08; +} + +bool8 IsItemTMHM(u16 itemId) +{ + return IsItemTM(itemId) || IsItemHM(itemId); +} + +bool8 IsItemBall(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return FIRST_BALL <= itemId && itemId <= LAST_BALL; +} diff --git a/src/oak_speech.c b/src/oak_speech.c index 4586aab26..62cccb008 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -1885,7 +1885,7 @@ static void CreateNidoranFSprite(u8 taskId) u8 spriteId; LoadSpecialPokePic(MonSpritesGfxManager_GetSpritePtr(0), INTRO_SPECIES, 0, TRUE); - LoadCompressedSpritePaletteUsingHeapWithTag(GetMonSpritePalFromSpeciesAndPersonality(INTRO_SPECIES, 0, SHINY_ODDS), INTRO_SPECIES); + LoadCompressedSpritePaletteUsingHeapWithTag(GetMonSpritePalFromSpeciesAndPersonality(INTRO_SPECIES, 0, 0), INTRO_SPECIES); SetMultiuseSpriteTemplateToPokemon(INTRO_SPECIES, 0); spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1); gSprites[spriteId].callback = SpriteCallbackDummy; diff --git a/src/party_menu.c b/src/party_menu.c index 0698490f3..fe4e8e9d9 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5178,7 +5178,7 @@ static void Task_LearnedMove(u8 taskId) if (learnMoveMethod == LEARN_VIA_TMHM) { AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); - if (item < ITEM_HM01) + if (!ItemId_GetImportance(item)) RemoveBagItem(item, 1); } GetMonNickname(mon, gStringVar1); diff --git a/src/pokeball.c b/src/pokeball.c index e9661edd6..726c3b229 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -45,47 +45,92 @@ static u16 GetBattlerPokeballItemId(u8 battlerId); #define GFX_TAG_POKE_BALL 55000 #define GFX_TAG_GREAT_BALL 55001 -#define GFX_TAG_SAFARI_BALL 55002 -#define GFX_TAG_ULTRA_BALL 55003 -#define GFX_TAG_MASTER_BALL 55004 -#define GFX_TAG_NET_BALL 55005 -#define GFX_TAG_DIVE_BALL 55006 +#define GFX_TAG_ULTRA_BALL 55002 +#define GFX_TAG_MASTER_BALL 55003 +#define GFX_TAG_PREMIER_BALL 55004 +#define GFX_TAG_HEAL_BALL 55005 +#define GFX_TAG_NET_BALL 55006 #define GFX_TAG_NEST_BALL 55007 -#define GFX_TAG_REPEAT_BALL 55008 -#define GFX_TAG_TIMER_BALL 55009 -#define GFX_TAG_LUXURY_BALL 55010 -#define GFX_TAG_PREMIER_BALL 55011 +#define GFX_TAG_DIVE_BALL 55008 +#define GFX_TAG_DUSK_BALL 55009 +#define GFX_TAG_TIMER_BALL 55010 +#define GFX_TAG_QUICK_BALL 55011 +#define GFX_TAG_REPEAT_BALL 55012 +#define GFX_TAG_LUXURY_BALL 55013 +#define GFX_TAG_LEVEL_BALL 55014 +#define GFX_TAG_LURE_BALL 55015 +#define GFX_TAG_MOON_BALL 55016 +#define GFX_TAG_FRIEND_BALL 55017 +#define GFX_TAG_LOVE_BALL 55018 +#define GFX_TAG_FAST_BALL 55019 +#define GFX_TAG_HEAVY_BALL 55020 +#define GFX_TAG_DREAM_BALL 55021 +#define GFX_TAG_SAFARI_BALL 55022 +#define GFX_TAG_SPORT_BALL 55023 +#define GFX_TAG_PARK_BALL 55024 +#define GFX_TAG_BEAST_BALL 55025 +#define GFX_TAG_CHERISH_BALL 55026 const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] = { [BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREAT_BALL}, - [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTER_BALL}, - [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL}, - [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL}, - [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL}, - [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL}, - [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL}, - [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL}, + [BALL_HEAL] = {gBallGfx_Heal, 384, GFX_TAG_HEAL_BALL}, + [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL}, + [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL}, + [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL}, + [BALL_DUSK] = {gBallGfx_Dusk, 384, GFX_TAG_DUSK_BALL}, + [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL}, + [BALL_QUICK] = {gBallGfx_Quick, 384, GFX_TAG_QUICK_BALL}, + [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL}, + [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL}, + [BALL_LEVEL] = {gBallGfx_Level, 384, GFX_TAG_LEVEL_BALL}, + [BALL_LURE] = {gBallGfx_Lure, 384, GFX_TAG_LURE_BALL}, + [BALL_MOON] = {gBallGfx_Moon, 384, GFX_TAG_MOON_BALL}, + [BALL_FRIEND] = {gBallGfx_Friend, 384, GFX_TAG_FRIEND_BALL}, + [BALL_LOVE] = {gBallGfx_Love, 384, GFX_TAG_LOVE_BALL}, + [BALL_FAST] = {gBallGfx_Fast, 384, GFX_TAG_FAST_BALL}, + [BALL_HEAVY] = {gBallGfx_Heavy, 384, GFX_TAG_HEAVY_BALL}, + [BALL_DREAM] = {gBallGfx_Dream, 384, GFX_TAG_DREAM_BALL}, + [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL}, + [BALL_SPORT] = {gBallGfx_Sport, 384, GFX_TAG_SPORT_BALL}, + [BALL_PARK] = {gBallGfx_Park, 384, GFX_TAG_PARK_BALL}, + [BALL_BEAST] = {gBallGfx_Beast, 384, GFX_TAG_BEAST_BALL}, + [BALL_CHERISH] = {gBallGfx_Cherish, 384, GFX_TAG_CHERISH_BALL}, }; const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = { [BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREAT_BALL}, - [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTER_BALL}, - [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL}, - [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL}, - [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL}, - [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL}, - [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL}, - [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL}, + [BALL_HEAL] = {gBallPal_Heal, GFX_TAG_HEAL_BALL}, + [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL}, + [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL}, + [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL}, + [BALL_DUSK] = {gBallPal_Dusk, GFX_TAG_DUSK_BALL}, + [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL}, + [BALL_QUICK] = {gBallPal_Quick, GFX_TAG_QUICK_BALL}, + [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL}, + [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL}, + [BALL_LEVEL] = {gBallPal_Level, GFX_TAG_LEVEL_BALL}, + [BALL_LURE] = {gBallPal_Lure, GFX_TAG_LURE_BALL}, + [BALL_MOON] = {gBallPal_Moon, GFX_TAG_MOON_BALL}, + [BALL_FRIEND] = {gBallPal_Friend, GFX_TAG_FRIEND_BALL}, + [BALL_LOVE] = {gBallPal_Love, GFX_TAG_LOVE_BALL}, + [BALL_FAST] = {gBallPal_Fast, GFX_TAG_FAST_BALL}, + [BALL_HEAVY] = {gBallPal_Heavy, GFX_TAG_HEAVY_BALL}, + [BALL_DREAM] = {gBallPal_Dream, GFX_TAG_DREAM_BALL}, + [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL}, + [BALL_SPORT] = {gBallPal_Sport, GFX_TAG_SPORT_BALL}, + [BALL_PARK] = {gBallPal_Park, GFX_TAG_PARK_BALL}, + [BALL_BEAST] = {gBallPal_Beast, GFX_TAG_BEAST_BALL}, + [BALL_CHERISH] = {gBallPal_Cherish, GFX_TAG_CHERISH_BALL}, }; static const struct OamData sBallOamData = @@ -221,16 +266,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_SAFARI] = - { - .tileTag = GFX_TAG_SAFARI_BALL, - .paletteTag = GFX_TAG_SAFARI_BALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_BallThrow, - }, [BALL_ULTRA] = { .tileTag = GFX_TAG_ULTRA_BALL, @@ -251,20 +286,30 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_NET] = + [BALL_PREMIER] = { - .tileTag = GFX_TAG_NET_BALL, - .paletteTag = GFX_TAG_NET_BALL, + .tileTag = GFX_TAG_PREMIER_BALL, + .paletteTag = GFX_TAG_PREMIER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_DIVE] = + [BALL_HEAL] = { - .tileTag = GFX_TAG_DIVE_BALL, - .paletteTag = GFX_TAG_DIVE_BALL, + .tileTag = GFX_TAG_HEAL_BALL, + .paletteTag = GFX_TAG_HEAL_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_NET] = + { + .tileTag = GFX_TAG_NET_BALL, + .paletteTag = GFX_TAG_NET_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -281,10 +326,20 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_REPEAT] = + [BALL_DIVE] = { - .tileTag = GFX_TAG_REPEAT_BALL, - .paletteTag = GFX_TAG_REPEAT_BALL, + .tileTag = GFX_TAG_DIVE_BALL, + .paletteTag = GFX_TAG_DIVE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_DUSK] = + { + .tileTag = GFX_TAG_DUSK_BALL, + .paletteTag = GFX_TAG_DUSK_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -301,6 +356,26 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, + [BALL_QUICK] = + { + .tileTag = GFX_TAG_QUICK_BALL, + .paletteTag = GFX_TAG_QUICK_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_REPEAT] = + { + .tileTag = GFX_TAG_REPEAT_BALL, + .paletteTag = GFX_TAG_REPEAT_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, [BALL_LUXURY] = { .tileTag = GFX_TAG_LUXURY_BALL, @@ -311,10 +386,130 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_PREMIER] = + [BALL_LEVEL] = { - .tileTag = GFX_TAG_PREMIER_BALL, - .paletteTag = GFX_TAG_PREMIER_BALL, + .tileTag = GFX_TAG_LEVEL_BALL, + .paletteTag = GFX_TAG_LEVEL_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_LURE] = + { + .tileTag = GFX_TAG_LURE_BALL, + .paletteTag = GFX_TAG_LURE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_MOON] = + { + .tileTag = GFX_TAG_MOON_BALL, + .paletteTag = GFX_TAG_MOON_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_FRIEND] = + { + .tileTag = GFX_TAG_FRIEND_BALL, + .paletteTag = GFX_TAG_FRIEND_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_LOVE] = + { + .tileTag = GFX_TAG_LOVE_BALL, + .paletteTag = GFX_TAG_LOVE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_FAST] = + { + .tileTag = GFX_TAG_FAST_BALL, + .paletteTag = GFX_TAG_FAST_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_HEAVY] = + { + .tileTag = GFX_TAG_HEAVY_BALL, + .paletteTag = GFX_TAG_HEAVY_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_DREAM] = + { + .tileTag = GFX_TAG_DREAM_BALL, + .paletteTag = GFX_TAG_DREAM_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_SAFARI] = + { + .tileTag = GFX_TAG_SAFARI_BALL, + .paletteTag = GFX_TAG_SAFARI_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_SPORT] = + { + .tileTag = GFX_TAG_SPORT_BALL, + .paletteTag = GFX_TAG_SPORT_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_PARK] = + { + .tileTag = GFX_TAG_PARK_BALL, + .paletteTag = GFX_TAG_PARK_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_BEAST] = + { + .tileTag = GFX_TAG_BEAST_BALL, + .paletteTag = GFX_TAG_BEAST_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_CHERISH] = + { + .tileTag = GFX_TAG_CHERISH_BALL, + .paletteTag = GFX_TAG_CHERISH_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -1323,11 +1518,10 @@ void LoadBallGfx(u8 ballId) switch (ballId) { - case BALL_DIVE: - case BALL_LUXURY: - case BALL_PREMIER: - break; - default: + case BALL_POKE ... BALL_MASTER: + case BALL_NET ... BALL_NEST: + case BALL_REPEAT: + case BALL_SAFARI: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; @@ -1342,9 +1536,17 @@ void FreeBallGfx(u8 ballId) static u16 GetBattlerPokeballItemId(u8 battlerId) { + struct Pokemon *mon, *illusionMon; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else - return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; + + return GetMonData(mon, MON_DATA_POKEBALL); } diff --git a/src/pokedex_screen.c b/src/pokedex_screen.c index 329e7ecc5..c6761b019 100644 --- a/src/pokedex_screen.c +++ b/src/pokedex_screen.c @@ -2867,7 +2867,7 @@ void DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y) { printerTemplate.currentChar = gSpeciesInfo[species].description; printerTemplate.windowId = windowId; - printerTemplate.fontId = FONT_NORMAL; + printerTemplate.fontId = FONT_SMALL; printerTemplate.letterSpacing = 1; printerTemplate.lineSpacing = 0; printerTemplate.unk = 0; @@ -2875,7 +2875,7 @@ void DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y) printerTemplate.bgColor = 0; printerTemplate.shadowColor = 2; - length = GetStringWidth(FONT_NORMAL, gSpeciesInfo[species].description, 0); + length = GetStringWidth(FONT_SMALL, gSpeciesInfo[species].description, 0); xCenter = x + (240 - length) / 2; if (xCenter > 0) @@ -2954,7 +2954,7 @@ static u8 DexScreen_DrawMonDexPage(bool8 justRegistered) // Dex entry FillWindowPixelBuffer(sPokedexScreenData->windowIds[2], PIXEL_FILL(0)); - DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 8); + DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 1); PutWindowTilemap(sPokedexScreenData->windowIds[2]); CopyWindowToVram(sPokedexScreenData->windowIds[2], COPYWIN_GFX); diff --git a/src/pokemon.c b/src/pokemon.c index be8687a82..f3fb7fd4e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -61,7 +61,6 @@ EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0}; static EWRAM_DATA struct MonSpritesGfxManager *sMonSpritesGfxManager = NULL; static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); -static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality); static bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); static bool8 IsPokemonStorageFull(void); static u8 CopyMonToPC(struct Pokemon *mon); @@ -5546,18 +5545,7 @@ void SetWildMonHeldItem(void) bool8 IsMonShiny(struct Pokemon *mon) { - u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - return IsShinyOtIdPersonality(otId, personality); -} - -static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) -{ - bool8 retVal = FALSE; - u32 shinyValue = GET_SHINY_VALUE(otId, personality); - if (shinyValue < SHINY_ODDS) - retVal = TRUE; - return retVal; + return GetMonData(mon, MON_DATA_IS_SHINY, NULL); } u8 *GetTrainerPartnerName(void) diff --git a/src/tm_case.c b/src/tm_case.c index b07261853..07926058f 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -25,9 +25,6 @@ #include "constants/songs.h" #include "constants/quest_log.h" -// Any item in the TM Case with nonzero importance is considered an HM -#define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0) - #define TAG_SCROLL_ARROW 110 enum { @@ -679,7 +676,7 @@ static void InitTMCaseListMenuItems(void) static void GetTMNumberAndMoveString(u8 * dest, u16 itemId) { StringCopy(gStringVar4, gText_FontSmall); - if (itemId >= ITEM_HM01) + if (IsItemHM(itemId)) { StringAppend(gStringVar4, sText_ClearTo18); StringAppend(gStringVar4, gText_NumberClear01); @@ -720,10 +717,18 @@ static void List_ItemPrintFunc(u8 windowId, u32 itemIndex, u8 y) { if (itemIndex != LIST_CANCEL) { - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex))) + u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex); + if (!IsItemHM(itemId)) { - ConvertIntToDecimalStringN(gStringVar1, BagGetQuantityByPocketPosition(POCKET_TM_CASE, itemIndex), STR_CONV_MODE_RIGHT_ALIGN, 3); - StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + if (!ItemId_GetImportance(itemId)) + { + ConvertIntToDecimalStringN(gStringVar1, BagGetQuantityByPocketPosition(POCKET_TM_CASE, itemIndex), STR_CONV_MODE_RIGHT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + } + else + { + StringCopy(gStringVar4, gText_EmptyString3); + } TMCase_Print(windowId, FONT_SMALL, gStringVar4, 126, y, 0, 0, TEXT_SKIP_DRAW, COLOR_DARK); } else @@ -982,7 +987,7 @@ static void Task_SelectedTMHM_Field(u8 taskId) StringAppend(strbuf, gText_Var1IsSelected + 2); // +2 skips over the stringvar TMCase_Print(WIN_SELECTED_MSG, FONT_NORMAL, strbuf, 0, 2, 1, 0, 0, COLOR_DARK); Free(strbuf); - if (IS_HM(gSpecialVar_ItemId)) + if (IsItemHM(gSpecialVar_ItemId)) { PlaceHMTileInWindow(WIN_SELECTED_MSG, 0, 2); CopyWindowToVram(WIN_SELECTED_MSG, COPYWIN_GFX); @@ -1050,7 +1055,7 @@ static void Action_Give(u8 taskId) PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); - if (!IS_HM(itemId)) + if (!ItemId_GetImportance(itemId)) { if (CalculatePlayerPartyCount() == 0) { @@ -1127,7 +1132,7 @@ static void Task_SelectedTMHM_GiveParty(u8 taskId) { s16 * data = gTasks[taskId].data; - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) + if (!ItemId_GetImportance(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_GiveHoldItem; Task_BeginFadeOutFromTMCase(taskId); @@ -1143,7 +1148,7 @@ static void Task_SelectedTMHM_GivePC(u8 taskId) { s16 * data = gTasks[taskId].data; - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) + if (!ItemId_GetImportance(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_ReturnToPokeStorage; Task_BeginFadeOutFromTMCase(taskId); @@ -1159,7 +1164,7 @@ static void Task_SelectedTMHM_Sell(u8 taskId) { s16 * data = gTasks[taskId].data; - if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) + if (ItemId_GetImportance(gSpecialVar_ItemId)) { // Can't sell TM/HMs with no price (by default this is just the HMs) CopyItemName(gSpecialVar_ItemId, gStringVar1);