From a3d09787623253d384e68bef49a5551ae3126aba Mon Sep 17 00:00:00 2001 From: Raymond Dodge Date: Sat, 18 Jan 2025 20:58:03 -0500 Subject: [PATCH 001/125] Replace easy_chat alphabetialOrder magic numbers with EC_INDEX values (#2096) --- src/data/easy_chat/easy_chat_group_actions.h | 156 ++++++------- .../easy_chat/easy_chat_group_adjectives.h | 72 +++--- src/data/easy_chat/easy_chat_group_battle.h | 126 +++++----- .../easy_chat/easy_chat_group_conditions.h | 138 +++++------ src/data/easy_chat/easy_chat_group_endings.h | 138 +++++------ src/data/easy_chat/easy_chat_group_events.h | 58 ++--- src/data/easy_chat/easy_chat_group_feelings.h | 138 +++++------ .../easy_chat/easy_chat_group_greetings.h | 84 +++---- src/data/easy_chat/easy_chat_group_hobbies.h | 108 ++++----- .../easy_chat/easy_chat_group_lifestyle.h | 90 ++++---- src/data/easy_chat/easy_chat_group_misc.h | 84 +++---- src/data/easy_chat/easy_chat_group_people.h | 150 ++++++------ src/data/easy_chat/easy_chat_group_speech.h | 120 +++++----- src/data/easy_chat/easy_chat_group_status.h | 218 +++++++++--------- src/data/easy_chat/easy_chat_group_time.h | 90 ++++---- src/data/easy_chat/easy_chat_group_trainer.h | 54 ++--- .../easy_chat/easy_chat_group_trendy_saying.h | 66 +++--- src/data/easy_chat/easy_chat_group_voices.h | 126 +++++----- 18 files changed, 1008 insertions(+), 1008 deletions(-) diff --git a/src/data/easy_chat/easy_chat_group_actions.h b/src/data/easy_chat/easy_chat_group_actions.h index 6ad297efcf..38f623ea56 100755 --- a/src/data/easy_chat/easy_chat_group_actions.h +++ b/src/data/easy_chat/easy_chat_group_actions.h @@ -81,469 +81,469 @@ const struct EasyChatWordInfo gEasyChatGroup_Actions[] = { [EC_INDEX(EC_WORD_MEETS)] = { .text = gEasyChatWord_Meets, - .alphabeticalOrder = 72, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALLOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CONCEDE)] = { .text = gEasyChatWord_Concede, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANGERS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIVE)] = { .text = gEasyChatWord_Give, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_APPEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIVES)] = { .text = gEasyChatWord_Gives, - .alphabeticalOrder = 75, + .alphabeticalOrder = EC_INDEX(EC_WORD_APPEARS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLAYED)] = { .text = gEasyChatWord_Played, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_BELIEVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLAYS)] = { .text = gEasyChatWord_Plays, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_BRAG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COLLECT)] = { .text = gEasyChatWord_Collect, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WALKING)] = { .text = gEasyChatWord_Walking, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAPABLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WALKS)] = { .text = gEasyChatWord_Walks, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAUSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAYS)] = { .text = gEasyChatWord_Says, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHANGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WENT)] = { .text = gEasyChatWord_Went, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHOOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAID)] = { .text = gEasyChatWord_Said, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_COLLECT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAKE_UP)] = { .text = gEasyChatWord_WakeUp, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_COME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAKES_UP)] = { .text = gEasyChatWord_WakesUp, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_CONCEDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANGERS)] = { .text = gEasyChatWord_Angers, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_COULDN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TEACH)] = { .text = gEasyChatWord_Teach, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISAPPEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TEACHES)] = { .text = gEasyChatWord_Teaches, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_DRINKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLEASE)] = { .text = gEasyChatWord_Please, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_EATS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEARN)] = { .text = gEasyChatWord_Learn, - .alphabeticalOrder = 76, + .alphabeticalOrder = EC_INDEX(EC_WORD_FAINT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHANGE)] = { .text = gEasyChatWord_Change, - .alphabeticalOrder = 77, + .alphabeticalOrder = EC_INDEX(EC_WORD_FAINTED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STORY)] = { .text = gEasyChatWord_Story, - .alphabeticalOrder = 73, + .alphabeticalOrder = EC_INDEX(EC_WORD_FORGET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRUST)] = { .text = gEasyChatWord_Trust, - .alphabeticalOrder = 74, + .alphabeticalOrder = EC_INDEX(EC_WORD_FORGETS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LAVISH)] = { .text = gEasyChatWord_Lavish, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LISTENS)] = { .text = gEasyChatWord_Listens, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIVES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEARING)] = { .text = gEasyChatWord_Hearing, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEARING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRAINS)] = { .text = gEasyChatWord_Trains, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_IGNORANT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHOOSE)] = { .text = gEasyChatWord_Choose, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_KNOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COME)] = { .text = gEasyChatWord_Come, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_KNOWS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAME)] = { .text = gEasyChatWord_Came, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_LAVISH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEARCH)] = { .text = gEasyChatWord_Search, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEARN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAKE)] = { .text = gEasyChatWord_Make, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_LISTENS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAUSE)] = { .text = gEasyChatWord_Cause, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOOKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KNOW)] = { .text = gEasyChatWord_Know, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KNOWS)] = { .text = gEasyChatWord_Knows, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_MEETS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_REFUSE)] = { .text = gEasyChatWord_Refuse, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_OVERDO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STORES)] = { .text = gEasyChatWord_Stores, - .alphabeticalOrder = 70, + .alphabeticalOrder = EC_INDEX(EC_WORD_OWN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BRAG)] = { .text = gEasyChatWord_Brag, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLAYED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IGNORANT)] = { .text = gEasyChatWord_Ignorant, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLAYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THINKS)] = { .text = gEasyChatWord_Thinks, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLEASE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BELIEVE)] = { .text = gEasyChatWord_Believe, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_PRAISE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SLIDE)] = { .text = gEasyChatWord_Slide, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_PRETEND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EATS)] = { .text = gEasyChatWord_Eats, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_REFUSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_USE)] = { .text = gEasyChatWord_Use, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_RELEASE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_USES)] = { .text = gEasyChatWord_Uses, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_RUN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_USING)] = { .text = gEasyChatWord_Using, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_RUNS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COULDN_T)] = { .text = gEasyChatWord_Couldnt, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAID), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAPABLE)] = { .text = gEasyChatWord_Capable, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISAPPEAR)] = { .text = gEasyChatWord_Disappear, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEARCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_APPEAR)] = { .text = gEasyChatWord_Appear, - .alphabeticalOrder = 69, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEEK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THROW)] = { .text = gEasyChatWord_Throw, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORRY)] = { .text = gEasyChatWord_Worry, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SLEPT)] = { .text = gEasyChatWord_Slept, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_SINK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SLEEP)] = { .text = gEasyChatWord_Sleep, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_SLEEP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RELEASE)] = { .text = gEasyChatWord_Release, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_SLEPT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DRINKS)] = { .text = gEasyChatWord_Drinks, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_SLIDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RUNS)] = { .text = gEasyChatWord_Runs, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMACK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RUN)] = { .text = gEasyChatWord_Run, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_STORES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORKS)] = { .text = gEasyChatWord_Works, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_STORY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORKING)] = { .text = gEasyChatWord_Working, - .alphabeticalOrder = 71, + .alphabeticalOrder = EC_INDEX(EC_WORD_TAKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TALKING)] = { .text = gEasyChatWord_Talking, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_TALK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TALK)] = { .text = gEasyChatWord_Talk, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_TALKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SINK)] = { .text = gEasyChatWord_Sink, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_TEACH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMACK)] = { .text = gEasyChatWord_Smack, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_TEACHES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PRETEND)] = { .text = gEasyChatWord_Pretend, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_THINKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PRAISE)] = { .text = gEasyChatWord_Praise, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_THROW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OVERDO)] = { .text = gEasyChatWord_Overdo, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRAINS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHOW)] = { .text = gEasyChatWord_Show, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRUST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOOKS)] = { .text = gEasyChatWord_Looks, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_USE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEES)] = { .text = gEasyChatWord_Sees, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_USES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEEK)] = { .text = gEasyChatWord_Seek, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_USING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OWN)] = { .text = gEasyChatWord_Own, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAKE_UP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TAKE)] = { .text = gEasyChatWord_Take, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAKES_UP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALLOW)] = { .text = gEasyChatWord_Allow, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_WALKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FORGET)] = { .text = gEasyChatWord_Forget, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_WALKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FORGETS)] = { .text = gEasyChatWord_Forgets, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_WENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_APPEARS)] = { .text = gEasyChatWord_Appears, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FAINT)] = { .text = gEasyChatWord_Faint, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FAINTED)] = { .text = gEasyChatWord_Fainted, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORRY), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_adjectives.h b/src/data/easy_chat/easy_chat_group_adjectives.h index 619dff6213..6a85973df4 100755 --- a/src/data/easy_chat/easy_chat_group_adjectives.h +++ b/src/data/easy_chat/easy_chat_group_adjectives.h @@ -39,217 +39,217 @@ const struct EasyChatWordInfo gEasyChatGroup_Adjectives[] = { [EC_INDEX(EC_WORD_WANDERING)] = { .text = gEasyChatWord_Wandering, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANTICIPATION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RICKETY)] = { .text = gEasyChatWord_Rickety, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_AWESOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROCK_SOLID)] = { .text = gEasyChatWord_RockSolid, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_BREAK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HUNGRY)] = { .text = gEasyChatWord_Hungry, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_DESTROYED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TIGHT)] = { .text = gEasyChatWord_Tight, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_DROOLING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TICKLISH)] = { .text = gEasyChatWord_Ticklish, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCITING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TWIRLING)] = { .text = gEasyChatWord_Twirling, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_FIERY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPIRALING)] = { .text = gEasyChatWord_Spiraling, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAPPILY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THIRSTY)] = { .text = gEasyChatWord_Thirsty, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOPELESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOLLING)] = { .text = gEasyChatWord_Lolling, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_HUNGRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SILKY)] = { .text = gEasyChatWord_Silky, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_INCREASING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SADLY)] = { .text = gEasyChatWord_Sadly, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOLLING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOPELESS)] = { .text = gEasyChatWord_Hopeless, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOVEY_DOVEY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_USELESS)] = { .text = gEasyChatWord_Useless, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_RICKETY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DROOLING)] = { .text = gEasyChatWord_Drooling, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_RIPPED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCITING)] = { .text = gEasyChatWord_Exciting, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROCK_SOLID), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THICK)] = { .text = gEasyChatWord_Thick, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_SADLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMOOTH)] = { .text = gEasyChatWord_Smooth, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_SCATTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SLIMY)] = { .text = gEasyChatWord_Slimy, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHAKY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THIN)] = { .text = gEasyChatWord_Thin, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHREDDED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BREAK)] = { .text = gEasyChatWord_Break, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_SILKY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VORACIOUS)] = { .text = gEasyChatWord_Voracious, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_SLIMY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SCATTER)] = { .text = gEasyChatWord_Scatter, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMOOTH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AWESOME)] = { .text = gEasyChatWord_Awesome, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPIRALING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WIMPY)] = { .text = gEasyChatWord_Wimpy, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_THICK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WOBBLY)] = { .text = gEasyChatWord_Wobbly, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_THIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHAKY)] = { .text = gEasyChatWord_Shaky, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_THIRSTY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RIPPED)] = { .text = gEasyChatWord_Ripped, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_TICKLISH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHREDDED)] = { .text = gEasyChatWord_Shredded, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_TIGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INCREASING)] = { .text = gEasyChatWord_Increasing, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_TWIRLING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YET)] = { .text = gEasyChatWord_Yet, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_USELESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DESTROYED)] = { .text = gEasyChatWord_Destroyed, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_VORACIOUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FIERY)] = { .text = gEasyChatWord_Fiery, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_WANDERING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOVEY_DOVEY)] = { .text = gEasyChatWord_LoveyDovey, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_WIMPY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAPPILY)] = { .text = gEasyChatWord_Happily, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_WOBBLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANTICIPATION)] = { .text = gEasyChatWord_Anticipation, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_YET), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_battle.h b/src/data/easy_chat/easy_chat_group_battle.h index 2a2420b2f1..56d7ce0cd8 100755 --- a/src/data/easy_chat/easy_chat_group_battle.h +++ b/src/data/easy_chat/easy_chat_group_battle.h @@ -66,379 +66,379 @@ const struct EasyChatWordInfo gEasyChatGroup_Battle[] = { [EC_INDEX(EC_WORD_MATCH_UP)] = { .text = gEasyChatWord_MatchUp, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_ACCEPT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GO)] = { .text = gEasyChatWord_Go, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_AIM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NO_1)] = { .text = gEasyChatWord_No1, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_ATTACK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DECIDE)] = { .text = gEasyChatWord_Decide, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_BATTLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LET_ME_WIN)] = { .text = gEasyChatWord_LetMeWin, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAN_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WINS)] = { .text = gEasyChatWord_Wins, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAN_T_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WIN)] = { .text = gEasyChatWord_Win, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHALLENGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WON)] = { .text = gEasyChatWord_Won, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_COME_ON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IF_I_WIN)] = { .text = gEasyChatWord_IfIWin, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_DECIDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHEN_I_WIN)] = { .text = gEasyChatWord_WhenIWin, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_DECIDED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAN_T_WIN)] = { .text = gEasyChatWord_CantWin, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_EASY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAN_WIN)] = { .text = gEasyChatWord_CanWin, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_ESCAPE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NO_MATCH)] = { .text = gEasyChatWord_NoMatch, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_FIGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPIRIT)] = { .text = gEasyChatWord_Spirit, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_FIGHTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DECIDED)] = { .text = gEasyChatWord_Decided, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_FOE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRUMP_CARD)] = { .text = gEasyChatWord_TrumpCard, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_GENIUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TAKE_THAT)] = { .text = gEasyChatWord_TakeThat, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIVE_UP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COME_ON)] = { .text = gEasyChatWord_ComeOn, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_GO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ATTACK)] = { .text = gEasyChatWord_Attack, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_GO_EASY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SURRENDER)] = { .text = gEasyChatWord_Surrender, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_GUARD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GUTSY)] = { .text = gEasyChatWord_Gutsy, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_GUTSY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TALENT)] = { .text = gEasyChatWord_Talent, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_IF_I_LOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STRATEGY)] = { .text = gEasyChatWord_Strategy, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_IF_I_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMITE)] = { .text = gEasyChatWord_Smite, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_INVINCIBLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MATCH)] = { .text = gEasyChatWord_Match, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEADER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VICTORY)] = { .text = gEasyChatWord_Victory, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEGEND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OFFENSIVE)] = { .text = gEasyChatWord_Offensive, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_LET_ME_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SENSE)] = { .text = gEasyChatWord_Sense, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VERSUS)] = { .text = gEasyChatWord_Versus, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOSS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FIGHTS)] = { .text = gEasyChatWord_Fights, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POWER)] = { .text = gEasyChatWord_Power, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_MATCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHALLENGE)] = { .text = gEasyChatWord_Challenge, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_MATCH_UP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STRONG)] = { .text = gEasyChatWord_Strong, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_MOVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOO_STRONG)] = { .text = gEasyChatWord_TooStrong, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_NO_MATCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GO_EASY)] = { .text = gEasyChatWord_GoEasy, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_NO_1), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FOE)] = { .text = gEasyChatWord_Foe, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_OFFENSIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GENIUS)] = { .text = gEasyChatWord_Genius, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_PARTNER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEGEND)] = { .text = gEasyChatWord_Legend, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_POINTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ESCAPE)] = { .text = gEasyChatWord_Escape, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_POWER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AIM)] = { .text = gEasyChatWord_Aim, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_PUSHOVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BATTLE)] = { .text = gEasyChatWord_Battle, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_RECEIVED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FIGHT)] = { .text = gEasyChatWord_Fight, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_REJECT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RESUSCITATE)] = { .text = gEasyChatWord_Resuscitate, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_RESUSCITATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POINTS)] = { .text = gEasyChatWord_Points, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_RULE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SERIOUS)] = { .text = gEasyChatWord_Serious, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_SENSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIVE_UP)] = { .text = gEasyChatWord_GiveUp, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_SERIOUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOSS)] = { .text = gEasyChatWord_Loss, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMITE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IF_I_LOSE)] = { .text = gEasyChatWord_IfILose, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPIRIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOST)] = { .text = gEasyChatWord_Lost, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_STRATEGY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOSE)] = { .text = gEasyChatWord_Lose, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_STRONG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GUARD)] = { .text = gEasyChatWord_Guard, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_SURRENDER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PARTNER)] = { .text = gEasyChatWord_Partner, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_TAKE_THAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_REJECT)] = { .text = gEasyChatWord_Reject, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_TALENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ACCEPT)] = { .text = gEasyChatWord_Accept, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOO_STRONG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INVINCIBLE)] = { .text = gEasyChatWord_Invincible, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOO_WEAK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RECEIVED)] = { .text = gEasyChatWord_Received, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRUMP_CARD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EASY)] = { .text = gEasyChatWord_Easy, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_VERSUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEAK)] = { .text = gEasyChatWord_Weak, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_VICTORY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOO_WEAK)] = { .text = gEasyChatWord_TooWeak, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEAK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PUSHOVER)] = { .text = gEasyChatWord_Pushover, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHEN_I_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEADER)] = { .text = gEasyChatWord_Leader, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_WIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RULE)] = { .text = gEasyChatWord_Rule, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_WINS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MOVE)] = { .text = gEasyChatWord_Move, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_WON), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_conditions.h b/src/data/easy_chat/easy_chat_group_conditions.h index d0636f1628..b53816e9e9 100755 --- a/src/data/easy_chat/easy_chat_group_conditions.h +++ b/src/data/easy_chat/easy_chat_group_conditions.h @@ -72,415 +72,415 @@ const struct EasyChatWordInfo gEasyChatGroup_Conditions[] = { [EC_INDEX(EC_WORD_HOT)] = { .text = gEasyChatWord_Hot, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_ABSENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXISTS)] = { .text = gEasyChatWord_Exists, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALONE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCESS)] = { .text = gEasyChatWord_Excess, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_AMUSING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_APPROVED)] = { .text = gEasyChatWord_Approved, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_APPROVED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAS)] = { .text = gEasyChatWord_Has, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_AWFUL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOOD)] = { .text = gEasyChatWord_Good, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_BADLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LESS)] = { .text = gEasyChatWord_Less, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_BECOMES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MOMENTUM)] = { .text = gEasyChatWord_Momentum, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOING)] = { .text = gEasyChatWord_Going, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEIRD)] = { .text = gEasyChatWord_Weird, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_BIG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BUSY)] = { .text = gEasyChatWord_Busy, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_BORED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOGETHER)] = { .text = gEasyChatWord_Together, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_BUSY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FULL)] = { .text = gEasyChatWord_Full, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_CLOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ABSENT)] = { .text = gEasyChatWord_Absent, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_COLD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEING)] = { .text = gEasyChatWord_Being, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_CORRECT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEED)] = { .text = gEasyChatWord_Need, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_DIFFERENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TASTY)] = { .text = gEasyChatWord_Tasty, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_DOCILE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SKILLED)] = { .text = gEasyChatWord_Skilled, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_ELSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOISY)] = { .text = gEasyChatWord_Noisy, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_ENTERTAINING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BIG)] = { .text = gEasyChatWord_Big, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCELLENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LATE)] = { .text = gEasyChatWord_Late, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CLOSE)] = { .text = gEasyChatWord_Close, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXISTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DOCILE)] = { .text = gEasyChatWord_Docile, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXPENSIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AMUSING)] = { .text = gEasyChatWord_Amusing, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_FABULOUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ENTERTAINING)] = { .text = gEasyChatWord_Entertaining, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_FAST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PERFECTION)] = { .text = gEasyChatWord_Perfection, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_FULL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PRETTY)] = { .text = gEasyChatWord_Pretty, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEALTHY)] = { .text = gEasyChatWord_Healthy, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOOD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCELLENT)] = { .text = gEasyChatWord_Excellent, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UPSIDE_DOWN)] = { .text = gEasyChatWord_UpsideDown, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEALTHY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COLD)] = { .text = gEasyChatWord_Cold, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_REFRESHING)] = { .text = gEasyChatWord_Refreshing, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_IMPOSSIBLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNAVOIDABLE)] = { .text = gEasyChatWord_Unavoidable, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_KIND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MUCH)] = { .text = gEasyChatWord_Much, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_LACKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OVERWHELMING)] = { .text = gEasyChatWord_Overwhelming, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_LATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FABULOUS)] = { .text = gEasyChatWord_Fabulous, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_LESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ELSE)] = { .text = gEasyChatWord_Else, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOUSY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXPENSIVE)] = { .text = gEasyChatWord_Expensive, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CORRECT)] = { .text = gEasyChatWord_Correct, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_LUKEWARM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IMPOSSIBLE)] = { .text = gEasyChatWord_Impossible, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_MISTAKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMALL)] = { .text = gEasyChatWord_Small, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_MOMENTUM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DIFFERENT)] = { .text = gEasyChatWord_Different, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_MUCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TIRED)] = { .text = gEasyChatWord_Tired, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_MYSTERY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SKILL)] = { .text = gEasyChatWord_Skill, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_NATURAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOP)] = { .text = gEasyChatWord_Top, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NON_STOP)] = { .text = gEasyChatWord_NonStop, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOISY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PREPOSTEROUS)] = { .text = gEasyChatWord_Preposterous, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_NON_STOP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NONE)] = { .text = gEasyChatWord_None, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_NONE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOTHING)] = { .text = gEasyChatWord_Nothing, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOTHING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NATURAL)] = { .text = gEasyChatWord_Natural, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_OVERWHELMING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BECOMES)] = { .text = gEasyChatWord_Becomes, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_PERFECTION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LUKEWARM)] = { .text = gEasyChatWord_Lukewarm, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_PREPOSTEROUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FAST)] = { .text = gEasyChatWord_Fast, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_PRETTY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOW)] = { .text = gEasyChatWord_Low, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_REFRESHING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AWFUL)] = { .text = gEasyChatWord_Awful, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_SECRET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALONE)] = { .text = gEasyChatWord_Alone, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEEMS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BORED)] = { .text = gEasyChatWord_Bored, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_SIMPLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SECRET)] = { .text = gEasyChatWord_Secret, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_SKILL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MYSTERY)] = { .text = gEasyChatWord_Mystery, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_SKILLED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LACKS)] = { .text = gEasyChatWord_Lacks, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMALL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEST)] = { .text = gEasyChatWord_Best, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_TASTY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOUSY)] = { .text = gEasyChatWord_Lousy, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_TIRED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MISTAKE)] = { .text = gEasyChatWord_Mistake, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOGETHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KIND)] = { .text = gEasyChatWord_Kind, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WELL)] = { .text = gEasyChatWord_Well, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNAVOIDABLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEAKENED)] = { .text = gEasyChatWord_Weakened, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_UPSIDE_DOWN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SIMPLE)] = { .text = gEasyChatWord_Simple, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEAKENED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEEMS)] = { .text = gEasyChatWord_Seems, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEIRD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BADLY)] = { .text = gEasyChatWord_Badly, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_WELL), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_endings.h b/src/data/easy_chat/easy_chat_group_endings.h index ffa5108a91..629380b039 100755 --- a/src/data/easy_chat/easy_chat_group_endings.h +++ b/src/data/easy_chat/easy_chat_group_endings.h @@ -72,415 +72,415 @@ const struct EasyChatWordInfo gEasyChatGroup_Endings[] = { [EC_INDEX(EC_WORD_WILL)] = { .text = gEasyChatWord_Will, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_A), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WILL_BE_HERE)] = { .text = gEasyChatWord_WillBeHere, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_ABOUT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OR)] = { .text = gEasyChatWord_Or, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_AFTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TIMES)] = { .text = gEasyChatWord_Times, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WONDER)] = { .text = gEasyChatWord_Wonder, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_AN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IS_IT_QUES)] = { .text = gEasyChatWord_IsItQues, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANYWHERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BE)] = { .text = gEasyChatWord_Be, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_ARE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIMME)] = { .text = gEasyChatWord_Gimme, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_AS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COULD)] = { .text = gEasyChatWord_Could, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_AT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIKELY_TO)] = { .text = gEasyChatWord_LikelyTo, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_BE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WOULD)] = { .text = gEasyChatWord_Would, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEFORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IS)] = { .text = gEasyChatWord_Is, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_BELONGS_TO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ISN_T_IT_QUES)] = { .text = gEasyChatWord_IsntItQues, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_BETTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LET_S)] = { .text = gEasyChatWord_Lets, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OTHER)] = { .text = gEasyChatWord_Other, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ARE)] = { .text = gEasyChatWord_Are, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_COULD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAS)] = { .text = gEasyChatWord_Was, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_DID), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WERE)] = { .text = gEasyChatWord_Were, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_DIDN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THOSE)] = { .text = gEasyChatWord_Those, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_DO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ISN_T)] = { .text = gEasyChatWord_Isnt, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_DOES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WON_T)] = { .text = gEasyChatWord_Wont, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_DOESN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAN_T)] = { .text = gEasyChatWord_Cant, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_DON_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAN)] = { .text = gEasyChatWord_Can, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DON_T)] = { .text = gEasyChatWord_Dont, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_FOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DO)] = { .text = gEasyChatWord_Do, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIMME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DOES)] = { .text = gEasyChatWord_Does, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHOM)] = { .text = gEasyChatWord_Whom, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAVEN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHICH)] = { .text = gEasyChatWord_Which, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_IN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WASN_T)] = { .text = gEasyChatWord_Wasnt, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_IS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEREN_T)] = { .text = gEasyChatWord_Werent, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_IS_IT_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAVE)] = { .text = gEasyChatWord_Have, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_ISN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAVEN_T)] = { .text = gEasyChatWord_Havent, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_ISN_T_IT_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_A)] = { .text = gEasyChatWord_A, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_IT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AN)] = { .text = gEasyChatWord_An, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_LET_S), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOT)] = { .text = gEasyChatWord_Not, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THERE)] = { .text = gEasyChatWord_There, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIKELY_TO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OK_QUES)] = { .text = gEasyChatWord_OkQues, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAYBE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SO)] = { .text = gEasyChatWord_So, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAYBE)] = { .text = gEasyChatWord_Maybe, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_OF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ABOUT)] = { .text = gEasyChatWord_About, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_OFF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OVER)] = { .text = gEasyChatWord_Over, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_OK_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IT)] = { .text = gEasyChatWord_It, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_ON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALL)] = { .text = gEasyChatWord_All, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_ONCE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FOR)] = { .text = gEasyChatWord_For, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_OR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ON)] = { .text = gEasyChatWord_On, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_OTHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OFF)] = { .text = gEasyChatWord_Off, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_OUT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AS)] = { .text = gEasyChatWord_As, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_OVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO)] = { .text = gEasyChatWord_To, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_SINCE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WITH)] = { .text = gEasyChatWord_With, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_SO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BETTER)] = { .text = gEasyChatWord_Better, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_THAN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVER)] = { .text = gEasyChatWord_Ever, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_THERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SINCE)] = { .text = gEasyChatWord_Since, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_THOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OF)] = { .text = gEasyChatWord_Of, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_TIMES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BELONGS_TO)] = { .text = gEasyChatWord_BelongsTo, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AT)] = { .text = gEasyChatWord_At, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IN)] = { .text = gEasyChatWord_In, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OUT)] = { .text = gEasyChatWord_Out, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_WASN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOO)] = { .text = gEasyChatWord_Too, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_WERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIKE)] = { .text = gEasyChatWord_Like, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEREN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DID)] = { .text = gEasyChatWord_Did, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHICH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DIDN_T)] = { .text = gEasyChatWord_Didnt, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHILE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DOESN_T)] = { .text = gEasyChatWord_Doesnt, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHOM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WITHOUT)] = { .text = gEasyChatWord_Without, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_WILL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AFTER)] = { .text = gEasyChatWord_After, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_WILL_BE_HERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEFORE)] = { .text = gEasyChatWord_Before, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_WITH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHILE)] = { .text = gEasyChatWord_While, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_WITHOUT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THAN)] = { .text = gEasyChatWord_Than, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_WON_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ONCE)] = { .text = gEasyChatWord_Once, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_WONDER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANYWHERE)] = { .text = gEasyChatWord_Anywhere, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_WOULD), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_events.h b/src/data/easy_chat/easy_chat_group_events.h index 0fbbcc4a78..a4e5165c60 100755 --- a/src/data/easy_chat/easy_chat_group_events.h +++ b/src/data/easy_chat/easy_chat_group_events.h @@ -32,175 +32,175 @@ const struct EasyChatWordInfo gEasyChatGroup_Events[] = { [EC_INDEX(EC_WORD_APPEAL)] = { .text = gEasyChatWord_Appeal, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_APPEAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVENTS)] = { .text = gEasyChatWord_Events, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_BATTLE_ROOM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STAY_AT_HOME)] = { .text = gEasyChatWord_StayAtHome, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_BATTLE_TOWER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BERRY)] = { .text = gEasyChatWord_Berry, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_BERRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CONTEST)] = { .text = gEasyChatWord_Contest, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_BLEND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MC)] = { .text = gEasyChatWord_Mc, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_CONTEST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_JUDGE)] = { .text = gEasyChatWord_Judge, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_CRUSH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SUPER)] = { .text = gEasyChatWord_Super, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_DIRECT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STAGE)] = { .text = gEasyChatWord_Stage, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVENTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HALL_OF_FAME)] = { .text = gEasyChatWord_HallOfFame, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVOLUTION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVOLUTION)] = { .text = gEasyChatWord_Evolution, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_FRONTIER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HYPER)] = { .text = gEasyChatWord_Hyper, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_HALL_OF_FAME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BATTLE_TOWER)] = { .text = gEasyChatWord_BattleTower, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIDDEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEADERS)] = { .text = gEasyChatWord_Leaders, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_HYPER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BATTLE_ROOM)] = { .text = gEasyChatWord_BattleRoom, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_JUDGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIDDEN)] = { .text = gEasyChatWord_Hidden, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEADERS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SECRET_BASE)] = { .text = gEasyChatWord_SecretBase, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_MASTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BLEND)] = { .text = gEasyChatWord_Blend, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_MC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POKEBLOCK)] = { .text = gEasyChatWord_POKEBLOCK, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_POKEBLOCK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MASTER)] = { .text = gEasyChatWord_Master, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_RANK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RANK)] = { .text = gEasyChatWord_Rank, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_RIBBON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RIBBON)] = { .text = gEasyChatWord_Ribbon, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROOM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CRUSH)] = { .text = gEasyChatWord_Crush, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_SECRET_BASE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DIRECT)] = { .text = gEasyChatWord_Direct, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_STAGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOWER)] = { .text = gEasyChatWord_Tower, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_STAY_AT_HOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNION)] = { .text = gEasyChatWord_Union, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_SUPER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROOM)] = { .text = gEasyChatWord_Room, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOWER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WIRELESS)] = { .text = gEasyChatWord_Wireless, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FRONTIER)] = { .text = gEasyChatWord_Frontier, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_WIRELESS), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_feelings.h b/src/data/easy_chat/easy_chat_group_feelings.h index 55fe9d00c5..5c2221530a 100755 --- a/src/data/easy_chat/easy_chat_group_feelings.h +++ b/src/data/easy_chat/easy_chat_group_feelings.h @@ -72,415 +72,415 @@ const struct EasyChatWordInfo gEasyChatGroup_Feelings[] = { [EC_INDEX(EC_WORD_MEET)] = { .text = gEasyChatWord_Meet, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_ADORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLAY)] = { .text = gEasyChatWord_Play, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALL_RIGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HURRIED)] = { .text = gEasyChatWord_Hurried, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANGER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOES)] = { .text = gEasyChatWord_Goes, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANGRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIDDY)] = { .text = gEasyChatWord_Giddy, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_BAD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAPPY)] = { .text = gEasyChatWord_Happy, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAPPINESS)] = { .text = gEasyChatWord_Happiness, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_BORING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCITE)] = { .text = gEasyChatWord_Excite, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_CARE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IMPORTANT)] = { .text = gEasyChatWord_Important, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_CARES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FUNNY)] = { .text = gEasyChatWord_Funny, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_DANGER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOT)] = { .text = gEasyChatWord_Got, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_DARN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GO_HOME)] = { .text = gEasyChatWord_GoHome, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_DEFEATED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISAPPOINTED)] = { .text = gEasyChatWord_Disappointed, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISAPPOINT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISAPPOINTS)] = { .text = gEasyChatWord_Disappoints, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISAPPOINTED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAD)] = { .text = gEasyChatWord_Sad, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISAPPOINTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRY)] = { .text = gEasyChatWord_Try, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISASTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRIES)] = { .text = gEasyChatWord_Tries, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISLIKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEARS)] = { .text = gEasyChatWord_Hears, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_DISLIKES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THINK)] = { .text = gEasyChatWord_Think, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_DONE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEAR)] = { .text = gEasyChatWord_Hear, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_DOWNCAST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WANTS)] = { .text = gEasyChatWord_Wants, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_DRINK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MISHEARD)] = { .text = gEasyChatWord_Misheard, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_EAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISLIKE)] = { .text = gEasyChatWord_Dislike, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_ENJOY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANGRY)] = { .text = gEasyChatWord_Angry, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_ENJOYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANGER)] = { .text = gEasyChatWord_Anger, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCITE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SCARY)] = { .text = gEasyChatWord_Scary, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_FEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LONESOME)] = { .text = gEasyChatWord_Lonesome, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_FUNNY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISAPPOINT)] = { .text = gEasyChatWord_Disappoint, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_GETS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_JOY)] = { .text = gEasyChatWord_Joy, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIDDY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GETS)] = { .text = gEasyChatWord_Gets, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_GO_HOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEVER)] = { .text = gEasyChatWord_Never, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DARN)] = { .text = gEasyChatWord_Darn, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DOWNCAST)] = { .text = gEasyChatWord_Downcast, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_GREAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INCREDIBLE)] = { .text = gEasyChatWord_Incredible, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAPPINESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIKES)] = { .text = gEasyChatWord_Likes, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAPPY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISLIKES)] = { .text = gEasyChatWord_Dislikes, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_HARD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BORING)] = { .text = gEasyChatWord_Boring, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CARE)] = { .text = gEasyChatWord_Care, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEARS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CARES)] = { .text = gEasyChatWord_Cares, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_HURRIED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALL_RIGHT)] = { .text = gEasyChatWord_AllRight, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_IMPORTANT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ADORE)] = { .text = gEasyChatWord_Adore, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_INCREDIBLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DISASTER)] = { .text = gEasyChatWord_Disaster, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_JOY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ENJOY)] = { .text = gEasyChatWord_Enjoy, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_LACKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ENJOYS)] = { .text = gEasyChatWord_Enjoys, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIKES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EAT)] = { .text = gEasyChatWord_Eat, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_LONESOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LACKING)] = { .text = gEasyChatWord_Lacking, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_MEET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BAD)] = { .text = gEasyChatWord_Bad, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_MISHEARD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HARD)] = { .text = gEasyChatWord_Hard, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEGATIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TERRIBLE)] = { .text = gEasyChatWord_Terrible, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHOULD)] = { .text = gEasyChatWord_Should, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_NICE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NICE)] = { .text = gEasyChatWord_Nice, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DRINK)] = { .text = gEasyChatWord_Drink, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_QUESTION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SURPRISE)] = { .text = gEasyChatWord_Surprise, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_RARE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FEAR)] = { .text = gEasyChatWord_Fear, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROMANTIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WANT)] = { .text = gEasyChatWord_Want, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAIT)] = { .text = gEasyChatWord_Wait, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_SATISFIED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SATISFIED)] = { .text = gEasyChatWord_Satisfied, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_SCARY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEE)] = { .text = gEasyChatWord_See, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RARE)] = { .text = gEasyChatWord_Rare, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHOULD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEGATIVE)] = { .text = gEasyChatWord_Negative, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_SURPRISE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DONE)] = { .text = gEasyChatWord_Done, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_TERRIBLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DANGER)] = { .text = gEasyChatWord_Danger, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_THINK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DEFEATED)] = { .text = gEasyChatWord_Defeated, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRIES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEAT)] = { .text = gEasyChatWord_Beat, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GREAT)] = { .text = gEasyChatWord_Great, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNDERSTAND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROMANTIC)] = { .text = gEasyChatWord_Romantic, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNDERSTANDS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_QUESTION)] = { .text = gEasyChatWord_Question, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNDERSTAND)] = { .text = gEasyChatWord_Understand, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_WANT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNDERSTANDS)] = { .text = gEasyChatWord_Understands, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_WANTS), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_greetings.h b/src/data/easy_chat/easy_chat_group_greetings.h index fb95f7939d..aabf34c1cf 100755 --- a/src/data/easy_chat/easy_chat_group_greetings.h +++ b/src/data/easy_chat/easy_chat_group_greetings.h @@ -45,253 +45,253 @@ const struct EasyChatWordInfo gEasyChatGroup_Greetings[] = { [EC_INDEX(EC_WORD_THANKS)] = { .text = gEasyChatWord_Thanks, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_APOLOGIZE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YES)] = { .text = gEasyChatWord_Yes, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_APPRECIATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERE_GOES)] = { .text = gEasyChatWord_HereGoes, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_BYE_BYE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERE_I_COME)] = { .text = gEasyChatWord_HereICome, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_COME_OVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERE_IT_IS)] = { .text = gEasyChatWord_HereItIs, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_CONGRATS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YEAH)] = { .text = gEasyChatWord_Yeah, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_COUNT_ON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WELCOME)] = { .text = gEasyChatWord_Welcome, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCUSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OI)] = { .text = gEasyChatWord_Oi, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCUSE_ME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOW_DO)] = { .text = gEasyChatWord_HowDo, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_FORGIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CONGRATS)] = { .text = gEasyChatWord_Congrats, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIVE_ME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIVE_ME)] = { .text = gEasyChatWord_GiveMe, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_GO_AHEAD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SORRY)] = { .text = gEasyChatWord_Sorry, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOOD_BYE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_APOLOGIZE)] = { .text = gEasyChatWord_Apologize, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HELLO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FORGIVE)] = { .text = gEasyChatWord_Forgive, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERE_GOES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEY_THERE)] = { .text = gEasyChatWord_HeyThere, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERE_I_COME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HELLO)] = { .text = gEasyChatWord_Hello, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERE_IT_IS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOOD_BYE)] = { .text = gEasyChatWord_GoodBye, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THANK_YOU)] = { .text = gEasyChatWord_ThankYou, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEY_THERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_I_VE_ARRIVED)] = { .text = gEasyChatWord_IveArrived, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEY_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PARDON)] = { .text = gEasyChatWord_Pardon, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_HI), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCUSE)] = { .text = gEasyChatWord_Excuse, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOO_HAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SEE_YA)] = { .text = gEasyChatWord_SeeYa, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOW_DO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCUSE_ME)] = { .text = gEasyChatWord_ExcuseMe, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_HUH_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WELL_THEN)] = { .text = gEasyChatWord_WellThen, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_I_VE_ARRIVED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GO_AHEAD)] = { .text = gEasyChatWord_GoAhead, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_LISTENING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_APPRECIATE)] = { .text = gEasyChatWord_Appreciate, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_MEET_YOU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEY_QUES)] = { .text = gEasyChatWord_HeyQues, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_NO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHAT_S_UP_QUES)] = { .text = gEasyChatWord_WhatsUpQues, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_OI), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HUH_QUES)] = { .text = gEasyChatWord_HuhQues, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_PARDON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NO)] = { .text = gEasyChatWord_No, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_SEE_YA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HI)] = { .text = gEasyChatWord_Hi, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMELL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YEAH_YEAH)] = { .text = gEasyChatWord_YeahYeah, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_SORRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BYE_BYE)] = { .text = gEasyChatWord_ByeBye, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_THANK_YOU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MEET_YOU)] = { .text = gEasyChatWord_MeetYou, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_THANKS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEY)] = { .text = gEasyChatWord_Hey, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_WELCOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMELL)] = { .text = gEasyChatWord_Smell, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_WELL_THEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LISTENING)] = { .text = gEasyChatWord_Listening, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHAT_S_UP_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOO_HAH)] = { .text = gEasyChatWord_HooHah, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_YAHOO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YAHOO)] = { .text = gEasyChatWord_Yahoo, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_YEAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YO)] = { .text = gEasyChatWord_Yo, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_YEAH_YEAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COME_OVER)] = { .text = gEasyChatWord_ComeOver, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_YES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COUNT_ON)] = { .text = gEasyChatWord_CountOn, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_YO), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_hobbies.h b/src/data/easy_chat/easy_chat_group_hobbies.h index dd507e21b9..fb3484ae05 100755 --- a/src/data/easy_chat/easy_chat_group_hobbies.h +++ b/src/data/easy_chat/easy_chat_group_hobbies.h @@ -57,325 +57,325 @@ const struct EasyChatWordInfo gEasyChatGroup_Hobbies[] = { [EC_INDEX(EC_WORD_IDOL)] = { .text = gEasyChatWord_Idol, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_ADVENTURE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANIME)] = { .text = gEasyChatWord_Anime, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANIME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SONG)] = { .text = gEasyChatWord_Song, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_BALL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MOVIE)] = { .text = gEasyChatWord_Movie, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_BIKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SWEETS)] = { .text = gEasyChatWord_Sweets, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_BOARD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHAT)] = { .text = gEasyChatWord_Chat, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_BOOK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHILD_S_PLAY)] = { .text = gEasyChatWord_ChildsPlay, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_CAMERA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOYS)] = { .text = gEasyChatWord_Toys, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_CARDS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MUSIC)] = { .text = gEasyChatWord_Music, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHANNEL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CARDS)] = { .text = gEasyChatWord_Cards, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHOPPING)] = { .text = gEasyChatWord_Shopping, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHILD_S_PLAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CAMERA)] = { .text = gEasyChatWord_Camera, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_COLLECTION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VIEWING)] = { .text = gEasyChatWord_Viewing, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_COMICS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPECTATOR)] = { .text = gEasyChatWord_Spectator, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_COMPLETE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOURMET)] = { .text = gEasyChatWord_Gourmet, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_DANCE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GAME)] = { .text = gEasyChatWord_Game, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_DATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RPG)] = { .text = gEasyChatWord_Rpg, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_DESIGN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COLLECTION)] = { .text = gEasyChatWord_Collection, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_DIET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COMPLETE)] = { .text = gEasyChatWord_Complete, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_FASHION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAGAZINE)] = { .text = gEasyChatWord_Magazine, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_FESTIVAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WALK)] = { .text = gEasyChatWord_Walk, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_FISHING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BIKE)] = { .text = gEasyChatWord_Bike, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLOWERS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOBBY)] = { .text = gEasyChatWord_Hobby, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_GAME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPORTS)] = { .text = gEasyChatWord_Sports, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOURMET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOFTWARE)] = { .text = gEasyChatWord_Software, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SONGS)] = { .text = gEasyChatWord_Songs, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEROINE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DIET)] = { .text = gEasyChatWord_Diet, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOBBY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TREASURE)] = { .text = gEasyChatWord_Treasure, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOLIDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRAVEL)] = { .text = gEasyChatWord_Travel, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_IDOL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DANCE)] = { .text = gEasyChatWord_Dance, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOCOMOTIVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHANNEL)] = { .text = gEasyChatWord_Channel, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOOK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAKING)] = { .text = gEasyChatWord_Making, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAGAZINE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FISHING)] = { .text = gEasyChatWord_Fishing, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DATE)] = { .text = gEasyChatWord_Date, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_MOVIE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DESIGN)] = { .text = gEasyChatWord_Design, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_MUSIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOCOMOTIVE)] = { .text = gEasyChatWord_Locomotive, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_NAP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLUSH_DOLL)] = { .text = gEasyChatWord_PlushDoll, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_PC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PC)] = { .text = gEasyChatWord_Pc, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLANS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLOWERS)] = { .text = gEasyChatWord_Flowers, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLUSH_DOLL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERO)] = { .text = gEasyChatWord_Hero, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_RPG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NAP)] = { .text = gEasyChatWord_Nap, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHOPPING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEROINE)] = { .text = gEasyChatWord_Heroine, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOFTWARE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FASHION)] = { .text = gEasyChatWord_Fashion, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_SONG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ADVENTURE)] = { .text = gEasyChatWord_Adventure, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_SONGS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BOARD)] = { .text = gEasyChatWord_Board, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPECTATOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BALL)] = { .text = gEasyChatWord_Ball, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPORTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BOOK)] = { .text = gEasyChatWord_Book, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_SWEETS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FESTIVAL)] = { .text = gEasyChatWord_Festival, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COMICS)] = { .text = gEasyChatWord_Comics, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRAVEL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOLIDAY)] = { .text = gEasyChatWord_Holiday, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_TREASURE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLANS)] = { .text = gEasyChatWord_Plans, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRENDY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRENDY)] = { .text = gEasyChatWord_Trendy, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_VACATION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VACATION)] = { .text = gEasyChatWord_Vacation, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_VIEWING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOOK)] = { .text = gEasyChatWord_Look, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_WALK), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_lifestyle.h b/src/data/easy_chat/easy_chat_group_lifestyle.h index 5819d0f2e4..264f4dde90 100755 --- a/src/data/easy_chat/easy_chat_group_lifestyle.h +++ b/src/data/easy_chat/easy_chat_group_lifestyle.h @@ -48,271 +48,271 @@ const struct EasyChatWordInfo gEasyChatGroup_Lifestyle[] = { [EC_INDEX(EC_WORD_CHORES)] = { .text = gEasyChatWord_Chores, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALLOWANCE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOME)] = { .text = gEasyChatWord_Home, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_BATH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MONEY)] = { .text = gEasyChatWord_Money, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHORES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALLOWANCE)] = { .text = gEasyChatWord_Allowance, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_CLASS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BATH)] = { .text = gEasyChatWord_Bath, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_COMMEMORATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CONVERSATION)] = { .text = gEasyChatWord_Conversation, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_CONVERSATION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SCHOOL)] = { .text = gEasyChatWord_School, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_DEPT_STORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COMMEMORATE)] = { .text = gEasyChatWord_Commemorate, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_DIGITAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HABIT)] = { .text = gEasyChatWord_Habit, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_DREAM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GROUP)] = { .text = gEasyChatWord_Group, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORD)] = { .text = gEasyChatWord_Word, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_GROUP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STORE)] = { .text = gEasyChatWord_Store, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_HABIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SERVICE)] = { .text = gEasyChatWord_Service, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORK)] = { .text = gEasyChatWord_Work, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_INFORMATION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SYSTEM)] = { .text = gEasyChatWord_System, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_ITEM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRAIN)] = { .text = gEasyChatWord_Train, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_KINDERGARTEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CLASS)] = { .text = gEasyChatWord_Class, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_LESSONS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LESSONS)] = { .text = gEasyChatWord_Lessons, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_LETTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INFORMATION)] = { .text = gEasyChatWord_Information, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIFE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIVING)] = { .text = gEasyChatWord_Living, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIVING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TEACHER)] = { .text = gEasyChatWord_Teacher, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_MACHINE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOURNAMENT)] = { .text = gEasyChatWord_Tournament, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAIL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LETTER)] = { .text = gEasyChatWord_Letter, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_MESSAGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVENT)] = { .text = gEasyChatWord_Event, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_MONEY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DIGITAL)] = { .text = gEasyChatWord_Digital, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_NAME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TEST)] = { .text = gEasyChatWord_Test, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEWS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DEPT_STORE)] = { .text = gEasyChatWord_DeptStore, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_PARTY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TELEVISION)] = { .text = gEasyChatWord_Television, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_PHONE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PHONE)] = { .text = gEasyChatWord_Phone, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_POPULAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ITEM)] = { .text = gEasyChatWord_Item, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_PROMISE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NAME)] = { .text = gEasyChatWord_Name, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_RADIO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEWS)] = { .text = gEasyChatWord_News, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_RENTAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POPULAR)] = { .text = gEasyChatWord_Popular, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_SCHOOL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PARTY)] = { .text = gEasyChatWord_Party, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_SERVICE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STUDY)] = { .text = gEasyChatWord_Study, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_STORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MACHINE)] = { .text = gEasyChatWord_Machine, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_STUDY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAIL)] = { .text = gEasyChatWord_Mail, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_SYSTEM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MESSAGE)] = { .text = gEasyChatWord_Message, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_TEACHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PROMISE)] = { .text = gEasyChatWord_Promise, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_TELEVISION), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DREAM)] = { .text = gEasyChatWord_Dream, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_TEST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KINDERGARTEN)] = { .text = gEasyChatWord_Kindergarten, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOURNAMENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIFE)] = { .text = gEasyChatWord_Life, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRAIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RADIO)] = { .text = gEasyChatWord_Radio, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RENTAL)] = { .text = gEasyChatWord_Rental, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WORLD)] = { .text = gEasyChatWord_World, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_WORLD), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_misc.h b/src/data/easy_chat/easy_chat_group_misc.h index aa8f84406d..187c86fc7a 100755 --- a/src/data/easy_chat/easy_chat_group_misc.h +++ b/src/data/easy_chat/easy_chat_group_misc.h @@ -45,253 +45,253 @@ const struct EasyChatWordInfo gEasyChatGroup_Misc[] = { [EC_INDEX(EC_WORD_HIGHS)] = { .text = gEasyChatWord_Highs, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_ABOVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOWS)] = { .text = gEasyChatWord_Lows, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_AM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UM)] = { .text = gEasyChatWord_Um, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_AWAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_REAR)] = { .text = gEasyChatWord_Rear, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_BACK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THINGS)] = { .text = gEasyChatWord_Things, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_BELOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THING)] = { .text = gEasyChatWord_Thing, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_BESIDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BELOW)] = { .text = gEasyChatWord_Below, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHOICE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ABOVE)] = { .text = gEasyChatWord_Above, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_CONFUSED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BACK)] = { .text = gEasyChatWord_Back, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_DEEP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIGH)] = { .text = gEasyChatWord_High, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_DOWN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERE)] = { .text = gEasyChatWord_Here, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVERY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INSIDE)] = { .text = gEasyChatWord_Inside, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_FAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OUTSIDE)] = { .text = gEasyChatWord_Outside, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_FRONT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BESIDE)] = { .text = gEasyChatWord_Beside, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THIS_IS_IT_EXCL)] = { .text = gEasyChatWord_ThisIsItExcl, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THIS)] = { .text = gEasyChatWord_This, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIGHS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVERY)] = { .text = gEasyChatWord_Every, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_INSIDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THESE)] = { .text = gEasyChatWord_These, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEFT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THESE_WERE)] = { .text = gEasyChatWord_TheseWere, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOWS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DOWN)] = { .text = gEasyChatWord_Down, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THAT)] = { .text = gEasyChatWord_That, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_OPPOSITE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THOSE_ARE)] = { .text = gEasyChatWord_ThoseAre, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_OUTSIDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THOSE_WERE)] = { .text = gEasyChatWord_ThoseWere, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_REAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THAT_S_IT_EXCL)] = { .text = gEasyChatWord_ThatsItExcl, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_RIGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AM)] = { .text = gEasyChatWord_Am, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHALLOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THAT_WAS)] = { .text = gEasyChatWord_ThatWas, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_THAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FRONT)] = { .text = gEasyChatWord_Front, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_THAT_WAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UP)] = { .text = gEasyChatWord_Up, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_THAT_S_IT_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHOICE)] = { .text = gEasyChatWord_Choice, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_THESE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FAR)] = { .text = gEasyChatWord_Far, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_THESE_WERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AWAY)] = { .text = gEasyChatWord_Away, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_THING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEAR)] = { .text = gEasyChatWord_Near, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_THINGS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHERE)] = { .text = gEasyChatWord_Where, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_THIS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHEN)] = { .text = gEasyChatWord_When, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_THIS_IS_IT_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHAT)] = { .text = gEasyChatWord_What, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_THOSE_ARE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DEEP)] = { .text = gEasyChatWord_Deep, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_THOSE_WERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHALLOW)] = { .text = gEasyChatWord_Shallow, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_UM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHY)] = { .text = gEasyChatWord_Why, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_UP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CONFUSED)] = { .text = gEasyChatWord_Confused, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OPPOSITE)] = { .text = gEasyChatWord_Opposite, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEFT)] = { .text = gEasyChatWord_Left, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RIGHT)] = { .text = gEasyChatWord_Right, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHY), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_people.h b/src/data/easy_chat/easy_chat_group_people.h index 2ddd3c9d9c..fb73c8651a 100755 --- a/src/data/easy_chat/easy_chat_group_people.h +++ b/src/data/easy_chat/easy_chat_group_people.h @@ -78,451 +78,451 @@ const struct EasyChatWordInfo gEasyChatGroup_People[] = { [EC_INDEX(EC_WORD_OPPONENT)] = { .text = gEasyChatWord_Opponent, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_ADULT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_I)] = { .text = gEasyChatWord_I, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOU)] = { .text = gEasyChatWord_You, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_AREN_T), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOURS)] = { .text = gEasyChatWord_Yours, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_AUNT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SON)] = { .text = gEasyChatWord_Son, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_BABE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOUR)] = { .text = gEasyChatWord_Your, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOU_RE)] = { .text = gEasyChatWord_Youre, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_BOY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOU_VE)] = { .text = gEasyChatWord_Youve, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_BROTHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MOTHER)] = { .text = gEasyChatWord_Mother, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHILDREN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GRANDFATHER)] = { .text = gEasyChatWord_Grandfather, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAUGHTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNCLE)] = { .text = gEasyChatWord_Uncle, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_DUDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FATHER)] = { .text = gEasyChatWord_Father, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_FAMILY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BOY)] = { .text = gEasyChatWord_Boy, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_FATHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ADULT)] = { .text = gEasyChatWord_Adult, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_FRIEND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BROTHER)] = { .text = gEasyChatWord_Brother, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIRL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SISTER)] = { .text = gEasyChatWord_Sister, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_GRANDFATHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GRANDMOTHER)] = { .text = gEasyChatWord_Grandmother, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_GRANDMOTHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AUNT)] = { .text = gEasyChatWord_Aunt, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_HE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PARENT)] = { .text = gEasyChatWord_Parent, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_HE_S), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAN)] = { .text = gEasyChatWord_Man, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_HER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ME)] = { .text = gEasyChatWord_Me, - .alphabeticalOrder = 72, + .alphabeticalOrder = EC_INDEX(EC_WORD_HERS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIRL)] = { .text = gEasyChatWord_Girl, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BABE)] = { .text = gEasyChatWord_Babe, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FAMILY)] = { .text = gEasyChatWord_Family, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_I), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HER)] = { .text = gEasyChatWord_Her, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_I_AM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIM)] = { .text = gEasyChatWord_Him, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_I_WAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HE)] = { .text = gEasyChatWord_He, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_I_VE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLACE)] = { .text = gEasyChatWord_Place, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_IT_S), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAUGHTER)] = { .text = gEasyChatWord_Daughter, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_KID), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIS)] = { .text = gEasyChatWord_His, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_LADY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HE_S)] = { .text = gEasyChatWord_Hes, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AREN_T)] = { .text = gEasyChatWord_Arent, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_ME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SIBLINGS)] = { .text = gEasyChatWord_Siblings, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_MOTHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KID)] = { .text = gEasyChatWord_Kid, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_MR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHILDREN)] = { .text = gEasyChatWord_Children, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_MRS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MR)] = { .text = gEasyChatWord_Mr, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_MY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MRS)] = { .text = gEasyChatWord_Mrs, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_MYSELF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MYSELF)] = { .text = gEasyChatWord_Myself, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_OPPONENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_I_WAS)] = { .text = gEasyChatWord_IWas, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_OUR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO_ME)] = { .text = gEasyChatWord_ToMe, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_PARENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MY)] = { .text = gEasyChatWord_My, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_PERSON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_I_AM)] = { .text = gEasyChatWord_IAm, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLACE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_I_VE)] = { .text = gEasyChatWord_Ive, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_RIVAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHO)] = { .text = gEasyChatWord_Who, - .alphabeticalOrder = 69, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOMEONE)] = { .text = gEasyChatWord_Someone, - .alphabeticalOrder = 73, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHE_IS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHO_WAS)] = { .text = gEasyChatWord_WhoWas, - .alphabeticalOrder = 70, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHE_WAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO_WHOM)] = { .text = gEasyChatWord_ToWhom, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_SIBLINGS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHOSE)] = { .text = gEasyChatWord_Whose, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_SISTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHO_IS)] = { .text = gEasyChatWord_WhoIs, - .alphabeticalOrder = 74, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IT_S)] = { .text = gEasyChatWord_Its, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOMEONE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LADY)] = { .text = gEasyChatWord_Lady, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_SON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FRIEND)] = { .text = gEasyChatWord_Friend, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_THEIR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALLY)] = { .text = gEasyChatWord_Ally, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_THEY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PERSON)] = { .text = gEasyChatWord_Person, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_THEY_WERE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DUDE)] = { .text = gEasyChatWord_Dude, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_THEY_RE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THEY)] = { .text = gEasyChatWord_They, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_THEY_VE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THEY_WERE)] = { .text = gEasyChatWord_TheyWere, - .alphabeticalOrder = 71, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO_HER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO_THEM)] = { .text = gEasyChatWord_ToThem, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO_ME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THEIR)] = { .text = gEasyChatWord_Their, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO_THEM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THEY_RE)] = { .text = gEasyChatWord_Theyre, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO_US), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THEY_VE)] = { .text = gEasyChatWord_Theyve, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_TO_WHOM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WE)] = { .text = gEasyChatWord_We, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNCLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEEN)] = { .text = gEasyChatWord_Been, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_WE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO_US)] = { .text = gEasyChatWord_ToUs, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_WE_RE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OUR)] = { .text = gEasyChatWord_Our, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_WE_VE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WE_RE)] = { .text = gEasyChatWord_WeRe, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RIVAL)] = { .text = gEasyChatWord_Rival, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHO_IS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WE_VE)] = { .text = gEasyChatWord_Weve, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHO_WAS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WOMAN)] = { .text = gEasyChatWord_Woman, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHOSE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHE)] = { .text = gEasyChatWord_She, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_WOMAN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHE_WAS)] = { .text = gEasyChatWord_SheWas, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TO_HER)] = { .text = gEasyChatWord_ToHer, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOU_RE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HERS)] = { .text = gEasyChatWord_Hers, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOU_VE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHE_IS)] = { .text = gEasyChatWord_SheIs, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOUR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOME)] = { .text = gEasyChatWord_Some, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOURS), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_speech.h b/src/data/easy_chat/easy_chat_group_speech.h index a0874a33a5..c88aedc39e 100755 --- a/src/data/easy_chat/easy_chat_group_speech.h +++ b/src/data/easy_chat/easy_chat_group_speech.h @@ -63,361 +63,361 @@ const struct EasyChatWordInfo gEasyChatGroup_Speech[] = { [EC_INDEX(EC_WORD_LISTEN)] = { .text = gEasyChatWord_Listen, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_A_LITTLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOT_VERY)] = { .text = gEasyChatWord_NotVery, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_A_LOT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MEAN)] = { .text = gEasyChatWord_Mean, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_A_TINY_BIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIE)] = { .text = gEasyChatWord_Lie, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_ABSOLUTELY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LAY)] = { .text = gEasyChatWord_Lay, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALSO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RECOMMEND)] = { .text = gEasyChatWord_Recommend, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALTHOUGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NITWIT)] = { .text = gEasyChatWord_Nitwit, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_AND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_QUITE)] = { .text = gEasyChatWord_Quite, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FROM)] = { .text = gEasyChatWord_From, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_AROUND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FEELING)] = { .text = gEasyChatWord_Feeling, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_AS_IF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BUT)] = { .text = gEasyChatWord_But, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_AS_MUCH_AS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOWEVER)] = { .text = gEasyChatWord_However, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_AWFULLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CASE)] = { .text = gEasyChatWord_Case, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_BUT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THE)] = { .text = gEasyChatWord_The, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_CASE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MISS)] = { .text = gEasyChatWord_Miss, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_ENOUGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOW)] = { .text = gEasyChatWord_How, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVEN_SO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIT)] = { .text = gEasyChatWord_Hit, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_FANTASTIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ENOUGH)] = { .text = gEasyChatWord_Enough, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_FEELING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_A_LOT)] = { .text = gEasyChatWord_ALot, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_FINALLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_A_LITTLE)] = { .text = gEasyChatWord_ALittle, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_FOR_NOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ABSOLUTELY)] = { .text = gEasyChatWord_Absolutely, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_FROM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AND)] = { .text = gEasyChatWord_And, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ONLY)] = { .text = gEasyChatWord_Only, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AROUND)] = { .text = gEasyChatWord_Around, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOWEVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PROBABLY)] = { .text = gEasyChatWord_Probably, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_IF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IF)] = { .text = gEasyChatWord_If, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_INSTEAD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VERY)] = { .text = gEasyChatWord_Very, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_JOKING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_A_TINY_BIT)] = { .text = gEasyChatWord_ATinyBit, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_JUST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WILD)] = { .text = gEasyChatWord_Wild, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_LAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THAT_S)] = { .text = gEasyChatWord_Thats, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_JUST)] = { .text = gEasyChatWord_Just, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_LISTEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVEN_SO)] = { .text = gEasyChatWord_EvenSo, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_MEAN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MUST_BE)] = { .text = gEasyChatWord_MustBe, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_MISS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NATURALLY)] = { .text = gEasyChatWord_Naturally, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_MODE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FOR_NOW)] = { .text = gEasyChatWord_ForNow, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_MOOD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNDERSTOOD)] = { .text = gEasyChatWord_Understood, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_MORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_JOKING)] = { .text = gEasyChatWord_Joking, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_MUST_BE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_READY)] = { .text = gEasyChatWord_Ready, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_NATURALLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOMETHING)] = { .text = gEasyChatWord_Something, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_NITWIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOMEHOW)] = { .text = gEasyChatWord_Somehow, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOT_VERY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALTHOUGH)] = { .text = gEasyChatWord_Although, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_ONLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALSO)] = { .text = gEasyChatWord_Also, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_PERFECT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PERFECT)] = { .text = gEasyChatWord_Perfect, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_PROBABLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AS_MUCH_AS)] = { .text = gEasyChatWord_AsMuchAs, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_QUITE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_REALLY)] = { .text = gEasyChatWord_Really, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_RATHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRULY)] = { .text = gEasyChatWord_Truly, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_READY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SERIOUSLY)] = { .text = gEasyChatWord_Seriously, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_REALLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOTALLY)] = { .text = gEasyChatWord_Totally, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_RECOMMEND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNTIL)] = { .text = gEasyChatWord_Until, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_SERIOUSLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AS_IF)] = { .text = gEasyChatWord_AsIf, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOMEHOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MOOD)] = { .text = gEasyChatWord_Mood, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOMETHING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RATHER)] = { .text = gEasyChatWord_Rather, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_THAT_S), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AWFULLY)] = { .text = gEasyChatWord_Awfully, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_THE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MODE)] = { .text = gEasyChatWord_Mode, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOO_LATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MORE)] = { .text = gEasyChatWord_More, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOTALLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOO_LATE)] = { .text = gEasyChatWord_TooLate, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRULY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FINALLY)] = { .text = gEasyChatWord_Finally, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNDERSTOOD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANY)] = { .text = gEasyChatWord_Any, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNTIL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INSTEAD)] = { .text = gEasyChatWord_Instead, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_VERY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FANTASTIC)] = { .text = gEasyChatWord_Fantastic, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_WILD), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_status.h b/src/data/easy_chat/easy_chat_group_status.h index af2292b446..b751fbaf18 100755 --- a/src/data/easy_chat/easy_chat_group_status.h +++ b/src/data/easy_chat/easy_chat_group_status.h @@ -112,655 +112,655 @@ const struct EasyChatWordInfo gEasyChatGroup_Status[] = { [EC_INDEX(EC_WORD_DARK)] = { .text = gEasyChatWord_Dark, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_AIR_LOCK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STENCH)] = { .text = gEasyChatWord_Stench, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALT_COLOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THICK_FAT)] = { .text = gEasyChatWord_ThickFat, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_ARENA_TRAP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RAIN_DISH)] = { .text = gEasyChatWord_RainDish, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_BATTLE_ARMOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DRIZZLE)] = { .text = gEasyChatWord_Drizzle, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEAUTIFUL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ARENA_TRAP)] = { .text = gEasyChatWord_ArenaTrap, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEAUTY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INTIMIDATE)] = { .text = gEasyChatWord_Intimidate, - .alphabeticalOrder = 101, + .alphabeticalOrder = EC_INDEX(EC_WORD_BLAZE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROCK_HEAD)] = { .text = gEasyChatWord_RockHead, - .alphabeticalOrder = 97, + .alphabeticalOrder = EC_INDEX(EC_WORD_BUG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COLOR)] = { .text = gEasyChatWord_Color, - .alphabeticalOrder = 106, + .alphabeticalOrder = EC_INDEX(EC_WORD_CHLOROPHYLL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALT_COLOR)] = { .text = gEasyChatWord_AltColor, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_CLEAR_BODY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROCK)] = { .text = gEasyChatWord_Rock, - .alphabeticalOrder = 68, + .alphabeticalOrder = EC_INDEX(EC_WORD_CLOUD_NINE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEAUTIFUL)] = { .text = gEasyChatWord_Beautiful, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_COLOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEAUTY)] = { .text = gEasyChatWord_Beauty, - .alphabeticalOrder = 86, + .alphabeticalOrder = EC_INDEX(EC_WORD_COLOR_CHANGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AIR_LOCK)] = { .text = gEasyChatWord_AirLock, - .alphabeticalOrder = 78, + .alphabeticalOrder = EC_INDEX(EC_WORD_COMPOUNDEYES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PSYCHIC)] = { .text = gEasyChatWord_Psychic, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_COOL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HYPER_CUTTER)] = { .text = gEasyChatWord_HyperCutter, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_COOLNESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FIGHTING)] = { .text = gEasyChatWord_Fighting, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_CUTE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHADOW_TAG)] = { .text = gEasyChatWord_ShadowTag, - .alphabeticalOrder = 99, + .alphabeticalOrder = EC_INDEX(EC_WORD_CUTE_CHARM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMART)] = { .text = gEasyChatWord_Smart, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_CUTENESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMARTNESS)] = { .text = gEasyChatWord_Smartness, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAMP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPEED_BOOST)] = { .text = gEasyChatWord_SpeedBoost, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_DARK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COOL)] = { .text = gEasyChatWord_Cool, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_DRAGON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COOLNESS)] = { .text = gEasyChatWord_Coolness, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_DRIZZLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BATTLE_ARMOR)] = { .text = gEasyChatWord_BattleArmor, - .alphabeticalOrder = 76, + .alphabeticalOrder = EC_INDEX(EC_WORD_DROUGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CUTE)] = { .text = gEasyChatWord_Cute, - .alphabeticalOrder = 72, + .alphabeticalOrder = EC_INDEX(EC_WORD_EARLY_BIRD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CUTENESS)] = { .text = gEasyChatWord_Cuteness, - .alphabeticalOrder = 88, + .alphabeticalOrder = EC_INDEX(EC_WORD_EFFECT_SPORE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STURDY)] = { .text = gEasyChatWord_Sturdy, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_ELECTRIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SUCTION_CUPS)] = { .text = gEasyChatWord_SuctionCups, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_FIGHTING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GRASS)] = { .text = gEasyChatWord_Grass, - .alphabeticalOrder = 90, + .alphabeticalOrder = EC_INDEX(EC_WORD_FIRE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CLEAR_BODY)] = { .text = gEasyChatWord_ClearBody, - .alphabeticalOrder = 91, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLAME_BODY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TORRENT)] = { .text = gEasyChatWord_Torrent, - .alphabeticalOrder = 104, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLASH_FIRE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GHOST)] = { .text = gEasyChatWord_Ghost, - .alphabeticalOrder = 75, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLYING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ICE)] = { .text = gEasyChatWord_Ice, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_FORECAST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GUTS)] = { .text = gEasyChatWord_Guts, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_GHOST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ROUGH_SKIN)] = { .text = gEasyChatWord_RoughSkin, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_GRASS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHELL_ARMOR)] = { .text = gEasyChatWord_ShellArmor, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_GROUND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NATURAL_CURE)] = { .text = gEasyChatWord_NaturalCure, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_GUTS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAMP)] = { .text = gEasyChatWord_Damp, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_HUGE_POWER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GROUND)] = { .text = gEasyChatWord_Ground, - .alphabeticalOrder = 73, + .alphabeticalOrder = EC_INDEX(EC_WORD_HUSTLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIMBER)] = { .text = gEasyChatWord_Limber, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HYPER_CUTTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAGNET_PULL)] = { .text = gEasyChatWord_MagnetPull, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_ICE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHITE_SMOKE)] = { .text = gEasyChatWord_WhiteSmoke, - .alphabeticalOrder = 71, + .alphabeticalOrder = EC_INDEX(EC_WORD_ILLUMINATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SYNCHRONIZE)] = { .text = gEasyChatWord_Synchronize, - .alphabeticalOrder = 100, + .alphabeticalOrder = EC_INDEX(EC_WORD_IMMUNITY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OVERGROW)] = { .text = gEasyChatWord_Overgrow, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_INNER_FOCUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SWIFT_SWIM)] = { .text = gEasyChatWord_SwiftSwim, - .alphabeticalOrder = 81, + .alphabeticalOrder = EC_INDEX(EC_WORD_INSOMNIA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAND_STREAM)] = { .text = gEasyChatWord_SandStream, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_INTIMIDATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAND_VEIL)] = { .text = gEasyChatWord_SandVeil, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_KEEN_EYE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KEEN_EYE)] = { .text = gEasyChatWord_KeenEye, - .alphabeticalOrder = 82, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEVITATE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INNER_FOCUS)] = { .text = gEasyChatWord_InnerFocus, - .alphabeticalOrder = 77, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIGHTNINGROD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STATIC)] = { .text = gEasyChatWord_Static, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIMBER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TYPE)] = { .text = gEasyChatWord_Type, - .alphabeticalOrder = 85, + .alphabeticalOrder = EC_INDEX(EC_WORD_LIQUID_OOZE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOUGH)] = { .text = gEasyChatWord_Tough, - .alphabeticalOrder = 94, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAGMA_ARMOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOUGHNESS)] = { .text = gEasyChatWord_Toughness, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_MAGNET_PULL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHED_SKIN)] = { .text = gEasyChatWord_ShedSkin, - .alphabeticalOrder = 79, + .alphabeticalOrder = EC_INDEX(EC_WORD_MARVEL_SCALE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HUGE_POWER)] = { .text = gEasyChatWord_HugePower, - .alphabeticalOrder = 92, + .alphabeticalOrder = EC_INDEX(EC_WORD_MINUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VOLT_ABSORB)] = { .text = gEasyChatWord_VoltAbsorb, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_NATURAL_CURE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WATER_ABSORB)] = { .text = gEasyChatWord_WaterAbsorb, - .alphabeticalOrder = 69, + .alphabeticalOrder = EC_INDEX(EC_WORD_NORMAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ELECTRIC)] = { .text = gEasyChatWord_Electric, - .alphabeticalOrder = 64, + .alphabeticalOrder = EC_INDEX(EC_WORD_OBLIVIOUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FORECAST)] = { .text = gEasyChatWord_Forecast, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_OVERGROW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SERENE_GRACE)] = { .text = gEasyChatWord_SereneGrace, - .alphabeticalOrder = 93, + .alphabeticalOrder = EC_INDEX(EC_WORD_OWN_TEMPO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POISON)] = { .text = gEasyChatWord_Poison, - .alphabeticalOrder = 103, + .alphabeticalOrder = EC_INDEX(EC_WORD_PATTERN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POISON_POINT)] = { .text = gEasyChatWord_PoisonPoint, - .alphabeticalOrder = 102, + .alphabeticalOrder = EC_INDEX(EC_WORD_PICKUP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DRAGON)] = { .text = gEasyChatWord_Dragon, - .alphabeticalOrder = 89, + .alphabeticalOrder = EC_INDEX(EC_WORD_PKRS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRACE)] = { .text = gEasyChatWord_Trace, - .alphabeticalOrder = 83, + .alphabeticalOrder = EC_INDEX(EC_WORD_PLUS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OBLIVIOUS)] = { .text = gEasyChatWord_Oblivious, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_POISON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRUANT)] = { .text = gEasyChatWord_Truant, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_POISON_POINT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RUN_AWAY)] = { .text = gEasyChatWord_RunAway, - .alphabeticalOrder = 84, + .alphabeticalOrder = EC_INDEX(EC_WORD_PRESSURE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STICKY_HOLD)] = { .text = gEasyChatWord_StickyHold, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_PSYCHIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CLOUD_NINE)] = { .text = gEasyChatWord_CloudNine, - .alphabeticalOrder = 107, + .alphabeticalOrder = EC_INDEX(EC_WORD_PURE_POWER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NORMAL)] = { .text = gEasyChatWord_Normal, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_RAIN_DISH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STEEL)] = { .text = gEasyChatWord_Steel, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROCK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ILLUMINATE)] = { .text = gEasyChatWord_Illuminate, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROCK_HEAD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EARLY_BIRD)] = { .text = gEasyChatWord_EarlyBird, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_ROUGH_SKIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HUSTLE)] = { .text = gEasyChatWord_Hustle, - .alphabeticalOrder = 66, + .alphabeticalOrder = EC_INDEX(EC_WORD_RUN_AWAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHINE)] = { .text = gEasyChatWord_Shine, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAND_STREAM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLYING)] = { .text = gEasyChatWord_Flying, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAND_VEIL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DROUGHT)] = { .text = gEasyChatWord_Drought, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_SERENE_GRACE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIGHTNINGROD)] = { .text = gEasyChatWord_Lightningrod, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHADOW_TAG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COMPOUNDEYES)] = { .text = gEasyChatWord_Compoundeyes, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHED_SKIN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MARVEL_SCALE)] = { .text = gEasyChatWord_MarvelScale, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHELL_ARMOR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WONDER_GUARD)] = { .text = gEasyChatWord_WonderGuard, - .alphabeticalOrder = 108, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHIELD_DUST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_INSOMNIA)] = { .text = gEasyChatWord_Insomnia, - .alphabeticalOrder = 74, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHINE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEVITATE)] = { .text = gEasyChatWord_Levitate, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMART), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PLUS)] = { .text = gEasyChatWord_Plus, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMARTNESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PRESSURE)] = { .text = gEasyChatWord_Pressure, - .alphabeticalOrder = 87, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOUNDPROOF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LIQUID_OOZE)] = { .text = gEasyChatWord_LiquidOoze, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPEED_BOOST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COLOR_CHANGE)] = { .text = gEasyChatWord_ColorChange, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_STATIC), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOUNDPROOF)] = { .text = gEasyChatWord_Soundproof, - .alphabeticalOrder = 70, + .alphabeticalOrder = EC_INDEX(EC_WORD_STEEL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EFFECT_SPORE)] = { .text = gEasyChatWord_EffectSpore, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_STENCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PKRS)] = { .text = gEasyChatWord_Pkrs, - .alphabeticalOrder = 67, + .alphabeticalOrder = EC_INDEX(EC_WORD_STICKY_HOLD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FIRE)] = { .text = gEasyChatWord_Fire, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_STURDY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLAME_BODY)] = { .text = gEasyChatWord_FlameBody, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_SUCTION_CUPS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MINUS)] = { .text = gEasyChatWord_Minus, - .alphabeticalOrder = 98, + .alphabeticalOrder = EC_INDEX(EC_WORD_SWARM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OWN_TEMPO)] = { .text = gEasyChatWord_OwnTempo, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_SWIFT_SWIM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MAGMA_ARMOR)] = { .text = gEasyChatWord_MagmaArmor, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_SYNCHRONIZE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WATER)] = { .text = gEasyChatWord_Water, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_THICK_FAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WATER_VEIL)] = { .text = gEasyChatWord_WaterVeil, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_TORRENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BUG)] = { .text = gEasyChatWord_Bug, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOUGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SWARM)] = { .text = gEasyChatWord_Swarm, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOUGHNESS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CUTE_CHARM)] = { .text = gEasyChatWord_CuteCharm, - .alphabeticalOrder = 63, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRACE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_IMMUNITY)] = { .text = gEasyChatWord_Immunity, - .alphabeticalOrder = 65, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRUANT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BLAZE)] = { .text = gEasyChatWord_Blaze, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_TYPE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PICKUP)] = { .text = gEasyChatWord_Pickup, - .alphabeticalOrder = 105, + .alphabeticalOrder = EC_INDEX(EC_WORD_VITAL_SPIRIT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PATTERN)] = { .text = gEasyChatWord_Pattern, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_VOLT_ABSORB), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLASH_FIRE)] = { .text = gEasyChatWord_FlashFire, - .alphabeticalOrder = 95, + .alphabeticalOrder = EC_INDEX(EC_WORD_WATER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VITAL_SPIRIT)] = { .text = gEasyChatWord_VitalSpirit, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_WATER_ABSORB), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CHLOROPHYLL)] = { .text = gEasyChatWord_Chlorophyll, - .alphabeticalOrder = 96, + .alphabeticalOrder = EC_INDEX(EC_WORD_WATER_VEIL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_PURE_POWER)] = { .text = gEasyChatWord_PurePower, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHITE_SMOKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHIELD_DUST)] = { .text = gEasyChatWord_ShieldDust, - .alphabeticalOrder = 80, + .alphabeticalOrder = EC_INDEX(EC_WORD_WONDER_GUARD), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_time.h b/src/data/easy_chat/easy_chat_group_time.h index 061abffd49..e7646f4fa7 100755 --- a/src/data/easy_chat/easy_chat_group_time.h +++ b/src/data/easy_chat/easy_chat_group_time.h @@ -48,271 +48,271 @@ const struct EasyChatWordInfo gEasyChatGroup_Time[] = { [EC_INDEX(EC_WORD_FALL)] = { .text = gEasyChatWord_Fall, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_AGE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MORNING)] = { .text = gEasyChatWord_Morning, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALMOST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TOMORROW)] = { .text = gEasyChatWord_Tomorrow, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_ALWAYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LAST)] = { .text = gEasyChatWord_Last, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_ANOTHER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAY)] = { .text = gEasyChatWord_Day, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_BEGINNING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOMETIME)] = { .text = gEasyChatWord_Sometime, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_CURRENT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALWAYS)] = { .text = gEasyChatWord_Always, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAILY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CURRENT)] = { .text = gEasyChatWord_Current, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FOREVER)] = { .text = gEasyChatWord_Forever, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAYS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAYS)] = { .text = gEasyChatWord_Days, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_DAYTIME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_END)] = { .text = gEasyChatWord_End, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_EARLIER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TUESDAY)] = { .text = gEasyChatWord_Tuesday, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_END), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YESTERDAY)] = { .text = gEasyChatWord_Yesterday, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_FALL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TODAY)] = { .text = gEasyChatWord_Today, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_FINAL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FRIDAY)] = { .text = gEasyChatWord_Friday, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_FINISH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MONDAY)] = { .text = gEasyChatWord_Monday, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_FOREVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LATER)] = { .text = gEasyChatWord_Later, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_FRIDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EARLIER)] = { .text = gEasyChatWord_Earlier, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_LAST), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ANOTHER)] = { .text = gEasyChatWord_Another, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_LATER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TIME)] = { .text = gEasyChatWord_Time, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_MONDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FINISH)] = { .text = gEasyChatWord_Finish, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_MONTH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEDNESDAY)] = { .text = gEasyChatWord_Wednesday, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_MORNING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SOON)] = { .text = gEasyChatWord_Soon, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEARLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_START)] = { .text = gEasyChatWord_Start, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEXT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MONTH)] = { .text = gEasyChatWord_Month, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_NIGHT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_STOP)] = { .text = gEasyChatWord_Stop, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_NIGHTTIME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOW)] = { .text = gEasyChatWord_Now, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FINAL)] = { .text = gEasyChatWord_Final, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_OLDEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEXT)] = { .text = gEasyChatWord_Next, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_SATURDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AGE)] = { .text = gEasyChatWord_Age, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOMETIME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SATURDAY)] = { .text = gEasyChatWord_Saturday, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_SOON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SUMMER)] = { .text = gEasyChatWord_Summer, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_SPRING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SUNDAY)] = { .text = gEasyChatWord_Sunday, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_START), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BEGINNING)] = { .text = gEasyChatWord_Beginning, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_STOP), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SPRING)] = { .text = gEasyChatWord_Spring, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_SUMMER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAYTIME)] = { .text = gEasyChatWord_Daytime, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_SUNDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WINTER)] = { .text = gEasyChatWord_Winter, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_THURSDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DAILY)] = { .text = gEasyChatWord_Daily, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_TIME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OLDEN)] = { .text = gEasyChatWord_Olden, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_TODAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ALMOST)] = { .text = gEasyChatWord_Almost, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_TOMORROW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEARLY)] = { .text = gEasyChatWord_Nearly, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_TUESDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_THURSDAY)] = { .text = gEasyChatWord_Thursday, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEDNESDAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NIGHTTIME)] = { .text = gEasyChatWord_Nighttime, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_WEEK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NIGHT)] = { .text = gEasyChatWord_Night, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_WINTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WEEK)] = { .text = gEasyChatWord_Week, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_YESTERDAY), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_trainer.h b/src/data/easy_chat/easy_chat_group_trainer.h index 87966c9771..a74ac5c3f6 100755 --- a/src/data/easy_chat/easy_chat_group_trainer.h +++ b/src/data/easy_chat/easy_chat_group_trainer.h @@ -30,163 +30,163 @@ const struct EasyChatWordInfo gEasyChatGroup_Trainer[] = { [EC_INDEX(EC_WORD_I_CHOOSE_YOU)] = { .text = gEasyChatWord_IChooseYou, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_BAG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GOTCHA)] = { .text = gEasyChatWord_Gotcha, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_CENTER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRADE)] = { .text = gEasyChatWord_Trade, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_EGG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SAPPHIRE)] = { .text = gEasyChatWord_Sapphire, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_EMERALD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EVOLVE)] = { .text = gEasyChatWord_Evolve, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_ENCYCLOPEDIA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ENCYCLOPEDIA)] = { .text = gEasyChatWord_Encyclopedia, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_EVOLVE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NATURE)] = { .text = gEasyChatWord_Nature, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLAME), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CENTER)] = { .text = gEasyChatWord_Center, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_GET), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EGG)] = { .text = gEasyChatWord_Egg, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOLD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LINK)] = { .text = gEasyChatWord_Link, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_GOTCHA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SP_ABILITY)] = { .text = gEasyChatWord_SpAbility, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_GREEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TRAINER)] = { .text = gEasyChatWord_Trainer, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_I_CHOOSE_YOU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_VERSION)] = { .text = gEasyChatWord_Version, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEAF), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POKENAV)] = { .text = gEasyChatWord_Pokenav, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_LEVEL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POKEMON)] = { .text = gEasyChatWord_Pokemon, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_LINK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GET)] = { .text = gEasyChatWord_Get, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_NATURE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_POKEDEX)] = { .text = gEasyChatWord_Pokedex, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_POKEDEX), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RUBY)] = { .text = gEasyChatWord_Ruby, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_POKEMON), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LEVEL)] = { .text = gEasyChatWord_Level, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_POKENAV), .enabled = TRUE, }, [EC_INDEX(EC_WORD_RED)] = { .text = gEasyChatWord_Red, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_RED), .enabled = FALSE, }, [EC_INDEX(EC_WORD_GREEN)] = { .text = gEasyChatWord_Green, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_RUBY), .enabled = FALSE, }, [EC_INDEX(EC_WORD_BAG)] = { .text = gEasyChatWord_Bag, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_SAPPHIRE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLAME)] = { .text = gEasyChatWord_Flame, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_SILVER), .enabled = FALSE, }, [EC_INDEX(EC_WORD_GOLD)] = { .text = gEasyChatWord_Gold, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_SP_ABILITY), .enabled = FALSE, }, [EC_INDEX(EC_WORD_LEAF)] = { .text = gEasyChatWord_Leaf, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRADE), .enabled = FALSE, }, [EC_INDEX(EC_WORD_SILVER)] = { .text = gEasyChatWord_Silver, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_TRAINER), .enabled = FALSE, }, [EC_INDEX(EC_WORD_EMERALD)] = { .text = gEasyChatWord_Emerald, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_VERSION), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_trendy_saying.h b/src/data/easy_chat/easy_chat_group_trendy_saying.h index 938073f7f8..60b5d8c725 100755 --- a/src/data/easy_chat/easy_chat_group_trendy_saying.h +++ b/src/data/easy_chat/easy_chat_group_trendy_saying.h @@ -36,199 +36,199 @@ const struct EasyChatWordInfo gEasyChatGroup_TrendySaying[] = { [EC_INDEX(EC_WORD_KTHX_BYE)] = { .text = gEasyChatWord_KthxBye, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_1_HIT_KO_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YES_SIR_EXCL)] = { .text = gEasyChatWord_YesSirExcl, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_AVANT_GARDE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AVANT_GARDE)] = { .text = gEasyChatWord_AvantGarde, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_BABY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_COUPLE)] = { .text = gEasyChatWord_Couple, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_BANG), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MUCH_OBLIGED)] = { .text = gEasyChatWord_MuchObliged, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_CANCEL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YEEHAW_EXCL)] = { .text = gEasyChatWord_YeehawExcl, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_COUPLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MEGA)] = { .text = gEasyChatWord_Mega, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_DESTINY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_1_HIT_KO_EXCL)] = { .text = gEasyChatWord_1HitKOExcl, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_FEVER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DESTINY)] = { .text = gEasyChatWord_Destiny, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_FLATTEN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CANCEL)] = { .text = gEasyChatWord_Cancel, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAPPENING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NEW)] = { .text = gEasyChatWord_New, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_HASSLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FLATTEN)] = { .text = gEasyChatWord_Flatten, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEART), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KIDDING)] = { .text = gEasyChatWord_Kidding, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIP_AND), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOSER)] = { .text = gEasyChatWord_Loser, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_KIDDING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOSING)] = { .text = gEasyChatWord_Losing, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_KNOCKOUT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAPPENING)] = { .text = gEasyChatWord_Happening, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_KTHX_BYE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIP_AND)] = { .text = gEasyChatWord_HipAnd, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOSER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHAKE)] = { .text = gEasyChatWord_Shake, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOSING), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHADY)] = { .text = gEasyChatWord_Shady, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_MEGA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UPBEAT)] = { .text = gEasyChatWord_Upbeat, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_MODERN), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MODERN)] = { .text = gEasyChatWord_Modern, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_MUCH_OBLIGED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SMELL_YA)] = { .text = gEasyChatWord_SmellYa, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_NEW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BANG)] = { .text = gEasyChatWord_Bang, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_OLD), .enabled = TRUE, }, [EC_INDEX(EC_WORD_KNOCKOUT)] = { .text = gEasyChatWord_Knockout, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHADY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HASSLE)] = { .text = gEasyChatWord_Hassle, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHAKE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WINNER)] = { .text = gEasyChatWord_Winner, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_SMELL_YA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FEVER)] = { .text = gEasyChatWord_Fever, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_UGLY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WANNABE)] = { .text = gEasyChatWord_Wannabe, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_UPBEAT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_BABY)] = { .text = gEasyChatWord_Baby, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_WANNABE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEART)] = { .text = gEasyChatWord_Heart, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_WINNER), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OLD)] = { .text = gEasyChatWord_Old, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_YEEHAW_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YOUNG)] = { .text = gEasyChatWord_Young, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_YES_SIR_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UGLY)] = { .text = gEasyChatWord_Ugly, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_YOUNG), .enabled = TRUE, }, }; diff --git a/src/data/easy_chat/easy_chat_group_voices.h b/src/data/easy_chat/easy_chat_group_voices.h index 3ebbafd252..f50cba002e 100755 --- a/src/data/easy_chat/easy_chat_group_voices.h +++ b/src/data/easy_chat/easy_chat_group_voices.h @@ -66,379 +66,379 @@ const struct EasyChatWordInfo gEasyChatGroup_Voices[] = { [EC_INDEX(EC_WORD_EXCL)] = { .text = gEasyChatWord_Excl, - .alphabeticalOrder = 0, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EXCL_EXCL)] = { .text = gEasyChatWord_ExclExcl, - .alphabeticalOrder = 1, + .alphabeticalOrder = EC_INDEX(EC_WORD_EXCL_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_QUES_EXCL)] = { .text = gEasyChatWord_QuesExcl, - .alphabeticalOrder = 7, + .alphabeticalOrder = EC_INDEX(EC_WORD_DASH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_QUES)] = { .text = gEasyChatWord_Ques, - .alphabeticalOrder = 8, + .alphabeticalOrder = EC_INDEX(EC_WORD_DASH_DASH_DASH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ELLIPSIS)] = { .text = gEasyChatWord_Ellipsis, - .alphabeticalOrder = 4, + .alphabeticalOrder = EC_INDEX(EC_WORD_ELLIPSIS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ELLIPSIS_EXCL)] = { .text = gEasyChatWord_EllipsisExcl, - .alphabeticalOrder = 5, + .alphabeticalOrder = EC_INDEX(EC_WORD_ELLIPSIS_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS)] = { .text = gEasyChatWord_EllipsisEllipsisEllipsis, - .alphabeticalOrder = 6, + .alphabeticalOrder = EC_INDEX(EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DASH)] = { .text = gEasyChatWord_Dash, - .alphabeticalOrder = 3, + .alphabeticalOrder = EC_INDEX(EC_WORD_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_DASH_DASH_DASH)] = { .text = gEasyChatWord_DashDashDash, - .alphabeticalOrder = 2, + .alphabeticalOrder = EC_INDEX(EC_WORD_QUES_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UH_OH)] = { .text = gEasyChatWord_UhOh, - .alphabeticalOrder = 23, + .alphabeticalOrder = EC_INDEX(EC_WORD_AGREE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAAAH)] = { .text = gEasyChatWord_Waaah, - .alphabeticalOrder = 11, + .alphabeticalOrder = EC_INDEX(EC_WORD_AHAHA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AHAHA)] = { .text = gEasyChatWord_Ahaha, - .alphabeticalOrder = 41, + .alphabeticalOrder = EC_INDEX(EC_WORD_AIYEEH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OH_QUES)] = { .text = gEasyChatWord_OhQues, - .alphabeticalOrder = 52, + .alphabeticalOrder = EC_INDEX(EC_WORD_ARRGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_NOPE)] = { .text = gEasyChatWord_Nope, - .alphabeticalOrder = 59, + .alphabeticalOrder = EC_INDEX(EC_WORD_AWW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_URGH)] = { .text = gEasyChatWord_Urgh, - .alphabeticalOrder = 22, + .alphabeticalOrder = EC_INDEX(EC_WORD_CRIES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HMM)] = { .text = gEasyChatWord_Hmm, - .alphabeticalOrder = 25, + .alphabeticalOrder = EC_INDEX(EC_WORD_CRY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WHOAH)] = { .text = gEasyChatWord_Whoah, - .alphabeticalOrder = 32, + .alphabeticalOrder = EC_INDEX(EC_WORD_EEK), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WROOOAAR_EXCL)] = { .text = gEasyChatWord_WroooaarExcl, - .alphabeticalOrder = 24, + .alphabeticalOrder = EC_INDEX(EC_WORD_EH_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WOW)] = { .text = gEasyChatWord_Wow, - .alphabeticalOrder = 26, + .alphabeticalOrder = EC_INDEX(EC_WORD_EHEHE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GIGGLE)] = { .text = gEasyChatWord_Giggle, - .alphabeticalOrder = 43, + .alphabeticalOrder = EC_INDEX(EC_WORD_FUFUFU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SIGH)] = { .text = gEasyChatWord_Sigh, - .alphabeticalOrder = 19, + .alphabeticalOrder = EC_INDEX(EC_WORD_GIGGLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UNBELIEVABLE)] = { .text = gEasyChatWord_Unbelievable, - .alphabeticalOrder = 33, + .alphabeticalOrder = EC_INDEX(EC_WORD_GRAAAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CRIES)] = { .text = gEasyChatWord_Cries, - .alphabeticalOrder = 61, + .alphabeticalOrder = EC_INDEX(EC_WORD_GWAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AGREE)] = { .text = gEasyChatWord_Agree, - .alphabeticalOrder = 34, + .alphabeticalOrder = EC_INDEX(EC_WORD_GWAHAHAHA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EH_QUES)] = { .text = gEasyChatWord_EhQues, - .alphabeticalOrder = 38, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_CRY)] = { .text = gEasyChatWord_Cry, - .alphabeticalOrder = 40, + .alphabeticalOrder = EC_INDEX(EC_WORD_HAHAHA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EHEHE)] = { .text = gEasyChatWord_Ehehe, - .alphabeticalOrder = 48, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OI_OI_OI)] = { .text = gEasyChatWord_OiOiOi, - .alphabeticalOrder = 37, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEHE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OH_YEAH)] = { .text = gEasyChatWord_OhYeah, - .alphabeticalOrder = 47, + .alphabeticalOrder = EC_INDEX(EC_WORD_HEHEHE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OH)] = { .text = gEasyChatWord_Oh, - .alphabeticalOrder = 42, + .alphabeticalOrder = EC_INDEX(EC_WORD_HIYAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OOPS)] = { .text = gEasyChatWord_Oops, - .alphabeticalOrder = 15, + .alphabeticalOrder = EC_INDEX(EC_WORD_HMM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SHOCKED)] = { .text = gEasyChatWord_Shocked, - .alphabeticalOrder = 49, + .alphabeticalOrder = EC_INDEX(EC_WORD_HOHOHO), .enabled = TRUE, }, [EC_INDEX(EC_WORD_EEK)] = { .text = gEasyChatWord_Eek, - .alphabeticalOrder = 46, + .alphabeticalOrder = EC_INDEX(EC_WORD_HUMPH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GRAAAH)] = { .text = gEasyChatWord_Graaah, - .alphabeticalOrder = 57, + .alphabeticalOrder = EC_INDEX(EC_WORD_LALALA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GWAHAHAHA)] = { .text = gEasyChatWord_Gwahahaha, - .alphabeticalOrder = 44, + .alphabeticalOrder = EC_INDEX(EC_WORD_LOL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAY)] = { .text = gEasyChatWord_Way, - .alphabeticalOrder = 54, + .alphabeticalOrder = EC_INDEX(EC_WORD_MMM), .enabled = TRUE, }, [EC_INDEX(EC_WORD_TCH)] = { .text = gEasyChatWord_Tch, - .alphabeticalOrder = 53, + .alphabeticalOrder = EC_INDEX(EC_WORD_MUFUFU), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEHE)] = { .text = gEasyChatWord_Hehe, - .alphabeticalOrder = 13, + .alphabeticalOrder = EC_INDEX(EC_WORD_NOPE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAH)] = { .text = gEasyChatWord_Hah, - .alphabeticalOrder = 29, + .alphabeticalOrder = EC_INDEX(EC_WORD_OH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YUP)] = { .text = gEasyChatWord_Yup, - .alphabeticalOrder = 51, + .alphabeticalOrder = EC_INDEX(EC_WORD_OH_DEAR), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HAHAHA)] = { .text = gEasyChatWord_Hahaha, - .alphabeticalOrder = 28, + .alphabeticalOrder = EC_INDEX(EC_WORD_OH_YEAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AIYEEH)] = { .text = gEasyChatWord_Aiyeeh, - .alphabeticalOrder = 55, + .alphabeticalOrder = EC_INDEX(EC_WORD_OH_KAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HIYAH)] = { .text = gEasyChatWord_Hiyah, - .alphabeticalOrder = 12, + .alphabeticalOrder = EC_INDEX(EC_WORD_OH_QUES), .enabled = TRUE, }, [EC_INDEX(EC_WORD_FUFUFU)] = { .text = gEasyChatWord_Fufufu, - .alphabeticalOrder = 27, + .alphabeticalOrder = EC_INDEX(EC_WORD_OI_OI_OI), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LOL)] = { .text = gEasyChatWord_Lol, - .alphabeticalOrder = 56, + .alphabeticalOrder = EC_INDEX(EC_WORD_OKAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_SNORT)] = { .text = gEasyChatWord_Snort, - .alphabeticalOrder = 30, + .alphabeticalOrder = EC_INDEX(EC_WORD_OOPS), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HUMPH)] = { .text = gEasyChatWord_Humph, - .alphabeticalOrder = 31, + .alphabeticalOrder = EC_INDEX(EC_WORD_SHOCKED), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEHEHE)] = { .text = gEasyChatWord_Hehehe, - .alphabeticalOrder = 20, + .alphabeticalOrder = EC_INDEX(EC_WORD_SIGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HEH)] = { .text = gEasyChatWord_Heh, - .alphabeticalOrder = 45, + .alphabeticalOrder = EC_INDEX(EC_WORD_SNORT), .enabled = TRUE, }, [EC_INDEX(EC_WORD_HOHOHO)] = { .text = gEasyChatWord_Hohoho, - .alphabeticalOrder = 36, + .alphabeticalOrder = EC_INDEX(EC_WORD_TCH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_UH_HUH)] = { .text = gEasyChatWord_UhHuh, - .alphabeticalOrder = 50, + .alphabeticalOrder = EC_INDEX(EC_WORD_UH_HUH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OH_DEAR)] = { .text = gEasyChatWord_OhDear, - .alphabeticalOrder = 9, + .alphabeticalOrder = EC_INDEX(EC_WORD_UH_OH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_ARRGH)] = { .text = gEasyChatWord_Arrgh, - .alphabeticalOrder = 21, + .alphabeticalOrder = EC_INDEX(EC_WORD_UNBELIEVABLE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MUFUFU)] = { .text = gEasyChatWord_Mufufu, - .alphabeticalOrder = 14, + .alphabeticalOrder = EC_INDEX(EC_WORD_URGH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_MMM)] = { .text = gEasyChatWord_Mmm, - .alphabeticalOrder = 10, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAAAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OH_KAY)] = { .text = gEasyChatWord_OhKay, - .alphabeticalOrder = 62, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAHAHAHA), .enabled = TRUE, }, [EC_INDEX(EC_WORD_OKAY)] = { .text = gEasyChatWord_Okay, - .alphabeticalOrder = 35, + .alphabeticalOrder = EC_INDEX(EC_WORD_WAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_LALALA)] = { .text = gEasyChatWord_Lalala, - .alphabeticalOrder = 16, + .alphabeticalOrder = EC_INDEX(EC_WORD_WHOAH), .enabled = TRUE, }, [EC_INDEX(EC_WORD_YAY)] = { .text = gEasyChatWord_Yay, - .alphabeticalOrder = 18, + .alphabeticalOrder = EC_INDEX(EC_WORD_WOW), .enabled = TRUE, }, [EC_INDEX(EC_WORD_AWW)] = { .text = gEasyChatWord_Aww, - .alphabeticalOrder = 60, + .alphabeticalOrder = EC_INDEX(EC_WORD_WOWEE), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WOWEE)] = { .text = gEasyChatWord_Wowee, - .alphabeticalOrder = 17, + .alphabeticalOrder = EC_INDEX(EC_WORD_WROOOAAR_EXCL), .enabled = TRUE, }, [EC_INDEX(EC_WORD_GWAH)] = { .text = gEasyChatWord_Gwah, - .alphabeticalOrder = 58, + .alphabeticalOrder = EC_INDEX(EC_WORD_YAY), .enabled = TRUE, }, [EC_INDEX(EC_WORD_WAHAHAHA)] = { .text = gEasyChatWord_Wahahaha, - .alphabeticalOrder = 39, + .alphabeticalOrder = EC_INDEX(EC_WORD_YUP), .enabled = TRUE, }, }; From c372a3bf823800a9f20a65435f8fe81343520b93 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 24 Jan 2025 11:59:24 +0100 Subject: [PATCH 002/125] Fix Enamorus not changing forms (#6093) --- src/data/pokemon/species_info/gen_8_families.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index ee08542523..4281b019ea 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -7687,6 +7687,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, .formSpeciesIdTable = sEnamorusFormSpeciesIdTable, + .formChangeTable = sEnamorusFormChangeTable, }, [SPECIES_ENAMORUS_THERIAN] = @@ -7751,6 +7752,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, .formSpeciesIdTable = sEnamorusFormSpeciesIdTable, + .formChangeTable = sEnamorusFormChangeTable, }, #endif //P_FAMILY_ENAMORUS From 4dc2bc69aa55c197ac6ee41f5230405c24bf9264 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:38:51 -0500 Subject: [PATCH 003/125] Fixed Liquid Voice's dynamic type for normal moves (#6092) --- src/battle_main.c | 22 +++++++++++----------- test/battle/ability/liquid_voice.c | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 test/battle/ability/liquid_voice.c diff --git a/src/battle_main.c b/src/battle_main.c index 2391b4f370..5028a02e33 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6028,9 +6028,17 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) break; } - if (moveType == TYPE_NORMAL - && ((!gMain.inBattle || TrySetAteType(move, battler, ability)) - && GetActiveGimmick(battler) != GIMMICK_DYNAMAX)) + if (gMovesInfo[move].soundMove && ability == ABILITY_LIQUID_VOICE) + { + return TYPE_WATER; + } + else if (moveEffect == EFFECT_AURA_WHEEL && species == SPECIES_MORPEKO_HANGRY) + { + return TYPE_DARK; + } + else if (moveType == TYPE_NORMAL + && ((!gMain.inBattle || TrySetAteType(move, battler, ability)) + && GetActiveGimmick(battler) != GIMMICK_DYNAMAX)) { if (gMain.inBattle && ateBoost != NULL) *ateBoost = TRUE; @@ -6045,14 +6053,6 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) *ateBoost = TRUE; return TYPE_NORMAL; } - else if (gMovesInfo[move].soundMove && ability == ABILITY_LIQUID_VOICE) - { - return TYPE_WATER; - } - else if (moveEffect == EFFECT_AURA_WHEEL && species == SPECIES_MORPEKO_HANGRY) - { - return TYPE_DARK; - } return TYPE_NONE; } diff --git a/test/battle/ability/liquid_voice.c b/test/battle/ability/liquid_voice.c new file mode 100644 index 0000000000..79fec2f2a6 --- /dev/null +++ b/test/battle/ability/liquid_voice.c @@ -0,0 +1,21 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_HYPER_VOICE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_HYPER_VOICE].power > 0); +} + +SINGLE_BATTLE_TEST("Liquid voice turns a sound move into a Water-type move") +{ + GIVEN { + PLAYER(SPECIES_TYPHLOSION); + OPPONENT(SPECIES_PRIMARINA) { Ability(ABILITY_LIQUID_VOICE); } + } WHEN { + TURN { MOVE(opponent, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); + MESSAGE("It's super effective!"); + } +} From a075166b6b617b8aa7b29f0a51eebf9ce3310ed7 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 25 Jan 2025 04:10:12 -0500 Subject: [PATCH 004/125] Added WEATHER_DOWNPOUR to Weather Ball's dynamic type (#6100) --- src/battle_controller_player.c | 7 +++---- src/battle_main.c | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e759bb9953..770b35bf99 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1708,7 +1708,7 @@ static void MoveSelectionDisplayPpNumber(u32 battler) static void MoveSelectionDisplayMoveType(u32 battler) { u8 *txtPtr, *end; - u32 speciesId; + u32 speciesId = gBattleMons[battler].species; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; @@ -1722,7 +1722,6 @@ static void MoveSelectionDisplayMoveType(u32 battler) } else if (effect == EFFECT_IVY_CUDGEL) { - speciesId = gBattleMons[battler].species; if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA @@ -1736,8 +1735,8 @@ static void MoveSelectionDisplayMoveType(u32 battler) } else if (effect == EFFECT_TERA_STARSTORM) { - if (gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR - || (IsGimmickSelected(battler, GIMMICK_TERA) && gBattleMons[battler].species == SPECIES_TERAPAGOS_TERASTAL)) + if (speciesId == SPECIES_TERAPAGOS_STELLAR + || (IsGimmickSelected(battler, GIMMICK_TERA) && speciesId == SPECIES_TERAPAGOS_TERASTAL)) type = TYPE_STELLAR; } else if (P_SHOW_DYNAMIC_TYPES) // Non-vanilla changes to battle UI showing dynamic types diff --git a/src/battle_main.c b/src/battle_main.c index 467e57229d..d0d2f1c106 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5870,6 +5870,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) break; case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: + case WEATHER_DOWNPOUR: if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) return TYPE_WATER; break; From 88986baf5fa7bbbbaa91ea65b33f5c755c371a72 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 25 Jan 2025 13:28:46 +0100 Subject: [PATCH 005/125] Trainer Party Pools (#5731) Co-authored-by: Hedara --- docs/tutorials/how_to_trainer_party_pool.md | 122 +++++ include/config/battle.h | 8 + include/data.h | 5 + include/trainer_pools.h | 76 +++ src/battle_main.c | 75 +-- src/data/battle_pool_rules.h | 68 +++ src/trainer_pools.c | 391 ++++++++++++++++ test/battle/trainer_control.c | 66 ++- test/battle/trainer_control.h | 492 +++++++++++++++++++- test/battle/trainer_control.party | 148 +++++- tools/trainerproc/main.c | 117 ++++- 11 files changed, 1499 insertions(+), 69 deletions(-) create mode 100644 docs/tutorials/how_to_trainer_party_pool.md create mode 100644 include/trainer_pools.h create mode 100644 src/data/battle_pool_rules.h create mode 100644 src/trainer_pools.c diff --git a/docs/tutorials/how_to_trainer_party_pool.md b/docs/tutorials/how_to_trainer_party_pool.md new file mode 100644 index 0000000000..e0e7639de3 --- /dev/null +++ b/docs/tutorials/how_to_trainer_party_pool.md @@ -0,0 +1,122 @@ +# How to use Trainer Party Pools +Trainer Party Pools (TPP) is a way to introduce a bit of unpredictability to trainer battles by allowing trainer to generate parties from pools defined by the user. + +The maximum number of mons that can be in a single trainer's pool is 255. + +## Turning on TPP with `trainer.sparty` +To use TPP with `trainers.party`, all that's needed is to define a `Party Size` that's smaller than than the number of defined mons for the trainer. + +## Turning on TPP with `trainers.h` +To use TPP with `trainers.h`, the trainer need to have the `.poolSize` field set to a value that's larger than the `.partySize` and equal to the number of mons defined in the trainer. + +## How the pool works +When generating a party for a trainer with a pool, the party is picked from the pool randomly according to rules set for the pool and tags assigned to individual mons in the pool. + +### Pool Rules +Pool rules are defined in `src/data/battle_pool_rules.h`. To begin with some default pools are defined, `defaultPoolRules` which any trainer that doesn't otherwise have a specified pool ruleset uses, and some custom rules for common scenarios. + +- `POOL_RULESET_BASIC`, a ruleset that will pick a mon from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first slot and `MON_POOL_TAG_ACE` in the last slot, and not pick mons with those tags for any other position. +- `POOL_RULESET_DOUBLES`, a ruleset that will pick up to two mons from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first two slots and `MON_POOL_TAG_ACE` in the last two slots, and not pick mons with those tags for any other position. +- `POOL_RULESET_WEATHER_SINGLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_BASIC`. +- `POOL_RULESET_WEATHER_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`. +- `POOL_RULESET_SUPPORT_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_SUPPORT` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`. + +All these pools also have the options `.speciesClause`, `.excludeForms`, `.itemClause` and `.itemClauseExclusions` set to the values defined in `include/config/battle.h` under `B_POOL_RULE_`. + +- `.speciesClause` if set to `TRUE` means that the same exact species as defined by `.species` can't be picked twice for the party from the pool. +- `.excludeForms` if set to `FALSE` means that the same exact species as defined by NetDex number can't be picked twice for the party from the pool. +- `.itemClause` if set to `TRUE` means that pokemon with the same held item can't be picked twice for the party from the pool. +- `.itemClauseExclusions` if set to `TRUE` means that multiple pokemon with the same item can be picked for the party if the item is listed in `poolItemClauseExclusions`. By default `ITEM_ORAN_BERRY` and `ITEM_SITRUS_BERRY` are the only items in the list of exclusions. + +Individual tags can have rules which change how they're included. +By setting the `.tagMaxMembers[POOL_TAG_]` field to a number, only that many mons with that tag will at max be part of the party, or if set to `POOL_MEMBER_COUNT_NONE` no mons with this tag will be included, and if set to `POOL_MEMBER_COUNT_UNLIMITED` no restrictions on the number of mons with the tag will apply. + +By setting `.tagRequired[POOL_TAG_]` option field to `TRUE`, this tag will be picked before any tags that are not required, after the tag has been picked for the pool it will be set to `FALSE` for that tag. + +The tags `Lead` and `Ace` has special handling where they will be picked for the first or last party position respectively. + +### Tags +There are currently 8 tags specified in the TPP implementation, `Lead`, `Ace`, `Weather Setter`, `Weather Abuser`, `Support`, `Tag 5`, `Tag 6` and `Tag 7`. + +If using `trainers.party`, these tags are applied to mons with the field `Tags: `, separated by `/`. Example `Tags: Lead / Weather Setter` + +If using `trainers.h`, these tags are applied to mons with the field `.tags`, separated by `|`. Example: `.tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER` + +Pokemon can have up to 32 different tags, but anything beyond the 8 initial tags has to be implemented. The numbered tags can be renamed too to better signify their purpose for developers. + +## Trainer options +A few more trainer options are introduced in order to further customize how the pool picking process works. + +- `Pool Pick Functions` (`.poolPickIndex`) controls which functons are used to pick mons from the pool, they're split into Lead, Ace, and Other. +By default, only `DefaultPickFunction` and `PickLowest` are implemented. Must be an `enum` value in `enum PoolPickFunctions`. +- `Pool Prune` (`.poolPruneIndex`) controls if members in the pool should be removed before party members are picked from the pool. +By default, only `POOL_PRUNE_NONE`, which doesn't remove anything from the pool, and `POOL_PRUNE_TEST`, which removes Wobbuffet from the pool, are implemented. Must be an `enum` value in `enum PoolPruneOptions`. + +## Example pool +``` +=== TRAINER_TIANA === +Name: TIANA +Class: Lass +Pic: Lass +Gender: Female +Music: Female +Double Battle: Yes +AI: Check Bad Move +Party Size: 4 +Pool Rules: Weather Doubles +Pool Pick Index: Default + +Zigzagoon +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Shroomish +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Psyduck +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Shellder +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Mew +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe +Tags: Ace + +Giratina +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe +Tags: Ace + +Vulpix +Ability: Drought +Level: 4 +Tags: Lead / Weather Setter + +Torkoal +Ability: Drought +Level: 4 +Tags: Lead / Weather Setter + +Bulbasaur +Ability: Chlorophyll +Level: 4 +Tags: Lead / Weather Abuser + +Cherrim +Level: 4 +Tags: Lead / Weather Abuser +``` +Here Tiana has been given a pool that's set up for a double battle with weather. Using the default pool rule `Weather Doubles` it will only pick one of each of the weather setters and abusers which Tiana will lead with. Tiana will also pick either Mew or Giratina as her Ace mon, and the last slot will be filled with one of Zigzagoon, Shroomish, Psyduck or Shellder. + +## Pool settings +If no pool rule is specified in the trainer, the default rules will be used, which sets rules according to some defaults from `include/config/battle.h`. +This file also has settings for other pool options. + +- `B_POOL_SETTING_CONSISTENT_RNG`, `TRUE` or `FALSE`, the party generated will always be the same on a particular save (RNG dependant on trainerId and encountered trainer). +- `B_POOL_SETTING_USE_FIXED_SEED`, `TRUE` or `FALSE`, the party generated will always be the same on a particular compiled ROM (RNG dependant on a chosen seed and encountered trainer). +- `B_POOL_SETTING_FIXED_SEED`, seed to use for fixed seed, does nothing if `B_POOL_SETTING_USE_FIXED_SEED` is `FALSE`. diff --git a/include/config/battle.h b/include/config/battle.h index 27e13e3d1c..898fc4416b 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -302,4 +302,12 @@ // Battle UI settings #define B_MOVE_REARRANGEMENT_IN_BATTLE GEN_LATEST // In Gen 4+ move slots cannot be rearranged in battle +#define B_POOL_SETTING_CONSISTENT_RNG FALSE // If set to true, the same trainer will always generate the same pool on the same save file +#define B_POOL_SETTING_USE_FIXED_SEED FALSE // If set to true, will use the fixed seed defined in B_POOL_SETTING_FIXED_SEED +#define B_POOL_SETTING_FIXED_SEED 0x1D4127 // "Random" number, unless a mistake was made, it's へだら in Emerald charmap which should spell he-da-ra +#define B_POOL_RULE_SPECIES_CLAUSE FALSE // Only pick a single pokemon of a unique NatDex number +#define B_POOL_RULE_EXCLUDE_FORMS FALSE // Exclude different forms from the Species Clause +#define B_POOL_RULE_ITEM_CLAUSE FALSE // Only allow each item to be picked once +#define B_POOL_RULES_USE_ITEM_EXCLUSIONS FALSE // Exclude items listed in poolItemClauseExclusions + #endif // GUARD_CONFIG_BATTLE_H diff --git a/include/data.h b/include/data.h index 1d2a1291f9..6c240d9920 100644 --- a/include/data.h +++ b/include/data.h @@ -76,6 +76,7 @@ struct TrainerMon u8 padding1:1; u8 dynamaxLevel:4; u8 padding2:4; + u32 tags; }; #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) @@ -94,6 +95,10 @@ struct Trainer u8 startingStatus:6; // this trainer starts a battle with a given status. see include/constants/battle.h for values /*0x1F*/ u8 mugshotColor; /*0x20*/ u8 partySize; + /*0x21*/ u8 poolSize; + /*0x22*/ u8 poolRuleIndex; + /*0x23*/ u8 poolPickIndex; + /*0x24*/ u8 poolPruneIndex; }; struct TrainerClass diff --git a/include/trainer_pools.h b/include/trainer_pools.h new file mode 100644 index 0000000000..196657a55f --- /dev/null +++ b/include/trainer_pools.h @@ -0,0 +1,76 @@ +#ifndef GUARD_TRAINER_POOLS_H +#define GUARD_TRAINER_POOLS_H + +#include "pokemon.h" +#include "data.h" +#include "global.h" + +#define POOL_SLOT_DISABLED 0xff + +// Unlimited is set to 0 so that the default is unlimited +#define POOL_MEMBER_COUNT_UNLIMITED 0 +#define POOL_MEMBER_COUNT_NONE 0xff + +enum PoolRulesets { + POOL_RULESET_BASIC, + POOL_RULESET_DOUBLES, + POOL_RULESET_WEATHER_SINGLES, + POOL_RULESET_WEATHER_DOUBLES, + POOL_RULESET_SUPPORT_DOUBLES, +}; + +enum PoolPickFunctions { + POOL_PICK_DEFAULT, + POOL_PICK_LOWEST, +}; + +enum PoolPruneOptions { + POOL_PRUNE_NONE, + POOL_PRUNE_TEST, + POOL_PRUNE_RANDOM_TAG, +}; + +enum PoolTags { + // Lead and Ace has special handling, leave them be + POOL_TAG_LEAD = 0, + POOL_TAG_ACE = 1, + // No special handling for these + POOL_TAG_WEATHER_SETTER = 2, + POOL_TAG_WEATHER_ABUSER = 3, + POOL_TAG_SUPPORT = 4, + POOL_TAG_TAG6 = 5, + POOL_TAG_TAG7 = 6, + POOL_TAG_TAG8 = 7, + // Must be the last element + POOL_NUM_TAGS = 8 +}; + +#define MON_POOL_TAG_LEAD 1 << POOL_TAG_LEAD +#define MON_POOL_TAG_ACE 1 << POOL_TAG_ACE +#define MON_POOL_TAG_WEATHER_SETTER 1 << POOL_TAG_WEATHER_SETTER +#define MON_POOL_TAG_WEATHER_ABUSER 1 << POOL_TAG_WEATHER_ABUSER +#define MON_POOL_TAG_SUPPORT 1 << POOL_TAG_SUPPORT +#define MON_POOL_TAG_TAG6 1 << POOL_TAG_TAG6 +#define MON_POOL_TAG_TAG7 1 << POOL_TAG_TAG7 +#define MON_POOL_TAG_TAG8 1 << POOL_TAG_TAG8 + +struct PoolRules +{ + bool8 speciesClause; + bool8 excludeForms; + bool8 itemClause; + bool8 itemClauseExclusions; + u8 tagMaxMembers[POOL_NUM_TAGS]; + bool8 tagRequired[POOL_NUM_TAGS]; +}; + +struct PickFunctions +{ + u32 (*LeadFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); + u32 (*AceFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); + u32 (*OtherFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); +}; + +void DoTrainerPartyPool(const struct Trainer *trainer, u32 *monIndices, u8 monsCount, u32 battleTypeFlags); + +#endif diff --git a/src/battle_main.c b/src/battle_main.c index d0d2f1c106..31c8ac83b3 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -54,6 +54,7 @@ #include "task.h" #include "test_runner.h" #include "text.h" +#include "trainer_pools.h" #include "trig.h" #include "tv.h" #include "util.h" @@ -1875,8 +1876,12 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer monsCount = trainer->partySize; } + u32 monIndices[monsCount]; + DoTrainerPartyPool(trainer, monIndices, monsCount, battleTypeFlags); + for (i = 0; i < monsCount; i++) { + u32 monIndex = monIndices[i]; s32 ball = -1; u32 personalityHash = GeneratePartyHash(trainer, i); const struct TrainerMon *partyData = trainer->party; @@ -1892,39 +1897,39 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer personalityValue = 0x88; // Use personality more likely to result in a male Pokémon personalityValue += personalityHash << 8; - if (partyData[i].gender == TRAINER_MON_MALE) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[i].species); - else if (partyData[i].gender == TRAINER_MON_FEMALE) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[i].species); - else if (partyData[i].gender == TRAINER_MON_RANDOM_GENDER) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(Random() & 1 ? MON_MALE : MON_FEMALE, partyData[i].species); - ModifyPersonalityForNature(&personalityValue, partyData[i].nature); - if (partyData[i].isShiny) + if (partyData[monIndex].gender == TRAINER_MON_MALE) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[monIndex].species); + else if (partyData[monIndex].gender == TRAINER_MON_FEMALE) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[monIndex].species); + else if (partyData[monIndex].gender == TRAINER_MON_RANDOM_GENDER) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(Random() & 1 ? MON_MALE : MON_FEMALE, partyData[monIndex].species); + ModifyPersonalityForNature(&personalityValue, partyData[monIndex].nature); + if (partyData[monIndex].isShiny) { otIdType = OT_ID_PRESET; fixedOtId = HIHALF(personalityValue) ^ LOHALF(personalityValue); } - CreateMon(&party[i], partyData[i].species, partyData[i].lvl, 0, TRUE, personalityValue, otIdType, fixedOtId); - SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); + CreateMon(&party[i], partyData[monIndex].species, partyData[monIndex].lvl, 0, TRUE, personalityValue, otIdType, fixedOtId); + SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[monIndex].heldItem); - CustomTrainerPartyAssignMoves(&party[i], &partyData[i]); - SetMonData(&party[i], MON_DATA_IVS, &(partyData[i].iv)); - if (partyData[i].ev != NULL) + CustomTrainerPartyAssignMoves(&party[i], &partyData[monIndex]); + SetMonData(&party[i], MON_DATA_IVS, &(partyData[monIndex].iv)); + if (partyData[monIndex].ev != NULL) { - SetMonData(&party[i], MON_DATA_HP_EV, &(partyData[i].ev[0])); - SetMonData(&party[i], MON_DATA_ATK_EV, &(partyData[i].ev[1])); - SetMonData(&party[i], MON_DATA_DEF_EV, &(partyData[i].ev[2])); - SetMonData(&party[i], MON_DATA_SPATK_EV, &(partyData[i].ev[3])); - SetMonData(&party[i], MON_DATA_SPDEF_EV, &(partyData[i].ev[4])); - SetMonData(&party[i], MON_DATA_SPEED_EV, &(partyData[i].ev[5])); + SetMonData(&party[i], MON_DATA_HP_EV, &(partyData[monIndex].ev[0])); + SetMonData(&party[i], MON_DATA_ATK_EV, &(partyData[monIndex].ev[1])); + SetMonData(&party[i], MON_DATA_DEF_EV, &(partyData[monIndex].ev[2])); + SetMonData(&party[i], MON_DATA_SPATK_EV, &(partyData[monIndex].ev[3])); + SetMonData(&party[i], MON_DATA_SPDEF_EV, &(partyData[monIndex].ev[4])); + SetMonData(&party[i], MON_DATA_SPEED_EV, &(partyData[monIndex].ev[5])); } - if (partyData[i].ability != ABILITY_NONE) + if (partyData[monIndex].ability != ABILITY_NONE) { - const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[i].species]; + const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[monIndex].species]; u32 maxAbilities = ARRAY_COUNT(speciesInfo->abilities); for (ability = 0; ability < maxAbilities; ++ability) { - if (speciesInfo->abilities[ability] == partyData[i].ability) + if (speciesInfo->abilities[ability] == partyData[monIndex].ability) break; } if (ability >= maxAbilities) @@ -1932,7 +1937,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } else if (B_TRAINER_MON_RANDOM_ABILITY) { - const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[i].species]; + const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[monIndex].species]; ability = personalityHash % 3; while (speciesInfo->abilities[ability] == ABILITY_NONE) { @@ -1940,34 +1945,34 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } } SetMonData(&party[i], MON_DATA_ABILITY_NUM, &ability); - SetMonData(&party[i], MON_DATA_FRIENDSHIP, &(partyData[i].friendship)); - if (partyData[i].ball != ITEM_NONE) + SetMonData(&party[i], MON_DATA_FRIENDSHIP, &(partyData[monIndex].friendship)); + if (partyData[monIndex].ball != ITEM_NONE) { - ball = partyData[i].ball; + ball = partyData[monIndex].ball; SetMonData(&party[i], MON_DATA_POKEBALL, &ball); } - if (partyData[i].nickname != NULL) + if (partyData[monIndex].nickname != NULL) { - SetMonData(&party[i], MON_DATA_NICKNAME, partyData[i].nickname); + SetMonData(&party[i], MON_DATA_NICKNAME, partyData[monIndex].nickname); } - if (partyData[i].isShiny) + if (partyData[monIndex].isShiny) { u32 data = TRUE; SetMonData(&party[i], MON_DATA_IS_SHINY, &data); } - if (partyData[i].dynamaxLevel > 0) + if (partyData[monIndex].dynamaxLevel > 0) { - u32 data = partyData[i].dynamaxLevel; + u32 data = partyData[monIndex].dynamaxLevel; SetMonData(&party[i], MON_DATA_DYNAMAX_LEVEL, &data); } - if (partyData[i].gigantamaxFactor) + if (partyData[monIndex].gigantamaxFactor) { - u32 data = partyData[i].gigantamaxFactor; + u32 data = partyData[monIndex].gigantamaxFactor; SetMonData(&party[i], MON_DATA_GIGANTAMAX_FACTOR, &data); } - if (partyData[i].teraType > 0) + if (partyData[monIndex].teraType > 0) { - u32 data = partyData[i].teraType; + u32 data = partyData[monIndex].teraType; SetMonData(&party[i], MON_DATA_TERA_TYPE, &data); } CalculateMonStats(&party[i]); diff --git a/src/data/battle_pool_rules.h b/src/data/battle_pool_rules.h new file mode 100644 index 0000000000..b88db3c797 --- /dev/null +++ b/src/data/battle_pool_rules.h @@ -0,0 +1,68 @@ +#include "battle_main.h" + +const u16 poolItemClauseExclusions[] = +{ + ITEM_ORAN_BERRY, + ITEM_SITRUS_BERRY, +}; + +const struct PoolRules defaultPoolRules = +{ + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, +}; + +const struct PoolRules gPoolRulesetsList[] = { + [POOL_RULESET_BASIC] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 1, + .tagMaxMembers[POOL_TAG_ACE] = 1, + }, + [POOL_RULESET_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + }, + [POOL_RULESET_WEATHER_SINGLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 1, + .tagMaxMembers[POOL_TAG_ACE] = 1, + .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, + .tagRequired[POOL_TAG_WEATHER_SETTER] = TRUE, + .tagMaxMembers[POOL_TAG_WEATHER_ABUSER] = POOL_MEMBER_COUNT_UNLIMITED, + .tagRequired[POOL_TAG_WEATHER_ABUSER] = TRUE, + }, + [POOL_RULESET_WEATHER_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, + .tagRequired[POOL_TAG_WEATHER_SETTER] = TRUE, + .tagMaxMembers[POOL_TAG_WEATHER_ABUSER] = POOL_MEMBER_COUNT_UNLIMITED, + .tagRequired[POOL_TAG_WEATHER_ABUSER] = TRUE, + }, + [POOL_RULESET_SUPPORT_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + .tagMaxMembers[POOL_TAG_SUPPORT] = 1, + .tagRequired[POOL_TAG_SUPPORT] = TRUE, + }, +}; diff --git a/src/trainer_pools.c b/src/trainer_pools.c new file mode 100644 index 0000000000..a3ea1de22b --- /dev/null +++ b/src/trainer_pools.c @@ -0,0 +1,391 @@ +#include "global.h" +#include "data.h" +#include "malloc.h" +#include "pokemon.h" +#include "random.h" +#include "trainer_pools.h" +#include "constants/battle.h" +#include "constants/items.h" + +#include "data/battle_pool_rules.h" + +static void HasRequiredTag(const struct Trainer *trainer, u8* poolIndexArray, struct PoolRules *rules, u32 *arrayIndex, bool32 *foundRequiredTag, u32 currIndex) +{ + // Start from index 2, since lead and ace has special handling + for (u32 currTag = 2; currTag < POOL_NUM_TAGS; currTag++) + { + if (rules->tagRequired[currTag] + && trainer->party[poolIndexArray[currIndex]].tags & (1u << currTag)) + { + *arrayIndex = currIndex; + *foundRequiredTag = TRUE; + break; + } + } +} + +static u32 DefaultLeadPickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + if ((partyIndex == 0) + || (partyIndex == 1 && (battleTypeFlags & BATTLE_TYPE_DOUBLE))) + { + // Find required + lead tags + bool32 foundRequiredTag = FALSE; + u32 firstLeadIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if ((poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + && (trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_LEAD))) + { + if (firstLeadIndex == POOL_SLOT_DISABLED) + firstLeadIndex = currIndex; + // Start from index 2, since lead and ace has special handling + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + lead wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstLeadIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstLeadIndex]; + poolIndexArray[firstLeadIndex] = POOL_SLOT_DISABLED; + } + } + return monIndex; +} + +static u32 DefaultAcePickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + if (((partyIndex == monsCount - 1) || (partyIndex == monsCount - 2 && battleTypeFlags & BATTLE_TYPE_DOUBLE)) + && (rules->tagMaxMembers[1] == POOL_MEMBER_COUNT_UNLIMITED || rules->tagMaxMembers[1] >= 1)) + { + // Find required + ace tags + bool32 foundRequiredTag = FALSE; + u32 firstAceIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if ((poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + && (trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_ACE))) + { + if (firstAceIndex == POOL_SLOT_DISABLED) + firstAceIndex = currIndex; + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + ace wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstAceIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstAceIndex]; + poolIndexArray[firstAceIndex] = POOL_SLOT_DISABLED; + } + } + return monIndex; +} + +static u32 DefaultOtherPickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + // Find required tag + bool32 foundRequiredTag = FALSE; + u32 firstUnpickedIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if (poolIndexArray[currIndex] != POOL_SLOT_DISABLED + && !(trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_LEAD)) + && !(trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_ACE))) + { + if (firstUnpickedIndex == POOL_SLOT_DISABLED) + firstUnpickedIndex = currIndex; + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + ace wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstUnpickedIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstUnpickedIndex]; + poolIndexArray[firstUnpickedIndex] = POOL_SLOT_DISABLED; + } + return monIndex; +} + +static u32 PickLowest(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 monIndex = POOL_SLOT_DISABLED; + u32 lowestIndex = POOL_SLOT_DISABLED; + for (u32 i = 0; i < trainer->poolSize; i++) + { + if (poolIndexArray[i] < monIndex) + { + lowestIndex = i; + monIndex = poolIndexArray[i]; + } + } + if (lowestIndex == POOL_SLOT_DISABLED) + return POOL_SLOT_DISABLED; + poolIndexArray[lowestIndex] = POOL_SLOT_DISABLED; + return monIndex; +} + +static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules, struct PickFunctions pickFunctions) +{ + u32 monIndex = POOL_SLOT_DISABLED; + // Pick Lead + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.LeadFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + // Pick Ace + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.AceFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + // If no mon has been found yet continue looking + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.OtherFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + u32 chosenTags = trainer->party[monIndex].tags; + u16 chosenSpecies = trainer->party[monIndex].species; + u16 chosenItem = trainer->party[monIndex].heldItem; + u16 chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; + // If tag was required, change pool rule to account for the required tag already being picked + u32 tagsToEliminate = 0; + for (u32 currTag = 0; currTag < POOL_NUM_TAGS; currTag++) + { + if (chosenTags & (1u << currTag) + && rules->tagMaxMembers[currTag] != POOL_MEMBER_COUNT_UNLIMITED) + { + if (rules->tagMaxMembers[currTag] == 1) + rules->tagMaxMembers[currTag] = POOL_MEMBER_COUNT_NONE; + else + rules->tagMaxMembers[currTag]--; + } + if (chosenTags & (1u << currTag)) + rules->tagRequired[currTag] = FALSE; + if (rules->tagMaxMembers[currTag] == POOL_MEMBER_COUNT_NONE) + tagsToEliminate |= 1u << currTag; + } + // If species clause, remove picked species from pool + // If item clause, remove all mons with same held item from pool + // If matching a tag that's been exhausted, remove from pool + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if (poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + { + u32 currentTags = trainer->party[poolIndexArray[currIndex]].tags; + u16 currentSpecies = trainer->party[poolIndexArray[currIndex]].species; + u16 currentItem = trainer->party[poolIndexArray[currIndex]].heldItem; + u16 currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; + if (currentTags & tagsToEliminate) + { + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + if (rules->speciesClause && chosenSpecies == currentSpecies) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (!rules->excludeForms && chosenNatDex == currentNatDex) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (rules->itemClause && currentItem != ITEM_NONE) + { + if (rules->itemClauseExclusions) + { + bool32 isExcluded = FALSE; + for (u32 i = 0; i < ARRAY_COUNT(poolItemClauseExclusions); i++) + { + if (chosenItem == poolItemClauseExclusions[i]) + { + isExcluded = TRUE; + break; + } + } + if (!isExcluded) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + else if (chosenItem == currentItem) + { + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + } + } + } + return monIndex; +} + +static u32 GetPoolSeed(const struct Trainer *trainer) +{ + u32 seed; + if (B_POOL_SETTING_USE_FIXED_SEED) + seed = B_POOL_SETTING_FIXED_SEED; + else + seed = gSaveBlock2Ptr->playerTrainerId[0] + (gSaveBlock2Ptr->playerTrainerId[1] << 8) + (gSaveBlock2Ptr->playerTrainerId[2] << 16) + (gSaveBlock2Ptr->playerTrainerId[3] << 24); + seed ^= (u32)trainer; + return seed; +} + +static void RandomizePoolIndices(const struct Trainer *trainer, u8 *poolIndexArray) +{ + // Basically the modern (Durstenfield's) Fisher-Yates shuffle + // Reducing the amount of calls to random needed by only using as many bits as needed per shuffle + u32 poolSize = trainer->poolSize; + for (u32 i = 0; i < poolSize; i++) + poolIndexArray[i] = i; + u32 rnd; + rng_value_t localRngState; + if (B_POOL_SETTING_CONSISTENT_RNG) + { + u32 seed = GetPoolSeed(trainer); + localRngState = LocalRandomSeed(seed); + // Replace the LocalRandom with LocalRandom32 when implemented + rnd = LocalRandom(&localRngState) + (LocalRandom(&localRngState) << 16); + } + else + { + rnd = Random32(); + } + u32 usedBits = 0; + for (u32 i = 0; i < poolSize - 1; i++) + { + u32 numBits = 1; + if (poolSize - i > 127) + numBits = 8; + else if (poolSize - i > 63) + numBits = 7; + else if (poolSize - i > 31) + numBits = 6; + else if (poolSize - i > 15) + numBits = 5; + else if (poolSize - i > 7) + numBits = 4; + else if (poolSize - i > 3) + numBits = 3; + else if (poolSize - i > 1) + numBits = 2; + if (usedBits + numBits > 32) + { + if (B_POOL_SETTING_CONSISTENT_RNG) + rnd = LocalRandom(&localRngState) + (LocalRandom(&localRngState) << 16); + else + rnd = Random32(); + usedBits = 0; + } + u32 currIndex = (rnd & ((1u << numBits) - 1)) % (poolSize - i); + rnd = rnd >> numBits; + usedBits += numBits; + u32 tempValue = poolIndexArray[poolSize - 1 - i]; + poolIndexArray[poolSize - 1 - i] = poolIndexArray[currIndex]; + poolIndexArray[currIndex] = tempValue; + } +} + +static struct PickFunctions GetPickFunctions(const struct Trainer *trainer) +{ + struct PickFunctions pickFunctions; + switch (trainer->poolPickIndex) + { + // Repeats, but better to have the safety + case POOL_PICK_DEFAULT: + pickFunctions.LeadFunction = &DefaultLeadPickFunction; + pickFunctions.AceFunction = &DefaultAcePickFunction; + pickFunctions.OtherFunction = &DefaultOtherPickFunction; + break; + case POOL_PICK_LOWEST: + pickFunctions.LeadFunction = &PickLowest; + pickFunctions.AceFunction = &PickLowest; + pickFunctions.OtherFunction = &PickLowest; + break; + default: + pickFunctions.LeadFunction = &DefaultLeadPickFunction; + pickFunctions.AceFunction = &DefaultAcePickFunction; + pickFunctions.OtherFunction = &DefaultOtherPickFunction; + break; + } + return pickFunctions; +} + +static void TestPrune(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + // Test function to demonstrate pruning + for (u32 i = 0; i < trainer->poolSize; i++) + if (trainer->party[poolIndexArray[i]].species == SPECIES_WOBBUFFET) + poolIndexArray[i] = POOL_SLOT_DISABLED; +} + +static void RandomTagPrune(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + u32 tagToUse = trainer->party[poolIndexArray[0]].tags; + for (u32 i = 0; i < trainer->poolSize; i++) + if (!(trainer->party[poolIndexArray[i]].tags & tagToUse)) + poolIndexArray[i] = POOL_SLOT_DISABLED; +} + +static void PrunePool(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + // Use defined pruning functions go here + switch (trainer->poolPruneIndex) + { + case POOL_PRUNE_NONE: + break; + case POOL_PRUNE_TEST: + TestPrune(trainer, poolIndexArray, rules); + break; + case POOL_PRUNE_RANDOM_TAG: + RandomTagPrune(trainer, poolIndexArray, rules); + break; + default: + break; + } +} + +void DoTrainerPartyPool(const struct Trainer *trainer, u32 *monIndices, u8 monsCount, u32 battleTypeFlags) +{ + bool32 usingPool = FALSE; + struct PoolRules rules = defaultPoolRules; + if (trainer->poolSize != 0) + { + usingPool = TRUE; + rules = gPoolRulesetsList[trainer->poolRuleIndex]; + u8 *poolIndexArray = Alloc(trainer->poolSize); + RandomizePoolIndices(trainer, poolIndexArray); + + struct PickFunctions pickFunctions = GetPickFunctions(trainer); + + PrunePool(trainer, poolIndexArray, &rules); + + for (u32 i = 0; i < monsCount; i++) + { + monIndices[i] = PickMonFromPool(trainer, poolIndexArray, i, monsCount, battleTypeFlags, &rules, pickFunctions); + // If the slot doesn't have a proper value, the pool creation failed, fall back to normal mon pick process + if (monIndices[i] == POOL_SLOT_DISABLED) + { + usingPool = FALSE; + break; + } + } + Free(poolIndexArray); + } + + if (!usingPool) + for (u32 i = 0; i < monsCount; i++) + monIndices[i] = i; +} diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index bbc49c2ed5..89a5c905a9 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -6,12 +6,13 @@ #include "malloc.h" #include "random.h" #include "string_util.h" +#include "trainer_pools.h" #include "constants/item.h" #include "constants/abilities.h" #include "constants/trainers.h" #include "constants/battle.h" -#define NUM_TEST_TRAINERS 3 +#define NUM_TEST_TRAINERS 9 static const struct Trainer sTestTrainers[DIFFICULTY_COUNT][NUM_TEST_TRAINERS] = { @@ -33,8 +34,8 @@ enum DifficultyLevel GetTrainerDifficultyLevelTest(u16 trainerId) TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon") { - u32 currTrainer = 0; struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 0; u8 nickBuffer[20]; CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); EXPECT(IsMonShiny(&testParty[0])); @@ -220,3 +221,64 @@ TEST("Difficulty changes which party if used for NPCs if defined for the difficu EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 50); Free(testParty); } + +TEST("Trainer Party Pool generates a party from the trainer pool") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 3; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_EEVEE); + Free(testParty); +} + +TEST("Trainer Party Pool picks a random lead and a random ace if tags exist in the pool") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 4; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_ARON); // Lead + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WYNAUT); // Not Lead or Ace + EXPECT(GetMonData(&testParty[2], MON_DATA_SPECIES) == SPECIES_EEVEE); // Ace + Free(testParty); +} + +TEST("Trainer Party Pool picks according to custom rules") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 5; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_TORKOAL); // Lead + Weather Setter + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_BULBASAUR); // Lead + Weather Abuser + EXPECT(GetMonData(&testParty[2], MON_DATA_SPECIES) == SPECIES_EEVEE); // Anything else + Free(testParty); +} + +TEST("Trainer Party Pool uses standard party creation if pool is illegal") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 6; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_WYNAUT); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WOBBUFFET); + Free(testParty); +} + +TEST("Trainer Party Pool can be pruned before picking") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 7; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_EEVEE); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WYNAUT); + Free(testParty); +} + +TEST("Trainer Party Pool can choose which functions to use for picking mons") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 8; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_WYNAUT); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WOBBUFFET); + Free(testParty); +} diff --git a/test/battle/trainer_control.h b/test/battle/trainer_control.h index 5b8aa02291..703a436274 100644 --- a/test/battle/trainer_control.h +++ b/test/battle/trainer_control.h @@ -120,7 +120,7 @@ }, #line 45 #line 52 - [DIFFICULTY_HARD][1] = + [DIFFICULTY_NORMAL][2] = { #line 46 .trainerName = _("Test2"), @@ -138,12 +138,12 @@ { { #line 54 - .species = SPECIES_YVELTAL, + .species = SPECIES_MEWTWO, .gender = TRAINER_MON_RANDOM_GENDER, #line 56 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), #line 55 - .lvl = 99, + .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, @@ -151,7 +151,7 @@ }, #line 57 #line 64 - [DIFFICULTY_NORMAL][2] = + [DIFFICULTY_EASY][2] = { #line 58 .trainerName = _("Test2"), @@ -169,12 +169,12 @@ { { #line 66 - .species = SPECIES_MEWTWO, + .species = SPECIES_METAPOD, .gender = TRAINER_MON_RANDOM_GENDER, #line 68 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), #line 67 - .lvl = 50, + .lvl = 1, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, @@ -182,7 +182,7 @@ }, #line 69 #line 76 - [DIFFICULTY_EASY][2] = + [DIFFICULTY_HARD][2] = { #line 70 .trainerName = _("Test2"), @@ -200,23 +200,22 @@ { { #line 78 - .species = SPECIES_METAPOD, + .species = SPECIES_ARCEUS, .gender = TRAINER_MON_RANDOM_GENDER, #line 80 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), #line 79 - .lvl = 1, + .lvl = 99, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 81 -#line 88 - [DIFFICULTY_HARD][2] = + [DIFFICULTY_NORMAL][3] = { #line 82 - .trainerName = _("Test2"), + .trainerName = _("Test3"), #line 83 .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, #line 84 @@ -226,19 +225,482 @@ TRAINER_ENCOUNTER_MUSIC_MALE, #line 87 .doubleBattle = FALSE, +#line 88 .partySize = 1, + .poolSize = 4, .party = (const struct TrainerMon[]) { { #line 90 - .species = SPECIES_ARCEUS, + .species = SPECIES_WYNAUT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 92 +#line 91 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), #line 91 - .lvl = 99, + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 92 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 93 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 93 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 94 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 95 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 95 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 96 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 97 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 97 + .lvl = 100, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, +#line 98 + [DIFFICULTY_NORMAL][4] = + { +#line 99 + .trainerName = _("Test4"), +#line 100 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 101 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 103 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 104 + .doubleBattle = FALSE, +#line 105 + .partySize = 3, + .poolSize = 6, + .party = (const struct TrainerMon[]) + { + { +#line 107 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 108 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 108 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 109 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 111 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 111 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 110 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 112 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 114 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 114 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 113 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 115 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 116 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 116 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 117 + .species = SPECIES_ODDISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 119 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 119 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 118 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 120 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 122 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 122 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 121 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, +#line 123 + [DIFFICULTY_NORMAL][5] = + { +#line 124 + .trainerName = _("Test5"), +#line 125 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 126 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 128 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 129 + .doubleBattle = TRUE, +#line 131 + .poolRuleIndex = POOL_RULESET_WEATHER_DOUBLES, +#line 130 + .partySize = 3, + .poolSize = 10, + .party = (const struct TrainerMon[]) + { + { +#line 133 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 135 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 135 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 134 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 136 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 138 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 138 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 137 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 139 + .species = SPECIES_VULPIX, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 141 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 141 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 140 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, + }, + { +#line 142 + .species = SPECIES_BULBASAUR, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 144 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 144 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 143 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, + }, + { +#line 145 + .species = SPECIES_TORKOAL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 147 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 147 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 146 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, + }, + { +#line 148 + .species = SPECIES_CHERRIM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 150 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 150 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 149 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, + }, + { +#line 151 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 153 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 153 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 152 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 154 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 156 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 156 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 155 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 157 + .species = SPECIES_ODDISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 158 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 158 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 159 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 160 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 160 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 161 + [DIFFICULTY_NORMAL][6] = + { +#line 162 + .trainerName = _("Test6"), +#line 163 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 164 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 166 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 167 + .doubleBattle = FALSE, +#line 169 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 168 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 171 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 173 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 173 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 172 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 174 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 176 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 176 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 175 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 177 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 179 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 179 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 178 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, +#line 180 + [DIFFICULTY_NORMAL][7] = + { +#line 181 + .trainerName = _("Test1"), +#line 182 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 183 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 185 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 186 + .doubleBattle = FALSE, +#line 188 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 189 + .poolPruneIndex = POOL_PRUNE_TEST, +#line 187 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 191 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 192 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 192 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 193 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 195 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 195 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 194 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 196 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 197 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 197 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 198 + [DIFFICULTY_NORMAL][8] = + { +#line 199 + .trainerName = _("Test1"), +#line 200 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 201 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 203 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 204 + .doubleBattle = FALSE, +#line 206 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 207 + .poolPickIndex = POOL_PICK_LOWEST, +#line 205 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 209 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 211 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 211 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 210 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 212 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 213 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 213 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 214 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 216 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 216 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 215 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, diff --git a/test/battle/trainer_control.party b/test/battle/trainer_control.party index 3357bb70fe..b4ba68c6b1 100644 --- a/test/battle/trainer_control.party +++ b/test/battle/trainer_control.party @@ -42,18 +42,6 @@ Difficulty: Normal Mewtwo Level: 5 -=== 1 === -Name: Test2 -Class: Pkmn Trainer 1 -Pic: Red -Gender: Male -Music: Male -Double Battle: No -Difficulty: HARD - -Yveltal -Level: 99 - === 2 === Name: Test2 Class: Pkmn Trainer 1 @@ -89,3 +77,139 @@ Difficulty: Hard Arceus Level: 99 + +=== 3 === +Name: Test3 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 1 + +Wynaut + +Wobbuffet + +Eevee + +Mew + +=== 4 === +Name: Test4 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 3 + +Wynaut + +Wobbuffet +Tags: Lead + +Eevee +Tags: Ace + +Mew + +Oddish +Tags: Ace + +Aron +Tags: Lead + +=== 5 === +Name: Test5 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: Yes +Party Size: 3 +Pool Rules: Weather Doubles + +Wynaut +Tags: Lead + +Wobbuffet +Tags: Lead + +Vulpix +Tags: Lead / Weather Setter + +Bulbasaur +Tags: Lead / Weather Abuser + +Torkoal +Tags: Lead / Weather Setter + +Cherrim +Tags: Lead / Weather Abuser + +Mew +Tags: Lead + +Aron +Tags: Lead + +Oddish + +Eevee + +=== 6 === +Name: Test6 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic + +Wynaut +Tags: Lead + +Wobbuffet +Tags: Lead + +Eevee +Tags: Lead + +=== 7 === +Name: Test1 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic +Pool Prune: Test + +Wynaut + +Wobbuffet +Tags: Lead + +Eevee + +=== 8 === +Name: Test1 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic +Pool Pick Functions: Lowest + +Wynaut +Tags: Ace + +Wobbuffet + +Eevee +Tags: Lead diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index db49633ee3..b301ddf552 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -16,8 +16,9 @@ #define MAX_TRAINER_AI_FLAGS 32 #define MAX_TRAINER_ITEMS 4 -#define PARTY_SIZE 6 +#define PARTY_SIZE 255 #define MAX_MON_MOVES 4 +#define MAX_MON_TAGS 32 struct String { @@ -82,6 +83,10 @@ struct Pokemon struct String moves[MAX_MON_MOVES]; int moves_n; int move1_line; + + struct String tags[MAX_MON_TAGS]; + int tags_n; + int tags_line; }; struct Trainer @@ -126,6 +131,18 @@ struct Trainer struct String difficulty; int difficulty_line; + + int party_size; + int party_size_line; + + struct String pool_rules; + int pool_rules_line; + + struct String pool_pick_functions; + int pool_pick_functions_line; + + struct String pool_prune; + int pool_prune_line; }; static bool is_empty_string(struct String s) @@ -1205,9 +1222,38 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->difficulty_line = value.location.line; trainer->difficulty = token_string(&value); } + else if (is_literal_token(&key, "Party Size")) + { + if (trainer->party_size_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Party Size'"); + trainer->party_size_line = value.location.line; + if (!token_int(p, &value, &trainer->party_size)) + any_error = !show_parse_error(p); + } + else if (is_literal_token(&key, "Pool Rules")) + { + if (trainer->pool_rules_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Rules'"); + trainer->pool_rules_line = value.location.line; + trainer->pool_rules = token_string(&value); + } + else if (is_literal_token(&key, "Pool Pick Functions")) + { + if (trainer->pool_pick_functions_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Pick Function'"); + trainer->pool_pick_functions_line = value.location.line; + trainer->pool_pick_functions = token_string(&value); + } + else if (is_literal_token(&key, "Pool Prune")) + { + if (trainer->pool_prune_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Prune'"); + trainer->pool_prune_line = value.location.line; + trainer->pool_prune = token_string(&value); + } else { - any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Double Battle', 'Difficulty', or 'AI'"); + any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Double Battle', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); } } if (!trainer->pic_line) @@ -1371,6 +1417,14 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct pokemon->tera_type_line = value.location.line; pokemon->tera_type = token_string(&value); } + else if (is_literal_token(&key, "Tags")) + { + if (pokemon->tags_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Tags'"); + pokemon->tags_line = value.location.line; + if (!token_human_identifiers(p, &value, pokemon->tags, &pokemon->tags_n, MAX_MON_TAGS)) + any_error = !show_parse_error(p); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'EVs', 'IVs', 'Ability', 'Level', 'Ball', 'Happiness', 'Nature', 'Shiny', 'Dynamax Level', 'Gigantamax', or 'Tera Type'"); @@ -1434,6 +1488,11 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } } + if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n) + { + set_show_parse_error(p, p->location, "partySize larger than supplied pool"); + } + return !any_error; } @@ -1735,9 +1794,44 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } - fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); - fprintf(f, " .party = (const struct TrainerMon[])\n"); - fprintf(f, " {\n"); + if (!is_empty_string(trainer->pool_rules)) + { + fprintf(f, "#line %d\n", trainer->pool_rules_line); + fprintf(f, " .poolRuleIndex = "); + fprint_constant(f, "POOL_RULESET", trainer->pool_rules); + fprintf(f, ",\n"); + } + + if (!is_empty_string(trainer->pool_pick_functions)) + { + fprintf(f, "#line %d\n", trainer->pool_pick_functions_line); + fprintf(f, " .poolPickIndex = "); + fprint_constant(f, "POOL_PICK", trainer->pool_pick_functions); + fprintf(f, ",\n"); + } + + if (!is_empty_string(trainer->pool_prune)) + { + fprintf(f, "#line %d\n", trainer->pool_prune_line); + fprintf(f, " .poolPruneIndex = "); + fprint_constant(f, "POOL_PRUNE", trainer->pool_prune); + fprintf(f, ",\n"); + } + + if (trainer->party_size_line) + { + fprintf(f, "#line %d\n", trainer->party_size_line); + fprintf(f, " .partySize = %d,\n", trainer->party_size); + fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } + else + { + fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } for (int j = 0; j < trainer->pokemon_n; j++) { struct Pokemon *pokemon = &trainer->pokemon[j]; @@ -1873,6 +1967,19 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } + if (pokemon->tags_line) + { + fprintf(f, "#line %d\n", pokemon->tags_line); + fprintf(f, " .tags = "); + for (int i = 0; i < pokemon->tags_n; i++) + { + if (i > 0) + fprintf(f, " | "); + fprint_constant(f, "MON_POOL_TAG", pokemon->tags[i]); + } + fprintf(f, ",\n"); + } + if (pokemon->moves_n > 0) { fprintf(f, " .moves = {\n"); From c4b838587bdaf6a44bd47c22bd72bf412190bb48 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 25 Jan 2025 14:38:18 +0100 Subject: [PATCH 006/125] Fixes Charge effect not boosting and tests (#6102) --- src/battle_script_commands.c | 2 +- test/battle/move_effect/charge.c | 57 ++++++++++++++------------------ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 55a192958c..e95dab7ac4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6774,7 +6774,7 @@ static void Cmd_moveend(void) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE <= GEN_8 || moveType == TYPE_ELECTRIC) + if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (TARGET_TURN_DAMAGED || gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index b057fa4753..78a0ba1b04 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -9,9 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Charge doubles the damage of the next Electric move of the user") { - s16 normalDamage = 0; - s16 chargedUpDamage = 0; - + s16 damage[2] = {0}; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -21,20 +19,18 @@ SINGLE_BATTLE_TEST("Charge doubles the damage of the next Electric move of the u TURN { MOVE(player, MOVE_THUNDERBOLT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &normalDamage); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARGE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &chargedUpDamage); + HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(normalDamage, Q_4_12(2.0), chargedUpDamage); + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } SINGLE_BATTLE_TEST("Charge's effect is kept until the user uses an Electric move (Gen 9+)") { - s16 normalDamage = 0; - s16 chargedUpDamage = 0; - + s16 damage[2] = {0}; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -45,20 +41,19 @@ SINGLE_BATTLE_TEST("Charge's effect is kept until the user uses an Electric move TURN { MOVE(player, MOVE_THUNDERBOLT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &normalDamage); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARGE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &chargedUpDamage); + HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(normalDamage, Q_4_12(2.0), chargedUpDamage); + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } SINGLE_BATTLE_TEST("Charge's effect is removed if the user fails using an Electric move (Gen 9+)") { s16 damage[2]; - GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -81,8 +76,7 @@ SINGLE_BATTLE_TEST("Charge's effect is removed if the user fails using an Electr SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind Power") { u32 species, ability; - s16 normalDamage = 0; - s16 chargedUpDamage = 0; + s16 damage[2]; PARAMETRIZE { species = SPECIES_WATTREL; ability = ABILITY_WIND_POWER; } PARAMETRIZE { species = SPECIES_TADBULB; ability = ABILITY_ELECTROMORPHOSIS; } @@ -97,22 +91,20 @@ SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind TURN { MOVE(player, MOVE_THUNDERBOLT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &normalDamage); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARGE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_AIR_CUTTER, opponent); ABILITY_POPUP(player, ability); ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &chargedUpDamage); + HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(normalDamage, Q_4_12(2.0), chargedUpDamage); + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is Electric or not (Gen 3-8)") { - s16 normalDamage = 0; - s16 chargedUpDamage = 0; - + s16 damage[2]; GIVEN { ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); @@ -125,26 +117,25 @@ SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is El TURN { MOVE(player, MOVE_THUNDERBOLT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &normalDamage); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARGE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &chargedUpDamage); + HP_BAR(opponent, captureDamage: &damage[1]); } THEN { if (B_CHARGE < GEN_9) - EXPECT_EQ(normalDamage, chargedUpDamage); + EXPECT_EQ(damage[0], damage[1]); else - EXPECT_MUL_EQ(normalDamage, Q_4_12(2.0), chargedUpDamage); + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") { - s16 normalDamage = 0; - s16 chargedUpDamage = 0; - + s16 damage[2]; GIVEN { - PLAYER(SPECIES_WOBBUFFET); + ASSUME(gMovesInfo[MOVE_IRON_HEAD].additionalEffects[0].moveEffect == MOVE_EFFECT_FLINCH); + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } } WHEN { TURN { MOVE(player, MOVE_THUNDERBOLT); } @@ -154,14 +145,14 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") TURN { MOVE(player, MOVE_THUNDERBOLT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &normalDamage); + HP_BAR(opponent, captureDamage: &damage[0]); ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARGE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); - HP_BAR(opponent, captureDamage: &chargedUpDamage); + HP_BAR(opponent, captureDamage: &damage[1]); } THEN { if (B_CHARGE < GEN_9) - EXPECT_EQ(normalDamage, chargedUpDamage); + EXPECT_EQ(damage[0], damage[1]); else - EXPECT_MUL_EQ(normalDamage, Q_4_12(2.0), chargedUpDamage); + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } From 856553daf42b9ff1f54c91bf8cf0ab364c467a55 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 25 Jan 2025 16:53:51 +0100 Subject: [PATCH 007/125] Put Identifier and smol in gitignore (#6105) --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 5f9172181d..301fc8ca29 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ prefabs.json /pokeemerald-*.png src/data/map_group_count.h tools/trainerproc/trainerproc +*.Identifier +*.smol +*.fastSmol +*.smolTM From df50320ca637cbf337c731c957034c5fac598e99 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 25 Jan 2025 17:38:19 +0100 Subject: [PATCH 008/125] Fix Crash if something costs 0 in shop (#6106) --- src/shop.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/shop.c b/src/shop.c index a343bab0d3..effb638984 100644 --- a/src/shop.c +++ b/src/shop.c @@ -1066,7 +1066,11 @@ static void Task_BuyHowManyDialogueInit(u8 taskId) BuyMenuPrintItemQuantityAndPrice(taskId); ScheduleBgCopyTilemapToVram(0); - maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost; + // Avoid division by zero in-case something costs 0 pokedollars. + if (sShopData->totalCost == 0) + maxQuantity = MAX_BAG_ITEM_CAPACITY; + else + maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost; if (maxQuantity > MAX_BAG_ITEM_CAPACITY) sShopData->maxQuantity = MAX_BAG_ITEM_CAPACITY; From 77b677dbf9412dbf637b4848a29d6bbed04796cf Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:26:38 +0100 Subject: [PATCH 009/125] Introduces BattleTurnCounter to simplfy timer checks (#6080) --- include/battle.h | 55 ++++++++++++------------- src/battle_ai_main.c | 15 ++++--- src/battle_ai_switch_items.c | 2 +- src/battle_anim_effects_1.c | 18 +++++---- src/battle_debug.c | 4 +- src/battle_dynamax.c | 12 +++--- src/battle_main.c | 7 +++- src/battle_script_commands.c | 68 ++++++++++++++----------------- src/battle_util.c | 78 ++++++++++++++++-------------------- 9 files changed, 123 insertions(+), 136 deletions(-) diff --git a/include/battle.h b/include/battle.h index 5e435a9a5b..573283972a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -238,49 +238,49 @@ struct SpecialStatus struct SideTimer { - u8 reflectTimer; + u16 reflectTimer; u8 reflectBattlerId; - u8 lightscreenTimer; + u16 lightscreenTimer; u8 lightscreenBattlerId; - u8 mistTimer; + u16 mistTimer; u8 mistBattlerId; - u8 safeguardTimer; + u16 safeguardTimer; u8 safeguardBattlerId; - u8 spikesAmount; - u8 toxicSpikesAmount; - u8 stealthRockAmount; - u8 stickyWebAmount; + u16 spikesAmount; // debug menu complains. might be better to solve there instead if possible + u16 toxicSpikesAmount; + u16 stealthRockAmount; + u16 stickyWebAmount; u8 stickyWebBattlerId; u8 stickyWebBattlerSide; // Used for Court Change - u8 auroraVeilTimer; + u16 auroraVeilTimer; u8 auroraVeilBattlerId; - u8 tailwindTimer; + u16 tailwindTimer; u8 tailwindBattlerId; - u8 luckyChantTimer; + u16 luckyChantTimer; u8 luckyChantBattlerId; - u8 steelsurgeAmount; + u16 steelsurgeAmount; // Timers below this point are not swapped by Court Change - u8 followmeTimer; + u16 followmeTimer; u8 followmeTarget:3; u8 followmePowder:1; // Rage powder, does not affect grass type pokemon. - u8 retaliateTimer; - u8 damageNonTypesTimer; + u16 retaliateTimer; + u16 damageNonTypesTimer; u8 damageNonTypesType; - u8 rainbowTimer; - u8 seaOfFireTimer; - u8 swampTimer; + u16 rainbowTimer; + u16 seaOfFireTimer; + u16 swampTimer; }; struct FieldTimer { - u8 mudSportTimer; - u8 waterSportTimer; - u8 wonderRoomTimer; - u8 magicRoomTimer; - u8 trickRoomTimer; - u8 terrainTimer; - u8 gravityTimer; - u8 fairyLockTimer; + u16 mudSportTimer; + u16 waterSportTimer; + u16 wonderRoomTimer; + u16 magicRoomTimer; + u16 trickRoomTimer; + u16 terrainTimer; + u16 gravityTimer; + u16 fairyLockTimer; }; struct WishFutureKnock @@ -289,7 +289,7 @@ struct WishFutureKnock u8 futureSightBattlerIndex[MAX_BATTLERS_COUNT]; u8 futureSightPartyIndex[MAX_BATTLERS_COUNT]; u16 futureSightMove[MAX_BATTLERS_COUNT]; - u8 wishCounter[MAX_BATTLERS_COUNT]; + u16 wishCounter[MAX_BATTLERS_COUNT]; u8 wishPartyId[MAX_BATTLERS_COUNT]; u8 weatherDuration; u8 knockedOffMons[NUM_BATTLE_SIDES]; // Each battler is represented by a bit. @@ -1169,6 +1169,7 @@ extern u16 gBattleMovePower; extern u16 gMoveToLearn; extern u32 gFieldStatuses; extern struct FieldTimer gFieldTimers; +extern u16 gBattleTurnCounter; extern u8 gBattlerAbility; extern struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT]; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 66774d1afe..7393617058 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2102,8 +2102,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_DEFOG: if (gSideStatuses[GetBattlerSide(battlerDef)] - & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) - || gSideTimers[GetBattlerSide(battlerDef)].auroraVeilTimer != 0 + & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) || gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY) { if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) @@ -2201,7 +2200,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-4); break; case EFFECT_WISH: - if (gWishFutureKnock.wishCounter[battlerAtk] != 0) + if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter) ADJUST_SCORE(-10); break; case EFFECT_ASSIST: @@ -2614,13 +2613,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_TAILWIND: - if (gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer != 0 - || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND) - || (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1)) // Trick Room active and not ending this turn + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND + || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND) + || gFieldStatuses & STATUS_FIELD_TRICK_ROOM) ADJUST_SCORE(-10); break; case EFFECT_LUCKY_CHANT: - if (gSideTimers[GetBattlerSide(battlerAtk)].luckyChantTimer != 0 + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_LUCKY_CHANT || PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -5320,7 +5319,7 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score switch (moveEffect) { case EFFECT_TAILWIND: - if (!gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1)) + if (!gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_TRICK_ROOM: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 24fafaf8bd..ad81949a5d 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -2174,7 +2174,7 @@ static bool32 ShouldUseItem(u32 battler) break; case EFFECT_ITEM_SET_MIST: battlerSide = GetBattlerSide(battler); - if (gDisableStructs[battler].isFirstTurn && gSideTimers[battlerSide].mistTimer == 0) + if (gDisableStructs[battler].isFirstTurn && !(gSideStatuses[battlerSide] & SIDE_STATUS_MIST)) shouldUse = TRUE; break; case EFFECT_ITEM_REVIVE: diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index a3104122d1..98bcada84b 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6693,16 +6693,21 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) u32 oppSide = GetBattlerSide(BATTLE_OPPOSITE(battlerAtk)); // if used future sight on opposing side, properly track who used it - if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) { - for (i = 0; i < gBattlersCount; i++) { + if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) + { + for (i = 0; i < gBattlersCount; i++) + { if (IsAlly(i,battlerAtk)) continue; // only on opposing side - if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) { + if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) + { // if target was attacked with future sight from us, now they'll be the partner slot gWishFutureKnock.futureSightBattlerIndex[i] = battlerPartner; gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerPartner]; break; - } else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) { + } + else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) + { gWishFutureKnock.futureSightBattlerIndex[i] = battlerAtk; gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerAtk]; break; @@ -6711,10 +6716,9 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) } // swap wish party indices - if (gWishFutureKnock.wishCounter[battlerAtk] > 0 - || gWishFutureKnock.wishCounter[battlerPartner] > 0) { + if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter + || gWishFutureKnock.wishCounter[battlerPartner] > gBattleTurnCounter) SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp); - } } static void AnimTask_AllySwitchDataSwap(u8 taskId) diff --git a/src/battle_debug.c b/src/battle_debug.c index b140d3791e..44a92b5f93 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -818,7 +818,7 @@ static void PrintDigitChars(struct BattleDebugMenu *data); static void SetUpModifyArrows(struct BattleDebugMenu *data); static void UpdateBattlerValue(struct BattleDebugMenu *data); static void UpdateMonData(struct BattleDebugMenu *data); -static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); +static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp); static void SwitchToDebugView(u8 taskId); static void SwitchToDebugViewFromAiParty(u8 taskId); @@ -1852,7 +1852,7 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) charDigits[i] = valueDigits[i] + CHAR_0; } -static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) +static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) { struct SideTimer *sideTimer = &gSideTimers[GetBattlerSide(data->battlerId)]; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 38664c5d09..cae562bf4e 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -646,9 +646,9 @@ void BS_SetMaxMoveEffect(void) gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = 8; + gFieldTimers.terrainTimer = gBattleTurnCounter + 8; else - gFieldTimers.terrainTimer = 5; + gFieldTimers.terrainTimer = gBattleTurnCounter + 5; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; effect++; @@ -665,7 +665,7 @@ void BS_SetMaxMoveEffect(void) { u32 moveType = GetMoveType(gCurrentMove); gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th gSideTimers[side].damageNonTypesType = moveType; BattleScriptPush(gBattlescriptCurrInstr + 1); ChooseDamageNonTypesString(moveType); @@ -708,9 +708,9 @@ void BS_SetMaxMoveEffect(void) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -722,7 +722,7 @@ void BS_SetMaxMoveEffect(void) if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) { gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = 5; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; effect++; diff --git a/src/battle_main.c b/src/battle_main.c index 31c8ac83b3..22d2cc32cf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -225,6 +225,7 @@ EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u32 gFieldStatuses = 0; EWRAM_DATA struct FieldTimer gFieldTimers = {0}; +EWRAM_DATA u16 gBattleTurnCounter = 0; EWRAM_DATA u8 gBattlerAbility = 0; EWRAM_DATA struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; @@ -3900,6 +3901,7 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; gBattleStruct->turnCountersTracker = 0; + gBattleTurnCounter = 0; memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); @@ -3954,9 +3956,10 @@ void BattleTurnPassed(void) return; if (DoBattlerEndTurnEffects()) return; + if (HandleWishPerishSongOnTurnEnd()) + return; } - if (HandleWishPerishSongOnTurnEnd()) - return; + if (HandleFaintedMonActions()) return; gBattleStruct->faintedActionsState = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index daf0cc5b35..420e5d3302 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4225,9 +4225,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) { gSideStatuses[side] |= SIDE_STATUS_REFLECT; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].reflectTimer = 8; + gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; else - gSideTimers[side].reflectTimer = 5; + gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; gSideTimers[side].reflectBattlerId = gBattlerAttacker; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -4245,9 +4245,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) { gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].lightscreenTimer = 8; + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; else - gSideTimers[side].lightscreenTimer = 5; + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; gSideTimers[side].lightscreenBattlerId = gBattlerAttacker; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -8568,7 +8568,7 @@ static void Cmd_setgravity(void) else { gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = 5; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -9145,7 +9145,6 @@ static void RemoveAllWeather(void) static void RemoveAllTerrains(void) { - gFieldTimers.terrainTimer = 0; switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) { case STATUS_FIELD_MISTY_TERRAIN: @@ -9637,7 +9636,7 @@ static void Cmd_various(void) else { gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; - gFieldTimers.fairyLockTimer = 2; + gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2; gBattlescriptCurrInstr = cmd->nextInstr; } return; @@ -10270,7 +10269,7 @@ static void Cmd_various(void) { gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_LUCKY_CHANT; gSideTimers[GetBattlerSide(battler)].luckyChantBattlerId = battler; - gSideTimers[GetBattlerSide(battler)].luckyChantTimer = 5; + gSideTimers[GetBattlerSide(battler)].luckyChantTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -10729,9 +10728,9 @@ static void Cmd_various(void) { gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_AURORA_VEIL; if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = 8; + gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 8; else - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = 5; + gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(battler)].auroraVeilBattlerId = battler; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -11600,9 +11599,9 @@ static void Cmd_setreflect(void) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_REFLECT; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = 8; + gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = gBattleTurnCounter + 8; else - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -12647,9 +12646,9 @@ static void Cmd_setlightscreen(void) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = 8; + gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = gBattleTurnCounter + 8; else - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -12861,7 +12860,7 @@ static void Cmd_setmist(void) } else { - gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].mistBattlerId = gBattlerAttacker; gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_MIST; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; @@ -13515,7 +13514,7 @@ static void Cmd_settailwind(void) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; gSideTimers[side].tailwindBattlerId = gBattlerAttacker; - gSideTimers[side].tailwindTimer = B_TAILWIND_TURNS >= GEN_5 ? 4 : 3; + gSideTimers[side].tailwindTimer = gBattleTurnCounter + (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -13929,7 +13928,7 @@ static void Cmd_setsafeguard(void) else { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; - gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } @@ -14225,7 +14224,7 @@ static void Cmd_trysetfutureattack(void) { CMD_ARGS(const u8 *failInstr); - if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0) + if (gWishFutureKnock.futureSightCounter[gBattlerTarget] > gBattleTurnCounter) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -14235,7 +14234,7 @@ static void Cmd_trysetfutureattack(void) gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; - gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; + gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3; if (gCurrentMove == MOVE_DOOM_DESIRE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; @@ -14705,9 +14704,9 @@ static void Cmd_trywish(void) switch (cmd->turnNumber) { case 0: // use wish - if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0) + if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter) { - gWishFutureKnock.wishCounter[gBattlerAttacker] = 2; + gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2; gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14818,18 +14817,17 @@ static void Cmd_setdamagetohealthdifference(void) } } -static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) +static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId) { if (gFieldStatuses & statusFlag) { gFieldStatuses &= ~statusFlag; - *timer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; } else { gFieldStatuses |= statusFlag; - *timer = 5; + *timer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = stringId; } } @@ -15227,7 +15225,7 @@ static void Cmd_settypebasedhalvers(void) if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) { gFieldStatuses |= STATUS_FIELD_MUDSPORT; - gFieldTimers.mudSportTimer = 5; + gFieldTimers.mudSportTimer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } @@ -15249,7 +15247,7 @@ static void Cmd_settypebasedhalvers(void) if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) { gFieldStatuses |= STATUS_FIELD_WATERSPORT; - gFieldTimers.waterSportTimer = 5; + gFieldTimers.waterSportTimer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } @@ -15434,17 +15432,9 @@ static void Cmd_removelightscreenreflect(void) else failed = FALSE; - if (!failed - && (gSideTimers[side].reflectTimer - || gSideTimers[side].lightscreenTimer - || gSideTimers[side].auroraVeilTimer)) + if (!failed && gSideStatuses[side] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; - gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; - gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; - gSideTimers[side].reflectTimer = 0; - gSideTimers[side].lightscreenTimer = 0; - gSideTimers[side].auroraVeilTimer = 0; + gSideStatuses[side] &= ~SIDE_STATUS_SCREEN_ANY; gBattleScripting.animTurn = 1; gBattleScripting.animTargetsHit = 1; } @@ -17178,13 +17168,13 @@ void BS_SetPledgeStatus(void) switch (cmd->sideStatus) { case SIDE_STATUS_RAINBOW: - gSideTimers[side].rainbowTimer = 4; + gSideTimers[side].rainbowTimer = gBattleTurnCounter + 4; break; case SIDE_STATUS_SEA_OF_FIRE: - gSideTimers[side].seaOfFireTimer = 4; + gSideTimers[side].seaOfFireTimer = gBattleTurnCounter + 4; break; case SIDE_STATUS_SWAMP: - gSideTimers[side].swampTimer = 4; + gSideTimers[side].swampTimer = gBattleTurnCounter + 4; } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 97a2e0aa30..21a0928bd2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1655,7 +1655,7 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) { if (terrainFlag & STATUS_FIELD_GRASSY_TERRAIN) BattleScriptExecute(BattleScript_GrassyTerrainHeals); - if (gFieldTimers.terrainTimer > 0 && --gFieldTimers.terrainTimer == 0) + if (gFieldTimers.terrainTimer == gBattleTurnCounter) { gFieldStatuses &= ~terrainFlag; TryToRevertMimicryAndFlags(); @@ -1737,7 +1737,7 @@ u8 DoFieldEndTurnEffects(void) SwapTurnOrder(i, j); } } - + gBattleTurnCounter++; gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; // fall through @@ -1748,7 +1748,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].reflectBattlerId; if (gSideStatuses[side] & SIDE_STATUS_REFLECT) { - if (--gSideTimers[side].reflectTimer == 0) + if (gSideTimers[side].reflectTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1773,7 +1773,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) { - if (--gSideTimers[side].lightscreenTimer == 0) + if (gSideTimers[side].lightscreenTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1799,7 +1799,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].auroraVeilBattlerId; if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) { - if (--gSideTimers[side].auroraVeilTimer == 0) + if (gSideTimers[side].auroraVeilTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1823,7 +1823,7 @@ u8 DoFieldEndTurnEffects(void) { side = gBattleStruct->turnSideTracker; gBattlerAttacker = gSideTimers[side].mistBattlerId; - if (gSideTimers[side].mistTimer != 0 && --gSideTimers[side].mistTimer == 0) + if (gSideTimers[side].mistTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_MIST; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1848,7 +1848,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].safeguardBattlerId; if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) { - if (--gSideTimers[side].safeguardTimer == 0) + if (gSideTimers[side].safeguardTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); @@ -1872,7 +1872,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].luckyChantBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT) { - if (--gSideTimers[side].luckyChantTimer == 0) + if (gSideTimers[side].luckyChantTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; BattleScriptExecute(BattleScript_LuckyChantEnds); @@ -1896,7 +1896,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].tailwindBattlerId; if (gSideStatuses[side] & SIDE_STATUS_TAILWIND) { - if (gSideTimers[side].tailwindTimer > 0 && --gSideTimers[side].tailwindTimer == 0) + if (gSideTimers[side].tailwindTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; BattleScriptExecute(BattleScript_TailwindEnds); @@ -1917,9 +1917,7 @@ u8 DoFieldEndTurnEffects(void) while (gBattleStruct->turnSideTracker < gBattlersCount) { u32 battler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; - if (gWishFutureKnock.wishCounter[battler] != 0 - && --gWishFutureKnock.wishCounter[battler] == 0 - && IsBattlerAlive(battler)) + if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) { gBattlerTarget = battler; BattleScriptExecute(BattleScript_WishComesTrue); @@ -1943,7 +1941,7 @@ u8 DoFieldEndTurnEffects(void) while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; - if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && --gSideTimers[side].damageNonTypesTimer == 0) + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[side].damageNonTypesTimer == gBattleTurnCounter) { // There is no in-game message when this side status ends. gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; @@ -1960,7 +1958,7 @@ u8 DoFieldEndTurnEffects(void) } break; case ENDTURN_TRICK_ROOM: - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 0 && --gFieldTimers.trickRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM; BattleScriptExecute(BattleScript_TrickRoomEnds); @@ -1969,7 +1967,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_WONDER_ROOM: - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer > 0 && --gFieldTimers.wonderRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM; BattleScriptExecute(BattleScript_WonderRoomEnds); @@ -1978,7 +1976,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_MAGIC_ROOM: - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer > 0 && --gFieldTimers.magicRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM; BattleScriptExecute(BattleScript_MagicRoomEnds); @@ -2003,7 +2001,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_WATER_SPORT: - if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0) + if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_WATERSPORT; BattleScriptExecute(BattleScript_WaterSportEnds); @@ -2012,7 +2010,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_MUD_SPORT: - if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_MUDSPORT; BattleScriptExecute(BattleScript_MudSportEnds); @@ -2021,7 +2019,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_GRAVITY: - if (gFieldStatuses & STATUS_FIELD_GRAVITY && --gFieldTimers.gravityTimer == 0) + if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_GRAVITY; BattleScriptExecute(BattleScript_GravityEnds); @@ -2034,7 +2032,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_FAIRY_LOCK: - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && --gFieldTimers.fairyLockTimer == 0) + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK; } @@ -2067,7 +2065,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].rainbowTimer > 0 && --gSideTimers[side].rainbowTimer == 0) + if (gSideTimers[side].rainbowTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW; BattleScriptExecute(BattleScript_TheRainbowDisappeared); @@ -2097,7 +2095,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].seaOfFireTimer > 0 && --gSideTimers[side].seaOfFireTimer == 0) + if (gSideTimers[side].seaOfFireTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE; BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared); @@ -2127,7 +2125,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].swampTimer > 0 && --gSideTimers[side].swampTimer == 0) + if (gSideTimers[side].swampTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SWAMP; BattleScriptExecute(BattleScript_TheSwampDisappeared); @@ -2873,7 +2871,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE: { u32 side = GetBattlerSide(gBattlerAttacker); - if (gSideTimers[side].damageNonTypesTimer + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) @@ -2926,14 +2924,12 @@ bool32 HandleWishPerishSongOnTurnEnd(void) gBattleStruct->wishPerishSongBattlerId++; - if (gWishFutureKnock.futureSightCounter[battler] != 0 - && --gWishFutureKnock.futureSightCounter[battler] == 0 - && !(gAbsentBattlerFlags & (1u << battler))) + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter && !(gAbsentBattlerFlags & (1u << battler))) { struct Pokemon *party; - if (gWishFutureKnock.futureSightCounter[battler] == 0 - && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] == 0) + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter + && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] <= gBattleTurnCounter) { gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_FUTUREATTACK; } @@ -4053,7 +4049,7 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbilit return FALSE; } -static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) +static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) { if ((!(gFieldStatuses & statusFlag) && (!gBattleStruct->isSkyBattle))) { @@ -4339,7 +4335,7 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov return effect; } -static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u8 *timer) +static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) { if (!(gFieldStatuses & flag)) { @@ -4347,7 +4343,7 @@ static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u8 *ti gFieldStatuses |= flag; gBattleScripting.animArg1 = anim; if (gBattleStruct->startingStatusTimer) - *timer = gBattleStruct->startingStatusTimer; + *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; else *timer = 0; // Infinite @@ -4357,7 +4353,7 @@ static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u8 *ti return 0; } -static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u8 *timer) +static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) { if (!(gSideStatuses[side] & flag)) { @@ -4366,7 +4362,7 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani gSideStatuses[side] |= flag; gBattleScripting.animArg1 = anim; if (gBattleStruct->startingStatusTimer) - *timer = gBattleStruct->startingStatusTimer; + *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; else *timer = 0; // Infinite @@ -11380,22 +11376,16 @@ static bool32 TryRemoveScreens(u32 battler) u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); // try to remove from battler's side - if (gSideStatuses[battlerSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + if (gSideStatuses[battlerSide] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[battlerSide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); - gSideTimers[battlerSide].reflectTimer = 0; - gSideTimers[battlerSide].lightscreenTimer = 0; - gSideTimers[battlerSide].auroraVeilTimer = 0; + gSideStatuses[battlerSide] &= ~SIDE_STATUS_SCREEN_ANY; removed = TRUE; } // try to remove from battler opponent's side - if (gSideStatuses[enemySide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + if (gSideStatuses[enemySide] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[enemySide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); - gSideTimers[enemySide].reflectTimer = 0; - gSideTimers[enemySide].lightscreenTimer = 0; - gSideTimers[enemySide].auroraVeilTimer = 0; + gSideStatuses[enemySide] &= ~SIDE_STATUS_SCREEN_ANY; removed = TRUE; } From 01e8d8233eec3ff3dc7041a2b03905e4f33a48ed Mon Sep 17 00:00:00 2001 From: Salem <65783283+u8-Salem@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:02:39 +0100 Subject: [PATCH 010/125] Trainer Battle Parameter Consolidation (#5982) --- asm/macros/battle_frontier/battle_dome.inc | 2 +- asm/macros/battle_frontier/battle_tower.inc | 10 +- asm/macros/battle_frontier/frontier_util.inc | 2 +- asm/macros/event.inc | 99 ++--- data/battle_scripts_1.s | 2 +- data/event_scripts.s | 2 +- .../scripts.inc | 2 +- data/maps/LavaridgeTown_Gym_1F/scripts.inc | 16 +- data/scripts/trainer_hill.inc | 2 +- include/battle_setup.h | 42 +- include/constants/battle.h | 2 +- include/constants/battle_setup.h | 3 +- include/constants/vars.h | 2 +- src/battle_ai_main.c | 8 +- src/battle_arena.c | 4 +- src/battle_bg.c | 10 +- src/battle_controller_link_opponent.c | 10 +- src/battle_controller_opponent.c | 20 +- src/battle_controller_recorded_opponent.c | 6 +- src/battle_dome.c | 18 +- src/battle_factory.c | 8 +- src/battle_gimmick.c | 2 +- src/battle_main.c | 30 +- src/battle_message.c | 60 +-- src/battle_palace.c | 10 +- src/battle_pike.c | 28 +- src/battle_pyramid.c | 6 +- src/battle_script_commands.c | 4 +- src/battle_setup.c | 389 +++++------------- src/battle_tent.c | 18 +- src/battle_tower.c | 68 +-- src/battle_transition.c | 4 +- src/battle_util.c | 2 +- src/cable_club.c | 4 +- src/frontier_util.c | 12 +- src/pokemon.c | 8 +- src/recorded_battle.c | 52 +-- src/scrcmd.c | 3 +- src/secret_base.c | 2 +- src/trainer_hill.c | 10 +- src/trainer_see.c | 7 +- src/trainer_slide.c | 6 +- src/union_room_battle.c | 2 +- src/vs_seeker.c | 2 +- test/text.c | 4 +- 45 files changed, 409 insertions(+), 594 deletions(-) diff --git a/asm/macros/battle_frontier/battle_dome.inc b/asm/macros/battle_frontier/battle_dome.inc index 9adbcc54e7..fe21ca4308 100644 --- a/asm/macros/battle_frontier/battle_dome.inc +++ b/asm/macros/battle_frontier/battle_dome.inc @@ -57,7 +57,7 @@ special CallBattleDomeFunction .endm - @ Sets gTrainerBattleOpponent_A to the trainer ID of the next opponent + @ Sets gTrainerBattleParameter.params.opponentA to the trainer ID of the next opponent .macro dome_setopponent setvar VAR_0x8004, BATTLE_DOME_FUNC_SET_OPPONENT_ID special CallBattleDomeFunction diff --git a/asm/macros/battle_frontier/battle_tower.inc b/asm/macros/battle_frontier/battle_tower.inc index b3c86955dd..6c9e606dde 100644 --- a/asm/macros/battle_frontier/battle_tower.inc +++ b/asm/macros/battle_frontier/battle_tower.inc @@ -115,14 +115,13 @@ .macro multi_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons - trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do MULTI_BATTLE_2_VS_2, \partnerId .endm .macro multi_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do MULTI_BATTLE_2_VS_1, \partnerId .endm @@ -145,14 +144,13 @@ .macro multi_fixed_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons - trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do_fixed MULTI_BATTLE_2_VS_2, \partnerId .endm .macro multi_fixed_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do_fixed MULTI_BATTLE_2_VS_1, \partnerId .endm diff --git a/asm/macros/battle_frontier/frontier_util.inc b/asm/macros/battle_frontier/frontier_util.inc index e40eccb5e7..4913b0fc15 100644 --- a/asm/macros/battle_frontier/frontier_util.inc +++ b/asm/macros/battle_frontier/frontier_util.inc @@ -133,7 +133,7 @@ special CallFrontierUtilFunc .endm - @ Buffer the name of gTrainerBattleOpponent_A in STR_VAR_1 (0) or STR_VAR_2 (1) + @ Buffer the name of gTrainerBattleParameter.params.opponentA in STR_VAR_1 (0) or STR_VAR_2 (1) .macro frontier_gettrainername stringVar:req setvar VAR_0x8004, FRONTIER_UTIL_FUNC_BUFFER_TRAINER_NAME .if \stringVar == STR_VAR_1 diff --git a/asm/macros/event.inc b/asm/macros/event.inc index efc30cabae..01522ab048 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -694,59 +694,31 @@ .byte \direction .endm + NULL = 0 + OBJ_ID_NONE = 0 + @ Configures the arguments for a trainer battle, then jumps to the appropriate script in scripts/trainer_battle.inc - .macro trainerbattle type:req, trainer:req, local_id:req, pointer1:req, pointer2, pointer3, pointer4 + .macro trainerbattle type:req localIdA:req, trainer_a:req, intro_text_a:req, lose_text_a:req, event_script_a:req, localIdB:req, trainer_b:req, intro_text_b:req, lose_text_b:req, event_script_b:req, victory_text:req, cannot_battle:req, isDouble:req, playMusicA:req, playMusicB:req, isRematch:req .byte SCR_OP_TRAINERBATTLE - .byte \type - .2byte \trainer - .2byte \local_id - .if \type == TRAINER_BATTLE_SINGLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ event script - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ event script - .elseif \type == TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT - .4byte \pointer1 @ text - .elseif \type == TRAINER_BATTLE_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .elseif \type == TRAINER_BATTLE_REMATCH - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .4byte \pointer4 @ event script - .elseif \type == TRAINER_BATTLE_REMATCH_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .4byte \pointer4 @ event script - .elseif \type == TRAINER_BATTLE_PYRAMID - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_SET_TRAINER_A - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_SET_TRAINER_B - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_HILL - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .endif + .set trainerbattle_flags, 0 + .ifgt \isDouble; .set trainerbattle_flags, trainerbattle_flags | (1 << 0); .endif + .ifgt \isRematch; .set trainerbattle_flags, trainerbattle_flags | (1 << 1); .endif + .ifgt \playMusicA; .set trainerbattle_flags, trainerbattle_flags | (1 << 2); .endif + .ifgt \playMusicB; .set trainerBattle_flags, trainerbattle_flags | (1 << 3); .endif + .ifgt \type; .set trainerbattle_flags, trainerbattle_flags | (\type << 4); .endif + .byte trainerbattle_flags + .byte \localIdA @ objEventLocalIdA + .2byte \trainer_a @ opponentA + .4byte \intro_text_a @ introTextA + .4byte \lose_text_a @ defeatTextA + .4byte \event_script_a @ retAddrA + .byte \localIdB @ objEventLocalIdB + .2byte \trainer_b @ opponentB + .4byte \intro_text_b @ introTextB + .4byte \lose_text_b @ defeatTextB + .4byte \event_script_b @ retAddrB + .4byte \victory_text @ victoryText + .4byte \cannot_battle @ cannotBattle .endm NO_MUSIC = FALSE @@ -755,11 +727,11 @@ @ When used with an event script, you can also pass in an optional flag to disable music .macro trainerbattle_single trainer:req, intro_text:req, lose_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_SINGLE, \trainer, 0, \intro_text, \lose_text + trainerbattle TRAINER_BATTLE_SINGLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \trainer, 0, \intro_text, \lose_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endif .endm @@ -767,38 +739,33 @@ @ and an optional event script. When used with an event script you can pass in an optional flag to disable music .macro trainerbattle_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text + trainerbattle TRAINER_BATTLE_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, FALSE, FALSE, FALSE .endif .endm @ Starts a rematch battle. Takes a trainer, intro text and loss text .macro trainerbattle_rematch trainer:req, intro_text:req, lose_text:req - trainerbattle TRAINER_BATTLE_REMATCH, \trainer, 0, \intro_text, \lose_text + trainerbattle TRAINER_BATTLE_REMATCH, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, TRUE .endm @ Starts a rematch double battle. Takes a trainer, intro text, loss text, and text for when you have too few pokemon .macro trainerbattle_rematch_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req - trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text + trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, FALSE, TRUE, FALSE, TRUE .endm @ Starts a trainer battle, skipping intro text. Takes a trainer and loss text .macro trainerbattle_no_intro trainer:req, lose_text:req - trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \trainer, 0, \lose_text + trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, OBJ_ID_NONE, \trainer, NULL, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a double battle with the player against two trainers @ Takes two trainers and defeat text for each .macro trainerbattle_two_trainers trainer_a:req, lose_text_a:req, trainer_b:req, lose_text_b:req - .byte 0x5c - .byte TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO - .2byte \trainer_a - .4byte \lose_text_a - .2byte \trainer_b - .4byte \lose_text_b + trainerbattle TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO, OBJ_ID_NONE, \trainer_a, NULL, \lose_text_a, NULL, OBJ_ID_NONE, \trainer_b, NULL, \lose_text_b, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5f9d79dff0..a5c08e7bbe 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5597,7 +5597,7 @@ BattleScript_LocalBattleLost:: jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_LocalBattleLostEnd - jumpifhalfword CMP_EQUAL, gTrainerBattleOpponent_A, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd + jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd BattleScript_LocalBattleLostPrintWhiteOut:: .if B_WHITEOUT_MONEY >= GEN_4 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd diff --git a/data/event_scripts.s b/data/event_scripts.s index b6b192f5f6..960a5fa084 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -89,7 +89,7 @@ gSpecialVars:: .4byte gSpecialVar_MonBoxId .4byte gSpecialVar_MonBoxPos .4byte gSpecialVar_Unused_0x8014 - .4byte gTrainerBattleOpponent_A + .4byte gTrainerBattleParameter + 2 // gTrainerBattleParameter.params.opponentA .include "data/specials.inc" diff --git a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc index ba9d996706..2b0ed8b9c4 100644 --- a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc @@ -105,7 +105,7 @@ BattlePyramid_WarpToTop:: @ TRAINER_PHILLIP is used as a placeholder BattlePyramid_TrainerBattle:: - trainerbattle TRAINER_BATTLE_PYRAMID, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText + trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE pyramid_showhint waitmessage waitbuttonpress diff --git a/data/maps/LavaridgeTown_Gym_1F/scripts.inc b/data/maps/LavaridgeTown_Gym_1F/scripts.inc index b7db13f54a..e211d08063 100644 --- a/data/maps/LavaridgeTown_Gym_1F/scripts.inc +++ b/data/maps/LavaridgeTown_Gym_1F/scripts.inc @@ -104,7 +104,7 @@ LavaridgeTown_Gym_1F_EventScript_FlanneryRematch:: end LavaridgeTown_Gym_1F_EventScript_Cole:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_COLE, LOCALID_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_COLE, TRAINER_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_ColePostBattle, MSGBOX_AUTOCLOSE end @@ -116,37 +116,37 @@ LavaridgeTown_Gym_EventScript_CheckTrainerScript:: end LavaridgeTown_Gym_1F_EventScript_Axle:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_AXLE, LOCALID_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_AXLE, TRAINER_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_AxlePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Keegan:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_KEEGAN, LOCALID_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_KEEGAN, TRAINER_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_KeeganPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_1F_EventScript_Danielle:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_DANIELLE, LOCALID_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_DANIELLE, TRAINER_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_DaniellePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_1F_EventScript_Gerald:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_GERALD, LOCALID_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_GERALD, TRAINER_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Jace:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JACE, LOCALID_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JACE, TRAINER_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_JacePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Jeff:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JEFF, LOCALID_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JEFF, TRAINER_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_JeffPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Eli:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_ELI, LOCALID_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_ELI, TRAINER_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_EliPostBattle, MSGBOX_AUTOCLOSE end diff --git a/data/scripts/trainer_hill.inc b/data/scripts/trainer_hill.inc index 04bbe05e5a..877b48c3db 100644 --- a/data/scripts/trainer_hill.inc +++ b/data/scripts/trainer_hill.inc @@ -60,7 +60,7 @@ TrainerHill_1F_Movement_SetInvisible:: @ TRAINER_PHILLIP is an actual Trainer on the SS Tidal, but is used as a placeholder here TrainerHill_EventScript_TrainerBattle:: - trainerbattle TRAINER_BATTLE_HILL, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText + trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE trainerhill_postbattletext waitmessage waitbuttonpress diff --git a/include/battle_setup.h b/include/battle_setup.h index a2009eea41..f8eda0d8dc 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -12,12 +12,43 @@ struct RematchTrainer u16 mapNum; }; +/* +the layout of the first byte can be confusing here +isDoubleBattle is the least lsb. msb is in the mode. +*/ +typedef union PACKED TrainerBattleParameter +{ + struct PACKED _TrainerBattleParameter + { + u8 isDoubleBattle:1; + u8 isRematch:1; + u8 playMusicA:1; + u8 playMusicB:1; + u8 mode:4; + u8 objEventLocalIdA; + u16 opponentA; + u8 *introTextA; + u8 *defeatTextA; + u8 *battleScriptRetAddrA; + u8 objEventLocalIdB; + u16 opponentB; + u8 *introTextB; + u8 *defeatTextB; + u8 *battleScriptRetAddrB; + u8 *victoryText; + u8 *cannotBattleText; + } params; + u8 data[sizeof(struct _TrainerBattleParameter)]; +} TrainerBattleParameter; + + extern const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES]; -extern u16 gTrainerBattleOpponent_A; -extern u16 gTrainerBattleOpponent_B; +extern TrainerBattleParameter gTrainerBattleParameter; extern u16 gPartnerTrainerId; +#define TRAINER_BATTLE_PARAM gTrainerBattleParameter.params + void BattleSetup_StartWildBattle(void); void BattleSetup_StartDoubleWildBattle(void); void BattleSetup_StartBattlePikeWildBattle(void); @@ -35,7 +66,8 @@ u8 GetTrainerBattleTransition(void); u8 GetSpecialBattleTransition(s32 id); void ChooseStarter(void); void ResetTrainerOpponentIds(void); -void SetMapVarsToTrainer(void); +void SetMapVarsToTrainerA(void); +void SetMapVarsToTrainerB(void); const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data); void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerScript); void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript); @@ -67,6 +99,10 @@ bool8 ShouldTryRematchBattle(void); bool8 IsTrainerReadyForRematch(void); void ShouldTryGetTrainerScript(void); u16 CountBattledRematchTeams(u16 trainerId); +void TrainerBattleLoadArgs(const u8 *data); +void TrainerBattleLoadArgsTrainerA(const u8 *data); +void TrainerBattleLoadArgsTrainerB(const u8 *data); +void TrainerBattleLoadArgsSecondTrainer(const u8 *data); void DoStandardWildBattle_Debug(void); void BattleSetup_StartTrainerBattle_Debug(void); diff --git a/include/constants/battle.h b/include/constants/battle.h index b361e90060..7f09e7f89b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -86,7 +86,7 @@ #define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) #define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) -#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gTrainerBattleOpponent_B == 0xFFFF)) +#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) #define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) // Battle Outcome defines diff --git a/include/constants/battle_setup.h b/include/constants/battle_setup.h index bb7f9adefa..91c89d0631 100644 --- a/include/constants/battle_setup.h +++ b/include/constants/battle_setup.h @@ -11,8 +11,7 @@ #define TRAINER_BATTLE_REMATCH_DOUBLE 7 #define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC 8 #define TRAINER_BATTLE_PYRAMID 9 -#define TRAINER_BATTLE_SET_TRAINER_A 10 -#define TRAINER_BATTLE_SET_TRAINER_B 11 +#define TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE 10 #define TRAINER_BATTLE_HILL 12 #define TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO 13 diff --git a/include/constants/vars.h b/include/constants/vars.h index 1b71134593..5ce02c1467 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -301,7 +301,7 @@ #define VAR_MON_BOX_ID 0x8012 #define VAR_MON_BOX_POS 0x8013 #define VAR_UNUSED_0x8014 0x8014 -#define VAR_TRAINER_BATTLE_OPPONENT_A 0x8015 // Alias of gTrainerBattleOpponent_A +#define VAR_TRAINER_BATTLE_OPPONENT_A 0x8015 // Alias of TRAINER_BATTLE_PARAM.opponentA #define SPECIAL_VARS_END 0x8015 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7393617058..d40cf2968f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -101,7 +101,7 @@ void BattleAI_SetupItems(void) { s32 i; u8 *data = (u8 *)BATTLE_HISTORY; - const u16 *items = GetTrainerItemsFromId(gTrainerBattleOpponent_A); + const u16 *items = GetTrainerItemsFromId(TRAINER_BATTLE_PARAM.opponentA); for (i = 0; i < sizeof(struct BattleHistory); i++) data[i] = 0; @@ -216,9 +216,9 @@ void BattleAI_SetupFlags(void) } else { - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(gTrainerBattleOpponent_A); - if (gTrainerBattleOpponent_B != 0) - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(gTrainerBattleOpponent_B); + AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); + if (TRAINER_BATTLE_PARAM.opponentB != 0) + AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); else AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT]; } diff --git a/src/battle_arena.c b/src/battle_arena.c index dd0f0c1bbd..d79602156f 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -472,7 +472,7 @@ static void InitArenaChallenge(void) gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetArenaData(void) @@ -562,7 +562,7 @@ static void GiveArenaPrize(void) static void BufferArenaOpponentName(void) { - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); } void DrawArenaRefereeTextBox(void) diff --git a/src/battle_bg.c b/src/battle_bg.c index 328f990653..24f2a55e8d 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -806,7 +806,7 @@ void DrawMainBattleBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1207,7 +1207,7 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); @@ -1272,7 +1272,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1334,7 +1334,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); @@ -1396,7 +1396,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index c437a687bd..1e4bf628db 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -401,9 +401,9 @@ static void LinkOpponentHandleDrawTrainerPic(u32 battler) if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) { if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { @@ -432,7 +432,7 @@ static void LinkOpponentHandleDrawTrainerPic(u32 battler) else { xPos = 176; - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { trainerPicId = GetUnionRoomTrainerPic(); } @@ -466,9 +466,9 @@ static void LinkOpponentHandleTrainerSlide(u32 battler) u32 trainerPicId; if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); BtlController_HandleTrainerSlide(battler, trainerPicId); LinkOpponentBufferExecCompleted(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index e87ee1a28d..adeae79652 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -432,7 +432,7 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) { trainerPicId = GetSecretBaseTrainerPicIndex(); } - else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) { trainerPicId = GetFrontierBrainTrainerPicIndex(); } @@ -441,13 +441,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { if (battlerId == 1) - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); } } else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -455,13 +455,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if (battlerId == 1) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); } } else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) @@ -471,13 +471,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { if (battlerId != 1) - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_B); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentB); else - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); } else { - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); } return trainerPicId; diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index af77dc11fc..38d2e0ea02 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -409,9 +409,9 @@ static void RecordedOpponentHandleDrawTrainerPic(u32 battler) if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) { if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { @@ -421,7 +421,7 @@ static void RecordedOpponentHandleDrawTrainerPic(u32 battler) else { xPos = 176; - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { trainerPicId = GetUnionRoomTrainerPic(); } diff --git a/src/battle_dome.c b/src/battle_dome.c index 19c5086523..d374843573 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -1782,7 +1782,7 @@ static void InitDomeChallenge(void) gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetDomeData(void) @@ -2182,13 +2182,13 @@ static void BufferDomeRoundText(void) static void BufferDomeOpponentName(void) { StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.curChallengeBattleNum]); - CopyDomeTrainerName(gStringVar2, gTrainerBattleOpponent_A); + CopyDomeTrainerName(gStringVar2, TRAINER_BATTLE_PARAM.opponentA); } static void InitDomeOpponentParty(void) { CalculatePlayerPartyCount(); - CreateDomeOpponentMons(TrainerIdToTournamentId(gTrainerBattleOpponent_A)); + CreateDomeOpponentMons(TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)); } static void CreateDomeOpponentMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentMonId, u32 otId) @@ -2577,7 +2577,7 @@ static int TournamentIdOfOpponent(int roundId, int trainerId) static void SetDomeOpponentId(void) { - gTrainerBattleOpponent_A = TrainerIdOfPlayerOpponent(); + TRAINER_BATTLE_PARAM.opponentA = TrainerIdOfPlayerOpponent(); } // While not an issue in-game, this will overflow if called after the player's opponent for the current round has been eliminated @@ -2588,7 +2588,7 @@ static u16 TrainerIdOfPlayerOpponent(void) static void SetDomeOpponentGraphicsId(void) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void SaveDomeChallenge(void) @@ -5063,9 +5063,9 @@ static void ResolveDomeRoundWinners(void) if (gSpecialVar_0x8005 == DOME_PLAYER_WON_MATCH) { - DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].isEliminated = TRUE; - DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; - gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(gTrainerBattleOpponent_A)] = gBattleResults.lastUsedMovePlayer; + DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)].isEliminated = TRUE; + DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; + gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)] = gBattleResults.lastUsedMovePlayer; // If the player's match was the final one, no NPC vs NPC matches to decide if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < DOME_FINAL) @@ -5693,7 +5693,7 @@ static void ReduceDomePlayerPartyToSelectedMons(void) static void GetPlayerSeededBeforeOpponent(void) { // A higher tournament ID is a worse seed - if (TrainerIdToTournamentId(gTrainerBattleOpponent_A) > TrainerIdToTournamentId(TRAINER_PLAYER)) + if (TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA) > TrainerIdToTournamentId(TRAINER_PLAYER)) gSpecialVar_Result = 1; else gSpecialVar_Result = 2; diff --git a/src/battle_factory.c b/src/battle_factory.c index 8edd9a2ddf..4ae2310c17 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -218,7 +218,7 @@ static void InitFactoryChallenge(void) gFrontierTempParty[i] = 0xFFFF; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetBattleFactoryData(void) @@ -325,7 +325,7 @@ static void GenerateOpponentMons(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; + TRAINER_BATTLE_PARAM.opponentA = trainerId; if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < FRONTIER_STAGES_PER_CHALLENGE - 1) gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId; @@ -379,7 +379,7 @@ static void GenerateOpponentMons(void) static void SetOpponentGfxVar(void) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void SetRentalsToOpponentParty(void) @@ -830,7 +830,7 @@ u32 GetAiScriptsInBattleFactory(void) int battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); int challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) return AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY; else if (challengeNum < 2) return 0; diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 057619aec1..540b1af1f1 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -80,7 +80,7 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) else { bool32 isSecondTrainer = (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT) && (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT; - u16 trainerId = isSecondTrainer ? gTrainerBattleOpponent_B : gTrainerBattleOpponent_A; + u16 trainerId = isSecondTrainer ? TRAINER_BATTLE_PARAM.opponentB : TRAINER_BATTLE_PARAM.opponentA; const struct TrainerMon *mon = &GetTrainerPartyFromId(trainerId)[isSecondTrainer ? gBattlerPartyIndexes[battler] - MULTI_PARTY_SIZE : gBattlerPartyIndexes[battler]]; if (gimmick == GIMMICK_TERA && mon->teraType != TYPE_NONE) diff --git a/src/battle_main.c b/src/battle_main.c index 22d2cc32cf..d89c4cae65 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -515,7 +515,7 @@ static void CB2_InitBattleInternal(void) | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL))) { - gBattleTypeFlags |= (IsTrainerDoubleBattle(gTrainerBattleOpponent_A) ? BATTLE_TYPE_DOUBLE : 0); + gBattleTypeFlags |= (IsTrainerDoubleBattle(TRAINER_BATTLE_PARAM.opponentA) ? BATTLE_TYPE_DOUBLE : 0); } InitBattleBgsVideo(); @@ -542,9 +542,9 @@ static void CB2_InitBattleInternal(void) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))) { - CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A, TRUE); + CreateNPCTrainerParty(&gEnemyParty[0], TRAINER_BATTLE_PARAM.opponentA, TRUE); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - CreateNPCTrainerParty(&gEnemyParty[PARTY_SIZE / 2], gTrainerBattleOpponent_B, FALSE); + CreateNPCTrainerParty(&gEnemyParty[PARTY_SIZE / 2], TRAINER_BATTLE_PARAM.opponentB, FALSE); SetWildMonHeldItem(); CalculateEnemyPartyCount(); } @@ -851,7 +851,7 @@ static void CB2_HandleStartBattle(void) BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { gLinkPlayers[0].id = 0; gLinkPlayers[1].id = 1; @@ -1056,11 +1056,11 @@ static void CB2_HandleStartMultiPartnerBattle(void) gLinkPlayers[1].id = 2; gLinkPlayers[2].id = 1; gLinkPlayers[3].id = 3; - GetFrontierTrainerName(gLinkPlayers[2].name, gTrainerBattleOpponent_A); - GetFrontierTrainerName(gLinkPlayers[3].name, gTrainerBattleOpponent_B); - GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gLinkPlayers[2].name, TRAINER_BATTLE_PARAM.opponentA); + GetFrontierTrainerName(gLinkPlayers[3].name, TRAINER_BATTLE_PARAM.opponentB); + GetBattleTowerTrainerLanguage(&language, TRAINER_BATTLE_PARAM.opponentA); gLinkPlayers[2].language = language; - GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_B); + GetBattleTowerTrainerLanguage(&language, TRAINER_BATTLE_PARAM.opponentB); gLinkPlayers[3].language = language; if (IsLinkTaskFinished()) @@ -1711,7 +1711,7 @@ static void CB2_HandleStartMultiBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } @@ -3719,14 +3719,14 @@ static void DoBattleIntro(void) // Try to set a status to start the battle with gBattleStruct->startingStatus = 0; - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(gTrainerBattleOpponent_B)) + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB)) { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(gTrainerBattleOpponent_B); + gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB); gBattleStruct->startingStatusTimer = 0; // infinite } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerStartingStatusFromId(gTrainerBattleOpponent_A)) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA)) { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(gTrainerBattleOpponent_A); + gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA); gBattleStruct->startingStatusTimer = 0; // infinite } else if (B_VAR_STARTING_STATUS != 0) @@ -5406,7 +5406,7 @@ static void HandleEndTurn_BattleWon(void) BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) PlayBGM(MUS_VICTORY_GYM_LEADER); else PlayBGM(MUS_VICTORY_TRAINER); @@ -5416,7 +5416,7 @@ static void HandleEndTurn_BattleWon(void) BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; - switch (GetTrainerClassFromId(gTrainerBattleOpponent_A)) + switch (GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA)) { case TRAINER_CLASS_ELITE_FOUR: case TRAINER_CLASS_CHAMPION: diff --git a/src/battle_message.c b/src/battle_message.c index e06aac8d7f..1538aec1c9 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2099,7 +2099,7 @@ void BufferStringBattle(u16 stringID, u32 battler) } else { - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1WantsToBattle; else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) stringPtr = sText_LinkTrainerWantsToBattlePause; @@ -2171,7 +2171,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) stringPtr = sText_Trainer1SentOutPkmn; - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn; else stringPtr = sText_LinkTrainerSentOutPkmn; @@ -2192,7 +2192,7 @@ void BufferStringBattle(u16 stringID, u32 battler) } else { - if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainer2WithdrewPkmn; @@ -2232,7 +2232,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainerMultiSentOutPkmn; - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn2; else stringPtr = sText_LinkTrainerSentOutPkmn2; @@ -2300,7 +2300,7 @@ void BufferStringBattle(u16 stringID, u32 battler) break; } } - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { switch (gBattleTextBuff1[0]) { @@ -2502,13 +2502,13 @@ static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 batt switch (GetBattlerPosition(battler)) { case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI) && !BATTLE_TWO_VS_ONE_OPPONENT) - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, text, multiplayerId, battler); else - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler); break; } @@ -2800,14 +2800,14 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = gAbilitiesInfo[sBattlerAbilities[gEffectBattler]].name; break; case B_TXT_TRAINER1_CLASS: // trainer class name - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_TXT_TRAINER1_NAME: // trainer1 name - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); break; case B_TXT_TRAINER1_NAME_WITH_CLASS: // trainer1 name with trainer class toCpy = textStart; - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); while (classString[classLength] != EOS) { textStart[classLength] = classString[classLength]; @@ -2815,7 +2815,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } textStart[classLength] = CHAR_SPACE; textStart += classLength + 1; - nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + nameString = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); if (nameString != textStart) { while (nameString[nameLength] != EOS) @@ -2847,12 +2847,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, gTrainerBattleOpponent_A); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else @@ -2863,12 +2863,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, gTrainerBattleOpponent_A); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } break; @@ -2937,14 +2937,14 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = sText_FoePkmnPrefix4; break; case B_TXT_TRAINER2_CLASS: - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); break; case B_TXT_TRAINER2_NAME: - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); break; case B_TXT_TRAINER2_NAME_WITH_CLASS: toCpy = textStart; - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); while (classString[classLength] != EOS) { textStart[classLength] = classString[classLength]; @@ -2952,7 +2952,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } textStart[classLength] = CHAR_SPACE; textStart += classLength + 1; - nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); + nameString = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); if (nameString != textStart) { while (nameString[nameLength] != EOS) @@ -2966,12 +2966,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, gTrainerBattleOpponent_B); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else @@ -2982,12 +2982,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER2_WIN_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, gTrainerBattleOpponent_B); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } break; @@ -3029,13 +3029,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; break; case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); else - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; } break; @@ -3055,13 +3055,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) classString = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; break; case B_POSITION_OPPONENT_LEFT: - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); else - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; } classLength = 0; diff --git a/src/battle_palace.c b/src/battle_palace.c index fdcb8d3903..68f01f84f7 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -94,7 +94,7 @@ static void InitPalaceChallenge(void) gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetPalaceData(void) @@ -153,14 +153,14 @@ static void GetPalaceCommentId(void) static void SetPalaceOpponent(void) { - gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = 5 *(Random() % 255) / 64u; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void BufferOpponentIntroSpeech(void) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } static void IncrementPalaceStreak(void) diff --git a/src/battle_pike.c b/src/battle_pike.c index 3ce3cd443a..9c93a164a9 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -1403,11 +1403,11 @@ static void PrepareOneTrainer(bool8 difficult) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1); - gTrainerBattleOpponent_A = trainerId; + TRAINER_BATTLE_PARAM.opponentA = trainerId; gFacilityTrainers = gBattleFrontierTrainers; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = TRAINER_BATTLE_PARAM.opponentA; } static void PrepareTwoTrainers(void) @@ -1429,10 +1429,10 @@ static void PrepareTwoTrainers(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1); - gTrainerBattleOpponent_A = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = TRAINER_BATTLE_PARAM.opponentA; do { @@ -1445,10 +1445,10 @@ static void PrepareTwoTrainers(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_B = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentB = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2] = gTrainerBattleOpponent_B; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2] = TRAINER_BATTLE_PARAM.opponentB; } static void ClearPikeTrainerIds(void) @@ -1463,13 +1463,13 @@ static void BufferTrainerIntro(void) { if (gSpecialVar_0x8005 == 0) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } else if (gSpecialVar_0x8005 == 1) { - if (gTrainerBattleOpponent_B < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_B].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentB < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentB].speechBefore); } } @@ -1615,7 +1615,7 @@ static void InitPikeChallenge(void) if (!(gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[lvlMode])) gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] = 0; - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; gBattleOutcome = 0; } diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index a184c9160f..c881dab38f 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -864,7 +864,7 @@ static void InitPyramidChallenge(void) } InitBattlePyramidBagCursorPosition(); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; gBattleOutcome = 0; } @@ -1324,11 +1324,11 @@ bool8 GetBattlePyramidTrainerFlag(u8 eventId) void MarkApproachingPyramidTrainersAsBattled(void) { - MarkPyramidTrainerAsBattled(gTrainerBattleOpponent_A); + MarkPyramidTrainerAsBattled(TRAINER_BATTLE_PARAM.opponentA); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { gSelectedObjectEvent = GetChosenApproachingTrainerObjectEventId(1); - MarkPyramidTrainerAsBattled(gTrainerBattleOpponent_B); + MarkPyramidTrainerAsBattled(TRAINER_BATTLE_PARAM.opponentB); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 420e5d3302..b9d07b9946 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8301,9 +8301,9 @@ static void Cmd_getmoneyreward(void) if (gBattleOutcome == B_OUTCOME_WON) { - money = GetTrainerMoneyToGive(gTrainerBattleOpponent_A); + money = GetTrainerMoneyToGive(TRAINER_BATTLE_PARAM.opponentA); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - money += GetTrainerMoneyToGive(gTrainerBattleOpponent_B); + money += GetTrainerMoneyToGive(TRAINER_BATTLE_PARAM.opponentB); AddMoney(&gSaveBlock1Ptr->money, money); } else diff --git a/src/battle_setup.c b/src/battle_setup.c index 62eb192b75..f6fa1a8e9b 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -57,22 +57,6 @@ enum { TRANSITION_TYPE_WATER, }; -enum { - TRAINER_PARAM_LOAD_VAL_8BIT, - TRAINER_PARAM_LOAD_VAL_16BIT, - TRAINER_PARAM_LOAD_VAL_32BIT, - TRAINER_PARAM_CLEAR_VAL_8BIT, - TRAINER_PARAM_CLEAR_VAL_16BIT, - TRAINER_PARAM_CLEAR_VAL_32BIT, - TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR, -}; - -struct TrainerBattleParameter -{ - void *varPtr; - u8 ptrType; -}; - // this file's functions static void DoBattlePikeWildBattle(void); static void DoSafariBattle(void); @@ -96,20 +80,9 @@ static void HandleRematchVarsOnBattleEnd(void); static const u8 *GetIntroSpeechOfApproachingTrainer(void); static const u8 *GetTrainerCantBattleSpeech(void); -EWRAM_DATA static u16 sTrainerBattleMode = 0; -EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; -EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; +EWRAM_DATA TrainerBattleParameter gTrainerBattleParameter = {0}; EWRAM_DATA u16 gPartnerTrainerId = 0; -EWRAM_DATA static u16 sTrainerObjectEventLocalId = 0; -EWRAM_DATA static u8 *sTrainerAIntroSpeech = NULL; -EWRAM_DATA static u8 *sTrainerBIntroSpeech = NULL; -EWRAM_DATA static u8 *sTrainerADefeatSpeech = NULL; -EWRAM_DATA static u8 *sTrainerBDefeatSpeech = NULL; -EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL; -EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL; EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL; -EWRAM_DATA static u8 *sTrainerABattleScriptRetAddr = NULL; -EWRAM_DATA static u8 *sTrainerBBattleScriptRetAddr = NULL; EWRAM_DATA static bool8 sShouldCheckTrainerBScript = FALSE; EWRAM_DATA static u8 sNoOfPossibleTrainerRetScripts = 0; @@ -163,114 +136,6 @@ static const u8 sBattleTransitionTable_BattleDome[] = B_TRANSITION_FRONTIER_SQUARES_SPIRAL }; -static const struct TrainerBattleParameter sOrdinaryBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sContinueScriptBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sDoubleBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -// two trainers, each with a defeat speech -static const struct TrainerBattleParameter sTrainerTwoTrainerBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_CLEAR_VAL_16BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - #define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \ { \ .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \ @@ -890,8 +755,8 @@ u8 GetTrainerBattleTransition(void) u8 transitionType; u8 enemyLevel; u8 playerLevel; - u32 trainerId = SanitizeTrainerId(gTrainerBattleOpponent_A); - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (DoesTrainerHaveMugshot(trainerId)) return B_TRANSITION_MUGSHOT; @@ -1027,30 +892,14 @@ static void TryUpdateGymLeaderRematchFromTrainer(void) UpdateGymLeaderRematch(); } -// why not just use the macros? maybe its because they didnt want to uncast const every time? -static u32 TrainerBattleLoadArg32(const u8 *ptr) -{ - return T1_READ_32(ptr); -} - -static u16 TrainerBattleLoadArg16(const u8 *ptr) -{ - return T1_READ_16(ptr); -} - -static u8 TrainerBattleLoadArg8(const u8 *ptr) -{ - return T1_READ_8(ptr); -} - static u16 GetTrainerAFlag(void) { - return TRAINER_FLAGS_START + gTrainerBattleOpponent_A; + return TRAINER_FLAGS_START + TRAINER_BATTLE_PARAM.opponentA; } static u16 GetTrainerBFlag(void) { - return TRAINER_FLAGS_START + gTrainerBattleOpponent_B; + return TRAINER_FLAGS_START + TRAINER_BATTLE_PARAM.opponentB; } static bool32 IsPlayerDefeated(u32 battleOutcome) @@ -1073,188 +922,143 @@ static bool32 IsPlayerDefeated(u32 battleOutcome) void ResetTrainerOpponentIds(void) { - gTrainerBattleOpponent_A = 0; - gTrainerBattleOpponent_B = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; + TRAINER_BATTLE_PARAM.opponentB = 0; } static void InitTrainerBattleVariables(void) { - sTrainerBattleMode = 0; - if (gApproachingTrainerId == 0) - { - sTrainerAIntroSpeech = NULL; - sTrainerADefeatSpeech = NULL; - sTrainerABattleScriptRetAddr = NULL; - } - else - { - sTrainerBIntroSpeech = NULL; - sTrainerBDefeatSpeech = NULL; - sTrainerBBattleScriptRetAddr = NULL; - } - sTrainerObjectEventLocalId = 0; - sTrainerVictorySpeech = NULL; - sTrainerCannotBattleSpeech = NULL; + memset(gTrainerBattleParameter.data, 0, sizeof(TrainerBattleParameter)); sTrainerBattleEndScript = NULL; } -static inline void SetU8(void *ptr, u8 value) +void TrainerBattleLoadArgs(const u8 *data) { - *(u8 *)(ptr) = value; + InitTrainerBattleVariables(); + memcpy(gTrainerBattleParameter.data, data, sizeof(TrainerBattleParameter)); + sTrainerBattleEndScript = (u8*)data + sizeof(TrainerBattleParameter); } -static inline void SetU16(void *ptr, u16 value) +void TrainerBattleLoadArgsTrainerA(const u8 *data) { - *(u16 *)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicA = temp->params.playMusicA; + TRAINER_BATTLE_PARAM.objEventLocalIdA = temp->params.objEventLocalIdA; + TRAINER_BATTLE_PARAM.opponentA = temp->params.opponentA; + TRAINER_BATTLE_PARAM.introTextA = temp->params.introTextA; + TRAINER_BATTLE_PARAM.defeatTextA = temp->params.defeatTextA; + TRAINER_BATTLE_PARAM.battleScriptRetAddrA = temp->params.battleScriptRetAddrA; } -static inline void SetU32(void *ptr, u32 value) +void TrainerBattleLoadArgsTrainerB(const u8 *data) { - *(u32 *)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicB = temp->params.playMusicB; + TRAINER_BATTLE_PARAM.objEventLocalIdB = temp->params.objEventLocalIdB; + TRAINER_BATTLE_PARAM.opponentB = temp->params.opponentB; + TRAINER_BATTLE_PARAM.introTextB = temp->params.introTextB; + TRAINER_BATTLE_PARAM.defeatTextB = temp->params.defeatTextB; + TRAINER_BATTLE_PARAM.battleScriptRetAddrB = temp->params.battleScriptRetAddrB; } -static inline void SetPtr(const void *ptr, const void *value) +// loads trainer A parameter to trainer B. Used for second trainer in trainer_see.c +void TrainerBattleLoadArgsSecondTrainer(const u8 *data) { - *(const void **)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicB = temp->params.playMusicA; + TRAINER_BATTLE_PARAM.objEventLocalIdB = temp->params.objEventLocalIdA; + TRAINER_BATTLE_PARAM.opponentB = temp->params.opponentA; + TRAINER_BATTLE_PARAM.introTextB = temp->params.introTextA; + TRAINER_BATTLE_PARAM.defeatTextB = temp->params.defeatTextA; + TRAINER_BATTLE_PARAM.battleScriptRetAddrB = temp->params.battleScriptRetAddrA; } -static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data) +void SetMapVarsToTrainerA(void) { - while (1) + if (TRAINER_BATTLE_PARAM.objEventLocalIdA != 0) { - switch (specs->ptrType) - { - case TRAINER_PARAM_LOAD_VAL_8BIT: - SetU8(specs->varPtr, TrainerBattleLoadArg8(data)); - data += 1; - break; - case TRAINER_PARAM_LOAD_VAL_16BIT: - SetU16(specs->varPtr, TrainerBattleLoadArg16(data)); - data += 2; - break; - case TRAINER_PARAM_LOAD_VAL_32BIT: - SetU32(specs->varPtr, TrainerBattleLoadArg32(data)); - data += 4; - break; - case TRAINER_PARAM_CLEAR_VAL_8BIT: - SetU8(specs->varPtr, 0); - break; - case TRAINER_PARAM_CLEAR_VAL_16BIT: - SetU16(specs->varPtr, 0); - break; - case TRAINER_PARAM_CLEAR_VAL_32BIT: - SetU32(specs->varPtr, 0); - break; - case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR: - SetPtr(specs->varPtr, data); - return; - } - specs++; + gSpecialVar_LastTalked = TRAINER_BATTLE_PARAM.objEventLocalIdA; + gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(TRAINER_BATTLE_PARAM.objEventLocalIdA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } -void SetMapVarsToTrainer(void) +void SetMapVarsToTrainerB(void) { - if (sTrainerObjectEventLocalId != 0) + if (TRAINER_BATTLE_PARAM.objEventLocalIdB != 0) { - gSpecialVar_LastTalked = sTrainerObjectEventLocalId; - gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(sTrainerObjectEventLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + gSpecialVar_LastTalked = TRAINER_BATTLE_PARAM.objEventLocalIdB; + gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(TRAINER_BATTLE_PARAM.objEventLocalIdB, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } +// expects parameters have been loaded correctly with TrainerBattleLoadArgs const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { - if (TrainerBattleLoadArg8(data) != TRAINER_BATTLE_SET_TRAINER_B) - InitTrainerBattleVariables(); - sTrainerBattleMode = TrainerBattleLoadArg8(data); - - switch (sTrainerBattleMode) + switch (TRAINER_BATTLE_PARAM.mode) { case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT: - TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); return EventScript_DoNoIntroTrainerBattle; case TRAINER_BATTLE_DOUBLE: - TrainerBattleLoadArgs(sDoubleBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sContinueScriptBattleParams, data); - SetMapVarsToTrainer(); - } - else - { - TrainerBattleLoadArgs(sTrainerBContinueScriptBattleParams, data); + SetMapVarsToTrainerA(); } return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC: - TrainerBattleLoadArgs(sContinueScriptBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE: case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC: - TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoDoubleTrainerBattle; #if FREE_MATCH_CALL == FALSE case TRAINER_BATTLE_REMATCH_DOUBLE: - TrainerBattleLoadArgs(sDoubleBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = GetRematchTrainerId(TRAINER_BATTLE_PARAM.opponentA); return EventScript_TryDoDoubleRematchBattle; case TRAINER_BATTLE_REMATCH: - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = GetRematchTrainerId(TRAINER_BATTLE_PARAM.opponentA); return EventScript_TryDoRematchBattle; #endif //FREE_MATCH_CALL case TRAINER_BATTLE_PYRAMID: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); } else { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - gTrainerBattleOpponent_B = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); + TRAINER_BATTLE_PARAM.opponentB = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); } return EventScript_TryDoNormalTrainerBattle; - case TRAINER_BATTLE_SET_TRAINER_A: - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - return sTrainerBattleEndScript; - case TRAINER_BATTLE_SET_TRAINER_B: - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + case TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE: return sTrainerBattleEndScript; case TRAINER_BATTLE_HILL: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = LocalIdToHillTrainerId(gSpecialVar_LastTalked); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } else { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - gTrainerBattleOpponent_B = LocalIdToHillTrainerId(gSpecialVar_LastTalked); + TRAINER_BATTLE_PARAM.opponentB = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO: gNoOfApproachingTrainers = 2; // set TWO_OPPONENTS gBattleTypeFlags gApproachingTrainerId = 1; // prevent trainer approach - TrainerBattleLoadArgs(sTrainerTwoTrainerBattleParams, data); return EventScript_DoNoIntroTrainerBattle; default: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - } - else - { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + SetMapVarsToTrainerA(); } return EventScript_TryDoNormalTrainerBattle; } @@ -1264,6 +1068,7 @@ void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerSc { gSelectedObjectEvent = trainerObjEventId; gSpecialVar_LastTalked = gObjectEvents[trainerObjEventId].localId; + TrainerBattleLoadArgs(trainerScript + 1); BattleSetup_ConfigureTrainerBattle(trainerScript + 1); ScriptContext_SetupScript(EventScript_StartTrainerApproach); LockPlayerFieldControls(); @@ -1273,6 +1078,12 @@ void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript) { gSelectedObjectEvent = trainerObjEventId; gSpecialVar_LastTalked = gObjectEvents[trainerObjEventId].localId; + + if (gApproachingTrainerId == 0) + TrainerBattleLoadArgs(trainerScript + 1); + else + TrainerBattleLoadArgsSecondTrainer(trainerScript + 1); + BattleSetup_ConfigureTrainerBattle(trainerScript + 1); } @@ -1282,11 +1093,13 @@ void SetUpTwoTrainersBattle(void) LockPlayerFieldControls(); } +#define OPCODE_OFFSET 1 bool32 GetTrainerFlagFromScriptPointer(const u8 *data) { - u32 flag = TrainerBattleLoadArg16(data + 2); - return FlagGet(TRAINER_FLAGS_START + flag); + TrainerBattleParameter *temp = (TrainerBattleParameter*)(data + OPCODE_OFFSET); + return FlagGet(TRAINER_FLAGS_START + temp->params.opponentA); } +#undef OPCODE_OFFSET // Set trainer's movement type so they stop and remain facing that direction // Note: Only for trainers who are spoken to directly @@ -1299,7 +1112,7 @@ void SetTrainerFacingDirection(void) u8 GetTrainerBattleMode(void) { - return sTrainerBattleMode; + return TRAINER_BATTLE_PARAM.mode; } bool8 GetTrainerFlag(void) @@ -1314,7 +1127,7 @@ bool8 GetTrainerFlag(void) static void SetBattledTrainersFlags(void) { - if (gTrainerBattleOpponent_B != 0) + if (TRAINER_BATTLE_PARAM.opponentB != 0) FlagSet(GetTrainerBFlag()); FlagSet(GetTrainerAFlag()); } @@ -1434,7 +1247,7 @@ static void CB2_EndTrainerBattle(void) { HandleBattleVariantEndParty(); - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) { DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -1460,7 +1273,7 @@ static void CB2_EndTrainerBattle(void) static void CB2_EndRematchBattle(void) { - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) { DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -1526,18 +1339,18 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void) if (sShouldCheckTrainerBScript) { sShouldCheckTrainerBScript = FALSE; - if (sTrainerBBattleScriptRetAddr != NULL) + if (TRAINER_BATTLE_PARAM.battleScriptRetAddrB != NULL) { gWhichTrainerToFaceAfterBattle = 1; - return sTrainerBBattleScriptRetAddr; + return TRAINER_BATTLE_PARAM.battleScriptRetAddrB; } } else { - if (sTrainerABattleScriptRetAddr != NULL) + if (TRAINER_BATTLE_PARAM.battleScriptRetAddrA != NULL) { gWhichTrainerToFaceAfterBattle = 0; - return sTrainerABattleScriptRetAddr; + return TRAINER_BATTLE_PARAM.battleScriptRetAddrA; } } @@ -1555,12 +1368,12 @@ void PlayTrainerEncounterMusic(void) u16 music; if (gApproachingTrainerId == 0) - trainerId = gTrainerBattleOpponent_A; + trainerId = TRAINER_BATTLE_PARAM.opponentA; else - trainerId = gTrainerBattleOpponent_B; + trainerId = TRAINER_BATTLE_PARAM.opponentB; - if (sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC - && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) + if (TRAINER_BATTLE_PARAM.mode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC + && TRAINER_BATTLE_PARAM.mode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) { switch (GetTrainerEncounterMusicId(trainerId)) { @@ -1621,19 +1434,19 @@ static const u8 *ReturnEmptyStringIfNull(const u8 *string) static const u8 *GetIntroSpeechOfApproachingTrainer(void) { if (gApproachingTrainerId == 0) - return ReturnEmptyStringIfNull(sTrainerAIntroSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextA); else - return ReturnEmptyStringIfNull(sTrainerBIntroSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextB); } const u8 *GetTrainerALoseText(void) { const u8 *string; - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) string = GetSecretBaseTrainerLoseText(); else - string = sTrainerADefeatSpeech; + string = TRAINER_BATTLE_PARAM.defeatTextA; StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string)); return gStringVar4; @@ -1641,18 +1454,18 @@ const u8 *GetTrainerALoseText(void) const u8 *GetTrainerBLoseText(void) { - StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerBDefeatSpeech)); + StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.defeatTextB)); return gStringVar4; } const u8 *GetTrainerWonSpeech(void) { - return ReturnEmptyStringIfNull(sTrainerVictorySpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.victoryText); } static const u8 *GetTrainerCantBattleSpeech(void) { - return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.cannotBattleText); } s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) @@ -1891,7 +1704,7 @@ static void RegisterTrainerInMatchCall(void) { if (FlagGet(FLAG_HAS_MATCH_CALL)) { - u32 matchCallFlagId = GetTrainerMatchCallFlag(gTrainerBattleOpponent_A); + u32 matchCallFlagId = GetTrainerMatchCallFlag(TRAINER_BATTLE_PARAM.opponentA); if (matchCallFlagId != 0xFFFF) FlagSet(matchCallFlagId); } @@ -1988,15 +1801,15 @@ u16 GetLastBeatenRematchTrainerId(u16 trainerId) bool8 ShouldTryRematchBattle(void) { - if (IsFirstTrainerIdReadyForRematch(gRematchTable, gTrainerBattleOpponent_A)) + if (IsFirstTrainerIdReadyForRematch(gRematchTable, TRAINER_BATTLE_PARAM.opponentA)) return TRUE; - return WasSecondRematchWon(gRematchTable, gTrainerBattleOpponent_A); + return WasSecondRematchWon(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); } bool8 IsTrainerReadyForRematch(void) { - return IsTrainerReadyForRematch_(gRematchTable, gTrainerBattleOpponent_A); + return IsTrainerReadyForRematch_(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); } static void HandleRematchVarsOnBattleEnd(void) @@ -2004,7 +1817,7 @@ static void HandleRematchVarsOnBattleEnd(void) if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && (I_VS_SEEKER_CHARGING != 0)) ClearRematchMovementByTrainerId(); - ClearTrainerWantRematchState(gRematchTable, gTrainerBattleOpponent_A); + ClearTrainerWantRematchState(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); SetBattledTrainersFlags(); } diff --git a/src/battle_tent.c b/src/battle_tent.c index 49df90ffd6..a5547da46b 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -127,14 +127,14 @@ static void SetVerdanturfTentPrize(void) static void SetVerdanturfTentTrainerGfx(void) { - gTrainerBattleOpponent_A = (u32)((Random() % 255) * 5) / 64; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = (u32)((Random() % 255) * 5) / 64; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void BufferVerdanturfTentTrainerIntro(void) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } static void SaveVerdanturfTentChallenge(void) @@ -218,7 +218,7 @@ static void GiveFallarborTentPrize(void) static void BufferFallarborTentTrainerName(void) { - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); } void CallSlateportTentFunction(void) @@ -375,8 +375,8 @@ static void GenerateOpponentMons(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + TRAINER_BATTLE_PARAM.opponentA = trainerId; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; while (monSet[numMons] != 0xFFFF) numMons++; if (numMons > 8) @@ -385,9 +385,9 @@ static void GenerateOpponentMons(void) } if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < TENT_STAGES_PER_CHALLENGE - 1) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; i = 0; while (i != FRONTIER_PARTY_SIZE) { diff --git a/src/battle_tower.c b/src/battle_tower.c index 7fcdf1b8dd..140d411843 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -823,7 +823,7 @@ static void InitTowerChallenge(void) ValidateBattleTowerRecordChecksums(); SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetTowerData(void) @@ -874,7 +874,7 @@ static void SetTowerData(void) static void SetTowerBattleWon(void) { #if FREE_BATTLE_TOWER_E_READER == FALSE - if (gTrainerBattleOpponent_A == TRAINER_EREADER) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_EREADER) ClearEReaderTrainer(&gSaveBlock2Ptr->frontier.ereaderTrainer); #endif //FREE_BATTLE_TOWER_E_READER @@ -946,7 +946,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void) if (idsCount != 0) { - gTrainerBattleOpponent_A = trainerIds[Random() % idsCount]; + TRAINER_BATTLE_PARAM.opponentA = trainerIds[Random() % idsCount]; return TRUE; } else @@ -973,15 +973,15 @@ static void SetNextFacilityOpponent(void) if (battleMode == FRONTIER_MODE_MULTIS || battleMode == FRONTIER_MODE_LINK_MULTIS) { id = gSaveBlock2Ptr->frontier.curChallengeBattleNum; - gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.trainerIds[id * 2]; - gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.trainerIds[id * 2 + 1]; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentA = gSaveBlock2Ptr->frontier.trainerIds[id * 2]; + TRAINER_BATTLE_PARAM.opponentB = gSaveBlock2Ptr->frontier.trainerIds[id * 2 + 1]; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); } else if (ChooseSpecialBattleTowerTrainer()) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } else { @@ -1000,10 +1000,10 @@ static void SetNextFacilityOpponent(void) break; } - gTrainerBattleOpponent_A = id; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = id; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < FRONTIER_STAGES_PER_CHALLENGE) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } } } @@ -1549,20 +1549,20 @@ static bool8 IsFrontierTrainerFemale(u16 trainerId) void FillFrontierTrainerParty(u8 monsCount) { ZeroEnemyPartyMons(); - FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); } void FillFrontierTrainersParties(u8 monsCount) { ZeroEnemyPartyMons(); - FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount); - FillTrainerParty(gTrainerBattleOpponent_B, 3, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentB, 3, monsCount); } static void FillTentTrainerParty(u8 monsCount) { ZeroEnemyPartyMons(); - FillTentTrainerParty_(gTrainerBattleOpponent_A, 0, monsCount); + FillTentTrainerParty_(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); } void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 otID, u32 flags, struct Pokemon *dst) @@ -1667,7 +1667,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) { // Normal battle frontier trainer. fixedIV = GetFrontierTrainerFixedIvs(trainerId); - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; } else if (trainerId == TRAINER_EREADER) { @@ -1789,9 +1789,9 @@ static void FillFactoryTrainerParty(void) { ZeroEnemyPartyMons(); if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) - FillFactoryFrontierTrainerParty(gTrainerBattleOpponent_A, 0); + FillFactoryFrontierTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0); else - FillFactoryTentTrainerParty(gTrainerBattleOpponent_A, 0); + FillFactoryTentTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0); } static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) @@ -1886,9 +1886,9 @@ static void GetOpponentIntroSpeech(void) SetFacilityPtrsGetLevel(); if (gSpecialVar_0x8005) - trainerId = gTrainerBattleOpponent_B; + trainerId = TRAINER_BATTLE_PARAM.opponentB; else - trainerId = gTrainerBattleOpponent_A; + trainerId = TRAINER_BATTLE_PARAM.opponentA; #if FREE_BATTLE_TOWER_E_READER == FALSE if (trainerId == TRAINER_EREADER) @@ -2011,7 +2011,7 @@ void DoSpecialTrainerBattle(void) for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.ereaderTrainer.party); i++) CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i]); gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_EREADER_TRAINER; - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_E_READER)); @@ -2021,7 +2021,7 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOME; if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE); CreateTask(Task_StartBattleAfterTransition, 1); CreateTask_PlayMapChosenOrBattleBGM(0); @@ -2086,7 +2086,7 @@ void DoSpecialTrainerBattle(void) } else if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_1) // Player + AI against one trainer { - gTrainerBattleOpponent_B = 0xFFFF; + TRAINER_BATTLE_PARAM.opponentB = 0xFFFF; gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; } else // MULTI_BATTLE_2_VS_2 @@ -2607,10 +2607,10 @@ static void LoadLinkMultiOpponentsData(void) { ResetBlockReceivedFlags(); memcpy(&gSaveBlock2Ptr->frontier.trainerIds, gBlockRecvBuffer, sizeof(gSaveBlock2Ptr->frontier.trainerIds)); - gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2]; - gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2 + 1]; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentA = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2]; + TRAINER_BATTLE_PARAM.opponentB = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2 + 1]; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); if (gReceivedRemoteLinkPlayers && gWirelessCommType == 0) gSpecialVar_Result = 4; else @@ -2652,10 +2652,10 @@ static void SetTowerInterviewData(void) if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_SINGLES) return; - GetFrontierTrainerName(text, gTrainerBattleOpponent_A); + GetFrontierTrainerName(text, TRAINER_BATTLE_PARAM.opponentA); StripExtCtrlCodes(text); StringCopy(gSaveBlock2Ptr->frontier.towerInterview.opponentName, text); - GetBattleTowerTrainerLanguage(&gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage, gTrainerBattleOpponent_A); + GetBattleTowerTrainerLanguage(&gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage, TRAINER_BATTLE_PARAM.opponentA); gSaveBlock2Ptr->frontier.towerInterview.opponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[1]], MON_DATA_SPECIES, NULL); gSaveBlock2Ptr->frontier.towerInterview.playerSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[0]], MON_DATA_SPECIES, NULL); for (i = 0; i < VANILLA_POKEMON_NAME_LENGTH + 1; i++) @@ -3418,10 +3418,10 @@ static void SetNextBattleTentOpponent(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < TENT_STAGES_PER_CHALLENGE) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) @@ -3435,7 +3435,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) u32 otID = 0; u16 monId; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; bfMonCount = 0; monId = monSet[bfMonCount]; diff --git a/src/battle_transition.c b/src/battle_transition.c index 1afbe7a026..b131769ba4 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2260,7 +2260,7 @@ static bool8 Mugshot_SetGfx(struct Task *task) s16 i, j; u16 *tilemap, *tileset; const u16 *mugshotsMap = sMugshotsTilemap; - u8 mugshotColor = GetTrainerMugshotColorFromId(gTrainerBattleOpponent_A); + u8 mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); GetBg0TilesDst(&tilemap, &tileset); CpuSet(sEliteFour_Tileset, tileset, 0xF0); @@ -2519,7 +2519,7 @@ static void Mugshots_CreateTrainerPics(struct Task *task) { struct Sprite *opponentSprite, *playerSprite; - u8 trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + u8 trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); s16 opponentRotationScales = 0; gReservedSpritePaletteCount = 10; diff --git a/src/battle_util.c b/src/battle_util.c index 21a0928bd2..d7b8d21741 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11340,7 +11340,7 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) return FALSE; else if (GetBattlerSide(battler) != B_SIDE_PLAYER) return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) return FALSE; else if (FlagGet(badgeFlag)) return TRUE; diff --git a/src/cable_club.c b/src/cable_club.c index d6a2903fd4..1a115c31ef 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -867,7 +867,7 @@ static void Task_StartWiredCableClubBattle(u8 taskId) SetLinkBattleTypeFlags(gSpecialVar_0x8004); CleanupOverworldWindowsAndTilemaps(); - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); @@ -933,7 +933,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) gLinkPlayers[0].linkType = LINKTYPE_BATTLE; SetLinkBattleTypeFlags(gSpecialVar_0x8004); CleanupOverworldWindowsAndTilemaps(); - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); diff --git a/src/frontier_util.c b/src/frontier_util.c index 30c22d4442..ab6dc867fd 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -1849,7 +1849,7 @@ void ResetFrontierTrainerIds(void) static void IsTrainerFrontierBrain(void) { - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; @@ -1900,7 +1900,7 @@ static void GiveBattlePoints(void) challengeNum = ARRAY_COUNT(sBattlePointAwards[0][0]) - 1; points = sBattlePointAwards[facility][battleMode][challengeNum]; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) points += 10; gSaveBlock2Ptr->frontier.battlePoints += points; ConvertIntToDecimalStringN(gStringVar1, points, STR_CONV_MODE_LEFT_ALIGN, 2); @@ -1910,7 +1910,7 @@ static void GiveBattlePoints(void) points = gSaveBlock2Ptr->frontier.cardBattlePoints; points += sBattlePointAwards[facility][battleMode][challengeNum]; IncrementDailyBattlePoints(sBattlePointAwards[facility][battleMode][challengeNum]); - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) { points += 10; IncrementDailyBattlePoints(10); @@ -2182,10 +2182,10 @@ static void BufferFrontierTrainerName(void) switch (gSpecialVar_0x8005) { case 0: - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); break; case 1: - GetFrontierTrainerName(gStringVar2, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar2, TRAINER_BATTLE_PARAM.opponentA); break; } } @@ -2564,7 +2564,7 @@ u16 GetFrontierBrainMonSpecies(u8 monId) void SetFrontierBrainObjEventGfx(u8 facility) { - gTrainerBattleOpponent_A = TRAINER_FRONTIER_BRAIN; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_FRONTIER_BRAIN; VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx); } diff --git a/src/pokemon.c b/src/pokemon.c index 748a21d3f8..e89605e66c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5181,7 +5181,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - u32 opponentTrainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (friendship > 99) friendshipLevel++; @@ -5748,11 +5748,11 @@ u16 GetBattleBGM(void) u8 trainerClass; if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A); + trainerClass = GetFrontierOpponentClass(TRAINER_BATTLE_PARAM.opponentA); else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) trainerClass = TRAINER_CLASS_EXPERT; else - trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); switch (trainerClass) { @@ -5771,7 +5771,7 @@ u16 GetBattleBGM(void) case TRAINER_CLASS_RIVAL: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) return MUS_VS_RIVAL; - if (!StringCompare(GetTrainerNameFromId(gTrainerBattleOpponent_A), gText_BattleWallyName)) + if (!StringCompare(GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentA), gText_BattleWallyName)) return MUS_VS_TRAINER; return MUS_VS_RIVAL; case TRAINER_CLASS_ELITE_FOUR: diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 6a1587930d..0b385c017c 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -349,8 +349,8 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->battleFlags = sBattleFlags; } - battleSave->opponentA = gTrainerBattleOpponent_A; - battleSave->opponentB = gTrainerBattleOpponent_B; + battleSave->opponentA = TRAINER_BATTLE_PARAM.opponentA; + battleSave->opponentB = TRAINER_BATTLE_PARAM.opponentB; battleSave->partnerId = gPartnerTrainerId; battleSave->multiplayerId = gRecordedBattleMultiplayerId; battleSave->lvlMode = gSaveBlock2Ptr->frontier.lvlMode; @@ -360,41 +360,41 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; battleSave->AI_scripts = sAI_Scripts; - if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_APPRENTICE) + if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentA < TRAINER_RECORD_MIXING_APPRENTICE) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) - battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].name[i]; - battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].facilityClass; + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].facilityClass; if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].language; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].language; } - else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_B < TRAINER_RECORD_MIXING_APPRENTICE) + else if (TRAINER_BATTLE_PARAM.opponentB >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentB < TRAINER_RECORD_MIXING_APPRENTICE) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) - battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].name[i]; - battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].facilityClass; + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].facilityClass; if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].language; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].language; } else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_FRIEND && gPartnerTrainerId < TRAINER_RECORD_MIXING_APPRENTICE) { @@ -405,19 +405,19 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gPartnerTrainerId - TRAINER_RECORD_MIXING_FRIEND].language; } - if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_APPRENTICE) + if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_APPRENTICE) { - battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].id; + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].id; for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; - battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].language; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].language; } - else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_APPRENTICE) + else if (TRAINER_BATTLE_PARAM.opponentB >= TRAINER_RECORD_MIXING_APPRENTICE) { - battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].id; + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].id; for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; - battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].language; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].language; } else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_APPRENTICE) { @@ -472,8 +472,8 @@ static void CB2_RecordedBattleEnd(void) gSaveBlock2Ptr->frontier.lvlMode = sLvlMode; gBattleOutcome = 0; gBattleTypeFlags = 0; - gTrainerBattleOpponent_A = 0; - gTrainerBattleOpponent_B = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; + TRAINER_BATTLE_PARAM.opponentB = 0; gPartnerTrainerId = 0; RecordedBattle_RestoreSavedParties(); @@ -530,8 +530,8 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) gRecordedBattleRngSeed = src->rngSeed; gBattleTypeFlags = src->battleFlags | BATTLE_TYPE_RECORDED; - gTrainerBattleOpponent_A = src->opponentA; - gTrainerBattleOpponent_B = src->opponentB; + TRAINER_BATTLE_PARAM.opponentA = src->opponentA; + TRAINER_BATTLE_PARAM.opponentB = src->opponentB; gPartnerTrainerId = src->partnerId; gRecordedBattleMultiplayerId = src->multiplayerId; sLvlMode = gSaveBlock2Ptr->frontier.lvlMode; diff --git a/src/scrcmd.c b/src/scrcmd.c index f82ac3c38d..2ab23a1aa8 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2376,7 +2376,8 @@ bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) { Script_RequestEffects(SCREFF_V1 | SCREFF_TRAINERBATTLE); - + + TrainerBattleLoadArgs(ctx->scriptPtr); ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); return FALSE; } diff --git a/src/secret_base.c b/src/secret_base.c index 7e0c1ae107..d4dc43c5bd 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -1163,7 +1163,7 @@ const u8 *GetSecretBaseTrainerLoseText(void) void PrepSecretBaseBattleFlags(void) { TryGainNewFanFromCounter(FANCOUNTER_BATTLED_AT_BASE); - gTrainerBattleOpponent_A = TRAINER_SECRET_BASE; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_SECRET_BASE; gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_SECRET_BASE; } diff --git a/src/trainer_hill.c b/src/trainer_hill.c index dd8ae78aa7..ce2b894bf0 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -864,7 +864,7 @@ void SetHillTrainerFlag(void) for (i = 0; i < HILL_TRAINERS_PER_FLOOR; i++) { - if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_A) + if (gSaveBlock2Ptr->frontier.trainerIds[i] == TRAINER_BATTLE_PARAM.opponentA) { gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; @@ -875,7 +875,7 @@ void SetHillTrainerFlag(void) { for (i = 0; i < HILL_TRAINERS_PER_FLOOR; i++) { - if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_B) + if (gSaveBlock2Ptr->frontier.trainerIds[i] == TRAINER_BATTLE_PARAM.opponentB) { gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; @@ -922,14 +922,14 @@ static void CreateNPCTrainerHillParty(u16 trainerId, u8 firstMonId) void FillHillTrainerParty(void) { ZeroEnemyPartyMons(); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_A, 0); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentA, 0); } void FillHillTrainersParties(void) { ZeroEnemyPartyMons(); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_A, 0); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_B, PARTY_SIZE / 2); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentA, 0); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentB, PARTY_SIZE / 2); } // This function is unused, but my best guess is diff --git a/src/trainer_see.c b/src/trainer_see.c index 12c6cba612..07eb46efdd 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -478,9 +478,10 @@ static u8 CheckTrainer(u8 objectEventId) if (trainerBattlePtr) { - if (trainerBattlePtr[1] == TRAINER_BATTLE_DOUBLE - || trainerBattlePtr[1] == TRAINER_BATTLE_REMATCH_DOUBLE - || trainerBattlePtr[1] == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE) + TrainerBattleParameter *temp = (TrainerBattleParameter *)(trainerBattlePtr + 1); + if (temp->params.mode == TRAINER_BATTLE_DOUBLE + || temp->params.mode == TRAINER_BATTLE_REMATCH_DOUBLE + || temp->params.mode == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE) { if (GetMonsStateToDoubles_2() != PLAYER_HAS_TWO_USABLE_MONS) return 0; diff --git a/src/trainer_slide.c b/src/trainer_slide.c index 1606ae5155..074f6259d2 100644 --- a/src/trainer_slide.c +++ b/src/trainer_slide.c @@ -204,21 +204,21 @@ static void SetTrainerSlideParamters(u32 battler, u32* firstId, u32* lastId, u32 { *firstId = MULTI_PARTY_SIZE; *lastId = PARTY_SIZE; - *trainerId = SanitizeTrainerId(gTrainerBattleOpponent_B); + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentB); *retValue = TRAINER_SLIDE_TARGET_TRAINER_B; } else { *firstId = 0; *lastId = MULTI_PARTY_SIZE; - *trainerId = SanitizeTrainerId(gTrainerBattleOpponent_A); + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); } } else { *firstId = 0; *lastId = PARTY_SIZE; - *trainerId = SanitizeTrainerId(gTrainerBattleOpponent_A); + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); } } diff --git a/src/union_room_battle.c b/src/union_room_battle.c index 4d5f7d8278..2bcbaef19c 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -69,7 +69,7 @@ static void CB2_SetUpPartiesAndStartBattle(void) } IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); CalculatePlayerPartyCount(); - gTrainerBattleOpponent_A = TRAINER_UNION_ROOM; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_UNION_ROOM; SetMainCallback2(CB2_InitBattle); } diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 771c01dc72..15829c3bd5 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -513,7 +513,7 @@ void ClearRematchMovementByTrainerId(void) struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates; struct ObjectEvent *objectEvent; - int vsSeekerDataIdx = TrainerIdToRematchTableId(gRematchTable, gTrainerBattleOpponent_A); + int vsSeekerDataIdx = TrainerIdToRematchTableId(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); if (!I_VS_SEEKER_CHARGING) return; diff --git a/test/text.c b/test/text.c index 781aaaed3e..7650c2dd59 100644 --- a/test/text.c +++ b/test/text.c @@ -612,8 +612,8 @@ TEST("Battle strings fit on the battle message window") sBattlerAbilities[j] = longAbilityID; // Set Trainers - gTrainerBattleOpponent_A = 1; - gTrainerBattleOpponent_B = 1; + TRAINER_BATTLE_PARAM.opponentA = 1; + TRAINER_BATTLE_PARAM.opponentB = 1; // Set battler to 1, so "The opposing " is prefixed when refering to battlers. gBattleTypeFlags |= BATTLE_TYPE_TRAINER; From 43e41bbed8f51b50f903638452e5ad9946335c8e Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 25 Jan 2025 16:03:08 -0500 Subject: [PATCH 011/125] Add Code Entry functionality (#5951) --- data/specials.inc | 2 + docs/tutorials/how_to_code_entry.md | 395 ++++++++++++++++++++++++++++ include/constants/global.h | 1 + include/naming_screen.h | 1 + src/field_specials.c | 15 ++ src/naming_screen.c | 23 ++ 6 files changed, 437 insertions(+) create mode 100644 docs/tutorials/how_to_code_entry.md diff --git a/data/specials.inc b/data/specials.inc index 9bf3734491..c95cea9a7e 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -561,3 +561,5 @@ gSpecials:: def_special Script_GetChosenMonOffensiveIVs def_special Script_GetChosenMonDefensiveIVs def_special UseBlankMessageToCancelPokemonPic + def_special EnterCode + def_special GetCodeFeedback diff --git a/docs/tutorials/how_to_code_entry.md b/docs/tutorials/how_to_code_entry.md new file mode 100644 index 0000000000..19219835d9 --- /dev/null +++ b/docs/tutorials/how_to_code_entry.md @@ -0,0 +1,395 @@ +## How to use the code entry system + +This system involves using the `EnterCode` special to prompt the player to enter a text string, and then the `GetCodeFeedback` special to perform some function based on the string entered. Using this system to make your own cheat codes or mystery gifts will involve both scripting and editing the `GetCodeFeedback` function itself to include your new functionality, and may involve further changes to the codebase if you want to implement something more far reaching (ie. a grindrunning mode). + +This tutorial will use the example of entering the string "CaughtEmAll" to flag every Pokemon as caught + +### 1. Choose where to initiaze your event scripting + +This can be anywhere or anything, pre-existing or added by you in porymap. I usually like using signs for testing things but this can be anything. I'm going to give the main script a more generic name, and you can attach it to whatever object you like. + +In that object's event script, add the following: +```diff +EventScript_CodeEntry:: + special EnterCode + waitstate + special GetCodeFeedback + end +``` + +This will prompt text entry from the object and prepare it to handle reading the entered text after it's been entered, but it won't do anything yet. Next we need to add our functionality to `GetCodeFeedback`. + +### 2. Add code string and code function to `GetCodeFeedback` + +You can find `GetCodeFeedback` in `src/field_specials.c`. Let's start by taking a look at the function: +``` +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} +``` + +What this function does is compare the input string (`gStringVar2`) against a specified string (`sText_SampleCode`) and returns a value depending on whether the strings matched (`gSpecialVar_Result`). Note that due to the way `StringCompare` works, the comparison does need to be negated with `!`. By default, this sample setup returns 1 when the string "SampleCode" is entered by the player. + +Let's leave that functionality alone in case we ever want to reference it again, and just add a brand new code instead. We want to use the string "CaughtEmAll" as our code, so we'll start by making a string for it, and a new conditional that checks if the entered string matches. We'll also want to make sure we return a new unique number for `gSpecialVar_Result` so our event script knows what happened. + +```diff +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); ++ static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; ++ else if (!StringCompare(gStringVar2, sText_CaughtEmAll)) ++ { ++ // TODO ++ gSpecialVar_Result = 2; ++ } + else + gSpecialVar_Result = 0; +} +``` + +Great! Now we have a new case to handle our new code, but it still doesn't do anything. This is the part that will change dramatically depending on what you want to do, and you can do anything you want, from setting flags to calling other functions or anything else! Just make sure you do it from within the conditional that matches your code. In our case we want to iterate through the Pokedex to mark everything as caught, which I'll just do here for simplicity. + +```diff +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else if (!StringCompare(gStringVar2, sText_CaughtEmAll)) + { ++ u32 i; ++ for (i = 0; i < NATIONAL_DEX_COUNT; i++) ++ { ++ GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT); ++ } + gSpecialVar_Result = 2; + } + else + gSpecialVar_Result = 0; +} +``` + +Awesome! Now our `GetCodeFeedback` function performs the task we want it to, and returns a 2 to our event script so it can handle the situation appropriately. That's our next and final step! + +### 3. Handle new `GetCodeFeedback` case in event script + +To clarify, this step is *optional*. You don't need to do anything else after `GetCodeFeedback` has run if you don't want to, as all the functionality is there; once that function finishes, everything in the Pokedex will be marked as caught. + +The reason we might want to do this step, and the reason we pass results back to the event script in the first place, is so we can handle providing the player with some dialogue based on what they're doing. + +Let's go back to our event script. + +``` +EventScript_CodeEntry:: + special EnterCode + waitstate + special GetCodeFeedback + end +``` + +Maybe we first want to prompt the player with a message that says something like "Enter a code?" + +```diff +EventScript_CodeEntry:: ++ lockall ++ msgbox EnterCode_EnterCodeText, MSGBOX_YESNO ++ compare VAR_RESULT, 0 ++ goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + end + ++CodeExit:: ++ releaseall ++ end ++ ++EnterCode_EnterCodeText: ++ .string "Enter a code?$" +``` + +This is all straightforward scripting stuff, the sign will first give the player a YES / NO box and ask whether they'd like to enter a code. Let's now add some cases and messages that handle the different results of the code entry from `GetCodeFeedback`. Let's look at the sign first: + +```diff +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback ++ goto_if_eq VAR_RESULT, 0, CodeFailed ++ goto_if_eq VAR_RESULT, 1, CodeSampleCode ++ goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll + end +``` + +Now we're handling cases for each of the possible return values from `GetCodeFeedback`! except we don't have any of those functions, so this will cause errors as the script has nothing to `goto_if_eq`. Let's write those too: + +```diff +CodeFailed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end + +CodeSampleString:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeSampleCode_Text, MSGBOX_DEFAULT + releaseall + end + +CodeCaughtEmAll:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT + releaseall + end +``` + +And lastly, we'll need to add all of the strings we now need to reference: + +``` +EnterCode_FailedText: + .string "...nothing happened.$" + +EnterCode_SucceededText: + .string "The code worked!$" + +CodeSampleCode_Text + .string "You entered the sample code!$" + +CodeCaughtEmAll_Text + .string "Encyclopedic knowledge fills your head.\n" + .string "It's like you've caught 'em all!$" +``` + +So to finish up, our event script file now looks like this, with all said and done: + +``` +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + goto_if_eq VAR_RESULT, 0, CodeFailed + goto_if_eq VAR_RESULT, 1, CodeSampleCode + goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll + end + +CodeExit:: + releaseall + end + +CodeFailed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end + +CodeSampleString:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeSampleCode_Text, MSGBOX_DEFAULT + releaseall + end + +CodeCaughtEmAll:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT + releaseall + end + +EnterCode_EnterCodeText: + .string "Enter a code?$" + +EnterCode_FailedText: + .string "...nothing happened.$" + +EnterCode_SucceededText: + .string "The code worked!$" + +CodeSampleCode_Text + .string "You entered the sample code!$" + +CodeCaughtEmAll_Text + .string "Encyclopedic knowledge fills your head.\n" + .string "It's like you've caught 'em all!$" + +``` + +And that's it! Feel free to expand this in whatever way you wish, the pattern can just be repeated as much as you like, and you can made the code called from `GetCodeFeedback` do whatever you like. + +## Can I change the icon on the name entry screen? + +Absolutely! In `naming_screen.c`, look for the `NamingScreen_CreateCodeIcon` function. It's very short. There's one relevant line that needs to be changed: + +``` +spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MYSTERY_GIFT_MAN, SpriteCallbackDummy, 56, 37, 0); +``` + +Just swap out `OBJ_EVENT_GFX_MYSTERY_GIFT_MAN` for whatever event object sprite you'd like to use instead. You may need to adjust the position (the 56 and 37 in this example) depending on your sprite. + +## What about a mystery gift setup? + +I'd like to cover this separately because it's best handled via `givemon` script commands, which means we don't do much in `GetCodeFeedback` other than return a unique identifier. I'm gonna reference @PCG06's mystery gift implementation which is based on this code entry system for a clean and really thorough example. + +### 3. Mystery Gift `GetCodeFeedback` + +Let's say you have two mystery gift mons and no other cases you want to handle, one for Celebi and one for Jirachi. Your `GetCodeFeedback` function will look something like this: + +``` +{ + static const u8 sText_CodeCelebi[] = _("Celebi"); + static const u8 sText_CodeJirachi[] = _("Jirachi"); + if (!StringCompare(gStringVar2, sText_CodeCelebi)) + gSpecialVar_Result = 1; + else if (!StringCompare(gStringVar2, sText_CodeJirachi)) + gSpecialVar_Result = 2; + else + gSpecialVar_Result = 0; +} +``` +and that's it, super simple. All of the other handling will have to be done on the scripting end, as we'll be leaning on `givemon` and its associated handling. + +### 2. Mystery Gift Scripting + +Let's return back to our EventScript_CodeEntry pattern from before, but instead use our new codes. + +``` +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + goto_if_eq VAR_RESULT, 0, CodeFailed + goto_if_eq VAR_RESULT, 1, MysteryGift_EventScript_Celebi + goto_if_eq VAR_RESULT, 2, MysteryGift_EventScript_Jirachi + end +``` + +Straightforward enough! The actual work is in writing `MysteryGift_EventScript_Celebi` and `MysteryGift_EventScript_Jirachi` to handle their givemons appropriately, prompt nicknaming, send them to the PC if the party is full, etc. We should also keep in mind that each Mystery Gift should only be entered once, so we'll want to track that with a flag; conveniently, expansion already has 15 flags we can use for the purpose. Let's do Celebi first. + +``` +MysteryGift_EventScript_Celebi:: + goto_if_set FLAG_MYSTERY_GIFT_1, MysteryGift_EventScript_Redeemed + bufferspeciesname STR_VAR_1, SPECIES_CELEBI + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CELEBI + givemon SPECIES_CELEBI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_TIMID, 0, MON_GENDERLESS, 0, 0, 4, 252, 252, 0, 31, 31, 31, 30, 31, 31, MOVE_ENERGY_BALL, MOVE_PSYCHIC, MOVE_NASTY_PLOT, MOVE_CELEBRATE, TRUE, FALSE, TYPE_PSYCHIC + setflag FLAG_MYSTERY_GIFT_1 + call MysteryGift_EventScript_ReceivedMon + releaseall + end +``` + +Walking through this, it's clear we'll need some more scripting. We first check if Celebi's corresponding Mystery Gift flag has been set, and if it has, we need to tell the player they've already redeemed it and can't again. If they haven't though, we get ourselves setup for the givemon, do the givemon, and set the mystery gift flag. Then we need soem more generic handling to prompt nicknaming and some fanfare. + +Two things, then; an event script to handle the case where a mystery gift mon has already been redeemed, and an event script to handle when a mystery gift mon has successfully been received. + +Just for the sake of simplicity, I'm going to handle entering a used mystery gift code the same way I'd handle an incorrect code. You're welcome to add more complex scripting if you prefer. + +``` +MysteryGift_EventScript_Redeemed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end +``` + +And then the scripto handle the player having successfully received a mon: + +``` +MysteryGift_EventScript_ReceivedMon:: + msgbox MysteryGift_Text_SucceededText, MSGBOX_DEFAULT + playfanfare MUS_OBTAIN_ITEM + message MysteryGift_Text_ReceivedGiftMon + waitfanfare + goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, MysteryGift_EventScript_NicknamePartyMon + goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, MysteryGift_EventScript_NicknamePCMon + goto Common_EventScript_NoMoreRoomForPokemon + msgbox MysteryGift_Text_PleaseVisitAgain, MSGBOX_DEFAULT + end +``` + +Almost done! Just need to handle the specific nicknaming scripts, and then add all of the text. + +``` +MysteryGift_EventScript_NicknamePartyMon:: + msgbox gText_NicknameThisPokemon, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_Exit + call Common_EventScript_GetGiftMonPartySlot + call Common_EventScript_NameReceivedPartyMon + goto MysteryGift_EventScript_Exit + end + +MysteryGift_EventScript_NicknamePCMon:: + msgbox gText_NicknameThisPokemon, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_TransferredToPC + call Common_EventScript_NameReceivedBoxMon + call Common_EventScript_TransferredToPC + releaseall + end + +MysteryGift_EventScript_TransferredToPC:: + call Common_EventScript_TransferredToPC + releaseall + end + +MysteryGift_Text_WelcomeToMysteryGiftSystem: + .string "Hello, {PLAYER}!\p" + .string "Welcome to the Mystery Gift System!\p" + .string "Would you like to enter a code?$" + +MysteryGift_Text_CurrentlyUnavailable: + .string "I'm sorry, but the Mystery Gift System\n" + .string "is currently unavailable.\p" + .string "Please try again later.\p" + .string "Thank you!$" + +MysteryGift_Text_PleaseVisitAgain: + .string "Please visit again!$" + +MysteryGift_Text_EnterCode: + .string "Please enter the code.$" + +MysteryGift_Text_SucceededText: + .string "The code was valid!\p" + .string "Enjoy your gift!$" + +MysteryGift_Text_FailedText: + .string "The code was invalid!\p" + .string "Would you like to enter a new code?$" + +MysteryGift_Text_RedeemedText: + .string "This code was already redeemed!\p" + .string "Would you like you enter a new code?$" + +MysteryGift_Text_ReceivedGiftMon: + .string "{PLAYER} received a {STR_VAR_1}!$" +``` + +Goodness, so much infrastructure scripting! The nice thing is that now that all the infrastructure is set up, much like before, adding new cases becomes really straightforward. With Celebi and all of the skeleton scripting finished, let's add Jirachi. + +``` +MysteryGift_EventScript_Jirachi:: + goto_if_set FLAG_MYSTERY_GIFT_2, MysteryGift_EventScript_Redeemed + bufferspeciesname STR_VAR_1, SPECIES_JIRACHI + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_JIRACHI + givemon SPECIES_JIRACHI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_ADAMANT, 0, MON_GENDERLESS, 0, 252, 4, 252, 0, 0, 31, 31, 31, 31, 31, 31, MOVE_IRON_HEAD, MOVE_ZEN_HEADBUTT, MOVE_PLAY_ROUGH, MOVE_CELEBRATE, TRUE, FALSE, TYPE_STEEL + setflag FLAG_MYSTERY_GIFT_2 + call MysteryGift_EventScript_ReceivedMon + releaseall + end +``` + +And that's it! Super straightforward from here, just make sure to iterate `FLAG_MYSTERY_GIFT` each time you add a new mon, and of course add their code to both `GetCodeFeedback` and the main script controlling code entry. diff --git a/include/constants/global.h b/include/constants/global.h index 9adb46db23..f8c70bd736 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -123,6 +123,7 @@ #define TYPE_NAME_LENGTH 8 #define ABILITY_NAME_LENGTH 16 #define TRAINER_NAME_LENGTH 10 +#define CODE_NAME_LENGTH 11 #define MAX_STAMP_CARD_STAMPS 7 diff --git a/include/naming_screen.h b/include/naming_screen.h index 93527640e5..a0cd3cf74b 100644 --- a/include/naming_screen.h +++ b/include/naming_screen.h @@ -9,6 +9,7 @@ enum { NAMING_SCREEN_CAUGHT_MON, NAMING_SCREEN_NICKNAME, NAMING_SCREEN_WALDA, + NAMING_SCREEN_CODE, }; void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback); diff --git a/src/field_specials.c b/src/field_specials.c index e04a8011fe..30b121acd0 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -70,6 +70,7 @@ #include "constants/metatile_labels.h" #include "palette.h" #include "battle_util.h" +#include "naming_screen.h" #define TAG_ITEM_ICON 5500 @@ -4344,3 +4345,17 @@ void UseBlankMessageToCancelPokemonPic(void) AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL); ScriptMenu_HidePokemonPic(); } + +void EnterCode(void) +{ + DoNamingScreen(NAMING_SCREEN_CODE, gStringVar2, 0, 0, 0, CB2_ReturnToFieldContinueScript); +} + +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} diff --git a/src/naming_screen.c b/src/naming_screen.c index 118d91cfb4..f5f780ed1c 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1373,6 +1373,7 @@ static void NamingScreen_CreatePlayerIcon(void); static void NamingScreen_CreatePCIcon(void); static void NamingScreen_CreateMonIcon(void); static void NamingScreen_CreateWaldaDadIcon(void); +static void NamingScreen_CreateCodeIcon(void); static void (*const sIconFunctions[])(void) = { @@ -1381,6 +1382,7 @@ static void (*const sIconFunctions[])(void) = NamingScreen_CreatePCIcon, NamingScreen_CreateMonIcon, NamingScreen_CreateWaldaDadIcon, + NamingScreen_CreateCodeIcon, }; static void CreateInputTargetIcon(void) @@ -1431,6 +1433,13 @@ static void NamingScreen_CreateWaldaDadIcon(void) StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH); } +static void NamingScreen_CreateCodeIcon(void) +{ + u8 spriteId; + spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MYSTERY_GIFT_MAN, SpriteCallbackDummy, 56, 37, 0); + gSprites[spriteId].oam.priority = 3; +} + //-------------------------------------------------- // Keyboard handling //-------------------------------------------------- @@ -1744,6 +1753,7 @@ static void (*const sDrawTextEntryBoxFuncs[])(void) = [NAMING_SCREEN_CAUGHT_MON] = DrawMonTextEntryBox, [NAMING_SCREEN_NICKNAME] = DrawMonTextEntryBox, [NAMING_SCREEN_WALDA] = DrawNormalTextEntryBox, + [NAMING_SCREEN_CODE] = DrawNormalTextEntryBox, }; static void DrawTextEntryBox(void) @@ -2146,6 +2156,18 @@ static const struct NamingScreenTemplate sWaldaWordsScreenTemplate = .title = gText_TellHimTheWords, }; +static const u8 sText_EnterCode[] = _("Enter code:"); +static const struct NamingScreenTemplate sCodeScreenTemplate = +{ + .copyExistingString = FALSE, + .maxChars = CODE_NAME_LENGTH, + .iconFunction = 5, + .addGenderIcon = FALSE, + .initialPage = KBPAGE_LETTERS_UPPER, + .unused = 35, + .title = sText_EnterCode, +}; + static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = { [NAMING_SCREEN_PLAYER] = &sPlayerNamingScreenTemplate, @@ -2153,6 +2175,7 @@ static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = [NAMING_SCREEN_CAUGHT_MON] = &sMonNamingScreenTemplate, [NAMING_SCREEN_NICKNAME] = &sMonNamingScreenTemplate, [NAMING_SCREEN_WALDA] = &sWaldaWordsScreenTemplate, + [NAMING_SCREEN_CODE] = &sCodeScreenTemplate, }; static const struct OamData sOam_8x8 = From 17f3541a6042f89ee71ecaf660c4cfbecee215b1 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 25 Jan 2025 17:19:47 -0500 Subject: [PATCH 012/125] Eject item ace flag switch AI fixes (#6098) --- src/battle_ai_switch_items.c | 13 ++++++++----- src/battle_util.c | 1 + test/battle/ai/ai_switching.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index ad81949a5d..0f38f326d1 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1744,8 +1744,9 @@ static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOu return TRUE; if (AI_DATA->ejectPackSwitch) { + u32 opposingAbility = AI_GetBattlerAbility(opposingBattler); // If faster, not a free switch; likely lowered own stats - if (!movedSecond) + if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts return FALSE; // Otherwise, free switch return TRUE; @@ -1949,8 +1950,9 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (defensiveMonId != PARTY_SIZE) return defensiveMonId; else if (batonPassId != PARTY_SIZE) return batonPassId; } - // If ace mon is the last available Pokemon and U-Turn/Volt Switch was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount && IsSwitchOutEffect(GetMoveEffect(gLastUsedMove))) + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount + && (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; @@ -2065,8 +2067,9 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) if (bestMonId != PARTY_SIZE) return bestMonId; - // If ace mon is the last available Pokemon and U-Turn/Volt Switch was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount && IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect)) + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount + && (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; diff --git a/src/battle_util.c b/src/battle_util.c index d7b8d21741..8a4e291492 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7138,6 +7138,7 @@ static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) { gProtectStructs[battler].statFell = FALSE; gBattleScripting.battler = battler; + AI_DATA->ejectPackSwitch = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) { BattleScriptExecute(BattleScript_EjectPackActivate_End2); diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index f86dd2b5f9..a6a0eb8d76 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -103,6 +103,37 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: U-Turn will send out Ace Mon i } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Button will send out Ace Mon if it's the only one remaining") +{ + u32 aiSmartMonChoicesFlag; + PARAMETRIZE { aiSmartMonChoicesFlag = 0; } + PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_BUTTON); }; + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Pack will send out Ace Mon if it's the only one remaining") +{ + u32 aiSmartMonChoicesFlag; + PARAMETRIZE { aiSmartMonChoicesFlag = 0; } + PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + PLAYER(SPECIES_ARCANINE) { Ability(ABILITY_INTIMIDATE); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_PACK); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_LINOONE) { Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + // General AI_FLAG_SMART_MON_CHOICES behaviour AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Number of hits to KO calculation checks whether incoming damage is less than recurring healing to avoid an infinite loop") { From a2b51a2381a4329cdbcfb34f308b93c7ce1cc699 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 25 Jan 2025 17:27:39 -0500 Subject: [PATCH 013/125] Terrain function standarization (#6097) --- src/battle_ai_util.c | 2 +- src/battle_main.c | 2 +- src/battle_util.c | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d3a427890c..04e0804ab7 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3039,7 +3039,7 @@ bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) { if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(AI_DATA->abilities[battlerAtk], move)) - || (IsBattlerGrounded(battlerDef) && (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) + || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) return FALSE; diff --git a/src/battle_main.c b/src/battle_main.c index d89c4cae65..7919329ee5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4836,7 +4836,7 @@ s8 GetBattleMovePriority(u32 battler, u16 move) gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerGrounded(battler) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } diff --git a/src/battle_util.c b/src/battle_util.c index 8a4e291492..ed3f74f7b4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9248,7 +9248,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower *= 2; break; case EFFECT_EXPLOSION: - if (move == MOVE_MISTY_EXPLOSION && gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && IsBattlerGrounded(battlerAtk)) + if (move == MOVE_MISTY_EXPLOSION && IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: @@ -9275,8 +9275,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_TERRAIN_PULSE: - if ((gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - && IsBattlerGrounded(battlerAtk)) + if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_TERRAIN_ANY)) basePower *= 2; break; case EFFECT_EXPANDING_FORCE: @@ -9292,7 +9291,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = CalcBeatUpPower(); break; case EFFECT_PSYBLADE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_MAX_MOVE: @@ -11726,7 +11725,7 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) { if (gBattleWeather & weatherFlags && HasWeatherEffect()) { - // given weather is active -> check if its sun, rain against utility umbrella ( since only 1 weather can be active at once) + // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) return FALSE; // utility umbrella blocks sun, rain effects From 4e8ddebb8dca32d6f8f029c70a3729afd923ddcc Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 25 Jan 2025 19:36:19 -0500 Subject: [PATCH 014/125] Updated trainer pic tutorial (#6049) Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.com> --- docs/tutorials/how_to_trainer_class.md | 178 ------------------------- docs/tutorials/how_to_trainer_pic.md | 98 ++++++++++++++ include/data.h | 2 +- src/data.c | 2 +- src/pokemon.c | 4 +- src/trainer_pokemon_sprites.c | 2 +- 6 files changed, 103 insertions(+), 183 deletions(-) delete mode 100644 docs/tutorials/how_to_trainer_class.md create mode 100644 docs/tutorials/how_to_trainer_pic.md diff --git a/docs/tutorials/how_to_trainer_class.md b/docs/tutorials/how_to_trainer_class.md deleted file mode 100644 index 3ce0217c28..0000000000 --- a/docs/tutorials/how_to_trainer_class.md +++ /dev/null @@ -1,178 +0,0 @@ -# How to add a new trainer class - -## Content -* [Quick Summary](#quick-summary) -* [The Graphics](#the-graphics) - * [1. Edit the sprites](#2-edit-the-sprites) - * [2. Register the sprites](#2-register-the-sprites) - * [3. The Animation](#2-the-animation) - * [4. Connecting pictures to the data](#2-connecting-pictures-to-the-data) -* [The Data](#the-data) - * [5. Defining the trainer class](#2-defining-the-trainer-class) -* [Usage](#usage) - -## Quick Summary -(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).) -If you've done this before and just need a quick lookup, here's what files you need: -1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) -2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) -3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h) -4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) -5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) -6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) -7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) - -## The Graphics - -### 1. Edit the sprites -We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: -[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) - -**Remember to limit yourself to 16 colors including transparency in the first slot!** - -Export the pallette and place into the same folder. - -### 2. Register the sprites -Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. -Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h): -```diff -extern const u32 gTrainerFrontPic_RubySapphireMay[]; -+ extern const u32 gTrainerFrontPic_myTrainerClass[]; - -extern const u32 gTrainerPalette_Hiker[]; -... - -... -extern const u32 gTrainerPalette_RubySapphireMay[]; -+ extern const u32 gTrainerPalette_myTrainerClass[]; - -extern const u8 gTrainerBackPic_Brendan[]; -``` - -Now link the graphic files. -[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): -```diff -const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); - -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz"); -const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); - -+ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz"); -+ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); - -const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4 -``` - -### 3. The Animation -Add the Animation of the trainer here: -[src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) - -The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame: - -```diff -static const union AnimCmd *const sAnims_RubySapphireMay[] ={ - sAnim_GeneralFrame0, -}; - -+ static const union AnimCmd *const sAnims_MyTrainerClass[] ={ -+ sAnim_GeneralFrame0, -+ }; - -const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] = -{ - [TRAINER_PIC_HIKER] = sAnims_Hiker, - [TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM, - [TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF, -... - -... - [TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan, - [TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay, -+ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass, -}; -``` - -### 4. Connecting the Pictures to the Data -The last few things we have to do is prepare the graphics for usage. In [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do: - -1. gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen. -2. gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier. -3. gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier. - -So, finally, it needs to look like this: -```diff -const struct MonCoords gTrainerFrontPicCoords[] = -{ - [TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1}, - [TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1}, -... - -... - [TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1}, - [TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1}, -+ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1}, -}; - -#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic} - -const struct CompressedSpriteSheet gTrainerFrontPicTable[] = -{ - TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800), - TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800), - TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800), - TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800), -... - -... - TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800), - TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800), -+ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800), -}; - -#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic} - -const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] = -{ - TRAINER_PAL(HIKER, gTrainerPalette_Hiker), - TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM), - TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF), -... - -... - TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan), - TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay), -+ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass), -}; - -``` -### The Data -#### 5. Defining the trainer class -Finally, let's bring it all together by defining our new trainer class in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): - -```diff -#define TRAINER_PIC_RS_MAY 92 -+ #define TRAINER_PIC_MYTRAINERCLASS 93 - -#define TRAINER_BACK_PIC_BRENDAN 0 -#define TRAINER_BACK_PIC_MAY 1 -``` -Remember to count the number next to the trainer class up by one! - -## Usage -You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: -```diff - [TRAINER_BRENDAN_PLACEHOLDER] = - { - .partyFlags = 0, - .trainerClass = TRAINER_CLASS_RS_PROTAG, - .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, -- .trainerPic = TRAINER_PIC_RS_BRENDAN, -+ .trainerPic = TRAINER_PIC_MYTRAINERCLASS, - .trainerName = _("BRENDAN"), - .items = {}, - .doubleBattle = FALSE, - .aiFlags = 0, - .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), - .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, - }, -``` diff --git a/docs/tutorials/how_to_trainer_pic.md b/docs/tutorials/how_to_trainer_pic.md new file mode 100644 index 0000000000..78f8a717e4 --- /dev/null +++ b/docs/tutorials/how_to_trainer_pic.md @@ -0,0 +1,98 @@ +# How to add a new trainer pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer pic](#2-defining-the-trainer-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) +2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) +3. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) +4. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) + +## The Graphics + +### 1. Edit the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: +[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) + +**Remember to limit yourself to 16 colors including transparency in the first slot!** + +Export the palette and place into the same folder. + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. +[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): +```diff +const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); + +const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz"); +const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); + ++ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz"); ++ const u32 gTrainerPalette_myTrainerClass[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); + +const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [src/data/graphics/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier. + +So, finally, it needs to look like this: +```diff +define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ + [trainerPic] = \ + { \ + .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ + .palette = {paletteFile, trainerPic}, \ + .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ + .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ + } + +const struct TrainerSprite gTrainerSprites[] = +{ + TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), + TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), + ... + TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), + TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass) +}; +``` +### The Data +#### 4. Defining the trainer pic +Finally, let's bring it all together by defining our new trainer pic in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): + +```diff +#define TRAINER_PIC_RS_MAY 92 ++ #define TRAINER_PIC_MY_TRAINER_CLASS 93 + +#define TRAINER_BACK_PIC_BRENDAN 0 +#define TRAINER_BACK_PIC_MAY 1 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: +```diff + [TRAINER_BRENDAN_PLACEHOLDER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RS_PROTAG, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, +- .trainerPic = TRAINER_PIC_RS_BRENDAN, ++ .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS, + .trainerName = _("BRENDAN"), + .items = {}, + .doubleBattle = FALSE, + .aiFlags = 0, + .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), + .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, + }, +``` diff --git a/include/data.h b/include/data.h index 6c240d9920..8b1e9c22d1 100644 --- a/include/data.h +++ b/include/data.h @@ -168,7 +168,7 @@ extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[]; extern const union AnimCmd sAnim_GeneralFrame0[]; extern const union AnimCmd sAnim_GeneralFrame3[]; extern const union AnimCmd *const gAnims_MonPic[]; -extern const union AnimCmd *const sAnims_Trainer[]; +extern const union AnimCmd *const gAnims_Trainer[]; extern const struct TrainerSprite gTrainerSprites[]; extern const struct TrainerBacksprite gTrainerBacksprites[]; diff --git a/src/data.c b/src/data.c index e50fa0c549..66d575e66a 100644 --- a/src/data.c +++ b/src/data.c @@ -220,7 +220,7 @@ const union AnimCmd *const gAnims_MonPic[MAX_MON_PIC_FRAMES] = sAnim_MonPic_1, }; -const union AnimCmd *const sAnims_Trainer[] ={ +const union AnimCmd *const gAnims_Trainer[] ={ sAnim_GeneralFrame0, sAnim_GeneralFrame0, }; diff --git a/src/pokemon.c b/src/pokemon.c index e89605e66c..829b0b1192 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2219,7 +2219,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; - gMultiuseSpriteTemplate.anims = sAnims_Trainer; + gMultiuseSpriteTemplate.anims = gAnims_Trainer; } } @@ -2231,7 +2231,7 @@ void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPositio gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; gMultiuseSpriteTemplate.paletteTag = trainerPicId; - gMultiuseSpriteTemplate.anims = sAnims_Trainer; + gMultiuseSpriteTemplate.anims = gAnims_Trainer; } static void EncryptBoxMon(struct BoxPokemon *boxMon) diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index 675c7643c8..bd3a7f3e06 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -116,7 +116,7 @@ static void AssignSpriteAnimsTable(bool8 isTrainer) if (!isTrainer) sCreatingSpriteTemplate.anims = gAnims_MonPic; else - sCreatingSpriteTemplate.anims = sAnims_Trainer; + sCreatingSpriteTemplate.anims = gAnims_Trainer; } static u16 CreatePicSprite(u16 species, bool8 isShiny, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) From 9e10f680a97bd8593a691f759682d22fd2003aee Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sun, 26 Jan 2025 03:48:38 -0500 Subject: [PATCH 015/125] Move flag fixes (#6107) --- src/data/moves_info.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 13544bdabc..50f8cebbd3 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -10844,7 +10844,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, - //.ignoresSubstitute = TRUE, + //.ignoresSubstitute = TRUE, In Gen5+, the evasion drop will no longer bypass Substitute. However, this is tricky to code .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -13340,7 +13340,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - //.windMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ACC_MINUS_1, .chance = 50, @@ -20369,7 +20368,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .argument = 50, .thawsUser = TRUE, .metronomeBanned = TRUE, - .healingMove = B_EXTRAPOLATED_MOVE_FLAGS, + .healingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, .chance = 20, From e1e3bcfa915a7eb9b51db1cf89aed4766046a549 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 26 Jan 2025 11:08:46 +0100 Subject: [PATCH 016/125] Tera starstorm (#6073) Co-authored-by: Hedara --- data/battle_anim_scripts.s | 150 +++++++++++++++++- .../battle_anims/sprites/starstorm_beam.png | Bin 0 -> 300 bytes include/battle_anim.h | 1 + include/constants/battle_anim.h | 1 + include/graphics.h | 2 + src/battle_anim_effects_1.c | 150 ++++++++++++++++++ src/data/battle_anim.h | 2 + src/graphics.c | 3 + 8 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 graphics/battle_anims/sprites/starstorm_beam.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b5f83b2d23..58d9ddafd8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -18066,6 +18066,155 @@ PopulationBombContinue: gBattleAnimMove_RevivalBlessing:: goto gBattleAnimMove_LunarBlessing +gBattleAnimMove_TeraStarstorm:: + loadspritegfx ANIM_TAG_STARSTORM + loadspritegfx ANIM_TAG_YELLOW_STAR + loadspritegfx ANIM_TAG_IMPACT + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar + goto TeraStarstormSingle +TeraStarstormStellar: + jumpifdoublebattle TeraStarstormDouble +TeraStarstormSingle: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end +TeraStarstormDouble: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end + +TeraStarstormCreateBeam:: + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 + return + gBattleAnimMove_TeraBlast:: gBattleAnimMove_OrderUp:: gBattleAnimMove_GlaiveRush:: @@ -18083,7 +18232,6 @@ gBattleAnimMove_CombatTorque:: gBattleAnimMove_MagicalTorque:: gBattleAnimMove_Psyblade:: gBattleAnimMove_MatchaGotcha:: -gBattleAnimMove_TeraStarstorm:: gBattleAnimMove_MightyCleave:: gBattleAnimMove_TachyonCutter:: gBattleAnimMove_SupercellSlam:: diff --git a/graphics/battle_anims/sprites/starstorm_beam.png b/graphics/battle_anims/sprites/starstorm_beam.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dced0a3575ba27b788edb3a3daa7659ae76e03 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DaPU;cPEB*=VV?2IR*hfA+9qn zEC4d2OxaDGW?WZ`OiB&Ws`QIVIO02f-q*~De)~SHTJyN-$>+&mAOHEY?f?J(mmELz z12qVg1o;Is0Qtz^KtQ)MP_EC@#W6%5CuT1+Tfl7Bu-#*Z*sg{bg^WxIsxzv&6687FGVD-&_e}3kLu=wP zdata[0] = gBattleAnimArgs[4]; + sprite->data[3] = 0; + sprite->data[4] = -70; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormBeam_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); + +} + +static void AnimTeraStarstormBeam_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); +} + +const union AffineAnimCmd gTeraStarAffineAnimCmds[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gTeraStarAffineAnimTable[] = { + gTeraStarAffineAnimCmds, +}; + +// arg0: start offset x +// arg1: start offset y +// arg2: end offset x +// arg3: end offset y +// arg4: duration +// arg5: target partner +// arg6: ????? +const struct SpriteTemplate gTeraStarSpriteTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_YELLOW_STAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gTeraStarAffineAnimTable, + .callback = AnimTeraStarstormStars, +}; + + +void AnimTeraStarstormStars(struct Sprite *sprite) +{ + gBattleAnimArgs[0] += 4; + gBattleAnimArgs[1] -= 100; + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->x; + sprite->data[3] = sprite->y; + if (gBattleAnimArgs[5] == 1) + { + u32 targetPartner; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + if (gBattleAnimTarget == 0) + targetPartner = 2; + else + targetPartner = 0; + } + else + { + if (gBattleAnimTarget == 1) + targetPartner = 3; + else + targetPartner = 1; + } + sprite->data[2] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormStars_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); +} + +static void AnimTeraStarstormStars_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); + if ((u16)gBattleAnimArgs[7] == 0xFFFF) + { + StartSpriteAnim(sprite, 1); + sprite->affineAnimPaused = FALSE; + } +} + // Animates a sprite that moves linearly from one location to another, with a // single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index a09c8d72c8..5f1643f82d 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1466,6 +1466,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Beam, 0x0800, ANIM_TAG_BEAM}, {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1933,6 +1934,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Beam, ANIM_TAG_BEAM}, {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index bc510d9d96..19b9570079 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1287,6 +1287,9 @@ const u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32("graphics/battle_anims/spri const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); +const u32 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.gbapal.lz"); + const u32 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U32("graphics/battle_anims/unused/unknown_2.gbapal.lz"); #include "data/graphics/trainers.h" From 0339f684c36a6d4177ff4bfa2e7d5fcfd84e6c9f Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:21:19 +0000 Subject: [PATCH 017/125] Fix seeds softlocking the game when a battler with a Surge ability enters the field (#6110) --- src/battle_script_commands.c | 8 +-- test/battle/hold_effect/seeds.c | 101 +++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 20 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e95dab7ac4..61082d33cd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10541,16 +10541,16 @@ static void Cmd_various(void) switch (GetBattlerHoldEffectParam(battler)) { case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN); + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); break; case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN); + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); break; case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN); + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); break; case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN); + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); break; } diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index 10a415bd63..22e94baa8c 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -1,62 +1,131 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); + ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); + ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); + ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); + +} + SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") { + u32 ability, item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_ELECTRIC_SEED; } + PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } GIVEN { - ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ability); Item(item); } } WHEN { - TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } + TURN { SWITCH(player, 1); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); + if (item == ITEM_ELECTRIC_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Electric Seed, the Defense of the opposing Tapu Koko rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); } } SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") { + u32 ability, item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_GRASSY_SEED; } + PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } GIVEN { - ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } + OPPONENT(SPECIES_TAPU_BULU) { Ability(ability); Item(item); } } WHEN { - TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } + TURN { SWITCH(player, 1); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); + if (item == ITEM_GRASSY_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Grassy Seed, the Defense of the opposing Tapu Bulu rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); } } SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain") { + u32 ability, item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_MISTY_SEED; } + PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } GIVEN { - ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } + OPPONENT(SPECIES_TAPU_FINI) { Ability(ability); Item(item); } } WHEN { - TURN { MOVE(player, MOVE_MISTY_TERRAIN); } + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_MISTY_TERRAIN); } + TURN { SWITCH(player, 1); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); + if (item == ITEM_MISTY_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Misty Seed, the Sp. Def of the opposing Tapu Fini rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); } } SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terrain") { + u32 ability, item; + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_PSYCHIC_SEED; } + PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } GIVEN { - ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); - ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } + OPPONENT(SPECIES_TAPU_LELE) { Ability(ability); Item(item); } } WHEN { - TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } + if (ability == ABILITY_TELEPATHY) + TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } + TURN { SWITCH(player, 1); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); + if (item == ITEM_PSYCHIC_SEED) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Using Psychic Seed, the Sp. Def of the opposing Tapu Lele rose!"); + } + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); } } From 4158f9251f78383241398261675343dabebf4d87 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:06:11 +0000 Subject: [PATCH 018/125] Fix Powder (status) config and some terrain timers not using gBattleTurnCounter (#6109) --- docs/tutorials/how_to_new_trainer_slide.md | 18 ++++++------- include/battle.h | 2 +- include/trainer_slide.h | 10 ++++---- src/battle_main.c | 4 +-- src/battle_script_commands.c | 18 ++++++------- src/battle_util.c | 30 ++++++++++++++-------- src/trainer_slide.c | 10 ++++---- 7 files changed, 50 insertions(+), 42 deletions(-) diff --git a/docs/tutorials/how_to_new_trainer_slide.md b/docs/tutorials/how_to_new_trainer_slide.md index f8fa345ba6..67c29a437d 100644 --- a/docs/tutorials/how_to_new_trainer_slide.md +++ b/docs/tutorials/how_to_new_trainer_slide.md @@ -70,11 +70,11 @@ If your new Trainer Slide needs to check for beforen initalized, a function is d ```diff void SetTrainerSlideMessage(enum DifficultyLevel, u32, u32); -void TryInitalizeFirstSTABMoveTrainerSlide(u32, u32, u32); -void TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(u32); -+ void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32); -void TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32); -void TryInitalizeTrainerSlideEnemyMonUnaffected(u32); +void TryInitializeFirstSTABMoveTrainerSlide(u32, u32, u32); +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32); ++ void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32); +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32); +void TryInitializeTrainerSlideEnemyMonUnaffected(u32); bool32 IsTrainerSlideInitialized(enum TrainerSlideType); ``` ### `src/trainer_slide.c` @@ -111,7 +111,7 @@ The function that determines if a Slide should play has different function for m InitalizeTrainerSlide(slideId); } -+void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) ++void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; + @@ -150,13 +150,13 @@ In `BattleTurnPassed`, most Trainer Slides are checked to see if they should run { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); -+ TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); - TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); ++ TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); + TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); gBattleCommunication[MSG_DISPLAY] = 1; ``` -The actual usage of `TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit` is added and is checked whenever a critical hit is scored. +The actual usage of `TryInitializeTrainerSlideEnemyLandsFirstCriticalHit` is added and is checked whenever a critical hit is scored. ### `test/battle/trainer_slides.c` ```diff diff --git a/include/battle.h b/include/battle.h index 573283972a..13fc659768 100644 --- a/include/battle.h +++ b/include/battle.h @@ -128,7 +128,7 @@ struct DisableStruct u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) u8 boosterEnergyActivates:1; u8 roostActive:1; - u8 unbrudenActive:1; + u8 unburdenActive:1; u8 startEmergencyExit:1; u8 neutralizingGas:1; u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case diff --git a/include/trainer_slide.h b/include/trainer_slide.h index c6f7b745e8..19fdf7c24a 100644 --- a/include/trainer_slide.h +++ b/include/trainer_slide.h @@ -12,11 +12,11 @@ struct MessageStatus void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId); -void TryInitalizeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType); -void TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(u32 target); -void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32 target); -void TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target); -void TryInitalizeTrainerSlideEnemyMonUnaffected(u32 target); +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType); +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target); +void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target); +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target); +void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target); bool32 IsTrainerSlideInitialized(enum TrainerSlideType slideId); bool32 IsTrainerSlidePlayed(enum TrainerSlideType slideId); void InitalizeTrainerSlide(enum TrainerSlideType slideId); diff --git a/src/battle_main.c b/src/battle_main.c index 3d3c70b37b..81e1e9821d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3777,6 +3777,7 @@ static void TryDoEventsBeforeFirstTurn(void) #endif // TESTING gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); + gBattleTurnCounter = 0; for (i = 0; i < gBattlersCount; i++) gBattlerByTurnOrder[i] = i; @@ -3901,7 +3902,6 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; gBattleStruct->turnCountersTracker = 0; - gBattleTurnCounter = 0; memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); @@ -4778,7 +4778,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) // various effects if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) speed *= 2; - if (gDisableStructs[battler].unbrudenActive) + if (gDisableStructs[battler].unburdenActive) speed *= 2; // paralysis drop diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2faa37564d..76211934c0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2698,8 +2698,8 @@ static void Cmd_critmessage(void) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); - TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); - TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); + TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); + TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); gBattleCommunication[MSG_DISPLAY] = 1; } @@ -2846,7 +2846,7 @@ static void Cmd_resultmessage(void) stringId = STRINGID_SUPEREFFECTIVE; } if (stringId == STRINGID_SUPEREFFECTIVE || stringId == STRINGID_SUPEREFFECTIVETWOFOES) - TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(gBattlerTarget); + TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(gBattlerTarget); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: if (IsDoubleSpreadMove()) @@ -3051,7 +3051,7 @@ static void CheckSetUnburden(u8 battler) { if (GetBattlerAbility(battler) == ABILITY_UNBURDEN) { - gDisableStructs[battler].unbrudenActive = TRUE; + gDisableStructs[battler].unburdenActive = TRUE; RecordAbilityBattle(battler, ABILITY_UNBURDEN); } } @@ -3074,7 +3074,7 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) RecordItemEffectBattle(battlerStealer, ItemId_GetHoldEffect(gLastUsedItem)); gBattleMons[battlerStealer].item = gLastUsedItem; - gDisableStructs[battlerStealer].unbrudenActive = FALSE; + gDisableStructs[battlerStealer].unburdenActive = FALSE; BtlController_EmitSetMonData(battlerStealer, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); // set attacker item MarkBattlerForControllerExec(battlerStealer); } @@ -8606,7 +8606,7 @@ static void BestowItem(u32 battlerAtk, u32 battlerDef) gBattleMons[battlerDef].item = gLastUsedItem; BtlController_EmitSetMonData(battlerDef, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item); MarkBattlerForControllerExec(battlerDef); - gDisableStructs[battlerDef].unbrudenActive = FALSE; + gDisableStructs[battlerDef].unburdenActive = FALSE; } // Called by Cmd_removeitem. itemId represents the item that was removed, not being given. @@ -14658,8 +14658,8 @@ static void Cmd_tryswapitems(void) } else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unbrudenActive) - gDisableStructs[gBattlerAttacker].unbrudenActive = FALSE; + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unburdenActive) + gDisableStructs[gBattlerAttacker].unburdenActive = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item } @@ -16958,7 +16958,7 @@ void BS_SetRemoveTerrain(void) gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; - gFieldTimers.terrainTimer = (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5; + gFieldTimers.terrainTimer = gBattleTurnCounter + (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5; gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/src/battle_util.c b/src/battle_util.c index ed3f74f7b4..a3874c68c3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1134,7 +1134,7 @@ void PrepareStringBattle(u16 stringId, u32 battler) } if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNWASNTAFFECTED || stringId == STRINGID_PKMNUNAFFECTED)) - TryInitalizeTrainerSlideEnemyMonUnaffected(gBattlerTarget); + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); BtlController_EmitPrintString(battler, BUFFER_A, stringId); MarkBattlerForControllerExec(battler); @@ -3135,6 +3135,18 @@ static inline bool32 TryFormChangeBeforeMove(void) return TRUE; } +static inline bool32 TryActivatePowderStatus(u32 move) +{ + u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) + return TRUE; + if (move == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) + return TRUE; + if (move == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove) + return TRUE; + return FALSE; +} + void SetAtkCancellerForCalledMove(void) { gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; @@ -3550,7 +3562,7 @@ static void CancellerWeatherPrimal(u32 *effect) if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) { u32 moveType = GetBattleMoveType(gCurrentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL)) + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; *effect = 1; @@ -3606,14 +3618,10 @@ static void CancellerPowderStatus(u32 *effect) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) { - u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; - if ((GetBattleMoveType(gCurrentMove) == TYPE_FIRE && !gBattleStruct->pledgeMove) - || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) - || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove)) + if (TryActivatePowderStatus(gCurrentMove)) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD - && (B_POWDER_RAIN < GEN_7 || !IsBattlerWeatherAffected(gBattlerAttacker, B_WEATHER_RAIN_PRIMAL))) + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE @@ -4058,9 +4066,9 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) gDisableStructs[battler].terrainAbilityDone = FALSE; if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - *timer = 8; + *timer = gBattleTurnCounter + 8; else - *timer = 5; + *timer = gBattleTurnCounter + 5; gBattleScripting.battler = battler; return TRUE; @@ -10736,7 +10744,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov } if (recordAbilities) - TryInitalizeFirstSTABMoveTrainerSlide(battlerDef, battlerAtk, moveType); + TryInitializeFirstSTABMoveTrainerSlide(battlerDef, battlerAtk, moveType); return modifier; } diff --git a/src/trainer_slide.c b/src/trainer_slide.c index 074f6259d2..a4788c3a95 100644 --- a/src/trainer_slide.c +++ b/src/trainer_slide.c @@ -300,7 +300,7 @@ static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId) return FALSE; } -void TryInitalizeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType) +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; @@ -316,7 +316,7 @@ void TryInitalizeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 m InitalizeTrainerSlide(slideId); } -void TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(u32 target) +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; @@ -329,7 +329,7 @@ void TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(u32 target) InitalizeTrainerSlide(slideId); } -void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) +void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; @@ -342,7 +342,7 @@ void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) InitalizeTrainerSlide(slideId); } -void TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target) +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; @@ -355,7 +355,7 @@ void TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target) InitalizeTrainerSlide(slideId); } -void TryInitalizeTrainerSlideEnemyMonUnaffected(u32 target) +void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; From b3543cbc59c455e1427397621150f7f74056902b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 26 Jan 2025 16:06:13 +0100 Subject: [PATCH 019/125] Fix MindBlown crash on MyBoy/No Cash (#6112) --- src/battle_anim_new.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 2d1ad3e807..c5ec4bc9c6 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -7844,8 +7844,8 @@ static void SpriteCB_MindBlownBall(struct Sprite *sprite) sprite->data[3] = gBattleAnimArgs[2]; sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; - sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1); - sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1); + sprite->data[6] = SAFE_DIV((oldPosX - sprite->x) << 4, gBattleAnimArgs[0] << 1); + sprite->data[7] = SAFE_DIV((oldPosY - sprite->y) << 4, gBattleAnimArgs[0] << 1); sprite->callback = AnimMindBlownBallStep; } static void AnimMindBlownBallStep(struct Sprite *sprite) From 99c24c5c1a9f7a40943c3dfcd6aa66b358c09f61 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 26 Jan 2025 16:23:33 +0100 Subject: [PATCH 020/125] Fix Double Iron Bash move animation crash on MyBoy/No$ (#6114) --- src/battle_anim_mons.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index f00626efe8..2df2b23089 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -1029,8 +1029,8 @@ void InitAnimLinearTranslation(struct Sprite *sprite) u16 xDelta = abs(x) << 8; u16 yDelta = abs(y) << 8; - xDelta = xDelta / sprite->data[0]; - yDelta = yDelta / sprite->data[0]; + xDelta = SAFE_DIV(xDelta, sprite->data[0]); + yDelta = SAFE_DIV(yDelta, sprite->data[0]); if (movingLeft) xDelta |= 1; From 37b6f031c8786bfe04ccffc64f20c463ccd75903 Mon Sep 17 00:00:00 2001 From: Cafe <46283144+Cafeei@users.noreply.github.com> Date: Sun, 26 Jan 2025 20:27:05 +0400 Subject: [PATCH 021/125] Duraludon battle animation (#6086) --- graphics/pokemon/duraludon/anim_front.png | Bin 0 -> 1595 bytes graphics/pokemon/duraludon/front.png | Bin 891 -> 0 bytes graphics/pokemon/duraludon/shiny.pal | 2 +- src/data/graphics/pokemon.h | 2 +- src/data/pokemon/species_info/gen_8_families.h | 2 +- src/data/pokemon_graphics/front_pic_anims.h | 9 ++++++++- 6 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 graphics/pokemon/duraludon/anim_front.png delete mode 100644 graphics/pokemon/duraludon/front.png diff --git a/graphics/pokemon/duraludon/anim_front.png b/graphics/pokemon/duraludon/anim_front.png new file mode 100644 index 0000000000000000000000000000000000000000..32624a4988e089d0b135371c5a7085d5c5a13494 GIT binary patch literal 1595 zcmV-B2E_S^P)Px#Fi=cXMV!*4Vuh?RU5jcoIS>#Kdx4bh;(LRAVvB*Kw6@I%BvSwX|7u}#y=iI~ zIAY%7_E%R?fB*mmxk*GpRA_}>yv6@CPW^hRLjZwPG5es=)z z!XlopvU8OpMqg~WouhcKoC$*Ku0;r`eZZ!GX4mr!-&D>7Y9F%^S+cl(2W6Z46_R>> zU5FjP4gso4MESV^Apz8KKuo0GE6oo$>JqZEP<8N=5K`Izk_Ch)Z^1rB=A-~-L_89L zb0!~SBsD=^R@lsbtm68NIuzmuA*?QCDfM55CeN7=l8U?JIsig1pPT~#$RWUhMINj? zdkJAx`5qwB19a&FxsEZRsC>-z-HU{zgyhx=(DVE-qiga+7|E>I04c0#O(`*Is+Cb- zgsdO10opla`PDgv=vjd!sDVcYJtA>w4*-4=!s>Vf&<@bm z`k18$bxNbT*|?fvuK*T+=3G1iwtUhS?00|xixmawvxCnDgHF18!0a1VhXz26SH`h3 zLS3H+6kG+6#?}eoWU+|uu>#ZzzYS7sX))EdmH4RRou1+2eL^rXM7nBsAMhSJ_m+xeUXmW;8zZe0QKGdPla`;E6fo#y4G_!hFs&!r zgz@KXNA36K8n8w$X2P8o-5KN^;BW^| zp-A$2Jzp==K^phzV`zo=!_dc%q^?)Yh#xi#B0C;KF>BK@=DLA84bS!=>1t2 zyL-TCi+(`#`J+UzIz{UruL#@-zNr8)63i!+O}-4))+!TaQ)a+-1oj@bX1|yc*n9sa zfw#+n&6J=C0vd5Tb`tFgSZ*T(R>t8j8U|fgl8}&fT|68^DESHa9cd*C8y+4iGB9xo|Fhj-`4D trWc}j0IBqSpf|sF04jw5xa8dp)<5SlscjCLE%*Qc002ovPDHLkV1j?}!pZ;u literal 0 HcmV?d00001 diff --git a/graphics/pokemon/duraludon/front.png b/graphics/pokemon/duraludon/front.png deleted file mode 100644 index fd22d471ee530a6cc3ac9d62a2a6720402842cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCpEP)Px#Fi=cXMV!*4Vuh?RU5jcoIS>#Kdx4bh;(LRAVvB*Kw6@I%BvSwX|7u}#y=iI~ zIAY%7_E%R?fB*mj`AI}UR9J;M1ub|srQA)&?5Ovxm$4|y#K z`t@}dx7+RX{BQ9iKR5jlkUs%10oy(xFafhq07$?_Q&3U8DUV|*sEMVFW41AZnkC%a zHkvR1fHWfWpfU{D0+6o~dOckn1#GlYvt9;-K5xl{0K`=QQ+NG00NBnELT3K|h5@$u z`oFal837;#s9;~2p|=qicw4yd`VoM;pt;DBY!JX!%93ocL4rsU&wm+C0eS*R7y~c} z7$kfS*cyN)T(2e6Vg>j%q{}II4f?O_S(2R)had&)t```0j0E#y2Wb(xQ`7FK?XlsbTK zg0z(2q<_930MQ-?XynZ5wY?6YM_Bf~U^?kY0OAg?5P%R%@UNR{Apmm36Jeca*WV8|j}?&TCjuDIEywgma;xUYb5hY~xxepUd000PPVt0E$SKH?56x;b1b9to3FK4>@RB=UO4+By89?_tuv4Vg zjm!5@ahk#%kW)p3TJEpDXMj$hYrlH5a}nEnz^WbpspAiTbR?i(^$y4nfbLnph5E&F ziru_>+-!JEAXNZoZh8jX=gA)OxPr8%>LUJ*Z}4H5bn5N`_ZMqS4oK`*O|OelS{yeB zIaWYsZ@mG$2@tr(2A~Vq{*h82i>1A`qT}UK0$iF82%m?C75@WZT002ovPDHLkV1mD@k-q={ diff --git a/graphics/pokemon/duraludon/shiny.pal b/graphics/pokemon/duraludon/shiny.pal index 19e7323e31..9ac865c3f3 100644 --- a/graphics/pokemon/duraludon/shiny.pal +++ b/graphics/pokemon/duraludon/shiny.pal @@ -8,7 +8,7 @@ JASC-PAL 16 16 16 81 96 101 226 157 109 -253 248 236 +242 211 111 118 138 154 149 163 164 8 36 82 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 4c6fa671e2..70e32a9c40 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -24186,7 +24186,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCTOVISH #if P_FAMILY_DURALUDON - const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/front.4bpp.lz"); + const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/anim_front.4bpp.lz"); const u32 gMonPalette_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/normal.gbapal.lz"); const u32 gMonBackPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/back.4bpp.lz"); const u32 gMonShinyPalette_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/shiny.gbapal.lz"); diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 4281b019ea..d372fb3b3c 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -5988,7 +5988,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, .frontAnimFrames = sAnims_Duraludon, - //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .frontAnimId = ANIM_SHAKE_FLASH_YELLOW_FAST, .backPic = gMonBackPic_Duraludon, .backPicSize = MON_COORDS_SIZE(64, 64), .backPicYOffset = 0, diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index 74b90bb340..3fceeb2ff9 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -9737,7 +9737,14 @@ PLACEHOLDER_ANIM_SINGLE_FRAME(Arctovish); #endif //P_FAMILY_ARCTOVISH #if P_FAMILY_DURALUDON -PLACEHOLDER_ANIM_SINGLE_FRAME(Duraludon); +static const union AnimCmd sAnim_Duraludon_1[] = +{ + + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(0, 2), + ANIMCMD_END, +}; #if P_GIGANTAMAX_FORMS PLACEHOLDER_ANIM_SINGLE_FRAME(DuraludonGmax); From 6b23a02e7d59c8bde8ef02f076f871c2c446cf1e Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 26 Jan 2025 17:12:18 +0000 Subject: [PATCH 022/125] Fix Powder config not checking for Powder status (#6113) --- src/battle_util.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a3874c68c3..fbb1d1b26d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3138,6 +3138,8 @@ static inline bool32 TryFormChangeBeforeMove(void) static inline bool32 TryActivatePowderStatus(u32 move) { u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER)) + return FALSE; if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) return TRUE; if (move == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) @@ -3616,20 +3618,17 @@ static void CancellerPowderMove(u32 *effect) static void CancellerPowderStatus(u32 *effect) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) + if (TryActivatePowderStatus(gCurrentMove)) { - if (TryActivatePowderStatus(gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE - || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) - gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; - } + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE + || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; } } From 7c6a77eae57882a36199bd148863722803da6935 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 26 Jan 2025 19:41:56 +0100 Subject: [PATCH 023/125] Remove UnusedBattleInit from battle_bg.c (#6116) --- src/battle_bg.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/battle_bg.c b/src/battle_bg.c index 24f2a55e8d..0625992d3d 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -703,24 +703,6 @@ const struct BattleBackground sBattleTerrainTable[] = }, }; -static void UNUSED CB2_UnusedBattleInit(void); - -static void UNUSED UnusedBattleInit(void) -{ - u8 spriteId; - - ResetSpriteData(); - spriteId = CreateSprite(&gUnusedBattleInitSprite, 0, 0, 0); - gSprites[spriteId].invisible = TRUE; - SetMainCallback2(CB2_UnusedBattleInit); -} - -static void UNUSED CB2_UnusedBattleInit(void) -{ - AnimateSprites(); - BuildOamBuffer(); -} - void BattleInitBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(0); From 058bf58b7b6d0e1eb623254bac611b6ee2d15cdb Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sun, 26 Jan 2025 15:39:14 -0600 Subject: [PATCH 024/125] Match current gen behavior for battle environment after fishing (#6099) --- include/config/item.h | 1 + src/battle_setup.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/config/item.h b/include/config/item.h index dce2682959..96156b0db8 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -41,6 +41,7 @@ // Fishing #define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. #define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! +#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked Pokémon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. #define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. #define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following Pokémon. #define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. diff --git a/src/battle_setup.c b/src/battle_setup.c index f6fa1a8e9b..96d23dc42a 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -49,6 +49,7 @@ #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" +#include "wild_encounter.h" enum { TRANSITION_TYPE_NORMAL, @@ -609,7 +610,11 @@ u8 BattleSetup_GetTerrainId(void) u16 tileBehavior; s16 x, y; - PlayerGetDestCoords(&x, &y); + if (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter) + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + else + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsTallGrass(tileBehavior)) From 9b9646220412ff27132089e5f488feadc32993b5 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sun, 26 Jan 2025 17:12:49 -0500 Subject: [PATCH 025/125] Consolidated contest opponent filters into gContestOpponents (#6119) --- include/contest.h | 1 + .../consolidate_contest_opponent_filters.py | 45 ++++ migration_scripts/README.md | 21 ++ src/contest.c | 10 +- src/data/contest_opponents.h | 197 +++++++++--------- 5 files changed, 167 insertions(+), 107 deletions(-) create mode 100644 migration_scripts/1.11/consolidate_contest_opponent_filters.py diff --git a/include/contest.h b/include/contest.h index acd12a4ebc..a10ec5babd 100644 --- a/include/contest.h +++ b/include/contest.h @@ -111,6 +111,7 @@ struct ContestPokemon u8 unused1:7; u32 personality; u32 otId; + u8 filter; }; struct ContestTempSave diff --git a/migration_scripts/1.11/consolidate_contest_opponent_filters.py b/migration_scripts/1.11/consolidate_contest_opponent_filters.py new file mode 100644 index 0000000000..240152cea2 --- /dev/null +++ b/migration_scripts/1.11/consolidate_contest_opponent_filters.py @@ -0,0 +1,45 @@ +import glob +import re +import os + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +# Read contest_opponents.h +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'r') as f: + source_content = f.read() + +# Extract party info from contest_opponents.h +source_pattern = re.compile(r'(\[CONTEST_OPPONENT_.*\])\s*=\s(CONTEST_FILTER_.*)*') +source_data = {} +for match in source_pattern.findall(source_content): + if len(match) == 2: + trainer_name, contest_filter = match + source_data[trainer_name] = (contest_filter) + +# Read contest_opponents.h content +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'r') as f: + destination_content = f.read() + +# Modify contest_opponents.h content +def add_filter_data(match): + trainer_name = match.group(1) + if trainer_name in source_data: + contest_filter = source_data[trainer_name] + print(f"Updating {trainer_name}: adding {contest_filter}") + #return f'{trainer_name} = {{\n .filter = {contest_filter}' + return f'{match.group(0)}\n .filter = {contest_filter}' + else: + return match.group(0) + +destination_pattern = re.compile(r'(\[CONTEST_OPPONENT_[A-Z_0-9]+\])\s*=\s*{') +modified_content = destination_pattern.sub(add_filter_data, destination_content) + +# Write the modified content back to contest_opponents.h +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'w') as f: + f.write(modified_content) + print("contest_opponents.h has been updated") diff --git a/migration_scripts/README.md b/migration_scripts/README.md index 696f146f14..46b1e227ef 100644 --- a/migration_scripts/README.md +++ b/migration_scripts/README.md @@ -17,6 +17,27 @@ python3 migration_scripts/*.py ; #run the migration script `*` will need to be replaced with the name of the appropriate script. +## 1.10.x to 1.11.x+ + +### Battle Frontier Trainers + +* Filepath [`migration_scripts/1.11/consolidate_contest_opponent_filters.py`](1.11/consolidate_contest_opponent_filters.py) +* Introduced in [Consolidated contest opponent filters into gContestOpponents #6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119) + +Moves the contest opponent filters in src/data/contest_opponents.h from gPostgameContestOpponentFilter to gContestOpponents + +#### [src/data/contest_opponents.h](../src/data/contest_opponents.h) +```diff +const struct ContestPokemon gContestOpponents[] = +{ + [CONTEST_OPPONENT_JIMMY] = { ++ .filter = CONTEST_FILTER_NONE, +... +- const u8 gPostgameContestOpponentFilter[] = +- { +- [CONTEST_OPPONENT_JIMMY] = CONTEST_FILTER_NONE, +``` + ## 1.8.x to 1.9.x+ ### Battle Anim Moves diff --git a/src/contest.c b/src/contest.c index 96bb4e925d..b99dd6e935 100644 --- a/src/contest.c +++ b/src/contest.c @@ -2956,7 +2956,6 @@ void SetContestants(u8 contestType, u8 rank) u8 opponentsCount = 0; u8 opponents[100]; bool8 allowPostgameContestants = FALSE; - const u8 *filter; TryPutPlayerLast(); @@ -2964,19 +2963,18 @@ void SetContestants(u8 contestType, u8 rank) allowPostgameContestants = TRUE; // Find all suitable opponents - filter = gPostgameContestOpponentFilter; for (i = 0; i < ARRAY_COUNT(gContestOpponents); i++) { if (rank == gContestOpponents[i].whichRank) { if (allowPostgameContestants == TRUE) { - if (filter[i] == CONTEST_FILTER_NO_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_NO_POSTGAME) continue; } else { - if (filter[i] == CONTEST_FILTER_ONLY_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_ONLY_POSTGAME) continue; } if (contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) @@ -3025,12 +3023,12 @@ void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame) if (isPostgame == TRUE) { - if (gPostgameContestOpponentFilter[i] == CONTEST_FILTER_NO_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_NO_POSTGAME) continue; } else { - if (gPostgameContestOpponentFilter[i] == CONTEST_FILTER_ONLY_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_ONLY_POSTGAME) continue; } if ((contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h index d3f02d33ab..d5928b64db 100644 --- a/src/data/contest_opponents.h +++ b/src/data/contest_opponents.h @@ -220,6 +220,7 @@ const struct ContestWinner gDefaultContestWinners[] = const struct ContestPokemon gContestOpponents[] = { [CONTEST_OPPONENT_JIMMY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_POOCHYENA, .nickname = _("POOCHY"), .trainerName = _("JIMMY"), @@ -248,6 +249,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EDITH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ILLUMISE, .nickname = _("MUSILLE"), .trainerName = _("EDITH"), @@ -276,6 +278,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EVAN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_DUSTOX, .nickname = _("DUSTER"), .trainerName = _("EVAN"), @@ -304,6 +307,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KELSEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEEDOT, .nickname = _("DOTS"), .trainerName = _("KELSEY"), @@ -332,6 +336,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MADISON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_TAILLOW, .nickname = _("TATAY"), .trainerName = _("MADISON"), @@ -360,6 +365,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAYMOND] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NINCADA, .nickname = _("NINDA"), .trainerName = _("RAYMOND"), @@ -388,6 +394,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRANT] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHROOMISH, .nickname = _("SMISH"), .trainerName = _("GRANT"), @@ -416,6 +423,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PAIGE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPHEAL, .nickname = _("SLEAL"), .trainerName = _("PAIGE"), @@ -444,6 +452,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALEC] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SLAKOTH, .nickname = _("SLOKTH"), .trainerName = _("ALEC"), @@ -472,6 +481,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SYDNEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WHISMUR, .nickname = _("WHIRIS"), .trainerName = _("SYDNEY"), @@ -500,6 +510,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORRIS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MAKUHITA, .nickname = _("MAHITA"), .trainerName = _("MORRIS"), @@ -528,6 +539,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARIAH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ARON, .nickname = _("RONAR"), .trainerName = _("MARIAH"), @@ -556,6 +568,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RUSSELL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CROBAT, .nickname = _("BATRO"), .trainerName = _("RUSSELL"), @@ -584,6 +597,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MELANIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GULPIN, .nickname = _("GULIN"), .trainerName = _("MELANIE"), @@ -612,6 +626,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CHANCE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MANECTRIC, .nickname = _("RIKELEC"), .trainerName = _("CHANCE"), @@ -640,6 +655,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AGATHA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BULBASAUR, .nickname = _("BULBY"), .trainerName = _("AGATHA"), @@ -668,6 +684,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BEAU] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BUTTERFREE, .nickname = _("FUTTERBE"), .trainerName = _("BEAU"), @@ -696,6 +713,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PIDGEOTTO, .nickname = _("PIDEOT"), .trainerName = _("KAY"), @@ -724,6 +742,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CALE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DIGLETT, .nickname = _("DIGLE"), .trainerName = _("CALE"), @@ -752,6 +771,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAITLIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_POLIWAG, .nickname = _("WAGIL"), .trainerName = _("CAITLIN"), @@ -780,6 +800,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLBY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_TOTODILE, .nickname = _("TOTDIL"), .trainerName = _("COLBY"), @@ -808,6 +829,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KYLIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_LEDYBA, .nickname = _("BALEDY"), .trainerName = _("KYLIE"), @@ -836,6 +858,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LIAM] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DELIBIRD, .nickname = _("BIRDLY"), .trainerName = _("LIAM"), @@ -864,6 +887,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_LARVITAR, .nickname = _("TARVITAR"), .trainerName = _("MILO"), @@ -892,6 +916,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ROSELIA, .nickname = _("RELIA"), .trainerName = _("KARINA"), @@ -920,6 +945,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BOBBY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_DODRIO, .nickname = _("DUODO"), .trainerName = _("BOBBY"), @@ -948,6 +974,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAIRE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_TRAPINCH, .nickname = _("PINCHIN"), .trainerName = _("CLAIRE"), @@ -976,6 +1003,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_WILLIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CACNEA, .nickname = _("NACAC"), .trainerName = _("WILLIE"), @@ -1004,6 +1032,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CASSIDY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SANDSLASH, .nickname = _("SHRAND"), .trainerName = _("CASSIDY"), @@ -1032,6 +1061,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORGAN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BALTOY, .nickname = _("TOYBAL"), .trainerName = _("MORGAN"), @@ -1060,6 +1090,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SUMMER] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MEDICHAM, .nickname = _("CHAMCHAM"), .trainerName = _("SUMMER"), @@ -1088,6 +1119,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILES] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPINDA, .nickname = _("SPININ"), .trainerName = _("MILES"), @@ -1116,6 +1148,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUDREY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SWABLU, .nickname = _("SWABY"), .trainerName = _("AUDREY"), @@ -1144,6 +1177,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AVERY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPOINK, .nickname = _("POINKER"), .trainerName = _("AVERY"), @@ -1172,6 +1206,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ARIANA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_KECLEON, .nickname = _("KECON"), .trainerName = _("ARIANA"), @@ -1200,6 +1235,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ASHTON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GOLDEEN, .nickname = _("GOLDEN"), .trainerName = _("ASHTON"), @@ -1228,6 +1264,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SANDRA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BARBOACH, .nickname = _("BOBOACH"), .trainerName = _("SANDRA"), @@ -1256,6 +1293,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CARSON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SKARMORY, .nickname = _("CORPY"), .trainerName = _("CARSON"), @@ -1284,6 +1322,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KATRINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOTAD, .nickname = _("TADO"), .trainerName = _("KATRINA"), @@ -1312,6 +1351,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LUKE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SLOWBRO, .nickname = _("BROWLO"), .trainerName = _("LUKE"), @@ -1340,6 +1380,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAUL] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_FARFETCHD, .nickname = _("FETCHIN"), .trainerName = _("RAUL"), @@ -1368,6 +1409,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SEEL, .nickname = _("SEELEY"), .trainerName = _("JADA"), @@ -1396,6 +1438,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ZEEK] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DROWZEE, .nickname = _("DROWZIN"), .trainerName = _("ZEEK"), @@ -1424,6 +1467,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DIEGO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HITMONCHAN, .nickname = _("HITEMON"), .trainerName = _("DIEGO"), @@ -1452,6 +1496,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALIYAH] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BLISSEY, .nickname = _("BLISS"), .trainerName = _("ALIYAH"), @@ -1480,6 +1525,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NATALIA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_ELEKID, .nickname = _("KIDLEK"), .trainerName = _("NATALIA"), @@ -1508,6 +1554,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SNUBBULL, .nickname = _("SNUBBINS"), .trainerName = _("DEVIN"), @@ -1536,6 +1583,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TYLOR] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MISDREAVUS, .nickname = _("DREAVIS"), .trainerName = _("TYLOR"), @@ -1564,6 +1612,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RONNIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LAIRON, .nickname = _("LAIRN"), .trainerName = _("RONNIE"), @@ -1592,6 +1641,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAUDIA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHIFTRY, .nickname = _("SHIFTY"), .trainerName = _("CLAUDIA"), @@ -1620,6 +1670,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELIAS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NINJASK, .nickname = _("NINAS"), .trainerName = _("ELIAS"), @@ -1648,6 +1699,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SWELLOW, .nickname = _("WELOW"), .trainerName = _("JADE"), @@ -1676,6 +1728,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANCIS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MIGHTYENA, .nickname = _("YENA"), .trainerName = _("FRANCIS"), @@ -1704,6 +1757,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALISHA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BEAUTIFLY, .nickname = _("TIFLY"), .trainerName = _("ALISHA"), @@ -1732,6 +1786,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SAUL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEAKING, .nickname = _("KINGSEA"), .trainerName = _("SAUL"), @@ -1760,6 +1815,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FELICIA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CASTFORM_NORMAL, .nickname = _("CASTER"), .trainerName = _("FELICIA"), @@ -1788,6 +1844,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EMILIO] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MACHOKE, .nickname = _("CHOKEM"), .trainerName = _("EMILIO"), @@ -1816,6 +1873,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARLA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOMBRE, .nickname = _("LOMBE"), .trainerName = _("KARLA"), @@ -1844,6 +1902,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DARRYL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEVIPER, .nickname = _("VIPES"), .trainerName = _("DARRYL"), @@ -1872,6 +1931,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SELENA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WAILMER, .nickname = _("MERAIL"), .trainerName = _("SELENA"), @@ -1900,6 +1960,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NOEL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MAGIKARP, .nickname = _("KARPAG"), .trainerName = _("NOEL"), @@ -1928,6 +1989,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LACEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LUNATONE, .nickname = _("LUNONE"), .trainerName = _("LACEY"), @@ -1956,6 +2018,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CORBIN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ABSOL, .nickname = _("ABSO"), .trainerName = _("CORBIN"), @@ -1984,6 +2047,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRACIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_EXEGGUTOR, .nickname = _("EGGSOR"), .trainerName = _("GRACIE"), @@ -2012,6 +2076,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLTIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_CUBONE, .nickname = _("CUBIN"), .trainerName = _("COLTIN"), @@ -2040,6 +2105,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELLIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HITMONLEE, .nickname = _("HITMON"), .trainerName = _("ELLIE"), @@ -2068,6 +2134,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARCUS] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SQUIRTLE, .nickname = _("SURTLE"), .trainerName = _("MARCUS"), @@ -2096,6 +2163,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KIARA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_KANGASKHAN, .nickname = _("KHANKAN"), .trainerName = _("KIARA"), @@ -2124,6 +2192,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BRYCE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PINECO, .nickname = _("PINOC"), .trainerName = _("BRYCE"), @@ -2152,6 +2221,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAMIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DUNSPARCE, .nickname = _("DILTOT"), .trainerName = _("JAMIE"), @@ -2180,6 +2250,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JORGE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HOUNDOOM, .nickname = _("DOOMOND"), .trainerName = _("JORGE"), @@ -2208,6 +2279,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVON] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MILTANK, .nickname = _("MILKAN"), .trainerName = _("DEVON"), @@ -2236,6 +2308,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JUSTINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GYARADOS, .nickname = _("RADOS"), .trainerName = _("JUSTINA"), @@ -2264,6 +2337,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RALPH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOUDRED, .nickname = _("LOUDERD"), .trainerName = _("RALPH"), @@ -2292,6 +2366,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ROSA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SKITTY, .nickname = _("SITTY"), .trainerName = _("ROSA"), @@ -2320,6 +2395,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KEATON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SLAKING, .nickname = _("SLING"), .trainerName = _("KEATON"), @@ -2348,6 +2424,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MAYRA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ALTARIA, .nickname = _("TARIA"), .trainerName = _("MAYRA"), @@ -2376,6 +2453,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LAMAR] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_KIRLIA, .nickname = _("LIRKI"), .trainerName = _("LAMAR"), @@ -2404,6 +2482,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUBREY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BELLOSSOM, .nickname = _("BLOSSOM"), .trainerName = _("AUBREY"), @@ -2432,6 +2511,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NIGEL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SABLEYE, .nickname = _("EYESAB"), .trainerName = _("NIGEL"), @@ -2460,6 +2540,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILLE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NATU, .nickname = _("UTAN"), .trainerName = _("CAMILLE"), @@ -2488,6 +2569,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHARPEDO, .nickname = _("PEDOS"), .trainerName = _("DEON"), @@ -2516,6 +2598,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JANELLE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LUVDISC, .nickname = _("LUVIS"), .trainerName = _("JANELLE"), @@ -2544,6 +2627,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HEATH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_HERACROSS, .nickname = _("HEROSS"), .trainerName = _("HEATH"), @@ -2572,6 +2656,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SASHA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ELECTRODE, .nickname = _("RODLECT"), .trainerName = _("SASHA"), @@ -2600,6 +2685,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANKIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_PICHU, .nickname = _("CHUPY"), .trainerName = _("FRANKIE"), @@ -2628,6 +2714,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HELEN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WOBBUFFET, .nickname = _("WOBET"), .trainerName = _("HELEN"), @@ -2656,6 +2743,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_GENGAR, .nickname = _("GAREN"), .trainerName = _("CAMILE"), @@ -2684,6 +2772,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARTIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PORYGON, .nickname = _("GONPOR"), .trainerName = _("MARTIN"), @@ -2712,6 +2801,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SERGIO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DRAGONITE, .nickname = _("DRITE"), .trainerName = _("SERGIO"), @@ -2740,6 +2830,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAILEY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MEOWTH, .nickname = _("MEOWY"), .trainerName = _("KAILEY"), @@ -2768,6 +2859,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PERLA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_JYNX, .nickname = _("NYX"), .trainerName = _("PERLA"), @@ -2796,6 +2888,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLARA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_TOGEPI, .nickname = _("GEPITO"), .trainerName = _("CLARA"), @@ -2824,6 +2917,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAKOB] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_ESPEON, .nickname = _("SPEON"), .trainerName = _("JAKOB"), @@ -2852,6 +2946,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TREY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SLOWKING, .nickname = _("SLOWGO"), .trainerName = _("TREY"), @@ -2880,6 +2975,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LANE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_URSARING, .nickname = _("URSING"), .trainerName = _("LANE"), @@ -2908,104 +3004,3 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, } }; - - -const u8 gPostgameContestOpponentFilter[] = -{ - [CONTEST_OPPONENT_JIMMY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EDITH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EVAN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KELSEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MADISON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RAYMOND] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_GRANT] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_PAIGE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ALEC] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SYDNEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MORRIS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MARIAH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RUSSELL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MELANIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CHANCE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AGATHA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_BEAU] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KAY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CALE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CAITLIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_COLBY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KYLIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_LIAM] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MILO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KARINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_BOBBY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CLAIRE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_WILLIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CASSIDY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MORGAN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SUMMER] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MILES] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AUDREY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AVERY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ARIANA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ASHTON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SANDRA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CARSON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KATRINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LUKE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_RAUL] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JADA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ZEEK] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DIEGO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ALIYAH] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_NATALIA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DEVIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_TYLOR] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_RONNIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CLAUDIA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ELIAS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_JADE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FRANCIS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ALISHA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SAUL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FELICIA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EMILIO] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KARLA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_DARRYL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SELENA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_NOEL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LACEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CORBIN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_GRACIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_COLTIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ELLIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MARCUS] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KIARA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_BRYCE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JAMIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JORGE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DEVON] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JUSTINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RALPH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ROSA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KEATON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MAYRA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LAMAR] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AUBREY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_NIGEL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CAMILLE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_DEON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_JANELLE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_HEATH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SASHA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FRANKIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_HELEN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CAMILE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MARTIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_SERGIO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KAILEY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_PERLA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CLARA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JAKOB] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_TREY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_LANE] = CONTEST_FILTER_ONLY_POSTGAME -}; From b2448ea002da9cf26ff44c034230c1c12fb25144 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 27 Jan 2025 00:25:57 +0100 Subject: [PATCH 026/125] Fix upcoming not working on no cash (#6121) --- include/gba/defines.h | 1 + src/agb_flash_1m.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/gba/defines.h b/include/gba/defines.h index 0bf7110810..2a68042421 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -12,6 +12,7 @@ #define EWRAM_INIT __attribute__((section(".ewram"))) #define COMMON_DATA __attribute__((section("common_data"))) #define UNUSED __attribute__((unused)) +#define USED __attribute__((used)) #define ARM_FUNC __attribute__((target("arm"))) diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c index 6fc4f3d600..037f7a964d 100644 --- a/src/agb_flash_1m.c +++ b/src/agb_flash_1m.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "gba/flash_internal.h" -static const char AgbLibFlashVersion[] = "FLASH1M_V103"; +USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; static const struct FlashSetupInfo * const sSetupInfos[] = { From f3f03ec43fda540b405debef4b0f98dbf5c15128 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:52:03 -0500 Subject: [PATCH 027/125] Fixed Hoenn dex off by 1 issues (#6104) --- src/pokedex.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pokedex.c b/src/pokedex.c index e4b5076e59..141ae3cdd2 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4539,7 +4539,7 @@ u16 GetHoennPokedexCount(u8 caseID) u16 count = 0; u16 i; - for (i = 0; i < HOENN_DEX_COUNT; i++) + for (i = 0; i < HOENN_DEX_COUNT - 1; i++) { switch (caseID) { @@ -4582,7 +4582,7 @@ bool16 HasAllHoennMons(void) { u32 i, j; - for (i = 0; i < HOENN_DEX_COUNT; i++) + for (i = 0; i < HOENN_DEX_COUNT - 1; i++) { j = HoennToNationalOrder(i + 1); if (!(gSpeciesInfo[j].isMythical && !gSpeciesInfo[j].dexForceRequired) && !GetSetPokedexFlag(j, FLAG_GET_CAUGHT)) From c77cf8284c98c45f019111c10474c0573fbec516 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 28 Jan 2025 13:11:39 +0100 Subject: [PATCH 028/125] Fix safari zone crash on No Cash (#6132) --- src/battle_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index f1457eacb3..a2d6c0fe10 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11972,6 +11972,10 @@ void SetShellSideArmCategory(void) u32 physical; u32 special; + // Don't run this check for Safari Battles. Because player's stats are zeroed out, this performs division by zero which previously would crash on certain emulators in Safari Zone. + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return; + for (battlerAtk = 0; battlerAtk < gBattlersCount; battlerAtk++) { attackerAtkStat = gBattleMons[battlerAtk].attack; From 4041af0b052f6cb97933404b20c3af2a91dc471a Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 28 Jan 2025 19:14:12 +0100 Subject: [PATCH 029/125] Removed stray semi-colon in AI code (#6134) Co-authored-by: Hedara --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 59695bc0e6..c3cd5a4d5e 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3668,7 +3668,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)) { if (gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); From 927bb8f833339a4c1f02bd542f6879e1076f256b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 28 Jan 2025 15:16:10 -0300 Subject: [PATCH 030/125] Fixed AI not handling type effectiveness beyond x8 (#6127) --- include/battle.h | 2 +- include/battle_ai_util.h | 7 ++--- include/constants/battle_ai.h | 10 ------- src/battle_ai_main.c | 49 +++++++++++++++---------------- src/battle_ai_switch_items.c | 29 +++++++++--------- src/battle_ai_util.c | 55 ++++++++--------------------------- 6 files changed, 54 insertions(+), 98 deletions(-) diff --git a/include/battle.h b/include/battle.h index 13fc659768..fe7c740639 100644 --- a/include/battle.h +++ b/include/battle.h @@ -350,7 +350,7 @@ struct AiLogicData u16 partnerMove; u16 speedStats[MAX_BATTLERS_COUNT]; // Speed stats for all battles, calculated only once, same way as damages struct SimulatedDamage simulatedDmg[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex - u8 effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex + uq4_12_t effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveAccuracy[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveLimitations[MAX_BATTLERS_COUNT]; u8 monToSwitchInId[MAX_BATTLERS_COUNT]; // ID of the mon to switch in. diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 552faa1306..44aa9a9ce6 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -101,15 +101,14 @@ bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType); -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType); +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType); +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType); bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex); u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef); -uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); -u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); +uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(u32 moveEffect); bool32 HasMove(u32 battlerId, u32 move); diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index e4cf747818..8ba2c72096 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -14,16 +14,6 @@ #define AI_TYPE2_USER 3 #define AI_TYPE_MOVE 4 -// type effectiveness -#define AI_EFFECTIVENESS_x8 7 -#define AI_EFFECTIVENESS_x4 6 -#define AI_EFFECTIVENESS_x2 5 -#define AI_EFFECTIVENESS_x1 4 -#define AI_EFFECTIVENESS_x0_5 3 -#define AI_EFFECTIVENESS_x0_25 2 -#define AI_EFFECTIVENESS_x0_125 1 -#define AI_EFFECTIVENESS_x0 0 - // AI Flags. Most run specific functions to update score, new flags are used for internal logic in other scripts // See docs/ai_flags.md for more details. #define AI_FLAG_CHECK_BAD_MOVE (1 << 0) // AI will avoid using moves that are likely to fail or be ineffective in the current situation. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index d40cf2968f..cadf627e20 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -421,7 +421,7 @@ static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { struct SimulatedDamage dmg = {0}; - u8 effectiveness = AI_EFFECTIVENESS_x0; + uq4_12_t effectiveness = Q_4_12(0.0); move = moves[moveIndex]; if (move != MOVE_NONE @@ -722,14 +722,14 @@ static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u3 void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) { struct BattlePokemon switchoutCandidate = gBattleMons[battlerDef]; - struct SimulatedDamage simulatedDamageSwitchout[4]; - u8 effectivenessSwitchout[4]; - u8 moveAccuracySwitchout[4]; + struct SimulatedDamage simulatedDamageSwitchout[MAX_MON_MOVES]; + uq4_12_t effectivenessSwitchout[MAX_MON_MOVES]; + u8 moveAccuracySwitchout[MAX_MON_MOVES]; struct BattlePokemon switchinCandidate; - struct SimulatedDamage simulatedDamageSwitchin[4]; - u8 effectivenessSwitchin[4]; - u8 moveAccuracySwitchin[4]; + struct SimulatedDamage simulatedDamageSwitchin[MAX_MON_MOVES]; + uq4_12_t effectivenessSwitchin[MAX_MON_MOVES]; + u8 moveAccuracySwitchin[MAX_MON_MOVES]; struct Pokemon *party = GetBattlerParty(battlerDef); struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); @@ -839,7 +839,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) s32 moveType; u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = AI_DATA; - u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; u32 weather; @@ -863,14 +863,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gBattleStruct->battlerState[battlerDef].commandingDondozo) RETURN_SCORE_MINUS(20); - // check if negates type - switch (effectiveness) + if (effectiveness == UQ_4_12(0.0)) { - case AI_EFFECTIVENESS_x0: RETURN_SCORE_MINUS(20); - break; - case AI_EFFECTIVENESS_x0_125: - case AI_EFFECTIVENESS_x0_25: + } + else if (effectiveness < UQ_4_12(0.5)) + { switch (moveEffect) { case EFFECT_FIXED_DAMAGE_ARG: @@ -889,7 +887,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: RETURN_SCORE_MINUS(10); } - break; } // check non-user target @@ -922,7 +919,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case ABILITY_WONDER_GUARD: - if (effectiveness < AI_EFFECTIVENESS_x2) + if (effectiveness < UQ_4_12(2.0)) RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: @@ -1117,7 +1114,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); - if (effectiveness == AI_EFFECTIVENESS_x0) + if (effectiveness == UQ_4_12(0.0)) { ADJUST_SCORE(-10); } @@ -1452,7 +1449,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FIXED_DAMAGE_ARG: case EFFECT_FOCUS_PUNCH: // AI_CBM_HighRiskForDamage - if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < AI_EFFECTIVENESS_x2) + if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(-10); if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) @@ -2840,7 +2837,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MAGNET_RISE: if (IsBattlerGrounded(battlerAtk) && (HasMove(battlerAtkPartner, MOVE_EARTHQUAKE) || HasMove(battlerAtkPartner, MOVE_MAGNITUDE)) - && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != AI_EFFECTIVENESS_x0)) // Doesn't resist ground move + && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != UQ_4_12(0.0))) // Doesn't resist ground move { RETURN_SCORE_PLUS(DECENT_EFFECT); // partner has earthquake or magnitude -> good idea to use magnet rise } @@ -3309,7 +3306,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) u32 moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = AI_DATA; u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; - u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; u32 predictedMove = aiData->lastUsedMove[battlerDef]; @@ -3323,7 +3320,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) moveEffect = EFFECT_PROTECT; // check status move preference - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != AI_EFFECTIVENESS_x0) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); // check thawing moves @@ -3346,7 +3343,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) IncreaseSleepScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_ABSORB: - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1) + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= UQ_4_12(1.0)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_EXPLOSION: @@ -4488,7 +4485,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_MAGNET_RISE: if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) - && !(AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerDef, battlerAtk) == AI_EFFECTIVENESS_x0)) // Doesn't resist ground move + && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first { @@ -4506,7 +4503,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_CAMOUFLAGE: if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move) // Attacker goes first - && !IsBattleMoveStatus(move) && AI_GetMoveEffectiveness(predictedMove, battlerDef, battlerAtk) != AI_EFFECTIVENESS_x0) + && !IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TOXIC_THREAD: @@ -5408,7 +5405,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); u32 moveEffect = gMovesInfo[move].effect; struct AiLogicData *aiData = AI_DATA; - u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; // Switch benefit switch (moveEffect) @@ -5429,7 +5426,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(DECENT_EFFECT); if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) { - if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < AI_EFFECTIVENESS_x2) + if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(10); if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 0f38f326d1..e90423a796 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -88,11 +88,12 @@ static inline bool32 SetSwitchinAndSwitch(u32 battler, u32 switchinId) static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization - u8 opposingPosition, atkType1, atkType2, defType1, defType2, effectiveness; + u8 opposingPosition, atkType1, atkType2, defType1, defType2; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler, weather = AI_GetWeather(AI_DATA); bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u16 typeEffectiveness = UQ_4_12(1.0), aiMoveEffect; //baseline typing damage + uq4_12_t effectiveness; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -133,7 +134,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) if (!IsBattleMoveStatus(aiMove)) { // Check if mon has a super effective move - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal @@ -254,8 +255,8 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > AI_EFFECTIVENESS_x0 - || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > AI_EFFECTIVENESS_x0) + if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) + || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > UQ_4_12(0.0)) && aiMove != MOVE_NONE) return FALSE; } @@ -265,7 +266,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > AI_EFFECTIVENESS_x0 && aiMove != MOVE_NONE) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) && aiMove != MOVE_NONE) return FALSE; } } @@ -294,7 +295,7 @@ static bool32 FindMonThatHitsWonderGuard(u32 battler) move = gBattleMons[battler].moves[i]; if (move != MOVE_NONE) { - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) return FALSE; } } @@ -319,7 +320,7 @@ static bool32 FindMonThatHitsWonderGuard(u32 battler) if (move != MOVE_NONE) { // Found a mon - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) return SetSwitchinAndSwitch(battler, i); } } @@ -527,7 +528,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) || (IsBattlerGrounded(battler) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) @@ -643,7 +644,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) if (move == MOVE_NONE) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -665,7 +666,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) if (move == MOVE_NONE) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -764,7 +765,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (move == 0) continue; - if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= AI_EFFECTIVENESS_x2 && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || AI_DATA->aiSwitchPredictionInProgress)) + if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, i); } } @@ -858,7 +859,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move - else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= UQ_4_12(2.0)) return FALSE; // Switch out 50% of the time otherwise @@ -1210,7 +1211,7 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, for (i = 0; i < MAX_MON_MOVES; i++) { u32 move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) break; } @@ -1866,7 +1867,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { if (typeMatchup < bestResistEffective) { - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) { if (canSwitchinWin1v1) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 04e0804ab7..dbb5aa8414 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -23,8 +23,6 @@ #include "constants/moves.h" #include "constants/items.h" -static u32 AI_GetEffectiveness(uq4_12_t multiplier); - // Functions u32 GetDmgRollType(u32 battlerAtk) { @@ -387,7 +385,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) } // To save computation time this function has 2 variants. One saves, sets and restores battlers, while the other doesn't. -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType) +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType) { struct SimulatedDamage dmg; @@ -395,7 +393,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(AI_DATA), rollType); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(AI_DATA), rollType); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -631,7 +629,7 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal *minimumDamage = minimum; } -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType) +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType) { struct SimulatedDamage simDamage; s32 moveType; @@ -755,7 +753,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u } // convert multiper to AI_EFFECTIVENESS_xX - *typeEffectiveness = AI_GetEffectiveness(effectivenessMultiplier); + *typeEffectiveness = effectivenessMultiplier; // Undo temporary settings gBattleStruct->dynamicMoveType = 0; @@ -1040,7 +1038,7 @@ u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef) return (bestDmg * 100) / gBattleMons[battlerDef].maxHP; } -uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) +uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) { uq4_12_t typeEffectiveness; u32 moveType; @@ -1062,35 +1060,6 @@ uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) return typeEffectiveness; } -u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) -{ - return AI_GetEffectiveness(AI_GetTypeEffectiveness(move, battlerAtk, battlerDef)); -} - -static u32 AI_GetEffectiveness(uq4_12_t multiplier) -{ - switch (multiplier) - { - case UQ_4_12(0.0): - return AI_EFFECTIVENESS_x0; - case UQ_4_12(0.125): - return AI_EFFECTIVENESS_x0_125; - case UQ_4_12(0.25): - return AI_EFFECTIVENESS_x0_25; - case UQ_4_12(0.5): - return AI_EFFECTIVENESS_x0_5; - case UQ_4_12(1.0): - default: - return AI_EFFECTIVENESS_x1; - case UQ_4_12(2.0): - return AI_EFFECTIVENESS_x2; - case UQ_4_12(4.0): - return AI_EFFECTIVENESS_x4; - case UQ_4_12(8.0): - return AI_EFFECTIVENESS_x8; - } -} - /* Checks to see if AI will move ahead of another battler * The function uses a stripped down version of the checks from GetWhichBattlerFasterArgs * Output: @@ -3012,7 +2981,7 @@ bool32 ShouldPoisonSelf(u32 battler, u32 ability) bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { if (!CanBePoisoned(battlerAtk, battlerDef, GetBattlerAbility(battlerDef)) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) return FALSE; @@ -3027,7 +2996,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3 bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { if (!CanBeParalyzed(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) @@ -3089,7 +3058,7 @@ bool32 ShouldBurnSelf(u32 battler, u32 ability) bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeBurned(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3101,7 +3070,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!AI_CanGetFrostbite(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3113,7 +3082,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || defAbility == ABILITY_OBLIVIOUS || !AreBattlersOfOppositeGender(battlerAtk, battlerDef) || AI_IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL)) @@ -3575,7 +3544,7 @@ void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, bool32 isPartyMonAttacker, enum DamageRollType rollType) { struct SimulatedDamage dmg; - u8 effectiveness; + uq4_12_t effectiveness; struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); if (isPartyMonAttacker) @@ -4048,7 +4017,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) if (IsViableZMove(battlerAtk, chosenMove)) { - u8 effectiveness; + uq4_12_t effectiveness; u32 zMove = GetUsableZMove(battlerAtk, chosenMove); struct SimulatedDamage dmg; From 49cbebd21202338d1bb909bfca5496b930eb911c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:11:11 +0100 Subject: [PATCH 031/125] Remove formToChangeInto (Unused) (#6137) --- include/battle.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 10724041ca..9a4a57d004 100644 --- a/include/battle.h +++ b/include/battle.h @@ -678,7 +678,6 @@ struct BattleStruct u8 safariCatchFactor; u8 linkBattleVsSpriteId_V; // The letter "V" u8 linkBattleVsSpriteId_S; // The letter "S" - u8 formToChangeInto; u8 chosenMovePositions[MAX_BATTLERS_COUNT]; u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT]; u8 prevSelectedPartySlot; From 72edeeffad8a161614164c0d0cc73234fc8c332f Mon Sep 17 00:00:00 2001 From: bassforte123 <130828119+bassforte123@users.noreply.github.com> Date: Tue, 28 Jan 2025 15:37:02 -0500 Subject: [PATCH 032/125] Update pokemon.h with nature comments (#6133) --- include/constants/pokemon.h | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 8e76a9aba4..eef34716f4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -46,31 +46,31 @@ #define EGG_GROUPS_PER_MON 2 // Pokémon natures -#define NATURE_HARDY 0 -#define NATURE_LONELY 1 -#define NATURE_BRAVE 2 -#define NATURE_ADAMANT 3 -#define NATURE_NAUGHTY 4 -#define NATURE_BOLD 5 -#define NATURE_DOCILE 6 -#define NATURE_RELAXED 7 -#define NATURE_IMPISH 8 -#define NATURE_LAX 9 -#define NATURE_TIMID 10 -#define NATURE_HASTY 11 -#define NATURE_SERIOUS 12 -#define NATURE_JOLLY 13 -#define NATURE_NAIVE 14 -#define NATURE_MODEST 15 -#define NATURE_MILD 16 -#define NATURE_QUIET 17 -#define NATURE_BASHFUL 18 -#define NATURE_RASH 19 -#define NATURE_CALM 20 -#define NATURE_GENTLE 21 -#define NATURE_SASSY 22 -#define NATURE_CAREFUL 23 -#define NATURE_QUIRKY 24 +#define NATURE_HARDY 0 // Neutral +#define NATURE_LONELY 1 // +Atk -Def +#define NATURE_BRAVE 2 // +Atk -Speed +#define NATURE_ADAMANT 3 // +Atk -SpAtk +#define NATURE_NAUGHTY 4 // +Atk -SpDef +#define NATURE_BOLD 5 // +Def -Atk +#define NATURE_DOCILE 6 // Neutral +#define NATURE_RELAXED 7 // +Def -Speed +#define NATURE_IMPISH 8 // +Def -SpAtk +#define NATURE_LAX 9 // +Def -SpDef +#define NATURE_TIMID 10 // +Speed -Atk +#define NATURE_HASTY 11 // +Speed -Def +#define NATURE_SERIOUS 12 // Neutral +#define NATURE_JOLLY 13 // +Speed -SpAtk +#define NATURE_NAIVE 14 // +Speed - SpDef +#define NATURE_MODEST 15 // +SpAtk -Atk +#define NATURE_MILD 16 // +SpAtk -Def +#define NATURE_QUIET 17 // +SpAtk -Speed +#define NATURE_BASHFUL 18 // Neutral +#define NATURE_RASH 19 // +SpAtk -SpDef +#define NATURE_CALM 20 // +SpDef -Atk +#define NATURE_GENTLE 21 // +SpDef -Def +#define NATURE_SASSY 22 // +SpDef -Speed +#define NATURE_CAREFUL 23 // +SpDef -SpAtk +#define NATURE_QUIRKY 24 // Neutral #define NUM_NATURES 25 // Pokémon Stats From 392a16651bce00efa50bc74f0258d7567320fbc1 Mon Sep 17 00:00:00 2001 From: lordraindance2 <47706100+lordraindance2@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:04:16 -0500 Subject: [PATCH 033/125] Implemented clear animation for also overworld pokemon (#5825) --- src/scrcmd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scrcmd.c b/src/scrcmd.c index 399562f9a0..87e79745bd 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1005,7 +1005,8 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) struct ObjectEvent *objEvent; // When applying script movements to follower, it may have frozen animation that must be cleared - if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) + if ((localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) + || ((objEvent = &gObjectEvents[GetObjectEventIdByLocalId(localId)]) && IS_OW_MON_OBJ(objEvent))) { ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); gSprites[objEvent->spriteId].animCmdIndex = 0; // Reset start frame of animation From 95aa41f0d42e1089e4bb082a614cab02419ad701 Mon Sep 17 00:00:00 2001 From: shachar700 <48739719+shachar700@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:43:13 +0200 Subject: [PATCH 034/125] Fixed switchout bug in multibattle where order of mons gets messed up (#2099) --- src/battle_script_commands.c | 71 +++++++++++++++++++++++++++++++++++- src/battle_util2.c | 4 +- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1891ea9285..f1a03b7af7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7189,7 +7189,7 @@ static void Cmd_forcerandomswitch(void) s32 battler2PartyId = 0; s32 firstMonId; - s32 lastMonId = 0; // + 1 + s32 lastMonId = 0; s32 monsCount; struct Pokemon *party = NULL; s32 validMons = 0; @@ -7209,12 +7209,20 @@ static void Cmd_forcerandomswitch(void) if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7227,12 +7235,20 @@ static void Cmd_forcerandomswitch(void) if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == B_FLANK_RIGHT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7244,7 +7260,11 @@ static void Cmd_forcerandomswitch(void) if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 2; // since there are two opponents, it has to be a double battle } @@ -7253,12 +7273,20 @@ static void Cmd_forcerandomswitch(void) if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7269,7 +7297,11 @@ static void Cmd_forcerandomswitch(void) else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 2; battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; @@ -7278,7 +7310,11 @@ static void Cmd_forcerandomswitch(void) else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 1; battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one Pokémon out in single battles @@ -7301,6 +7337,38 @@ static void Cmd_forcerandomswitch(void) } else { + #ifdef BUGFIX + if (TryDoForceSwitchOut()) + { + do + { + do + { + i = Random() % monsCount; + i += firstMonId; + } + while (i == battler2PartyId || i == battler1PartyId); + } while (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE + || GetMonData(&party[i], MON_DATA_IS_EGG) == TRUE + || GetMonData(&party[i], MON_DATA_HP) == 0); //should be one while loop, but that doesn't match. + *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i; + + if (!IsMultiBattle()) + SwitchPartyOrder(gBattlerTarget); + + if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); + SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), i, 1); + } + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + SwitchPartyOrderInGameMulti(gBattlerTarget, i); + } + #else if (TryDoForceSwitchOut()) { do @@ -7331,6 +7399,7 @@ static void Cmd_forcerandomswitch(void) if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) SwitchPartyOrderInGameMulti(gBattlerTarget, i); + #endif } } else diff --git a/src/battle_util2.c b/src/battle_util2.c index 8a202c9867..8ecb0a79b4 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -109,12 +109,12 @@ void SwitchPartyOrderInGameMulti(u8 battlerId, u8 arg1) { s32 i; for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - gBattlePartyCurrentOrder[i] = *(0 * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)); + gBattlePartyCurrentOrder[i] = *(i + (u8 *)(gBattleStruct->battlerPartyOrders)); SwitchPartyMonSlots(GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battlerId]), GetPartyIdFromBattlePartyId(arg1)); for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - *(0 * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; + *(i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; } } From 6432027f6b0ad149b85d84fd36759eff1de6ae48 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:02:40 +0100 Subject: [PATCH 035/125] Replace BattleStruct members quickClawRandom/quickDrawRandom with locals (#6136) --- include/battle.h | 2 -- src/battle_main.c | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/include/battle.h b/include/battle.h index fe7c740639..77b2ffdae8 100644 --- a/include/battle.h +++ b/include/battle.h @@ -806,8 +806,6 @@ struct BattleStruct u8 dauntlessShieldBoost[NUM_BATTLE_SIDES]; u8 supersweetSyrup[NUM_BATTLE_SIDES]; u8 supremeOverlordCounter[MAX_BATTLERS_COUNT]; - u8 quickClawRandom[MAX_BATTLERS_COUNT]; - u8 quickDrawRandom[MAX_BATTLERS_COUNT]; u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. u8 categoryOverride; // for Z-Moves and Max Moves diff --git a/src/battle_main.c b/src/battle_main.c index 81e1e9821d..59f36ab1e1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -111,7 +111,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void UpdateBattlerPartyOrdersOnSwitch(u32 battler); static bool8 AllAtActionConfirmed(void); static void TryChangeTurnOrder(void); -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2); +static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom); static void CheckChangingTurnOrderEffects(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -5045,6 +5045,9 @@ static void SetActionsAndBattlersTurnOrder(void) } else { + u32 quickClawRandom[MAX_BATTLERS_COUNT] = {0}; + u32 quickDrawRandom[MAX_BATTLERS_COUNT] = {0}; + for (battler = 0; battler < gBattlersCount; battler++) { if (gChosenActionByBattler[battler] == B_ACTION_USE_ITEM @@ -5064,8 +5067,8 @@ static void SetActionsAndBattlersTurnOrder(void) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[battler]; gBattlerByTurnOrder[turnOrderId] = battler; - gBattleStruct->quickClawRandom[battler] = RandomPercentage(RNG_QUICK_CLAW, GetBattlerHoldEffectParam(battler)); - gBattleStruct->quickDrawRandom[battler] = RandomPercentage(RNG_QUICK_DRAW, 30); + quickClawRandom[battler] = RandomPercentage(RNG_QUICK_CLAW, GetBattlerHoldEffectParam(battler)); + quickDrawRandom[battler] = RandomPercentage(RNG_QUICK_DRAW, 30); turnOrderId++; } } @@ -5075,7 +5078,7 @@ static void SetActionsAndBattlersTurnOrder(void) { u8 battler1 = gBattlerByTurnOrder[i]; u8 battler2 = gBattlerByTurnOrder[j]; - TryChangingTurnOrderEffects(battler1, battler2); + TryChangingTurnOrderEffects(battler1, battler2, quickClawRandom, quickDrawRandom); if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -5254,7 +5257,7 @@ static void TryChangeTurnOrder(void) } } -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2) +static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { u32 ability1 = GetBattlerAbility(battler1); u32 holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); @@ -5263,21 +5266,21 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2) // Battler 1 // Quick Draw - if (ability1 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler1]) && gBattleStruct->quickDrawRandom[battler1]) + if (ability1 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler1]) && quickDrawRandom[battler1]) gProtectStructs[battler1].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw - && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gBattleStruct->quickClawRandom[battler1]) + && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler1]) || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].usedCustapBerry = TRUE; // Battler 2 // Quick Draw - if (ability2 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler2]) && gBattleStruct->quickDrawRandom[battler2]) + if (ability2 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler2]) && quickDrawRandom[battler2]) gProtectStructs[battler2].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw - && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gBattleStruct->quickClawRandom[battler2]) + && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler2]) || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].usedCustapBerry = TRUE; } From bc5adcac1814bf2d8841dd1c352c945d7e73b710 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:46:56 -0800 Subject: [PATCH 036/125] Updated Trainer Ids used in Trainer Slides tests (#6138) --- test/battle/trainer_slides.c | 26 +++++++++++++------------- test/battle/trainer_slides.h | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index b5bb127a0c..ee8b632f25 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_BEFORE_FIRST_TURN; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_BEFORE_FIRST_TURN; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; GIVEN { ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; GIVEN { ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; GIVEN { ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; GIVEN { ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -107,7 +107,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_SWITCHIN; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_SWITCHIN; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_HALF_HP; GIVEN { ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); @@ -154,7 +154,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_LOW_HP; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_LOW_HP; GIVEN { ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); PLAYER(SPECIES_WOBBUFFET) { Attack(999);} @@ -168,7 +168,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_MEGA_EVOLUTION; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_MEGA_EVOLUTION; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -184,7 +184,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") SINGLE_BATTLE_TEST("Trainer Slide: Z Move") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_Z_MOVE; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_Z_MOVE; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } @@ -200,7 +200,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Z Move") SINGLE_BATTLE_TEST("Trainer Slide: Dynamax") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_DYNAMAX; + gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_DYNAMAX; GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/trainer_slides.h b/test/battle/trainer_slides.h index cb62a00800..3c4dff852a 100644 --- a/test/battle/trainer_slides.h +++ b/test/battle/trainer_slides.h @@ -1,54 +1,54 @@ [DIFFICULTY_NORMAL] = { - [TRAINER_SLIDE_BEFORE_FIRST_TURN] = + [1 + TRAINER_SLIDE_BEFORE_FIRST_TURN] = { [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = + [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = + [1 + TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = { [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = + [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = + [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = + [1 + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = { [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = + [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_LAST_SWITCHIN] = + [1 + TRAINER_SLIDE_LAST_SWITCHIN] = { [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_LAST_HALF_HP] = + [1 + TRAINER_SLIDE_LAST_HALF_HP] = { [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_LAST_LOW_HP] = + [1 + TRAINER_SLIDE_LAST_LOW_HP] = { [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_MEGA_EVOLUTION] = + [1 + TRAINER_SLIDE_MEGA_EVOLUTION] = { [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_Z_MOVE] = + [1 + TRAINER_SLIDE_Z_MOVE] = { [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_DYNAMAX] = + [1 + TRAINER_SLIDE_DYNAMAX] = { [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), }, From b130a3846e993c66638169ac09a3a0a26c36bf03 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:09:00 -0800 Subject: [PATCH 037/125] Added Difficulty Fallback for Trainer Slides (#6088) --- src/trainer_slide.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/trainer_slide.c b/src/trainer_slide.c index a4788c3a95..209f47f0c3 100644 --- a/src/trainer_slide.c +++ b/src/trainer_slide.c @@ -59,14 +59,14 @@ static const u8* const sTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_ }, }; -static const u8* const sFrontierTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +static const u8* const sFrontierTrainerSlides[DIFFICULTY_COUNT][FRONTIER_TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = { [DIFFICULTY_NORMAL] = { }, }; -static const u8* const sTestTrainerSlides[DIFFICULTY_COUNT][FRONTIER_TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +static const u8* const sTestTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = { #include "../test/battle/trainer_slides.h" }; @@ -107,24 +107,36 @@ static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive) return count; } -static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) +static const u8* const *GetTrainerSlideArray(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) { if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - return (sFrontierTrainerSlides[difficulty][trainerId][slideId] != NULL); + return sFrontierTrainerSlides[difficulty][trainerId]; else if (TESTING) - return (sTestTrainerSlides[difficulty][trainerId][slideId] != NULL); + return sTestTrainerSlides[difficulty][trainerId]; else - return (sTrainerSlides[difficulty][trainerId][slideId] != NULL); + return sTrainerSlides[difficulty][trainerId]; +} + +static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) +{ + const u8* const *trainerSlides = GetTrainerSlideArray(difficulty, trainerId, slideId); + const u8* const *trainerSlidesNormal = GetTrainerSlideArray(DIFFICULTY_NORMAL, trainerId, slideId); + + if (trainerSlides[slideId] == NULL) + return (trainerSlidesNormal[slideId] != NULL); + else + return TRUE; } void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) { - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - gBattleStruct->trainerSlideMsg = sFrontierTrainerSlides[difficulty][trainerId][slideId]; - else if (TESTING) - gBattleStruct->trainerSlideMsg = sTestTrainerSlides[difficulty][trainerId][slideId]; + const u8* const *trainerSlides = GetTrainerSlideArray(difficulty, trainerId, slideId); + const u8* const *trainerSlidesNormal = GetTrainerSlideArray(DIFFICULTY_NORMAL, trainerId, slideId); + + if (trainerSlides[slideId] != NULL) + gBattleStruct->trainerSlideMsg = trainerSlides[slideId]; else - gBattleStruct->trainerSlideMsg = sTrainerSlides[difficulty][trainerId][slideId]; + gBattleStruct->trainerSlideMsg = trainerSlidesNormal[slideId]; } static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(enum TrainerSlideType slideId) @@ -232,7 +244,7 @@ enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType return TRAINER_SLIDE_TARGET_NONE; SetTrainerSlideParamters(battler, &firstId, &lastId, &trainerId, &retValue); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(trainerId); + enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); gBattleScripting.battler = battler; From 94c98e623304500cce2b2269fcefc18824024136 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:39:19 +0100 Subject: [PATCH 038/125] Clean up follow up for Simultaneous Reduction HP (#6139) --- include/battle.h | 5 --- src/battle_script_commands.c | 68 +++++++++++++++---------------- src/battle_tv.c | 2 +- src/battle_util.c | 78 ++++++++++++++++++------------------ 4 files changed, 74 insertions(+), 79 deletions(-) diff --git a/include/battle.h b/include/battle.h index 77b2ffdae8..12af6d1ad2 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1248,10 +1248,5 @@ static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDe || (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH)); } -static inline bool32 MoveResultHasEffect(u32 battler) -{ - return !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT); -} - #endif // GUARD_BATTLE_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 485fc608ac..c0d191ebe5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1144,7 +1144,7 @@ bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef) && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP && !IsBattleMoveStatus(move) - && MoveResultHasEffect(battlerDef) + && !(gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) && GetBattlerAbility(battlerDef) == ABILITY_TERA_SHELL) return TRUE; @@ -1349,7 +1349,7 @@ static void Cmd_attackcanceler(void) static bool32 JumpIfMoveFailed(u8 adder, u16 move) { - if (!MoveResultHasEffect(gBattlerTarget)) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; @@ -2207,7 +2207,7 @@ static void Cmd_adjustdamage(void) gBattlescriptCurrInstr = cmd->nextInstr; if (gSpecialStatuses[gBattlerAttacker].gemBoost - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleMons[gBattlerAttacker].item && moveEffect != EFFECT_PLEDGE @@ -2522,7 +2522,7 @@ static void Cmd_healthbarupdate(void) if (gBattleControllerExecFlags) return; - if (MoveResultHasEffect(battler) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { @@ -2566,7 +2566,7 @@ static void Cmd_datahpupdate(void) u32 battler = GetBattlerForBattleScript(cmd->battler); - if (MoveResultHasEffect(battler) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { @@ -2694,7 +2694,7 @@ static void Cmd_critmessage(void) if (gBattleControllerExecFlags == 0) { - if (gSpecialStatuses[gBattlerTarget].criticalHit && MoveResultHasEffect(gBattlerTarget)) + if (gSpecialStatuses[gBattlerTarget].criticalHit && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); @@ -2727,7 +2727,7 @@ static void Cmd_effectivenesssound(void) } moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); } - else if (MoveResultHasEffect(gBattlerTarget) && DoesBattlerNegateDamage(gBattlerTarget)) + else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && DoesBattlerNegateDamage(gBattlerTarget)) moveResultFlags = 0; if (!(moveResultFlags & MOVE_RESULT_MISSED)) @@ -4334,7 +4334,7 @@ static void Cmd_setadditionaleffects(void) { CMD_ARGS(); - if (MoveResultHasEffect(gBattlerTarget)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) @@ -5995,7 +5995,7 @@ static void Cmd_moveend(void) // Not strictly a protect effect, but works the same way else if (gProtectStructs[gBattlerTarget].beakBlastCharge && CanBeBurned(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && MoveResultHasEffect(gBattlerTarget)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; @@ -6018,7 +6018,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; } - else if (IsBattlerAlive(gBattlerAttacker) && MoveResultHasEffect(gBattlerTarget)) + else if (IsBattlerAlive(gBattlerAttacker) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); @@ -6047,7 +6047,7 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget) - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && !IsBattleMoveStatus(gCurrentMove) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -6065,7 +6065,7 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) - && MoveResultHasEffect(gBattlerTarget)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -6078,7 +6078,7 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && MoveThawsUser(originallyUsedMove) - && MoveResultHasEffect(gBattlerTarget)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -6098,7 +6098,7 @@ static void Cmd_moveend(void) break; } else if (moveRecoil > 0 - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one { @@ -6321,7 +6321,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible - if (!MoveResultHasEffect(gBattlerTarget) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) || WasUnableToUseMove(gBattlerAttacker)) { @@ -6349,7 +6349,7 @@ static void Cmd_moveend(void) case MOVEEND_NUM_HITS: if (gBattlerAttacker != gBattlerTarget && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget)) { gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; @@ -6458,7 +6458,7 @@ static void Cmd_moveend(void) if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) gLastHitBy[gBattlerTarget] = gBattlerAttacker; - if (gHitMarker & HITMARKER_OBEYS && MoveResultHasEffect(gBattlerTarget)) + if (gHitMarker & HITMARKER_OBEYS && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { if (gChosenMove == MOVE_UNAVAILABLE) { @@ -6484,7 +6484,7 @@ static void Cmd_moveend(void) && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)) - && MoveResultHasEffect(gBattlerTarget)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleStruct->lastTakenMove[gBattlerTarget] = gChosenMove; gBattleStruct->lastTakenMoveFrom[gBattlerTarget][gBattlerAttacker] = gChosenMove; @@ -6496,7 +6496,7 @@ static void Cmd_moveend(void) u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); // Set a flag if move hits either target (for throat spray that can't check damage) if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && MoveResultHasEffect(gBattlerTarget)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) gProtectStructs[gBattlerAttacker].targetAffected = TRUE; gBattleStruct->battlerState[gBattlerAttacker].targetsDone[gBattlerTarget] = TRUE; @@ -6557,7 +6557,7 @@ static void Cmd_moveend(void) } case MOVEEND_MULTIHIT_MOVE: { - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gMultiHitCounter && !(moveEffect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case @@ -6636,7 +6636,7 @@ static void Cmd_moveend(void) && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate. && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) { StealTargetItem(gBattlerAttacker, gBattlerTarget); @@ -6809,7 +6809,7 @@ static void Cmd_moveend(void) && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) // Pickpocket doesn't activate for sheer force && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) // Pickpocket requires contact - && MoveResultHasEffect(gBattlerTarget)) // Obviously attack needs to have worked + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked { u8 battlers[4] = {0, 1, 2, 3}; SortBattlersBySpeed(battlers, FALSE); // Pickpocket activates for fastest mon without item @@ -6954,8 +6954,8 @@ static void Cmd_moveend(void) gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; if (B_RAMPAGE_CANCELLING >= GEN_5 - && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging - && !MoveResultHasEffect(gBattlerTarget) // And it is unusable + && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging + && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT // And it is unusable && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker); // Cancel it @@ -6999,7 +6999,7 @@ static void Cmd_moveend(void) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || !MoveResultHasEffect(gBattlerTarget))) + if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); ClearDamageCalcResults(); @@ -8230,7 +8230,7 @@ static void Cmd_hitanimation(void) { u32 battler = GetBattlerForBattleScript(cmd->battler); - if (MoveResultHasEffect(battler)) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) { if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) @@ -9080,7 +9080,7 @@ static void Cmd_useitemonopponent(void) static bool32 HasAttackerFaintedTarget(void) { - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattleMoveStatus(gCurrentMove) && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget @@ -11809,7 +11809,7 @@ static void Cmd_stockpile(void) } break; case 1: // Save def/sp def stats. - if (MoveResultHasEffect(gBattlerTarget)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; @@ -13786,7 +13786,7 @@ static void Cmd_handlerollout(void) { CMD_ARGS(); - if (!MoveResultHasEffect(gBattlerTarget)) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveMissedPause; @@ -13824,7 +13824,7 @@ static void Cmd_handlefurycutter(void) { CMD_ARGS(); - if (!MoveResultHasEffect(gBattlerTarget)) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; gBattlescriptCurrInstr = BattleScript_MoveMissedPause; @@ -14872,7 +14872,7 @@ static void Cmd_tryswapabilities(void) } else { - if (!MoveResultHasEffect(gBattlerTarget) || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -15428,7 +15428,7 @@ static void Cmd_removelightscreenreflect(void) side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (B_BRICK_BREAK >= GEN_5) - failed = !MoveResultHasEffect(gBattlerTarget); + failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; else failed = FALSE; @@ -17487,7 +17487,7 @@ void BS_TryActivateGulpMissile(void) { NATIVE_ARGS(); - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT @@ -17689,7 +17689,7 @@ void BS_TryHitSwitchTarget(void) if (IsBattlerAlive(gBattlerAttacker) && IsBattlerAlive(gBattlerTarget) - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT && GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG) diff --git a/src/battle_tv.c b/src/battle_tv.c index 2dd171a35a..3ac5259c74 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1261,7 +1261,7 @@ static void TrySetBattleSeminarShow(void) damageCalcData.updateFlags = FALSE; gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, powerOverride); dmgByMove[i] = gBattleStruct->moveDamage[gBattlerTarget]; - if (dmgByMove[i] == 0 && MoveResultHasEffect(gBattlerTarget)) + if (dmgByMove[i] == 0 && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; } } diff --git a/src/battle_util.c b/src/battle_util.c index fbb1d1b26d..c0a320b69b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5622,7 +5622,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 switch (gLastUsedAbility) { case ABILITY_JUSTIFIED: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && moveType == TYPE_DARK @@ -5636,7 +5636,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_RATTLED: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) @@ -5650,7 +5650,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WATER_COMPACTION: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && moveType == TYPE_WATER @@ -5664,7 +5664,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STAMINA: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) @@ -5678,7 +5678,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_BERSERK: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && HadMoreThanHalfHpNowDoesnt(battler) @@ -5695,7 +5695,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_EMERGENCY_EXIT: case ABILITY_WIMP_OUT: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) // Had more than half of hp before, now has less @@ -5713,7 +5713,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WEAK_ARMOR: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && IsBattleMovePhysical(gCurrentMove) @@ -5729,7 +5729,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CURSED_BODY: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) @@ -5748,7 +5748,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_LINGERING_AROMA: case ABILITY_MUMMY: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -5773,7 +5773,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WANDERING_SPIRIT: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -5797,7 +5797,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_POINT: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && gSpecialStatuses[battler].criticalHit && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) @@ -5810,7 +5810,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COLOR_CHANGE: - if (MoveResultHasEffect(battler) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && move != MOVE_STRUGGLE && !IsBattleMoveStatus(move) && IsBattlerTurnDamaged(gBattlerTarget) @@ -5828,7 +5828,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GOOEY: case ABILITY_TANGLING_HAIR: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg @@ -5846,7 +5846,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ROUGH_SKIN: case ABILITY_IRON_BARBS: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5863,7 +5863,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_AFTERMATH: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -5887,7 +5887,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_INNARDS_OUT: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { @@ -5933,7 +5933,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 goto STATIC; // Sleep if (i < sleep - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5957,7 +5957,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5978,7 +5978,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5996,7 +5996,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_FLAME_BODY: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -6014,7 +6014,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CUTE_CHARM: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -6042,7 +6042,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COTTON_DOWN: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget)) @@ -6054,7 +6054,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STEAM_ENGINE: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) @@ -6068,7 +6068,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SAND_SPIT: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect())) @@ -6089,7 +6089,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_PERISH_BODY: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) @@ -6110,7 +6110,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_GULP_MISSILE: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) @@ -6141,7 +6141,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SEED_SOWER: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) @@ -6153,7 +6153,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_THERMAL_EXCHANGE: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) @@ -6167,7 +6167,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_SHELL: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) // Activates after all hits from a multi-hit move. @@ -6185,7 +6185,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; // fall through case ABILITY_ELECTROMORPHOSIS: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) @@ -6196,7 +6196,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_DEBRIS: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && (!gBattleStruct->isSkyBattle) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattleMovePhysical(gCurrentMove) @@ -6215,7 +6215,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 switch (gLastUsedAbility) { case ABILITY_POISON_TOUCH: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget)) @@ -6233,7 +6233,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_CHAIN: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget)) @@ -6249,7 +6249,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STENCH: - if (MoveResultHasEffect(gBattlerTarget) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && RandomChance(RNG_STENCH, 1, 10) @@ -8149,7 +8149,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) atkHoldEffectParam *= 2; if (gBattleStruct->moveDamage[battler] != 0 // Need to have done damage - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && !MoveIgnoresKingsRock(gCurrentMove) && gBattleMons[gBattlerTarget].hp @@ -8184,7 +8184,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { case HOLD_EFFECT_SHELL_BELL: if (gBattleScripting.savedDmg > 0 - && MoveResultHasEffect(battler) + && !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget && !IsBattlerAtMaxHp(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker) @@ -8238,7 +8238,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case ITEMEFFECT_TARGET: - if (MoveResultHasEffect(gBattlerTarget)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { moveType = GetBattleMoveType(gCurrentMove); switch (battlerHoldEffect) @@ -8385,7 +8385,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_STICKY_BARB: if (IsBattlerTurnDamaged(gBattlerTarget) - && MoveResultHasEffect(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) @@ -12249,7 +12249,7 @@ u32 NumAffectedSpreadMoveTargets(void) targetCount = 0; for (u32 battler = 0; battler < gBattlersCount; battler++) { - if (MoveResultHasEffect(battler)) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) targetCount++; } From 32eb5dfba592c47ae9a904a1277c831d06abb9d4 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:58:16 +0100 Subject: [PATCH 039/125] Remove global sBattler_AI (#6128) --- include/battle_ai_main.h | 24 +++++++--- include/battle_ai_util.h | 8 ++-- src/battle_ai_main.c | 86 ++++++++++++++++++------------------ src/battle_ai_switch_items.c | 2 +- src/battle_ai_util.c | 73 +++++++++++++++--------------- src/battle_gfx_sfx_util.c | 2 +- src/battle_main.c | 5 +-- 7 files changed, 104 insertions(+), 96 deletions(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 3617be910f..f30759fd24 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -57,21 +57,30 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define SET_SCORE(battler, movesetIndex, val) \ do \ { \ - TestRunner_Battle_AISetScore(__FILE__, __LINE__, battler, movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AISetScore(__FILE__, __LINE__, battler, movesetIndex, val); \ + } \ AI_THINKING_STRUCT->score[movesetIndex] = val; \ } while (0) \ #define ADJUST_SCORE(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ score += val; \ } while (0) \ #define ADJUST_AND_RETURN_SCORE(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ score += val; \ return score; \ } while (0) \ @@ -79,7 +88,10 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define ADJUST_SCORE_PTR(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ (*score) += val; \ } while (0) \ @@ -98,13 +110,11 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); void BattleAI_SetupItems(void); void BattleAI_SetupFlags(void); void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler); -u32 BattleAI_ChooseMoveOrAction(void); +u32 BattleAI_ChooseMoveOrAction(u32 battler); void Ai_InitPartyStruct(void); void Ai_UpdateSwitchInData(u32 battler); void Ai_UpdateFaintData(u32 battler); void SetAiLogicDataForTurn(struct AiLogicData *aiData); void ResetDynamicAiFunc(void); -extern u8 sBattler_AI; - #endif // GUARD_BATTLE_AI_MAIN_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 44aa9a9ce6..6ea9660168 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -56,8 +56,8 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); s32 AI_DecideKnownAbilityForTurn(u32 battlerId); u32 AI_DecideHoldEffectForTurn(u32 battlerId); -bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move); -u32 AI_GetWeather(struct AiLogicData *aiData); +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); +u32 AI_GetWeather(void); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, u32 numHits); bool32 HasDamagingMove(u32 battlerId); @@ -84,7 +84,7 @@ u32 AI_GetBattlerAbility(u32 battler); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat); +bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 battlerAbility, u32 stat); bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); @@ -125,7 +125,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(u32 moveEffect); bool32 IsNonVolatileStatusMoveEffect(u32 moveEffect); -bool32 IsMoveRedirectionPrevented(u32 move, u32 atkAbility); +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMoveEffect(u32 moveEffect); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cadf627e20..95e0e3ef5f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -40,7 +40,6 @@ static bool32 IsPinchBerryItemEffect(u32 holdEffect); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests -EWRAM_DATA u8 sBattler_AI = 0; EWRAM_DATA AiScoreFunc sDynamicAiFunc = NULL; // const rom data @@ -268,25 +267,24 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) SET_SCORE(battler, i, 0); } - //sBattler_AI = battler; - gBattlerTarget = SetRandomTarget(sBattler_AI); - gBattleStruct->aiChosenTarget[sBattler_AI] = gBattlerTarget; + gBattlerTarget = SetRandomTarget(battler); + gBattleStruct->aiChosenTarget[battler] = gBattlerTarget; } -u32 BattleAI_ChooseMoveOrAction(void) +u32 BattleAI_ChooseMoveOrAction(u32 battler) { u32 ret; if (!IsDoubleBattle()) - ret = ChooseMoveOrAction_Singles(sBattler_AI); + ret = ChooseMoveOrAction_Singles(battler); else - ret = ChooseMoveOrAction_Doubles(sBattler_AI); + ret = ChooseMoveOrAction_Doubles(battler); // Clear protect structures, some flags may be set during AI calcs // e.g. pranksterElevated from GetBattleMovePriority memset(&gProtectStructs, 0, MAX_BATTLERS_COUNT * sizeof(struct ProtectStruct)); #if TESTING - TestRunner_Battle_CheckAiMoveScores(sBattler_AI); + TestRunner_Battle_CheckAiMoveScores(battler); #endif // TESTING return ret; } @@ -469,7 +467,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) gBattleStruct->aiDelayTimer = gMain.vblankCounter1; aiData->weatherHasEffect = HasWeatherEffect(); - weather = AI_GetWeather(aiData); + weather = AI_GetWeather(); // get/assume all battler data and simulate AI damage battlersCount = gBattlersCount; @@ -583,7 +581,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) AI_DATA->partnerMove = GetAllyChosenMove(battlerAi); AI_THINKING_STRUCT->aiLogicId = 0; AI_THINKING_STRUCT->movesetIndex = 0; - flags = AI_THINKING_STRUCT->aiFlags[sBattler_AI]; + flags = AI_THINKING_STRUCT->aiFlags[battlerAi]; while (flags != 0) { @@ -747,7 +745,7 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink PokemonToBattleMon(&party[aiData->mostSuitableMonId[battlerDef]], &switchinCandidate); gBattleMons[battlerDef] = switchinCandidate; SetBattlerAiData(battlerDef, aiData); - CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather(aiData)); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather()); // Regular processing with new battler do @@ -893,7 +891,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(moveTarget & MOVE_TARGET_USER)) { // target ability checks - if (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) RETURN_SCORE_MINUS(20); @@ -989,7 +987,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_LEAF_GUARD: - if ((AI_GetWeather(aiData) & B_WEATHER_SUN) + if ((AI_GetWeather() & B_WEATHER_SUN) && aiData->holdEffects[battlerDef] != HOLD_EFFECT_UTILITY_UMBRELLA && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); @@ -1005,11 +1003,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { case ABILITY_LIGHTNING_ROD: - if (moveType == TYPE_ELECTRIC && !IsMoveRedirectionPrevented(move, aiData->abilities[battlerAtk])) + if (moveType == TYPE_ELECTRIC && !IsMoveRedirectionPrevented(battlerAtk, move, aiData->abilities[battlerAtk])) RETURN_SCORE_MINUS(20); break; case ABILITY_STORM_DRAIN: - if (moveType == TYPE_WATER && !IsMoveRedirectionPrevented(move, aiData->abilities[battlerAtk])) + if (moveType == TYPE_WATER && !IsMoveRedirectionPrevented(battlerAtk, move, aiData->abilities[battlerAtk])) RETURN_SCORE_MINUS(20); break; case ABILITY_MAGIC_BOUNCE: @@ -1067,7 +1065,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return 0; // Can't even select heal blocked move // primal weather check - weather = AI_GetWeather(aiData); + weather = AI_GetWeather(); if (weather & B_WEATHER_PRIMAL_ANY) { switch (moveEffect) @@ -1118,7 +1116,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); } - else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { ADJUST_SCORE(-10); } @@ -1357,36 +1355,36 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // stat lowering effects case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_HYPER_CUTTER) ADJUST_SCORE(-10); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_DEF)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_DEF)) ADJUST_SCORE(-10); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_SPEED_BOOST) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPDEF)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ACC)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ACC)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_KEEN_EYE || aiData->abilities[battlerDef] == ABILITY_MINDS_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && aiData->abilities[battlerDef] == ABILITY_ILLUMINATE)) @@ -1395,9 +1393,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: case EFFECT_TICKLE: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_DEF)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_DEF)) ADJUST_SCORE(-8); break; case EFFECT_VENOM_DRENCH: @@ -1407,18 +1405,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) ADJUST_SCORE(-8); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-6); } break; case EFFECT_NOBLE_ROAR: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-8); break; case EFFECT_CAPTIVATE: @@ -1479,7 +1477,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOXIC_THREAD: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison //fallthrough case EFFECT_POISON: @@ -1894,7 +1892,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_COPYCAT: @@ -1943,7 +1941,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if ((AI_GetWeather(aiData) & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) + if ((AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) ADJUST_SCORE(-3); else if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); @@ -2716,7 +2714,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) && moveEffect != EFFECT_DESTINY_BOND && moveEffect != EFFECT_WISH && moveEffect != EFFECT_HEALING_WISH - && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather(aiData) & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) + && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) ADJUST_SCORE(-30); // Don't use a status move if the mon is the last one in the party, has no good switchin, or is trapped else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS @@ -2895,7 +2893,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { // partner ability checks - if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { switch (atkPartnerAbility) { @@ -3597,7 +3595,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) || HasMoveEffect(EFFECT_SNORE, battlerAtk) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD - || (AI_GetWeather(aiData) & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) + || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -4070,12 +4068,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->abilities[battlerDef]) { case ABILITY_SWIFT_SWIM: - if (AI_GetWeather(aiData) & B_WEATHER_RAIN) + if (AI_GetWeather() & B_WEATHER_RAIN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; case ABILITY_CHLOROPHYLL: case ABILITY_FLOWER_GIFT: - if (AI_GetWeather(aiData) & B_WEATHER_SUN) + if (AI_GetWeather() & B_WEATHER_SUN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; } @@ -4523,7 +4521,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SHORE_UP: - if ((AI_GetWeather(aiData) & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) + if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) ADJUST_SCORE(DECENT_EFFECT); else if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(DECENT_EFFECT); @@ -5373,23 +5371,23 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SANDSTORM: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SUNNY_DAY: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_RAIN_DANCE: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_HAIL: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SNOWSCAPE: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index e90423a796..c341fb5175 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -90,7 +90,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) //Variable initialization u8 opposingPosition, atkType1, atkType2, defType1, defType2; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; - u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler, weather = AI_GetWeather(AI_DATA); + u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler, weather = AI_GetWeather(); bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u16 typeEffectiveness = UQ_4_12(1.0), aiMoveEffect; //baseline typing damage uq4_12_t effectiveness; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dbb5aa8414..3f0b86fcd1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -393,7 +393,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(AI_DATA), rollType); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(), rollType); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -426,7 +426,7 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy u32 battlerDefAbility; u32 partnerBattlerDefAbility; - if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { battlerDefAbility = ABILITY_NONE; partnerBattlerDefAbility = ABILITY_NONE; @@ -877,7 +877,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -887,7 +887,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; } @@ -944,7 +944,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_ATK_DEF_DOWN: case MOVE_EFFECT_DEF_SPDEF_DOWN: if ((additionalEffect->self && abilityAtk != ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(abilityAtk, move))) + || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move))) return TRUE; break; case MOVE_EFFECT_RECHARGE: @@ -965,7 +965,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_ALL_STATS_UP: if ((additionalEffect->self && abilityAtk == ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(abilityAtk, move)))) + || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)))) return TRUE; break; } @@ -1122,7 +1122,7 @@ static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) if (AI_DATA->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; - if (!DoesBattlerIgnoreAbilityChecks(AI_DATA->abilities[battler], move)) + if (!DoesBattlerIgnoreAbilityChecks(battler, AI_DATA->abilities[battler], move)) { if (B_STURDY >= GEN_5 && AI_DATA->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; @@ -1377,30 +1377,31 @@ u32 AI_DecideHoldEffectForTurn(u32 battlerId) return holdEffect; } -bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move) +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept - if (IsMoldBreakerTypeAbility(sBattler_AI, atkAbility) || MoveIgnoresTargetAbility(move)) + if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) return TRUE; return FALSE; } -static inline bool32 AI_WeatherHasEffect(struct AiLogicData *aiData) +static inline bool32 AI_WeatherHasEffect(void) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE + || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) return TRUE; // AI doesn't understand weather supression (handicap) - return aiData->weatherHasEffect; // weather damping abilities are announced + return AI_DATA->weatherHasEffect; // weather damping abilities are announced } -u32 AI_GetWeather(struct AiLogicData *aiData) +u32 AI_GetWeather(void) { if (gBattleWeather == B_WEATHER_NONE) return B_WEATHER_NONE; - if (!AI_WeatherHasEffect(aiData)) + if (!AI_WeatherHasEffect()) return B_WEATHER_NONE; return gBattleWeather; } @@ -1464,9 +1465,9 @@ bool32 IsHazardMoveEffect(u32 moveEffect) } } -bool32 IsMoveRedirectionPrevented(u32 move, u32 atkAbility) +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; u32 effect = GetMoveEffect(move); @@ -1514,7 +1515,7 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) return TRUE; // discouraged from hitting - weather = AI_GetWeather(AI_DATA); + weather = AI_GetWeather(); if ((weather & B_WEATHER_SUN) && effect == EFFECT_THUNDER) return FALSE; @@ -1542,7 +1543,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)) return FALSE; - if (!DoesBattlerIgnoreAbilityChecks(atkAbility, move) && defAbility == ABILITY_STURDY) + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, atkAbility, move) && defAbility == ABILITY_STURDY) return FALSE; if ((((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS) @@ -1565,7 +1566,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SANDSTORM) return FALSE; @@ -1586,7 +1587,7 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) return FALSE; @@ -1609,7 +1610,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_RAIN) return FALSE; @@ -1630,7 +1631,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SUN) return FALSE; @@ -1656,7 +1657,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSnow(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) return FALSE; @@ -1714,11 +1715,11 @@ void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, } // stat stages -bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat) +bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 battlerAbility, u32 stat) { - if (gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) + if (gBattleMons[battlerDef].statStages[stat] > MIN_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) { - if (AI_DATA->holdEffects[battler] == HOLD_EFFECT_CLEAR_AMULET + if (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET || battlerAbility == ABILITY_CLEAR_BODY || battlerAbility == ABILITY_WHITE_SMOKE || battlerAbility == ABILITY_FULL_METAL_BODY) @@ -1732,9 +1733,9 @@ bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat) return !(battlerAbility == ABILITY_BIG_PECKS); case STAT_SPEED: // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(sBattler_AI, battler, AI_THINKING_STRUCT->moveConsidered) - && CountUsablePartyMons(sBattler_AI) == 0 - && !HasMoveEffect(sBattler_AI, EFFECT_ELECTRO_BALL)); + return !(AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) + && CountUsablePartyMons(battlerAtk) == 0 + && !HasMoveEffect(battlerAtk, EFFECT_ELECTRO_BALL)); case STAT_ACC: return !(battlerAbility == ABILITY_KEEN_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE)); } @@ -2491,7 +2492,7 @@ bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) case EFFECT_SOLAR_BEAM: case EFFECT_TWO_TURNS_ATTACK: return !(AI_DATA->holdEffects[battlerAtk] == HOLD_EFFECT_POWER_HERB - || (AI_GetWeather(AI_DATA) & GetMoveTwoTurnAttackWeather(move))); + || (AI_GetWeather() & GetMoveTwoTurnAttackWeather(move))); default: return FALSE; } @@ -2603,7 +2604,7 @@ static u32 GetWeatherDamage(u32 battlerId) u32 ability = AI_DATA->abilities[battlerId]; u32 holdEffect = AI_DATA->holdEffects[battlerId]; u32 damage = 0; - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (!weather) return 0; @@ -3007,7 +3008,7 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) { if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(AI_DATA->abilities[battlerAtk], move)) + || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, AI_DATA->abilities[battlerAtk], move)) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) @@ -3297,7 +3298,7 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, u32 moveEffect) { case EFFECT_AURORA_VEIL: // Use only in Hail and only if AI doesn't already have Reflect, Light Screen or Aurora Veil itself active. - if ((AI_GetWeather(AI_DATA) & (B_WEATHER_HAIL | B_WEATHER_SNOW)) + if ((AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; @@ -3562,7 +3563,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl AI_THINKING_STRUCT->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather(AI_DATA), rollType); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather(), rollType); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); @@ -4123,7 +4124,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st u32 partnerAbility; u32 partnerHoldEffect = aiData->holdEffects[battlerAtkPartner]; - if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) partnerAbility = ABILITY_NONE; else partnerAbility = aiData->abilities[battlerAtkPartner]; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 945fa660ca..a71ee9c94f 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -199,7 +199,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) gBattleStruct->palaceFlags &= (1 << MAX_BATTLERS_COUNT) - 1; gBattleStruct->palaceFlags |= (selectedMoves << MAX_BATTLERS_COUNT); BattleAI_SetupAIData(selectedMoves, battler); - chosenMoveId = BattleAI_ChooseMoveOrAction(); + chosenMoveId = BattleAI_ChooseMoveOrAction(battler); } // If no moves matched the selected group, pick a new move from groups the Pokémon has diff --git a/src/battle_main.c b/src/battle_main.c index 59f36ab1e1..3360bd3515 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4191,12 +4191,11 @@ static void HandleTurnActionSelectionState(void) AI_DATA->aiCalcInProgress = TRUE; // Setup battler data - sBattler_AI = battler; - BattleAI_SetupAIData(0xF, sBattler_AI); + BattleAI_SetupAIData(0xF, battler); SetupAISwitchingData(battler, isAiRisky); // Do scoring - gBattleStruct->aiMoveOrAction[battler] = BattleAI_ChooseMoveOrAction(); + gBattleStruct->aiMoveOrAction[battler] = BattleAI_ChooseMoveOrAction(battler); AI_DATA->aiCalcInProgress = FALSE; } // fallthrough From d0bd82452f051f71dd18c87eb2b22fd0e1c71ae5 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 30 Jan 2025 01:13:53 +0100 Subject: [PATCH 040/125] Added some TO_DO tests (#6140) Co-authored-by: Hedara --- test/battle/ability/aroma_veil.c | 201 +++++++++++++++++++++++++-- test/battle/ability/chlorophyll.c | 50 ++++++- test/battle/ability/electric_surge.c | 13 +- test/battle/ability/grassy_surge.c | 13 +- test/battle/ability/hydration.c | 13 +- test/battle/ability/misty_surge.c | 13 +- test/battle/ability/psychic_surge.c | 13 +- test/battle/ability/snow_cloak.c | 29 +++- test/battle/ability/stance_change.c | 2 - test/battle/gimmick/dynamax.c | 19 ++- 10 files changed, 343 insertions(+), 23 deletions(-) diff --git a/test/battle/ability/aroma_veil.c b/test/battle/ability/aroma_veil.c index dc53fa1492..4965fec217 100644 --- a/test/battle/ability/aroma_veil.c +++ b/test/battle/ability/aroma_veil.c @@ -1,15 +1,198 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Taunt"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Torment"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Encore"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Cursed Body"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Heal Block"); -TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation"); -TO_DO_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Imprison"); +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Taunt") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); + ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TAUNT, target: moveTarget); MOVE(moveTarget, MOVE_HARDEN); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Torment") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); + ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TORMENT, target: moveTarget); MOVE(moveTarget, MOVE_HARDEN); } + TURN { MOVE(moveTarget, MOVE_HARDEN); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TORMENT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Encore") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ENCORE, target: moveTarget); MOVE(moveTarget, MOVE_HARDEN); } + TURN { MOVE(moveTarget, MOVE_CELEBRATE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); + ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_DISABLE, target: moveTarget); MOVE(moveTarget, MOVE_HARDEN); } + TURN { MOVE(moveTarget, MOVE_HARDEN); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Cursed Body") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_PECK].makesContact); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_JELLICENT) { Ability(ABILITY_CURSED_BODY); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PECK, target: opponentLeft); MOVE(playerRight, MOVE_PECK, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_PECK, target: opponentLeft); MOVE(playerRight, MOVE_PECK, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PECK, playerLeft); + NOT ABILITY_POPUP(opponentLeft, ABILITY_CURSED_BODY); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PECK, playerRight); + NOT ABILITY_POPUP(opponentLeft, ABILITY_CURSED_BODY); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PECK, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PECK, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Heal Block") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_HEAL_BLOCK].effect == EFFECT_HEAL_BLOCK); + ASSUME(gMovesInfo[MOVE_RECOVER].effect == EFFECT_RESTORE_HP); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_HEAL_BLOCK, target: moveTarget); MOVE(moveTarget, MOVE_RECOVER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RECOVER, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ATTRACT, target: moveTarget); MOVE(moveTarget, MOVE_CELEBRATE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, moveTarget); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Imprison") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_IMPRISON].effect == EFFECT_IMPRISON); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) {Moves(MOVE_IMPRISON, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_IMPRISON); MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); MOVE(opponentRight, MOVE_SPLASH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_IMPRISON, opponentLeft); + NONE_OF { + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Aroma Veil prevents Psychic Noise's effect") +{ + struct BattlePokemon *moveTarget = NULL; + PARAMETRIZE { moveTarget = playerLeft; } + PARAMETRIZE { moveTarget = playerRight; } + GIVEN { + ASSUME(gMovesInfo[MOVE_PSYCHIC_NOISE].additionalEffects[0].moveEffect == MOVE_EFFECT_PSYCHIC_NOISE); + PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PSYCHIC_NOISE, target: moveTarget); MOVE(moveTarget, MOVE_RECOVER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHIC_NOISE, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_AROMA_VEIL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RECOVER, moveTarget); + } +} // Marked in Bulbapedia as need of research //TO_DO_BATTLE_TEST("Aroma Veil prevents G-Max Meltdown's effect"); -//TO_DO_BATTLE_TEST("Aroma Veil prevents Psychic Noise's effect"); diff --git a/test/battle/ability/chlorophyll.c b/test/battle/ability/chlorophyll.c index 493a197638..84546dbe4c 100644 --- a/test/battle/ability/chlorophyll.c +++ b/test/battle/ability/chlorophyll.c @@ -1,6 +1,50 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Chlorophyll doubles speed if it's sunny"); -TO_DO_BATTLE_TEST("Chlorophyll doesn't double speed if Cloud Nine/Air Lock is on the field"); -TO_DO_BATTLE_TEST("Chlorophyll doesn't double speed if they have an Utility Umbrella"); +SINGLE_BATTLE_TEST("Chlorophyll doubles speed if it's sunny") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Ability(ABILITY_CHLOROPHYLL); Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(199); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SUNNY_DAY); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } +} + +SINGLE_BATTLE_TEST("Chlorophyll doesn't double speed if Cloud Nine/Air Lock is on the field") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Ability(ABILITY_CHLOROPHYLL); Speed(100); } + OPPONENT(SPECIES_GOLDUCK) { Speed(199); Ability(ABILITY_CLOUD_NINE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SUNNY_DAY); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} + +SINGLE_BATTLE_TEST("Chlorophyll doesn't double speed if they have an Utility Umbrella") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Ability(ABILITY_CHLOROPHYLL); Speed(100); Item(ITEM_UTILITY_UMBRELLA); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(199); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SUNNY_DAY); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} diff --git a/test/battle/ability/electric_surge.c b/test/battle/ability/electric_surge.c index 3509f1c687..3213cfc323 100644 --- a/test/battle/ability/electric_surge.c +++ b/test/battle/ability/electric_surge.c @@ -1,4 +1,15 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Electric Surge creates Electric Terrain when entering the battle"); +SINGLE_BATTLE_TEST("Electric Surge creates Electric Terrain when entering the battle") +{ + GIVEN { + PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_ELECTRIC_SURGE); + MESSAGE("An electric current ran across the battlefield!"); + } +} diff --git a/test/battle/ability/grassy_surge.c b/test/battle/ability/grassy_surge.c index ccdb471d9f..e8f1a0cbae 100644 --- a/test/battle/ability/grassy_surge.c +++ b/test/battle/ability/grassy_surge.c @@ -1,4 +1,15 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Grassy Surge creates Grassy Terrain when entering the battle"); +SINGLE_BATTLE_TEST("Grassy Surge creates Grassy Terrain when entering the battle") +{ + GIVEN { + PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_GRASSY_SURGE); + MESSAGE("Grass grew to cover the battlefield!"); + } +} diff --git a/test/battle/ability/hydration.c b/test/battle/ability/hydration.c index 7d16ad04ae..7df2681c13 100644 --- a/test/battle/ability/hydration.c +++ b/test/battle/ability/hydration.c @@ -15,4 +15,15 @@ SINGLE_BATTLE_TEST("Hydration cures non-volatile Status conditions if it is rain } } -TO_DO_BATTLE_TEST("Hydration doesn't cure status conditions if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Hydration doesn't cure status conditions if Cloud Nine/Air Lock is on the field") +{ + GIVEN { + PLAYER(SPECIES_VAPOREON) { Ability(ABILITY_HYDRATION); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } + } WHEN { + TURN { MOVE(player, MOVE_RAIN_DANCE); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_HYDRATION); + MESSAGE("Vaporeon was hurt by its burn!"); + } +} diff --git a/test/battle/ability/misty_surge.c b/test/battle/ability/misty_surge.c index 229d26c3ba..d09f3e8f65 100644 --- a/test/battle/ability/misty_surge.c +++ b/test/battle/ability/misty_surge.c @@ -1,4 +1,15 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Misty Surge creates Misty Terrain when entering the battle"); +SINGLE_BATTLE_TEST("Misty Surge creates Misty Terrain when entering the battle") +{ + GIVEN { + PLAYER(SPECIES_TAPU_FINI) { Ability(ABILITY_MISTY_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_MISTY_SURGE); + MESSAGE("Mist swirled around the battlefield!"); + } +} diff --git a/test/battle/ability/psychic_surge.c b/test/battle/ability/psychic_surge.c index d840e8d440..02b2080043 100644 --- a/test/battle/ability/psychic_surge.c +++ b/test/battle/ability/psychic_surge.c @@ -1,4 +1,15 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Psychic Surge creates Psychic Terrain when entering the battle"); +SINGLE_BATTLE_TEST("Psychic Surge creates Psychic Terrain when entering the battle") +{ + GIVEN { + PLAYER(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_PSYCHIC_SURGE); + MESSAGE("The battlefield got weird!"); + } +} diff --git a/test/battle/ability/snow_cloak.c b/test/battle/ability/snow_cloak.c index a4d1acadb7..5b589f168f 100644 --- a/test/battle/ability/snow_cloak.c +++ b/test/battle/ability/snow_cloak.c @@ -28,5 +28,30 @@ SINGLE_BATTLE_TEST("Snow Cloak increases evasion during hail") } } -TO_DO_BATTLE_TEST("Snow Cloak doesn't prevent hail damage if Cloud Nine/Air Lock is on the field"); -TO_DO_BATTLE_TEST("Snow Cloak doesn't increase evasion if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Snow Cloak doesn't increase evasion if Cloud Nine/Air Lock is on the field") +{ + PASSES_RANDOMLY(10, 10, RNG_ACCURACY); + GIVEN { + PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } + OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } + } WHEN { + TURN { MOVE(player, MOVE_HAIL); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Snow Cloak increases evasion during snow") +{ + PASSES_RANDOMLY(4, 5, RNG_ACCURACY); + GIVEN { + ASSUME(gMovesInfo[MOVE_POUND].accuracy == 100); + PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SNOWSCAPE); } + TURN { MOVE(opponent, MOVE_POUND); } + } SCENE { + HP_BAR(player); + } +} diff --git a/test/battle/ability/stance_change.c b/test/battle/ability/stance_change.c index f8a0c70b3e..7998c907cb 100644 --- a/test/battle/ability/stance_change.c +++ b/test/battle/ability/stance_change.c @@ -79,5 +79,3 @@ SINGLE_BATTLE_TEST("Stance Change doesn't change Aegislash to Shield if King's S EXPECT_EQ(player->species, SPECIES_AEGISLASH_BLADE); } } - -TO_DO_BATTLE_TEST("Stance Change doesn't change Aegislash to Shield if King's Shield is called by a different move - Me First"); diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 91773b01bc..089587c71d 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1202,7 +1202,22 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") } } -TO_DO_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect"); +SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_G_MAX_TERROR].argument == MAX_EFFECT_MEAN_LOOK); + PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_LICK, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_G_MAX_TERROR, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent); + } THEN { + EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); + } +} DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") { @@ -1583,4 +1598,4 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") } ABILITY_POPUP(opponent, ability); } -} \ No newline at end of file +} From bc421740e8b3fea023fd0fbc66f079e638e7f60c Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Wed, 29 Jan 2025 23:12:45 -0500 Subject: [PATCH 041/125] fix: fixed compilation error when OW_GFX_COMPRESS is FALSE --- src/event_object_movement.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 059e64bb07..5353acbb8b 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2041,8 +2041,9 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { sprite->y += -(graphicsInfo->height >> 1) - sprite->centerToCornerVecY; } - if (OW_GFX_COMPRESS) - LoadSheetGraphicsInfo(graphicsInfo, objEvent->graphicsId, sprite); + #if OW_GFX_COMPRESS + LoadSheetGraphicsInfo(graphicsInfo, objEvent->graphicsId, sprite); + #endif sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; From 397e98b954630bf6b56ab86c8fa63363359db130 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 30 Jan 2025 18:38:28 -0300 Subject: [PATCH 042/125] Version 1.10.2 (#6144) --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- CHANGELOG.md | 1 + README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.10.x/1.10.2.md | 143 ++++++++++++++++++ include/constants/expansion.h | 4 +- 8 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 docs/changelogs/1.10.x/1.10.2.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 88c5cabd28..0e4bcf401e 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.1 (Latest release) + - 1.10.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.1 - 1.10.0 - 1.9.4 - 1.9.3 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index e49c54e756..49828dc6a4 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.1 (Latest release) + - 1.10.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.1 - 1.10.0 - 1.9.4 - 1.9.3 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 02bc0399b1..2183cf7d89 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.1 (Latest release) + - 1.10.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.1 - 1.10.0 - 1.9.4 - 1.9.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 963e05d7bc..ed2785837a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pokeemerald-Expansion Changelogs ## 1.10.x +- **[Version 1.10.2](docs/changelogs/1.10.x/1.10.2.md) - 🧹 Bugfix Release** - **[Version 1.10.1](docs/changelogs/1.10.x/1.10.1.md) - 🧹 Bugfix Release** - **[Version 1.10.0](docs/changelogs/1.10.x/1.10.0.md) - ✨ Feature Release** diff --git a/README.md b/README.md index 70317fac5c..5b1defe62b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ The main advantage of using vanilla pokeemerald as a base is being able to link If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` -Based off RHH's pokeemerald-expansion 1.10.1 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.10.2 https://github.com/rh-hideout/pokeemerald-expansion/ ``` #### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fb10d5b265..b0faec0560 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -20,6 +20,7 @@ - [How to use the Testing System](tutorials/how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.10.x]() + - [Version 1.10.2](changelogs/1.10.x/1.10.2.md) - [Version 1.10.1](changelogs/1.10.x/1.10.1.md) - [Version 1.10.0](changelogs/1.10.x/1.10.0.md) - [1.9.x]() diff --git a/docs/changelogs/1.10.x/1.10.2.md b/docs/changelogs/1.10.x/1.10.2.md new file mode 100644 index 0000000000..1617fb8e5f --- /dev/null +++ b/docs/changelogs/1.10.x/1.10.2.md @@ -0,0 +1,143 @@ +# Version 1.10.2 + +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.10.2`. +``` + +## 🧬 General 🧬 +### Changed +* Add manual breaking back to "What will (mon) do?" message by @kittenchilly in [#5908](https://github.com/rh-hideout/pokeemerald-expansion/pull/5908) + +### Fixed +* Explicitly specify dependencies for teachable learnset helper by @ravepossum in [#6015](https://github.com/rh-hideout/pokeemerald-expansion/pull/6015) +* Add dependency on json files to learnset helper by @ravepossum in [#6083](https://github.com/rh-hideout/pokeemerald-expansion/pull/6083) + +## 🗺️ Overworld 🗺️ +### Fixed +* Field effect for cutting grass is missing setfieldeffectargument. Issue #5766 by @shachar700 and @kasenn for finding the source of the issue, @hedara90 for the help with github in [#5952](https://github.com/rh-hideout/pokeemerald-expansion/pull/5952) +* Fix Match Call Behavior (#5931) by @MercedesCL in [#6033](https://github.com/rh-hideout/pokeemerald-expansion/pull/6033) +* Fixes HGSS dex not compiling currently by @hedara90 in [#6051](https://github.com/rh-hideout/pokeemerald-expansion/pull/6051) +* Fixed Liquid Voice's dynamic type for normal moves by @fdeblasio in [#6092](https://github.com/rh-hideout/pokeemerald-expansion/pull/6092) +* Fix Crash if something costs 0 in shop by @DizzyEggg in [#6106](https://github.com/rh-hideout/pokeemerald-expansion/pull/6106) +* Fixed Hoenn dex off by 1 issues by @fdeblasio in [#6104](https://github.com/rh-hideout/pokeemerald-expansion/pull/6104) + +## 🐉 Pokémon 🐉 +### Changed +* Add Clodsire second frame and fixed Grookey backsprite + overworld by @kittenchilly in [#6047](https://github.com/rh-hideout/pokeemerald-expansion/pull/6047) +* Duraludon battle animation by @Cafeei in [#6086](https://github.com/rh-hideout/pokeemerald-expansion/pull/6086) + +### Fixed +* Fix Enamorus not changing forms by @Bassoonian in [#6093](https://github.com/rh-hideout/pokeemerald-expansion/pull/6093) + +## ⚔️ Battle General ⚔️ +### Changed +* Adds static assert for `DamageCalculationData` by @AlexOn1ine in [#6063](https://github.com/rh-hideout/pokeemerald-expansion/pull/6063) + +### Fixed +* Fixes Trainer Slide messages causing corruption for recoil damage by @AlexOn1ine in [#5926](https://github.com/rh-hideout/pokeemerald-expansion/pull/5926) +* Fixes broken link battles by @hedara90 and @AsparagusEduardo for finding out that the `gBitTable` removal was the source of the bug. in [#5940](https://github.com/rh-hideout/pokeemerald-expansion/pull/5940) +* fixed interaction between Innards Out and Future Sight by @wiz1989 in [#5966](https://github.com/rh-hideout/pokeemerald-expansion/pull/5966) +* Fixes various Dynamax HP conversions/calculations by @PhallenTree in [#5933](https://github.com/rh-hideout/pokeemerald-expansion/pull/5933) +* Fixes Parting Shot / Eject Pack interaction by @AlexOn1ine in [#5963](https://github.com/rh-hideout/pokeemerald-expansion/pull/5963) +* Fixes Shell Bell including heal amount from Future Sight when triggered by @AlexOn1ine in [#5962](https://github.com/rh-hideout/pokeemerald-expansion/pull/5962) +* Fixes Tera giving boost to dynamic bp moves by @AlexOn1ine in [#6008](https://github.com/rh-hideout/pokeemerald-expansion/pull/6008) +* Fixes Z-Move trigger sprite on B button exit by @AlexOn1ine in [#6009](https://github.com/rh-hideout/pokeemerald-expansion/pull/6009) +* Fixed multiple transform/form change graphical issues by @AsparagusEduardo in [#6005](https://github.com/rh-hideout/pokeemerald-expansion/pull/6005) + - Dynamax and Tera color tinting now stays during Transform/Form Change animations. + - Dynamax no longer resets Transformed mon sprites. + - Transform no longer transforms into a Gigantamax Pokémon unless the transformee has Gigantamax Factor and transforms into a base form with a Gigantamax Form. +* Fixes defrosting if frozen mon is not damaged by opponent by @AlexOn1ine in [#6016](https://github.com/rh-hideout/pokeemerald-expansion/pull/6016) +* Fix Redirection Abilities Not Drawing in Ally Moves by @ghoulslash in [#6026](https://github.com/rh-hideout/pokeemerald-expansion/pull/6026) +* fixed bug giving immunity to full-paralysis when B_MAGIC_GUARD is >= GEN_4 by @AERDU in [#6032](https://github.com/rh-hideout/pokeemerald-expansion/pull/6032) +* Fixes large battle messages being cut off instead of being prompted to advance by @PhallenTree in [#6052](https://github.com/rh-hideout/pokeemerald-expansion/pull/6052) +* Fixes Rapid Spin / Toxic Debris interaction by @AlexOn1ine in [#6023](https://github.com/rh-hideout/pokeemerald-expansion/pull/6023) +* Fixes Eject Pack triggering twice on Intimidate by @AlexOn1ine in [#6072](https://github.com/rh-hideout/pokeemerald-expansion/pull/6072) +* Trainerslide animation fix by @hedara90 in [#6040](https://github.com/rh-hideout/pokeemerald-expansion/pull/6040) + - `B_ENEMY_MON_SHADOW_STYLE` set to `GEN_LATEST` since that setting no longer interferes with trainerslides. Set it to `GEN_3` to use regular Gen 3 shadow style. +* Fixes Charge effect not boosting and tests by @AlexOn1ine in [#6102](https://github.com/rh-hideout/pokeemerald-expansion/pull/6102) +* Fix seeds softlocking the game when a battler with a Surge ability enters the field by @PhallenTree in [#6110](https://github.com/rh-hideout/pokeemerald-expansion/pull/6110) +* Fix MindBlown crash on MyBoy/No Cash by @DizzyEggg in [#6112](https://github.com/rh-hideout/pokeemerald-expansion/pull/6112) +* Fix Double Iron Bash move animation crash on MyBoy/No$ by @DizzyEggg in [#6114](https://github.com/rh-hideout/pokeemerald-expansion/pull/6114) +* Fix safari zone crash on No Cash by @DizzyEggg in [#6132](https://github.com/rh-hideout/pokeemerald-expansion/pull/6132) + +## 🤹 Moves 🤹 +### Fixed +* Fixed a bunch of move anims by @hedara90 in [#5936](https://github.com/rh-hideout/pokeemerald-expansion/pull/5936) + +## 🧶 Items 🧶 +### Changed +* Added the Gen. 4+ berries to gBerryCrush_BerryData by @LOuroboros in [#5937](https://github.com/rh-hideout/pokeemerald-expansion/pull/5937) + +### Fixed +* Reverts wrongly done partial Eject Pack fix by @AlexOn1ine in [#5928](https://github.com/rh-hideout/pokeemerald-expansion/pull/5928) + +## 🤖 Battle AI 🤖 +### Fixed +* Fix Entrainment AI scoring bug by @Pawkkie in [#6056](https://github.com/rh-hideout/pokeemerald-expansion/pull/6056) +* Removed stray semi-colon in AI code by @hedara90 in [#6134](https://github.com/rh-hideout/pokeemerald-expansion/pull/6134) + +## 🧹 Other Cleanup 🧹 +* Clear unneeded braces from 5922 by @Pawkkie in [#5927](https://github.com/rh-hideout/pokeemerald-expansion/pull/5927) +* Removed references to `HANDLE_EXPANDED_MOVE_NAME` in docs by @AsparagusEduardo in [#5955](https://github.com/rh-hideout/pokeemerald-expansion/pull/5955) +* Rename `AI_FLAG_PREFER_STRONGEST_MOVE` by @Pawkkie in [#5972](https://github.com/rh-hideout/pokeemerald-expansion/pull/5972) +* Removed `OW_AUTO_SIGNPOST` by @AlexOn1ine in [#5978](https://github.com/rh-hideout/pokeemerald-expansion/pull/5978) +* `CreateFacilityMon` error: `'personality' may be used uninitialized` by @DizzyEggg in [#5981](https://github.com/rh-hideout/pokeemerald-expansion/pull/5981) +* PlayerHandleStatusXor - change `u8` to `u32` by @DizzyEggg in [#5988](https://github.com/rh-hideout/pokeemerald-expansion/pull/5988) +* Follow up for Innards Out / Future Sight interaction by @AlexOn1ine in [#5967](https://github.com/rh-hideout/pokeemerald-expansion/pull/5967) +* Remove out of bounds `gSprites` access in move relearner by @DizzyEggg in [#5991](https://github.com/rh-hideout/pokeemerald-expansion/pull/5991) +* Use `gCurrentMove` instead of checking `0xFF` move by @AlexOn1ine in [#5999](https://github.com/rh-hideout/pokeemerald-expansion/pull/5999) +* Wrong undefs by @AlexOn1ine in [#6024](https://github.com/rh-hideout/pokeemerald-expansion/pull/6024) +* Fixed whitespace issue with trainerproc by @AsparagusEduardo in [#6042](https://github.com/rh-hideout/pokeemerald-expansion/pull/6042) +* Remove redundant line in `Cmd_setcharge` by @AlexOn1ine in [#6053](https://github.com/rh-hideout/pokeemerald-expansion/pull/6053) +* Put Identifier and smol in gitignore by @DizzyEggg in [#6105](https://github.com/rh-hideout/pokeemerald-expansion/pull/6105) +* Move flag fixes by @fdeblasio in [#6107](https://github.com/rh-hideout/pokeemerald-expansion/pull/6107) +* Remove `formToChangeInto` (Unused) by @AlexOn1ine in [#6137](https://github.com/rh-hideout/pokeemerald-expansion/pull/6137) + +## 🧪 Test Runner 🧪 +### Changed +* Insomnia test used the wrong move in Turn section by @AlexOn1ine in [#5939](https://github.com/rh-hideout/pokeemerald-expansion/pull/5939) +* Updated Makefile to allow for the creation of specific tests by @pkmnsnfrn and @mrgriffin in [#5993](https://github.com/rh-hideout/pokeemerald-expansion/pull/5993) +* Adds Liquid Ooze and Aromatic Mist test by @AlexOn1ine in [#6012](https://github.com/rh-hideout/pokeemerald-expansion/pull/6012) +* Improved Hidden Power test by @AsparagusEduardo and @hedara90, who recommended this implementation. in [#6014](https://github.com/rh-hideout/pokeemerald-expansion/pull/6014) +* Add known failing learnset cap test by @Bassoonian in [#6046](https://github.com/rh-hideout/pokeemerald-expansion/pull/6046) +* Fix Symbiosis Needing battler Argument + Tests by @ghoulslash in [#6039](https://github.com/rh-hideout/pokeemerald-expansion/pull/6039) +* Added some `TO_DO` tests by @hedara90 in [#6140](https://github.com/rh-hideout/pokeemerald-expansion/pull/6140) + +### Fixed +* Fixed Gimmick tests failing when running first by @AsparagusEduardo in [#6001](https://github.com/rh-hideout/pokeemerald-expansion/pull/6001) +* Ported Makefile fix from upcoming by @hedara90 and @mrgriffin Wrote the fix on upcoming in [#6007](https://github.com/rh-hideout/pokeemerald-expansion/pull/6007) + +## 📚 Documentation 📚 +* Fix formatting in `WSL.md` by @Cafeei in [#5942](https://github.com/rh-hideout/pokeemerald-expansion/pull/5942) +* Update scope.md by @Pawkkie in [#5948](https://github.com/rh-hideout/pokeemerald-expansion/pull/5948) +* Removed references to `HANDLE_EXPANDED_MOVE_NAME` in docs by @AsparagusEduardo in [#5955](https://github.com/rh-hideout/pokeemerald-expansion/pull/5955) +* Update scope.md (again) by @Pawkkie and @kithr1 in [#5971](https://github.com/rh-hideout/pokeemerald-expansion/pull/5971) +* Codify new expansion release schedule by @pkmnsnfrn and @Pawkkie in [#5916](https://github.com/rh-hideout/pokeemerald-expansion/pull/5916) +* Workflow for Scope Discussion by @Pawkkie in [#6022](https://github.com/rh-hideout/pokeemerald-expansion/pull/6022) +* Update `constants/pokemon.h` with nature comments by @bassforte123 in [#6133](https://github.com/rh-hideout/pokeemerald-expansion/pull/6133) + +## 📦 Branch Synchronisation 📦 +### pret +* 17 of January in [#6045](https://github.com/rh-hideout/pokeemerald-expansion/pull/6045) + * Slight contest documentation by @AsparagusEduardo in [pret#2078](https://github.com/pret/pokeemerald/pull/2078) + * Update vars.h (cleanup) by @shachar700 in [pret#2082](https://github.com/pret/pokeemerald/pull/2082) + * missing const in extern gBasicHitSplatSpriteTemplate by @DizzyEggg in [pret#2083](https://github.com/pret/pokeemerald/pull/2083) + * extern gAncientPowerRockSpriteTemplate fix by @DizzyEggg in [pret#2084](https://github.com/pret/pokeemerald/pull/2084) + * remove undef TASK_NONE from list_menu by @DizzyEggg in [pret#2085](https://github.com/pret/pokeemerald/pull/2085) + * Fix CaveTransition pals by @DizzyEggg in [pret#2095](https://github.com/pret/pokeemerald/pull/2095) + * Define field script opcode constants by @rayrobdod in [pret#2005](https://github.com/pret/pokeemerald/pull/2005) + * Document bard music by @GriffinRichards in [pret#2053](https://github.com/pret/pokeemerald/pull/2053) + * Extern gSprites and gOamMatrices with known array size by @DizzyEggg in [pret#2090](https://github.com/pret/pokeemerald/pull/2090) + * Fix conflicting types for rotating gate functions by @DizzyEggg in [pret#2087](https://github.com/pret/pokeemerald/pull/2087) + +## New Contributors +* @shachar700 made their first contribution in [#5952](https://github.com/rh-hideout/pokeemerald-expansion/pull/5952) +* @MercedesCL made their first contribution in [#6033](https://github.com/rh-hideout/pokeemerald-expansion/pull/6033) +* @bassforte123 made their first contribution in [#6133](https://github.com/rh-hideout/pokeemerald-expansion/pull/6133) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.1...expansion/1.10.2 + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 1a3ba19065..83127e4af9 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.10.1 +// Last version: 1.10.2 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 10 #define EXPANSION_VERSION_PATCH 2 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From 370cfd5bb4d0cbd155bec69f466c99d43abc80a3 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 30 Jan 2025 18:40:03 -0300 Subject: [PATCH 043/125] Begin 1.10.3 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 83127e4af9..9e9e791856 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.10.2 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 10 -#define EXPANSION_VERSION_PATCH 2 +#define EXPANSION_VERSION_PATCH 3 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSES #endif From 1c3cabb52ae1bd01d8b8ec8135905ed211c4109f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 30 Jan 2025 18:46:06 -0300 Subject: [PATCH 044/125] Fix typo --- include/constants/expansion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 9e9e791856..a164187ab9 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -8,6 +8,6 @@ // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSES +#define EXPANSION_TAGGED_RELEASE FALSE #endif From 4fc56128d03f1b123b5a23d48aab5679b229c45b Mon Sep 17 00:00:00 2001 From: khbsd Date: Thu, 30 Jan 2025 19:29:20 -0600 Subject: [PATCH 045/125] Add Mega Evo, Primal Reversion, and Ultra Necrozma OW sprites (#5874) Co-authored-by: kittenchilly --- CREDITS.md | 4 + graphics/pokemon/abomasnow/mega/overworld.png | Bin 0 -> 1846 bytes .../abomasnow/mega/overworld_normal.pal | 19 + .../abomasnow/mega/overworld_shiny.pal | 19 + graphics/pokemon/absol/mega/overworld.png | Bin 0 -> 1530 bytes .../pokemon/absol/mega/overworld_normal.pal | 19 + .../pokemon/absol/mega/overworld_shiny.pal | 19 + .../pokemon/aerodactyl/mega/overworld.png | Bin 0 -> 1615 bytes .../aerodactyl/mega/overworld_normal.pal | 19 + .../aerodactyl/mega/overworld_shiny.pal | 19 + graphics/pokemon/aggron/mega/overworld.png | Bin 0 -> 1764 bytes .../pokemon/aggron/mega/overworld_normal.pal | 19 + .../pokemon/aggron/mega/overworld_shiny.pal | 19 + graphics/pokemon/alakazam/mega/overworld.png | Bin 0 -> 1134 bytes .../alakazam/mega/overworld_normal.pal | 19 + .../pokemon/alakazam/mega/overworld_shiny.pal | 19 + graphics/pokemon/altaria/mega/overworld.png | Bin 0 -> 1793 bytes .../pokemon/altaria/mega/overworld_normal.pal | 19 + .../pokemon/altaria/mega/overworld_shiny.pal | 19 + graphics/pokemon/ampharos/mega/overworld.png | Bin 0 -> 1418 bytes .../ampharos/mega/overworld_normal.pal | 19 + .../pokemon/ampharos/mega/overworld_shiny.pal | 19 + graphics/pokemon/audino/mega/overworld.png | Bin 0 -> 1079 bytes .../pokemon/audino/mega/overworld_normal.pal | 19 + .../pokemon/audino/mega/overworld_shiny.pal | 19 + graphics/pokemon/banette/mega/overworld.png | Bin 0 -> 1142 bytes .../pokemon/banette/mega/overworld_normal.pal | 19 + .../pokemon/banette/mega/overworld_shiny.pal | 19 + graphics/pokemon/beedrill/mega/overworld.png | Bin 0 -> 944 bytes .../beedrill/mega/overworld_normal.pal | 19 + .../pokemon/beedrill/mega/overworld_shiny.pal | 19 + graphics/pokemon/blastoise/mega/overworld.png | Bin 0 -> 1129 bytes .../blastoise/mega/overworld_normal.pal | 19 + .../blastoise/mega/overworld_shiny.pal | 19 + graphics/pokemon/blaziken/mega/overworld.png | Bin 0 -> 1510 bytes .../blaziken/mega/overworld_normal.pal | 19 + .../pokemon/blaziken/mega/overworld_shiny.pal | 19 + graphics/pokemon/camerupt/mega/overworld.png | Bin 0 -> 1524 bytes .../camerupt/mega/overworld_normal.pal | 19 + .../pokemon/camerupt/mega/overworld_shiny.pal | 19 + .../pokemon/charizard/mega_x/overworld.png | Bin 0 -> 1154 bytes .../charizard/mega_x/overworld_normal.pal | 19 + .../charizard/mega_x/overworld_shiny.pal | 19 + .../pokemon/charizard/mega_y/overworld.png | Bin 0 -> 1189 bytes .../charizard/mega_y/overworld_normal.pal | 19 + .../charizard/mega_y/overworld_shiny.pal | 19 + graphics/pokemon/diancie/mega/overworld.png | Bin 0 -> 1756 bytes .../pokemon/diancie/mega/overworld_normal.pal | 19 + .../pokemon/diancie/mega/overworld_shiny.pal | 19 + graphics/pokemon/gallade/mega/overworld.png | Bin 0 -> 1367 bytes .../pokemon/gallade/mega/overworld_normal.pal | 19 + .../pokemon/gallade/mega/overworld_shiny.pal | 19 + graphics/pokemon/garchomp/mega/overworld.png | Bin 0 -> 1549 bytes .../garchomp/mega/overworld_normal.pal | 19 + .../pokemon/garchomp/mega/overworld_shiny.pal | 19 + graphics/pokemon/gardevoir/mega/overworld.png | Bin 0 -> 1224 bytes .../gardevoir/mega/overworld_normal.pal | 19 + .../gardevoir/mega/overworld_shiny.pal | 19 + graphics/pokemon/gengar/mega/overworld.png | Bin 0 -> 947 bytes .../pokemon/gengar/mega/overworld_normal.pal | 19 + .../pokemon/gengar/mega/overworld_shiny.pal | 19 + graphics/pokemon/glalie/mega/overworld.png | Bin 0 -> 1473 bytes .../pokemon/glalie/mega/overworld_normal.pal | 19 + .../pokemon/glalie/mega/overworld_shiny.pal | 19 + graphics/pokemon/groudon/primal/overworld.png | Bin 0 -> 2384 bytes .../groudon/primal/overworld_normal.pal | 19 + .../groudon/primal/overworld_shiny.pal | 19 + graphics/pokemon/gyarados/mega/overworld.png | Bin 0 -> 1618 bytes .../gyarados/mega/overworld_normal.pal | 19 + .../pokemon/gyarados/mega/overworld_shiny.pal | 19 + graphics/pokemon/heracross/mega/overworld.png | Bin 0 -> 1414 bytes .../heracross/mega/overworld_normal.pal | 19 + .../heracross/mega/overworld_shiny.pal | 19 + graphics/pokemon/houndoom/mega/overworld.png | Bin 0 -> 1270 bytes .../houndoom/mega/overworld_normal.pal | 19 + .../pokemon/houndoom/mega/overworld_shiny.pal | 19 + .../pokemon/kangaskhan/mega/overworld.png | Bin 0 -> 1399 bytes .../kangaskhan/mega/overworld_normal.pal | 19 + .../kangaskhan/mega/overworld_shiny.pal | 19 + graphics/pokemon/kyogre/primal/overworld.png | Bin 0 -> 2371 bytes .../kyogre/primal/overworld_normal.pal | 19 + .../pokemon/kyogre/primal/overworld_shiny.pal | 19 + graphics/pokemon/latias/mega/overworld.png | Bin 0 -> 1666 bytes .../pokemon/latias/mega/overworld_normal.pal | 19 + .../pokemon/latias/mega/overworld_shiny.pal | 19 + graphics/pokemon/latios/mega/overworld.png | Bin 0 -> 1666 bytes .../pokemon/latios/mega/overworld_normal.pal | 19 + .../pokemon/latios/mega/overworld_shiny.pal | 19 + graphics/pokemon/lopunny/mega/overworld.png | Bin 0 -> 1284 bytes .../pokemon/lopunny/mega/overworld_normal.pal | 19 + .../pokemon/lopunny/mega/overworld_shiny.pal | 19 + graphics/pokemon/lucario/mega/overworld.png | Bin 0 -> 1380 bytes .../pokemon/lucario/mega/overworld_normal.pal | 19 + .../pokemon/lucario/mega/overworld_shiny.pal | 19 + graphics/pokemon/manectric/mega/overworld.png | Bin 0 -> 1249 bytes .../manectric/mega/overworld_normal.pal | 19 + .../manectric/mega/overworld_shiny.pal | 19 + graphics/pokemon/mawile/mega/overworld.png | Bin 0 -> 1464 bytes .../pokemon/mawile/mega/overworld_normal.pal | 19 + .../pokemon/mawile/mega/overworld_shiny.pal | 19 + graphics/pokemon/medicham/mega/overworld.png | Bin 0 -> 1365 bytes .../medicham/mega/overworld_normal.pal | 19 + .../pokemon/medicham/mega/overworld_shiny.pal | 19 + graphics/pokemon/metagross/mega/overworld.png | Bin 0 -> 1687 bytes .../metagross/mega/overworld_normal.pal | 19 + .../metagross/mega/overworld_shiny.pal | 19 + graphics/pokemon/mewtwo/mega_x/overworld.png | Bin 0 -> 1442 bytes .../mewtwo/mega_x/overworld_normal.pal | 19 + .../pokemon/mewtwo/mega_x/overworld_shiny.pal | 19 + graphics/pokemon/mewtwo/mega_y/overworld.png | Bin 0 -> 1372 bytes .../mewtwo/mega_y/overworld_normal.pal | 19 + .../pokemon/mewtwo/mega_y/overworld_shiny.pal | 19 + graphics/pokemon/necrozma/ultra/overworld.png | Bin 0 -> 994 bytes .../necrozma/ultra/overworld_normal.pal | 19 + .../necrozma/ultra/overworld_shiny.pal | 19 + graphics/pokemon/pidgeot/mega/overworld.png | Bin 0 -> 1375 bytes .../pokemon/pidgeot/mega/overworld_normal.pal | 19 + .../pokemon/pidgeot/mega/overworld_shiny.pal | 19 + graphics/pokemon/pinsir/mega/overworld.png | Bin 0 -> 1551 bytes .../pokemon/pinsir/mega/overworld_normal.pal | 19 + .../pokemon/pinsir/mega/overworld_shiny.pal | 19 + graphics/pokemon/rayquaza/mega/overworld.png | Bin 0 -> 3459 bytes .../rayquaza/mega/overworld_normal.pal | 19 + .../pokemon/rayquaza/mega/overworld_shiny.pal | 19 + graphics/pokemon/sableye/mega/overworld.png | Bin 0 -> 1192 bytes .../pokemon/sableye/mega/overworld_normal.pal | 19 + .../pokemon/sableye/mega/overworld_shiny.pal | 19 + graphics/pokemon/salamence/mega/overworld.png | Bin 0 -> 1440 bytes .../salamence/mega/overworld_normal.pal | 19 + .../salamence/mega/overworld_shiny.pal | 19 + graphics/pokemon/sceptile/mega/overworld.png | Bin 0 -> 1495 bytes .../sceptile/mega/overworld_normal.pal | 19 + .../pokemon/sceptile/mega/overworld_shiny.pal | 19 + graphics/pokemon/scizor/mega/overworld.png | Bin 0 -> 1424 bytes .../pokemon/scizor/mega/overworld_normal.pal | 19 + .../pokemon/scizor/mega/overworld_shiny.pal | 19 + graphics/pokemon/sharpedo/mega/overworld.png | Bin 0 -> 1364 bytes .../sharpedo/mega/overworld_normal.pal | 19 + .../pokemon/sharpedo/mega/overworld_shiny.pal | 19 + graphics/pokemon/slowbro/mega/overworld.png | Bin 0 -> 887 bytes .../pokemon/slowbro/mega/overworld_normal.pal | 19 + .../pokemon/slowbro/mega/overworld_shiny.pal | 19 + graphics/pokemon/steelix/mega/overworld.png | Bin 0 -> 2703 bytes .../pokemon/steelix/mega/overworld_normal.pal | 19 + .../pokemon/steelix/mega/overworld_shiny.pal | 19 + graphics/pokemon/swampert/mega/overworld.png | Bin 0 -> 1355 bytes .../swampert/mega/overworld_normal.pal | 19 + .../pokemon/swampert/mega/overworld_shiny.pal | 19 + graphics/pokemon/tyranitar/mega/overworld.png | Bin 0 -> 1505 bytes .../tyranitar/mega/overworld_normal.pal | 19 + .../tyranitar/mega/overworld_shiny.pal | 19 + graphics/pokemon/venusaur/mega/overworld.png | Bin 0 -> 859 bytes .../venusaur/mega/overworld_normal.pal | 19 + .../pokemon/venusaur/mega/overworld_shiny.pal | 19 + include/config/overworld.h | 1 + spritesheet_rules.mk | 153 ++++++ src/data/graphics/pokemon.h | 504 +++++++++--------- .../pokemon/species_info/gen_1_families.h | 187 +++++++ .../pokemon/species_info/gen_2_families.h | 44 ++ .../pokemon/species_info/gen_3_families.h | 253 +++++++++ .../pokemon/species_info/gen_4_families.h | 44 ++ .../pokemon/species_info/gen_5_families.h | 11 + .../pokemon/species_info/gen_6_families.h | 11 + .../pokemon/species_info/gen_7_families.h | 11 + 164 files changed, 2909 insertions(+), 252 deletions(-) create mode 100644 CREDITS.md create mode 100644 graphics/pokemon/abomasnow/mega/overworld.png create mode 100644 graphics/pokemon/abomasnow/mega/overworld_normal.pal create mode 100644 graphics/pokemon/abomasnow/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/absol/mega/overworld.png create mode 100644 graphics/pokemon/absol/mega/overworld_normal.pal create mode 100644 graphics/pokemon/absol/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/aerodactyl/mega/overworld.png create mode 100644 graphics/pokemon/aerodactyl/mega/overworld_normal.pal create mode 100644 graphics/pokemon/aerodactyl/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/aggron/mega/overworld.png create mode 100644 graphics/pokemon/aggron/mega/overworld_normal.pal create mode 100644 graphics/pokemon/aggron/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/alakazam/mega/overworld.png create mode 100644 graphics/pokemon/alakazam/mega/overworld_normal.pal create mode 100644 graphics/pokemon/alakazam/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/altaria/mega/overworld.png create mode 100644 graphics/pokemon/altaria/mega/overworld_normal.pal create mode 100644 graphics/pokemon/altaria/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/ampharos/mega/overworld.png create mode 100644 graphics/pokemon/ampharos/mega/overworld_normal.pal create mode 100644 graphics/pokemon/ampharos/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/audino/mega/overworld.png create mode 100644 graphics/pokemon/audino/mega/overworld_normal.pal create mode 100644 graphics/pokemon/audino/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/banette/mega/overworld.png create mode 100644 graphics/pokemon/banette/mega/overworld_normal.pal create mode 100644 graphics/pokemon/banette/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/beedrill/mega/overworld.png create mode 100644 graphics/pokemon/beedrill/mega/overworld_normal.pal create mode 100644 graphics/pokemon/beedrill/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/blastoise/mega/overworld.png create mode 100644 graphics/pokemon/blastoise/mega/overworld_normal.pal create mode 100644 graphics/pokemon/blastoise/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/blaziken/mega/overworld.png create mode 100644 graphics/pokemon/blaziken/mega/overworld_normal.pal create mode 100644 graphics/pokemon/blaziken/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/camerupt/mega/overworld.png create mode 100644 graphics/pokemon/camerupt/mega/overworld_normal.pal create mode 100644 graphics/pokemon/camerupt/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/charizard/mega_x/overworld.png create mode 100644 graphics/pokemon/charizard/mega_x/overworld_normal.pal create mode 100644 graphics/pokemon/charizard/mega_x/overworld_shiny.pal create mode 100644 graphics/pokemon/charizard/mega_y/overworld.png create mode 100644 graphics/pokemon/charizard/mega_y/overworld_normal.pal create mode 100644 graphics/pokemon/charizard/mega_y/overworld_shiny.pal create mode 100644 graphics/pokemon/diancie/mega/overworld.png create mode 100644 graphics/pokemon/diancie/mega/overworld_normal.pal create mode 100644 graphics/pokemon/diancie/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/gallade/mega/overworld.png create mode 100644 graphics/pokemon/gallade/mega/overworld_normal.pal create mode 100644 graphics/pokemon/gallade/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/garchomp/mega/overworld.png create mode 100644 graphics/pokemon/garchomp/mega/overworld_normal.pal create mode 100644 graphics/pokemon/garchomp/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/gardevoir/mega/overworld.png create mode 100644 graphics/pokemon/gardevoir/mega/overworld_normal.pal create mode 100644 graphics/pokemon/gardevoir/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/gengar/mega/overworld.png create mode 100644 graphics/pokemon/gengar/mega/overworld_normal.pal create mode 100644 graphics/pokemon/gengar/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/glalie/mega/overworld.png create mode 100644 graphics/pokemon/glalie/mega/overworld_normal.pal create mode 100644 graphics/pokemon/glalie/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/groudon/primal/overworld.png create mode 100644 graphics/pokemon/groudon/primal/overworld_normal.pal create mode 100644 graphics/pokemon/groudon/primal/overworld_shiny.pal create mode 100644 graphics/pokemon/gyarados/mega/overworld.png create mode 100644 graphics/pokemon/gyarados/mega/overworld_normal.pal create mode 100644 graphics/pokemon/gyarados/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/heracross/mega/overworld.png create mode 100644 graphics/pokemon/heracross/mega/overworld_normal.pal create mode 100644 graphics/pokemon/heracross/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/houndoom/mega/overworld.png create mode 100644 graphics/pokemon/houndoom/mega/overworld_normal.pal create mode 100644 graphics/pokemon/houndoom/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/kangaskhan/mega/overworld.png create mode 100644 graphics/pokemon/kangaskhan/mega/overworld_normal.pal create mode 100644 graphics/pokemon/kangaskhan/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/kyogre/primal/overworld.png create mode 100644 graphics/pokemon/kyogre/primal/overworld_normal.pal create mode 100644 graphics/pokemon/kyogre/primal/overworld_shiny.pal create mode 100644 graphics/pokemon/latias/mega/overworld.png create mode 100644 graphics/pokemon/latias/mega/overworld_normal.pal create mode 100644 graphics/pokemon/latias/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/latios/mega/overworld.png create mode 100644 graphics/pokemon/latios/mega/overworld_normal.pal create mode 100644 graphics/pokemon/latios/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/lopunny/mega/overworld.png create mode 100644 graphics/pokemon/lopunny/mega/overworld_normal.pal create mode 100644 graphics/pokemon/lopunny/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/lucario/mega/overworld.png create mode 100644 graphics/pokemon/lucario/mega/overworld_normal.pal create mode 100644 graphics/pokemon/lucario/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/manectric/mega/overworld.png create mode 100644 graphics/pokemon/manectric/mega/overworld_normal.pal create mode 100644 graphics/pokemon/manectric/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/mawile/mega/overworld.png create mode 100644 graphics/pokemon/mawile/mega/overworld_normal.pal create mode 100644 graphics/pokemon/mawile/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/medicham/mega/overworld.png create mode 100644 graphics/pokemon/medicham/mega/overworld_normal.pal create mode 100644 graphics/pokemon/medicham/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/metagross/mega/overworld.png create mode 100644 graphics/pokemon/metagross/mega/overworld_normal.pal create mode 100644 graphics/pokemon/metagross/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/mewtwo/mega_x/overworld.png create mode 100644 graphics/pokemon/mewtwo/mega_x/overworld_normal.pal create mode 100644 graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal create mode 100644 graphics/pokemon/mewtwo/mega_y/overworld.png create mode 100644 graphics/pokemon/mewtwo/mega_y/overworld_normal.pal create mode 100644 graphics/pokemon/mewtwo/mega_y/overworld_shiny.pal create mode 100644 graphics/pokemon/necrozma/ultra/overworld.png create mode 100644 graphics/pokemon/necrozma/ultra/overworld_normal.pal create mode 100644 graphics/pokemon/necrozma/ultra/overworld_shiny.pal create mode 100644 graphics/pokemon/pidgeot/mega/overworld.png create mode 100644 graphics/pokemon/pidgeot/mega/overworld_normal.pal create mode 100644 graphics/pokemon/pidgeot/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/pinsir/mega/overworld.png create mode 100644 graphics/pokemon/pinsir/mega/overworld_normal.pal create mode 100644 graphics/pokemon/pinsir/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/rayquaza/mega/overworld.png create mode 100644 graphics/pokemon/rayquaza/mega/overworld_normal.pal create mode 100644 graphics/pokemon/rayquaza/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/sableye/mega/overworld.png create mode 100644 graphics/pokemon/sableye/mega/overworld_normal.pal create mode 100644 graphics/pokemon/sableye/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/salamence/mega/overworld.png create mode 100644 graphics/pokemon/salamence/mega/overworld_normal.pal create mode 100644 graphics/pokemon/salamence/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/sceptile/mega/overworld.png create mode 100644 graphics/pokemon/sceptile/mega/overworld_normal.pal create mode 100644 graphics/pokemon/sceptile/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/scizor/mega/overworld.png create mode 100644 graphics/pokemon/scizor/mega/overworld_normal.pal create mode 100644 graphics/pokemon/scizor/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/sharpedo/mega/overworld.png create mode 100644 graphics/pokemon/sharpedo/mega/overworld_normal.pal create mode 100644 graphics/pokemon/sharpedo/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/slowbro/mega/overworld.png create mode 100644 graphics/pokemon/slowbro/mega/overworld_normal.pal create mode 100644 graphics/pokemon/slowbro/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/steelix/mega/overworld.png create mode 100644 graphics/pokemon/steelix/mega/overworld_normal.pal create mode 100644 graphics/pokemon/steelix/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/swampert/mega/overworld.png create mode 100644 graphics/pokemon/swampert/mega/overworld_normal.pal create mode 100644 graphics/pokemon/swampert/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/tyranitar/mega/overworld.png create mode 100644 graphics/pokemon/tyranitar/mega/overworld_normal.pal create mode 100644 graphics/pokemon/tyranitar/mega/overworld_shiny.pal create mode 100644 graphics/pokemon/venusaur/mega/overworld.png create mode 100644 graphics/pokemon/venusaur/mega/overworld_normal.pal create mode 100644 graphics/pokemon/venusaur/mega/overworld_shiny.pal diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000000..70203c4f93 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,4 @@ +## Mega Evolution Overworld Sprite Credits: +- [princess-phoenix](https://www.deviantart.com/princess-phoenix) +- [larryturbo](https://www.deviantart.com/larryturbo) +- [kidkatt](https://www.deviantart.com/kidkatt) diff --git a/graphics/pokemon/abomasnow/mega/overworld.png b/graphics/pokemon/abomasnow/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..319e37016eab655a69f7f05c97494c1e898c5729 GIT binary patch literal 1846 zcmV-62g&$}P)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_sK~&G(73?Roaz7A*yzds|LExW5dTRL000FsNklIdQ3-7YFiK;J^33ZY%!=E zcpW1P?wC$dTtC9ZyPLQs$(O;P_%lIE%qL)MCK2y}Vd-AS$b#zt)%YZ~>Sj75E-($m zI!B2f+-sfKAZLFGR>Rk^2bVDds1R`~j=A=#a2z8G?&x5hq}W8yS#7tl8gPLshlgCT zWb7}McT7I?=RnuQNb#B}3LMACigSW;WiPv+GD;Slv4h;iYS3zhF5g^?S;uMSqtrG@j?vx1)qtzYA&?hy|1TIkMgF`aOTN1}jFAqU%o1gchgqiRvKM;*Six_YovJ~^l)zaomsaB` zP5Yn~=Odse;f9(h9CF0Ub*_U8thHUV#Cps1x0->E_$(oAuzHLWWlrx3E6$Y~CNb~2 z;mv7BiSVa;7^`rdn|x2Pe!HFmCg2jgHj~o;TeZCgIC-wt<34D`sSp89a1vGdWJzP= zfgp!INW&%Wa|j*q$$M4iywh**`4lSrimQh7jqYHNv}+4TM2o z7P}(@?Uhmagk$A>5Htsz1~t&dDp54RjgGiFAT0t$Y_i2B*LG^v`b@xgP61)x1sh7r z(|@d8`yP6URzBfW`RoAf5Y3iGe!Yhxlni_Fku)JgP!(jFwhnRZf zOFX+^khSi7i$8F*_H=NHu?CohuTQKSE@{t~1JC)U;qFB literal 0 HcmV?d00001 diff --git a/graphics/pokemon/abomasnow/mega/overworld_normal.pal b/graphics/pokemon/abomasnow/mega/overworld_normal.pal new file mode 100644 index 0000000000..124ab1628b --- /dev/null +++ b/graphics/pokemon/abomasnow/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 72 56 +48 120 64 +50 86 102 +80 80 80 +122 122 122 +48 152 72 +120 120 152 +0 0 0 +160 168 200 +192 136 208 +184 192 208 +156 233 255 +216 216 232 +201 255 255 +232 232 248 diff --git a/graphics/pokemon/abomasnow/mega/overworld_shiny.pal b/graphics/pokemon/abomasnow/mega/overworld_shiny.pal new file mode 100644 index 0000000000..91c1c05271 --- /dev/null +++ b/graphics/pokemon/abomasnow/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +41 66 79 +26 113 141 +50 86 102 +80 80 80 +122 122 122 +16 141 183 +120 120 152 +0 0 0 +160 168 200 +192 136 208 +184 192 208 +156 233 255 +216 216 232 +201 255 255 +232 232 248 diff --git a/graphics/pokemon/absol/mega/overworld.png b/graphics/pokemon/absol/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..609bcb4ff52894cb2b126778f474e888534b2838 GIT binary patch literal 1530 zcmVEX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_^SU^Z%fFK}XXn=Tt zpa1{>u(-(3*y!l!_+V&&cz~cNFhBqR00000U_k zj=3iYDb>*cpHnYEKqClrzAE$Pa{$mKkhD`IRVpHo;KD0TcZOU7L^6+w5K?^@;PRn| z!m($N3S;TLE4GK3QxCW}mrVqQatkDiqOY|8EqDu{OCXXh#Hs?j0Siud0*M7mk0SQo z4Iu@GQwwNZTbpaTo7F+@5wp4l7bb_d0L_qU2nFwT)~5k)9_wI$3Pjl$V)5O(;Yhv1 zIxj7tb8S-I;X7+9dr^Ua^yuNnamUUrz%t}*6ap4m$aT&y0~~%EpbD?uf!KQY`QYrF zu7H8_BZaRA)C_N;W`~M)QA2Dx7t2A@X^S+cHXKi5TQh= z`G6hX1Iz$+`0}aP_m=?^zXMdEMwN(G8A##r@;Pv;?TZ6g^PxPhc~W7-k;}n2@u9+O z0P>_f(k`z%rRw*m0Tai^<0y#0$bCv$y6M$<;1=-WtTA3=8bsd|@R_Rt6(H<7bgFEa zmjN?>U4r{k1}sYH_{DD$*tphq=5m)pGDG=qh%^3z%RMpMZPZb_{=w%jxuA=%b&4yu>|;dlPVSIO&vG$J)&_9aIj>+RiawG zlMQ37{5V)(4v6efTqyxVxE)uATTlYhPu@v|q&=LfG5HB)>a$7Te zbRzg4uZ>OMryu`@R|#&qH`fBM1lEX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_==cBt00000sdo=`000C^NklRKO5Y$R58)O7VdVBeetIUkk@0fU0Z%_V^JH_>EtN zG*Uf|;9ynus3~*~Lc$YM(RXa>b&LZ0*{lN~J*6>WHChMtqu2pzRu%kHO1TASIM9l& z;oJ9Z6A57eWEO7QzJCn>xA2Wh1DxvsI+PGmX&zETE4trnm9S^e5nPY_9J&&G1AC8EdfiQ5w@Y|x_Ocjvdbh1WD%PJ9klo_YXV*}K>mJ^_|$l3wGwG}Ku#?cvc;;;=w zz^o_sCBTwf^o`iPso+>e0_+6L(*p8##e)`(1AYoBUFg@~1Z1JJ(_jRoxn8#HpyEv% zkZfa?=G*`?j}zu>Zj@Fh8JA)^t;tyyK^mYeyT6^wmRwoe*?sjo0ne`V-vicUv_!RO zARsYKWDFF!D6n@1+d8+Hh^vv)4@=-vRAyS#)J0Ihbl-lfH8&eMDWk|Ey{w7Wtw1!gYmMaKkGz-gDOR=vDu***}9B=`BtYYhJis9IN! zZYBF~T=@dbmOQnWZJfZXDiBbmtb{mMof~kfFdBi1#Df*{vIIc^$NTREuO~oDU3*3F zmD@W+1(d$jGk%iV>rJf=ypDwavTS?i0*vD(5H5)sbKPCsOtsoP2=L>ZqK$bPWJRa} zPMf29!?c$k`#Z_?y5a!#{71DgC)=8GGFjK~i>Cj?uk)UOj^+G%5!^3~4&WewMQ^zq zSW*9x0C6gxqvG51^{PC;%kN{-zWy1{wfE2T{;2)R|2F+h?qB<@_8*8*JWh!+l_CHD N002ovPDHLkV1nbw{~rJV literal 0 HcmV?d00001 diff --git a/graphics/pokemon/aerodactyl/mega/overworld_normal.pal b/graphics/pokemon/aerodactyl/mega/overworld_normal.pal new file mode 100644 index 0000000000..1a4ef75e75 --- /dev/null +++ b/graphics/pokemon/aerodactyl/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +62 62 62 +96 16 16 +92 92 92 +72 64 96 +122 122 122 +128 88 128 +128 112 176 +0 0 0 +144 136 200 +184 136 192 +176 176 224 +200 200 208 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal b/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal new file mode 100644 index 0000000000..a2869cb405 --- /dev/null +++ b/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +62 62 62 +96 16 16 +92 92 92 +72 64 96 +122 122 122 +79 76 138 +169 112 176 +0 0 0 +186 136 200 +112 116 222 +208 176 224 +200 200 208 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/aggron/mega/overworld.png b/graphics/pokemon/aggron/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..fbceb62a39a971be4fc8306b9e15ccaa0a9f3e31 GIT binary patch literal 1764 zcmVEX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_3{h$$uW!lvHrIcU?~GI zrz64>U9{lklnbKjpzB6IG$L~D@j_I zK{0`1e5vE$C3+X?}%3%Jrz8lGAg5)*7G4TM*^`B0XbqHiWBn@?-^^eRWmHNzQ; z*#%tb7+H{E^yjw_kbDE-m0o6m$!OsF&W4@FHU^IM4`6D$OxiVYq!SQbo>NSb1)?d9 zgjf2Pg%H%h7ZU(6dd#M{XZLiMMWLFPm>~kcw}301x$)XI95euXt1-vc893K{3KWQ0 zi~x+0fwuBr>Ld(ef|XHKtQ07Tp8#(|Ga;91NuS9OuzX9xFl@`%5S}1{$wx^Fd9x9Ff-C`I6#cHDWt^TdaT`Ts8R7DM#BpGYfY{BBE7U-_syX z#sb)&8$J7G1j1!0+lzI7jL(lrXPK;fL?jYySl}jY1#mJj=`sX3pf?9gEPBsO23DEr zA9Vs^N3pbElfVm49)0=MwUt!$5bT3KFAE;FSSJJ=1}AfDIy>0r42SxSDSJZ?fYo5rEyOK95!u5C4BqA;*p6K62b1Y( zjRZXC7eDNsZ~&ygrhD`-x^E3i=b6Xg3|I`VI?ZhOeHfI#sGlo4Ay#yc7Y#{ksuUeoW&!(8o ze-0i+*qF}|a56ZBZztISJcizeoyJ{9>;vAJ{r~Gvu73b-18o~NvdbX=0000Px#Fi=cXMYH1nB_$|FDi?20KV4m8ka#%BK|7FbVA!ZI_}E~uu(+_WyZ`_I=;-(W z000000Ifh^Z2$lR>`6pHR9JzTS{a?2^0hCKnTi35$9pEJA4J)ZSlYH=}ddZqURZ?;l9-0SiA*T zcGC>d<*(&j6_{oKReuJ!n_#v73ea@75%nnXvcQ9Ir9b)?6LebrhXtUdoW{`zFvWkS zKLAw!s|BF+uSl$2bQG;#;OF{2%re5N|7M4=I)rNn+2Gp$OFbgcMZc+ljsI>k1_RSX zDF)x_rvZ!F9s>qI6QkigR=}(e!OH`GVDNP!fpVOJsW_Be*pX?z5NjYZ;uz* zu)-FAsEhpDD38D(YTK_3zSWNa)#J3nCcwgH1NODutwmwNj|?Nr4O}!^fmMTpURH^% z_ow>SpZB5ck&H~^fD`cK%iF^4J6FhO0Dho-w=(UvR8j+!u0ziX`C0FiegbS~$ijZ| ze63EX39#~!>@N1t0d|bp5r-rJYFjF-0Okr8JuL6#DgeEH25e_2_(aHS?Km~}fG}sB zBZBP^fI{S)&9hJ|tN==dtDY@U1;E3oR{)D%s_4I8xU;!K@xKOSjpIOYOqe6s$EOfn z$$|gjye%;1R z;*h6>m)i7|w*ega(1$AufL!dLJRuVoQU}ZxZuIP*qsv31zX7Z+xG_o_ud)fC1)TUy zP9F`$gr$}uak5zQ-vTyz4(&a5*+Q=Z)n=z=6+1*&xOs_6P1bi>a*- z08hQoZyCSRtAN!6zvHNkQV!z=aN;v^Ih+yn!8m^KF1J1cEP8Lbc9?(SWvc3326Vk% zJm3{=9sOYh{m&6CpfZ5)dh#;AIC2Bm>KIlGg0KR5cN#2uv5fBdh?$03-019DM5~n$}?<%zz!=6Me&{5Oy)vzpsFBJwV!}m&&6~nE%h| zuk{VzszOT6sb4vUpI_CX&i7QkZL11Bjxt<-0b`>}l1!$<_5c6?07*qoM6N<$g3CG_ A$N&HU literal 0 HcmV?d00001 diff --git a/graphics/pokemon/alakazam/mega/overworld_normal.pal b/graphics/pokemon/alakazam/mega/overworld_normal.pal new file mode 100644 index 0000000000..f9858b0bc4 --- /dev/null +++ b/graphics/pokemon/alakazam/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +37 37 40 +71 42 23 +111 79 63 +93 93 99 +144 120 56 +201 65 59 +144 109 96 +216 168 48 +248 216 96 +176 176 184 +176 176 188 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/alakazam/mega/overworld_shiny.pal b/graphics/pokemon/alakazam/mega/overworld_shiny.pal new file mode 100644 index 0000000000..73211d068e --- /dev/null +++ b/graphics/pokemon/alakazam/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +37 37 40 +71 42 23 +142 72 100 +93 93 99 +144 120 56 +201 65 59 +193 103 130 +216 168 48 +248 216 96 +176 176 184 +176 176 188 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/altaria/mega/overworld.png b/graphics/pokemon/altaria/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..d85233b8aeb2522f9a4e20270e12a0763ff6b603 GIT binary patch literal 1793 zcmV+c2mbhpP)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_w7x#4Z3a zUDo+Qpv+iFSTcIHP`~1?5qyR9*PjRs~AP6viy2RDl)h6H>5B#kA%J5Af z93eC(0v-hlL2<4GX#%jQ*Mob-n*{a2M;kOf(Pjxn(7xXULfl#PFCWqVN#L?(u#iw! zJh!@nDc+~jEuwGwt0?>{_oH=r?!6J{{B38tLYLX?rverI?)%OoG$;t*d_f9)g)eyb zq&ps{IOxRvKfAJ?1hRmY3GSKTFD0BR3A?7oZ@`28hJV-q z$*knvS}x=U{i-m6XMsXc?QdJOp9&U{zJ@?PJq)U~Axbo-~b5 zH~a#_H-X$r*|sh5LDbN|0f zyZw_uO(fKo)ST!62-S|_fq%z2Nn6}4o8G_M;%<(^2vQ}BQ6N>54mh8&Q1oA~0$U;^ z_tg#C`qYT?5>^k6h6_s*K*x z+i{@G4naV}`#oDcO)lZC1-}}v0#l6f$gux_&znFihf>PfQh$5uI(o^!=)(+MPf){D zf=dtZ`SC>0S<6O>KrjJKU@-xpSw=I!kfJNL5PlJ81Ub*E0Kh)7J+ct)ZlRuWE7K^# zid?gFO|>qs)ucs%>IIrY|L7(660m?pIAm~-m zLO|_5>q_>^`uz;{bUob&B%hrjEpnkFhJHFQ^5;`x4>Ozr>jl@>HAMxK;pLG>P>KS5 z4`8sTrUC|g6a`GS3*?%VFQ!P5E-UiCfp69M-3+vP9HzLDFJu$a5P{{ks7535wCZ_mCtulYQ`CLEie1_(ib)X%`Py*vao z`^D|0`?`o+G;B9-4{1^@_R`(k#TkMAWH#cl|Ir?Ms0{Xa3L#fO5^`RaGG(aKraPPt zXf9`@KmCq4T(@y<-+7MqQ~oM}64Jeb%D3Jf{yi@so4_2OZR5Y%YvWW$PaSg*;0Z6~ jO5p#*!@$c{PVxT$2^5(2oX#xu00000NkvXXu0mjfTv}A0 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/altaria/mega/overworld_normal.pal b/graphics/pokemon/altaria/mega/overworld_normal.pal new file mode 100644 index 0000000000..af72a688cb --- /dev/null +++ b/graphics/pokemon/altaria/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +0 32 96 +0 64 104 +72 80 104 +40 104 152 +40 128 168 +112 128 144 +64 168 216 +96 192 232 +0 0 0 +168 176 192 +208 224 232 +248 248 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/altaria/mega/overworld_shiny.pal b/graphics/pokemon/altaria/mega/overworld_shiny.pal new file mode 100644 index 0000000000..b15eb80b80 --- /dev/null +++ b/graphics/pokemon/altaria/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +77 96 16 +104 95 18 +72 80 104 +151 146 55 +167 149 58 +112 128 144 +215 194 85 +231 209 115 +0 0 0 +168 176 192 +208 224 232 +248 248 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/ampharos/mega/overworld.png b/graphics/pokemon/ampharos/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..c96d8e2bec6de79e96b8a9a55ab2258c6a027a48 GIT binary patch literal 1418 zcmV;51$Fv~P)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_000ApNkl^>L(EXjVS)Y;ePZ zxD69vGB+Krrnb%cv4JNp-f4p8nWMGNH~T;EY>-tTj}tKFlWrWN6Oq2gCk};TIckZ~ zB+}@Awpd}~w~e8$Q@f8iuFnuCIAt3?@cUG1ur;su5p9m# zAhauPKQK?;H`dxiO9ilZp=mrNWbAn*^vaD(tMsL1*D*j&%td{^l@^ zC6RmvHvCq%AL_LpoEv-u>8N1Z1-1$^2Ob!}tnwBTO?qJ9#z4v69HtRDFRDz#G|JTA z9Y2;iPY{1RC^ZT*KMF&0Z2(ioBZ4=hS$*(*T%HCvKP1I;)_iCbN=nF>AIroOT~}=s z7MyTzt{!bA9deu&ZD*9c+5hC)=IiB9jvIjFY0(7jM+$^lQIgT_Ij(e%bv;l(Kx9M5;EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_JjJf~p-Ta@86Vvk(!lTdeXG9Iq zmUmcYUQ@UwtkiSp!Qh4wQmS^D3|!1kQ5U*ZlbP)#nnJMf1(*Evqm; zk8p^`yTCZjmu-T#b>i07fJ+F1z4?|?$~WxUc0bGcA&_VJCeY?bWAc~qfD8Ol+KsmR zSGMMJe{8F1YY&aLkdRQUsHHhNDCzl6@+vaw$#(1HKUaT6tk4zea~V zl6@*b=qZjQ30ZQjnO`JbZvNK*Tge^a2p3dH!~j0W3{>v-hrl&ha`rH%IX={d*J|SZ z^dN&9WpRIsYJbeG#CHE^ywQKL;SpQh!<^^V1P1*sGYlqf{r*gU?C`WD(${AZ^!Q!G xIrbC%WzT-Aoz0K^(;dEX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4Lu$p!429zY z;S#_9^X?duELy-`$)x=$(loW7!N(VzY|HXlpY>VS#r(hg@#3g^F!;mmf3Ya&E>zBe z)Xf%eM$d{!A*%)&=d25~_-^&EiWK!4j5&v>>o@r6;Ykw!=UL7n8v*G2^zfhwM4ujj z!XZ#qXz_0!W|OD^ggD1JMm5D2zxpsrpl}v9N(mIs0ih{fZt=r`=+gwMoLzvQaR3?@ zfHhQT@n+;ROOb~Hb!n6gcJ`cl{fDSza636ft_ zq=qLrktl2l5`9DyoSHnE;8kHsX?+bI64;?~!t=?w)y3%6m&X(9r+{B@NUQq%1aBd| zps%a`IAO?1=8KE9%1m|Q(%T%5*jauEl-wu^!-!K!1-;>1SXVry&?)$W-r=>kFrp6* zi#PZ+#6bf!1tX5`DtOOCiAq@sjvT(=8}}p}r`$P4M4*EcK7Ya;--K` z9B=ue&#$SJ)FO!2yRvg?+|Tmi`KLfX44|Gc=JKwIYm^dxC$!n^s_$Iz6Rw;u0x_sY zcc5)i_-=%sH2!l&kn(RCi>v3e;r!ylFfjzo?){aGdBDx!3)Ukm7<{%yIsgCw07*qo IM6N<$f|lkQEC2ui literal 0 HcmV?d00001 diff --git a/graphics/pokemon/banette/mega/overworld_normal.pal b/graphics/pokemon/banette/mega/overworld_normal.pal new file mode 100644 index 0000000000..f98360fa12 --- /dev/null +++ b/graphics/pokemon/banette/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +44 36 58 +72 56 16 +120 96 24 +71 58 87 +100 87 115 +160 128 40 +200 160 48 +178 90 154 +135 115 144 +213 106 188 +243 120 219 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/banette/mega/overworld_shiny.pal b/graphics/pokemon/banette/mega/overworld_shiny.pal new file mode 100644 index 0000000000..1ebf612ac2 --- /dev/null +++ b/graphics/pokemon/banette/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 59 58 +72 56 16 +120 96 24 +52 85 89 +81 114 117 +160 128 40 +200 160 48 +178 90 154 +109 135 146 +213 106 188 +243 120 219 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/beedrill/mega/overworld.png b/graphics/pokemon/beedrill/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc2cb6748a42b4eb968af87498d680f75528d1b GIT binary patch literal 944 zcmV;h15f;kP)Px#Fi=cXMYH1nGchkSGB0RQC{R#Pz$iesk1_SiFp!XtnwXLG=c@n!0KmY&(%jwX z==lHt|GF<=RR913E=fc|R9J=WmWy(uFbqYZR%}x_^#A{MuVh2~P=Iu&?aoe}P8vAE zK9+1?ntt1F`)&VGW0t?4;)j=B;D{iSzaQfKc5HaYrGL%P^AWz3!*81$(J{9JBtHnq z-(4fQqTw|5ad7 zQpHo}pO@I=f;1TROH9Y3os(HWc76_lkzca&llf!?sNl*WH(qrEo7Z!$+p-ZHGK6I-!+O^ASxd+xy*GY~Xx4+I=3@XY z3+`WK2>>q(y~JUi^Ws!6#-$yBSa||Z%Gub&a<6~$xB+8JSu=R>A%GS!M7JDR{=u&? zJm*qbT|?WCjw7JvLk1pc@?>s-mUjVkzr%>}r1R|YtjFlf{Z23NMW`%JU7`}PbX)=o zS6uTZO%wtdTcqLLO^D&QkZe<_kC!cq$oriybNI;1!q)Ix411mmP95L7X?-Q;DzD0{ffUS_!KWPk>x6L!ahhR=JBb`~9^o>V z$7^`h_bPAGsDpT80#7+FrCuDo(+oQw${Da1I0PLg==KHLaoRamyiKDF^34AU-$~@#gy#zE_FOi%&Vw2S0|{ zjy}QPKgsu?5@EI@zD@C+>%;Hk``N<@obc%se>wjL1dj1JKkNUm2RPy1-u?h@0!z*| StMSVK0000Px#Fi=cXMTqsXNGJ#}I9O0nP@o7ffKUjqa2S|~P{^oI@W@a=c-U~5;E0HbxVX3g z008Ld`01Qy{Qv+1=Sf6CR9J=Wm*H~bAPj^HgxDcQy#L$YO2RP)3{87?ow+&vNYi}S z>|!D0kB@&V9O66tr^6-0K;ex4^a8j<P2? z6}rdi{NStxK zKct0c{^%(91Sh&9h~DQUVIk7+kVfK+%LMii*jvIG#{~W^;k%hS;c|C8AMa&Uqj1JC zf>a!fq@IBZr(|}4$dV3^2Tu*x)v-tvFB0nkGtT=Y90CJ1rEbPi>IwtBQa|E*ep=K3 zR#=yb8CQW}7Z~~mhFk=SLVs=GlIQdc!6tX_8yIrjexs0XD)5#9ZSFnJXN}(l`p#)P z<}ZN{R><4rJ-!RP1;h;kZEL`myfI)@pcj4D1`dASg)A`KA`1j-cj=5vh9F0@${<6K zBW0;Frse1BDT%&4BDU$#z2IAi*9%Non8#zy3e7tl0=Y`ByTBC%C;DTIx%*giTNo69 zd2#bHCo->0NA{bR7Y0A9tWMwsMu`=HzEpT{Jq>EE0u!w(#_?yue+e7jsXTm5H7^W` zK+5Tz6CFk0o816*Z_7=wm946iMv0Fp+36<(953w7Tm{BwT8JJ9q9p~S+eSKri?jv& zQ1WLy45~makgtzB6;oXC;t^Q4;?CSFFz4gyoI}h{xHOOj#`UrC^5Rd#N+-MNPIcR6 z6IQbV=r*qnJ5Xdkb@rlI=kQ1X+( zT_EQ!Ns>a~xm`jhTJe)Xm4O?(#QlzqrenbEIP^HTi0i8I)^%yyN&8$5&W+`n61PI$ z;4Z{}+h(WcZ963f93S&YXycog7dGIyhT9(JW@C9p+c3{KikqD95GZxt)=zN4Weo02 zk(V-XT|>>LnllbvZuw{IBaWrh@k=+gD3@C_23VmGVtuWFF_$s?2uPaV*wN2?A?+zU zoJ%e78Z6qi)dsYO6V8W9lK>?9g3Gn+r;dRW@4vLdfXw4~Wc$*<4i-`+%{E1m4J12V zXQ?mFb93UMYib*QlGkM!WLy1nu7hZiBlqgG>(ZcEX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-sv*Q0@6$f%ECQeRHa9BXFCMMfF zHST&O?P_DNfKbr5SoqLTAYi!g;F$mNw*UYDTSD|e000BwNklM{AfMC(M%@69&611u?XvLe*X5NZQF}G(!Oo7WLA{#kwrR5~tiggG2dMvt_?p%w5k?nCfj;#r{x-2E3Y972YG zBwN7!dk%htd(rq6F3Va~xcUADd4a_u$a7Bo>6G{(j^g&?_oq1ouB-yThEsyw*+Iz1 zcwV39hF6yr`c8kI@HA-xv}oI$#ock#5pd&r-Nmtzx)6HTKXXy&RG{}ghoA8DrV(~Q z5{E(K#Uf;?Lhjs{w<<&x=G9a1im%H;`%&NL@uU_nY}eI7A3~;5o_uKdRbXla)1{Ak z1~l9>Ei}B)(VecsXRK=N64|X7wYb>h)R6!`2RvVFnhI2ZYe2(gH7#@$aPNWs2b={G z$9EC<9+@;}(vXjC{Blq?5%!jj3Cq#lfQC0MI%b65qt0kg{}`WA$;D+|m*`YqU4T|l z@S?zMaPZh)SYEf;&47m2EmDV<1p-~#VD|K~?Ix~Ts1os*aMoGd|0+7hr$Cs)&M|Dlc8$sQ)Ql)w_vB@Pr`7h-=j`18>n?7a z7N%vb^;YIgMqp}2?7%vOq^@00kt|TZt!e<0#W=+*0EZEx3SJa=HqiO3&%>zJ0GztG zD_dAD>{E<-p!4Du3k`bVTTws~2yx=DOo;3=l#l{q)O~mHvcR)}j&p%*`EG!m%-mHo zS_+izuOh#%Khqj!fl%nML_cqI>em3;^mO87fvJHa&>sc*kpU-1Eyau$3ef?E{Smcy zW(Z%!`!owQRs>qSao`1ni`|ZbJmGyL@v6YX;G;vSKpckFfKYSquNIjyQ6M4x9*k)c zXlI9q%#2y$o%gZ;`N$Wq3WU6gMId&W=(F0OP`-WxYl{yq0l-sH;+cogC4kt~Kc-3G zJoDlh0*#nd1?U-j@VO~a4HkhkJ8bV6k+f5708Zfa!RaXQuHU2^Pg8Gz9%<_Dj3*TY z+S|3dETkh~PE$~Ov&*|8@d6u2%dOvu)c~4>le}5h1zss|xwfdkgwDhNyWrU(f8|tQ zmrH?XSiMLM5P}Wbm8NB~aD;JN;8}p1-BA9^0G9FX3p53=+!qM$bk6O_0ILrGH@Lq^ z50R$|UIv&4fvLb(7Y+rc0-tV!4!OrHF9UwZ8YUPzQ(gSsfPZcM0vu~y^Pp+kmjD0& M07*qoM6N<$g1~~*cK`qY literal 0 HcmV?d00001 diff --git a/graphics/pokemon/blaziken/mega/overworld_normal.pal b/graphics/pokemon/blaziken/mega/overworld_normal.pal new file mode 100644 index 0000000000..243ecb7697 --- /dev/null +++ b/graphics/pokemon/blaziken/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +97 21 7 +114 42 38 +78 78 78 +112 88 64 +176 38 38 +219 60 53 +238 122 36 +237 106 99 +176 128 80 +208 184 88 +248 208 80 +32 96 184 +240 224 152 +255 242 183 +0 0 0 diff --git a/graphics/pokemon/blaziken/mega/overworld_shiny.pal b/graphics/pokemon/blaziken/mega/overworld_shiny.pal new file mode 100644 index 0000000000..cec00622de --- /dev/null +++ b/graphics/pokemon/blaziken/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +97 48 7 +114 42 38 +78 78 78 +112 88 64 +176 80 38 +219 110 53 +238 122 36 +237 148 99 +176 128 80 +208 184 88 +248 208 80 +32 96 184 +240 224 152 +255 242 183 +0 0 0 diff --git a/graphics/pokemon/camerupt/mega/overworld.png b/graphics/pokemon/camerupt/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..38fd221e9234811024b48b5e5198381d9554ac7b GIT binary patch literal 1524 zcmVEX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-sv*Q0CB`H`SATT&UU{yd^U|_N} z8`Vu3<8L#7a8TKVD(k>KpqO~TxR?L{0QmU$|Gyh{000B;Nkl9sPV5?1177lBf_Zr=7rCZbTgPr6e(;#0W4t5!1~F z13fUvRbYkz1e$IReZfW*n0%V4ZI*0k`b;NhibybR8&XW&Tnod}hbA+Xn zbB176u{ufRR zZPDPu6{3EzzQ&Zf&k5Fft|e-54N!!Q^`h;kz+0{%jN$auAMcI95J@MO=(NUS7jDqW zO@cDxnMthe;DerzSk?$TsB%o2!oyRU^mBsXEBr3T$v@$Qq-tWBKI{6}aNEt}6-?%CIibH!X&zK5P^Y0$aT5 z(=`$tQgxxMmyN;}R|70{d|PwBhhrlL2NzuOy5{g)qoZ3`*%4-VbC@A5Ufk;@`>+Ax zaM=glhnIjBe;Qz1xw->y&K#U_$$m}hlHV`xrOk1uZJSsBtj9xaSmPQj?%1)7f6J>u zFAMGjWqjEy9eiUDtH8pK4$k@DeNOO-0S-HPU0i`SSv}-= z2rMD3^zdp>yu(OKeROcm)x`T6q>N8Zv6Bl!2=l>`&pbB)+4nw3UOFpR>+LsrHHbBa zy4pM7V=sfx0Ck!jn*H1-j(EfI#X8DJr|4(=&*S)}-@=Y(i{acLoEy9Xgwp_}J{+Dp z-FVMZZkCxXz4k@zHiMyTP&m1k_`|-H_?Cw5_y^m|0J<&=YJg`24*8c9rO3p+etOR# zCZm1iFZwZv_0xU)jp4TjjQ~6^X@WB7pUitBX2?GBBRvb$*ZqaTR{_q9K1Sp}{0HCv a+WrB^p=OgJvo*W`0000Px#Fi=cXMTqsX9v>u79W;I@KuS(pTV7{tZF4AKj!J~RIj#SGvelrVpa1{>mC^B~ z=l|H)_@&xx4FCWH07*naR9J=WnA?);C=5lTJ^~v@asK~rXG;PbFvO?lVQL;ib#-Ev zENyX-aUPFv`?hcUw*O6|=HvGq2<>Bp8~!&mxxzc{CM!(^-eCwtcH9d*Mx^K6P)Q6F(I|{FyyNOmvqJM?-h-~t0z8jdx6<;`+;MVOtqdhm9D8yr129U+uO7GPbYm}%kY1Mdc_rqFSC zXg708A(%pZq|`?yYI!q=<-#cG2*-GazhI4h26qP6iHY3^UsCj7IyJPSEh*MKrbTc-* z=I&zzu?CL}C@+F~67(*hT_>V=qK1d3rl$&d(IH-K(>6HS1n^o1w@A3)B;oC*?;wdS zMb&V}^AMvvsKB)A0CVYkJgVu3L8IS`gOw-1pZ6O}3s78PzPZ66RoL!Ld6%Lm?eYCb zz5aQ}J?W~+dz6+LU+7#RF3=YGDKJ*@ZQ{BFd=ezM+u$&8cAl5v4BNgd0(A}TDgNjt z{fYSMeRSd>he0C{6Od428iD5)6iPcXV3H#{A0m0G#-ul6nFlV;O9m5M=@&7DC93JO zK00yF4}(Tv8VID2H>D=9gXha|lmNl4mK^$mDRk$l#i7T^DXOwwvy?h5W|K+5Jue2G zz;qFKRwq&e;i}`T!Xmc(u+A&zXEB@L!d0MP19_dtO0bU8`7+|gpc9y=6{uGthe0aE z%KDlo2`7C*@RFS;T{Lt2ut_-;;&6bc1WMHt&nxntDgo*FVbBN^Um>+XpTeAxKF-V6 zGJ&VU4J8sIT%1<|hqz8aV?f`AlLr3jX{&Z_-#dO7v;q^21R567%^^Aue*I`0zjTO> ztTln^iGIZ$M-bXx8`=vBM~AV7OUFJ76rB(Z5U3Mmf$gPekbv&e z;$Y;W!2>S(repfXFP(QB1|J1lf;Mu~cS6?pt)ON+dhKlRfQ#)jY_KOkM+s=R8%%x{ z5Zk=!eEdpDnNNRJK$bW*Xf>F|D{O63uMwkB#UP}LOqx_AAZ~JfCKNj^u UU7iv^nE(I)07*qoM6N<$f`K{_*Z=?k literal 0 HcmV?d00001 diff --git a/graphics/pokemon/charizard/mega_x/overworld_normal.pal b/graphics/pokemon/charizard/mega_x/overworld_normal.pal new file mode 100644 index 0000000000..32de717e27 --- /dev/null +++ b/graphics/pokemon/charizard/mega_x/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +30 31 36 +80 29 52 +126 40 64 +74 78 90 +91 94 103 +107 109 115 +40 96 142 +74 132 189 +57 173 255 +126 178 213 +160 160 160 +0 0 0 +149 209 241 +165 231 255 +216 216 248 diff --git a/graphics/pokemon/charizard/mega_x/overworld_shiny.pal b/graphics/pokemon/charizard/mega_x/overworld_shiny.pal new file mode 100644 index 0000000000..ca80ec4de0 --- /dev/null +++ b/graphics/pokemon/charizard/mega_x/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +30 31 36 +80 29 52 +126 40 64 +45 83 75 +62 116 105 +71 136 123 +142 40 54 +189 74 84 +57 173 255 +126 178 213 +160 160 160 +0 0 0 +149 209 241 +165 231 255 +216 216 248 diff --git a/graphics/pokemon/charizard/mega_y/overworld.png b/graphics/pokemon/charizard/mega_y/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..ec153e5a308f9896fdc3ed505391eee2f24d3610 GIT binary patch literal 1189 zcmV;W1X}xvP)Px#Fi=cXMYH1nU@!n+KmaI6Silea9dV>xa5EVv%6k0uWy1PolymmS#eO*oO)ZOTR4d?+a%9hy$ zkV3C_0R=D_xB$A2$GTqisW*p~C5V+c!ovDhN>J;k!PbET2ImVGK;o<3)W`s{19T(D zR>t#H2Nw8oAW$Xd)QEMWbvi-^dNJ4-FhB`8EJzDTd>kRvdI-l+2Nb|mfEv&nfKdYU z1)~`OnFGAA{9x;F5?)l5a}l(PTR_Om((21n2V_9&aP9z;te=|! zO_f!u1c*);CscsyeZsQPl%ms8JxLF>8(O>qN= z{>u87J1{+W8TMwKlr0GaKs;N@#qX*g?w~HfLZpCkLDZrp(kvA~(r*m)B?nZ1>j2R0 zS-_V%2zjyROG&mqT zVB*VX8j2!u&-zqJ2~e-oGX>=XgKqd?c zFy%%@25`dgz`(ouIw%8%+CYM& zfV=3Xehz7SJ;GyT03Un6s}xU|e9#`> z(*^g<*~W_qdLQC5jR9YCH!-(CxB538@EwNV@o&c;mG3@*$fY`_00000NkvXXu0mjf D3 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/charizard/mega_y/overworld_normal.pal b/graphics/pokemon/charizard/mega_y/overworld_normal.pal new file mode 100644 index 0000000000..7bf6f4e8ef --- /dev/null +++ b/graphics/pokemon/charizard/mega_y/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 48 0 +96 64 0 +40 72 88 +192 16 32 +144 64 32 +200 88 40 +248 120 56 +248 184 16 +216 168 48 +240 208 112 +64 128 128 +160 160 160 +0 0 0 +216 216 248 +0 0 0 diff --git a/graphics/pokemon/charizard/mega_y/overworld_shiny.pal b/graphics/pokemon/charizard/mega_y/overworld_shiny.pal new file mode 100644 index 0000000000..6aedfdfd26 --- /dev/null +++ b/graphics/pokemon/charizard/mega_y/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +53 34 65 +77 76 80 +118 33 45 +192 16 32 +86 72 106 +115 96 142 +146 122 178 +248 184 16 +163 161 167 +196 194 199 +160 61 70 +160 160 160 +0 0 0 +216 216 248 +0 0 0 diff --git a/graphics/pokemon/diancie/mega/overworld.png b/graphics/pokemon/diancie/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..2843e4fc33d2e75eca94d85c7fcf1c17e5602029 GIT binary patch literal 1756 zcmV<21|#{2P)EX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-sv*Q0PE;>t1Wv3}y#+YJsc$V2; zs?ops^y1gLDgZ22Xi?izARDFEKr6u3Nuo5q2M#%rcPrrfryVA9a_K@-(hEn;!1+gu?Nh4u){37lef5C z77BC#90=860IYEkVwJP|-k}9t@o{U&)^*SrX9+%zfVm^|l!x4w9sd%0>lJ`+0PF~9 z&M`7HiGdXU_lqgk zE9d}6KC?^OxjzHKap=~8d@I0{5CMwl7#0bLGrV@SdoADA0d5T;;{)^V+)J3}FNf=m zcDDlDN4_!&>^tJCE(BB1Bw1k@0Jnw^0s~j+>kS8SZ_e}<4uOSl0z3&_Ed1!kAyKnn zd@TyvS-b#8zUsgj2CNZm)2>O6!soXMkP3>IH@j%0gQGd}SzT^dz6Ibx=&T#ZKt;_V zmkYCZd3*u(d^JQFBfQK3<$`M+D#!$Q7}Pc-ENzdy!Dr+umS-{rMppV-09Ha*5~;3= z+^i051ayFI6o4_26>qZ(i%xcQ1;F@cz)A>L4>KwZ+gogS)Et6mcM;Gm)gG`A76&|^ zxKYKr#aPvL2^audzA8_VU>;o|#d1cFS^;VkJOfrjI|(;wtXx_tFOZ-WumY?Cv_#Nx zbw>NyU5TK&8$j}P)rf;W>mO;#M+P0jDPX$++^PU?l@28mPbtr;9bc2XL~sJEgv9|3 zkQmlK*GkY%zzAp)9J&aoZG4esLP)8p`iyT4SP0D*Vasa@`UzAfThR+u$pi#YdNr1W3|IfHF+h4$|g1eo`mM1 zELAcukzQcXmVX2^zBYwGmFdFFs1EUPsC)~+N?6sh*bnx`#z+2j|D53g@S0)V^l(7C z9DryHF#A?O2bhene>-E2=TPQ9*&{}3jvX8m;7OkCw_2P~ty*mKxP9H zL0V_Nd)8in1K$}V%$Ze+rE+XCtmV7D3p9jUHrKBD?QXf^HUM^noJ`n}oIx!<-SnP- z;pAJs-s>?i`Ogj(e8Wxt;rsI4`>u&~)&q`&B}k~1Fprb19&+)?+6Og~748$PAK#EV z!m=G*J%;1f4*}JlEFV6M9DH|QS1<;*hH-$AZzi0-b}YYtJOQ%XIW!Btdmmj7y!wta y+zTK6`WEoE;RD|{&F75$-SOLYf1~xkdHew;OHx>;YVuwH0000EX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-sv*Q0)7AF8m5Ey7+NJvnCAUL=% zNZvtO7?3b9us|2Dz-Y+eh=`Z~007X?;OOZ1ms=W^000A0NklZdFL-C_fC{5|T3vpYa)=@frWpus`JVGj45rgB~C3(pjLx zX=y9$al0%{i9P<;4bXzo*rLb(x`BaGYCC9igAGh$`9IDL1VUm>VTYSIQ=&Q6ws?ah zLqFo8FC|^z8(aj|c6f)g!0+>ANok(viozZztUt#jpV~ovi`!(s%~787HdKLaPUJX1 z^EN3ONAxBB8w{AIK7>gz(B@Q%G4mnQ18q)}5!Q$eB7&W18c%qfF8p2shEvNN!zdecI7f$&TG6K(X!3D_rZQRXP*Z`M zn}IgpL%a)A0^H?;jWm^le1 zRhT)q&=Kjn_>GU3_=-RWUD@&s=S%kCU?BKhPW)_81R|<9CKks7P^lpf(Z-RDn?WAV z<-8ImI8FbNU-a(+33OfY#_!@oc~;#Y&) zfU~?hyCNDY9|rKO(NP2@2Z|L^LfZ}}0|CXKo?Hx`6pj-FPOg--6o6dO+iBK^o=@N7T?W)TRJ;VusoXy=N-%>bt! zgB2E~4qgEX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4LK8r~m)}=;-(W0000000000bJT1y000CCNklzdpk2n~+O zXxR6E-g5AM%}(2|{n6U(ZpH(0Ktv|T@qhfr!OXve|K-8#jM-4!;Y9Hd<)=T2D?ew1 zpff8Eb~t&@Skz%)ZT6l%!JP}Z_dehv_5mIU!n>UVYn;S0!vcB?XNcud`?>y0h{}w0Xz2UIDnqW-O_i=1(;-?JV5P%&XeGFsFt!G>#6ySHXF-CBQ!ylm( zBaHnT1F*qG;(A}ny(z;7T+WB=uz!c)kt2@3k1Iima2kdt4s3An)5u7foE(m492M%w z48iZ{s?`I|C~p-(#>59WU0|q3lz8gE9*-O^BXXDgp4Qqejv3Ab`IrP?hYLZ8tn)_x zxmlHYz@w2j3&YFE-=D)x4)Dh~>g-$M>sNLD0go1}ahEeTO5`A=hYlb0OMvJ4E#BF- zFODfPJ*7Lm5d4z*@MS~C!RHy~dJnV9_=X_TWT~I#tqUNr@ye)croDIDXyK`Ex>+7z_a!d37->G z?&LQ539t1_9zcXsp6QxLk7u~Ti-G&J7C*PFBZplKhy@9hpiX`&d`-}YJelejywp@u0ijg9C8v$0|G-5P;4wkZ0nnMZ^z8+^XZ8aS-VVCgLhN*UxyZ-)1r>YOeCo z`{N@V3^`cv%D`=vpS^>CaR!I|Uau9YJu$&gid|e!{uZZyeA@30pAX5B~z%b`!+_%NAhV zX>V-I@ipEM)IP;fxd%G^BjdGxp#g$u`JJ16Sy2CSN78x_49NCLh~E-m3YT3+;2C$? zrsW+T0+8`WKe5nEl)lfHOpts3Wamaa8enr9x}{gUNuG2j8D8Qw!Kzow1Z(|Kpm#ts z@pj5E2>8l@;9n5v@I+8XXx5Cjikw>peH!q=LDv!-^xfbK1C`YCGgV<0FIz@jliV;y8u;hlcvfW`I(2XrG^I112+i^Pjw910vw`$5bqu96cN zi#i{S&-812A`tcwFkF3iDWxC^bhsAD*dNUamRY&cCf|5;VWJSg$*Tj@kBm=y z`rtwGPD9nBaUp#%)8R+Cx)%hqgNqk@n5Fd2W#u67EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4LvE$o427{n z>=^m-{%_kO{B^_DW}5rEs%{a@rB}UVVqADoO9O4JFFC!Go4dx z@m*mr6GpkSKAYbSpzpAdOJRLN0CSEJl(s|QmgwZc;6tDbZW@5bA#mRsNKKRjm~s}F zH!u_mJ9NuJ0CT=841`0{Z*qP}hP7lIi8t$2-n(3R29!8Fi`4H-9@to5KVRjDE6`eK zUm?=%bKcu*UfDaXS!%WxU(hH5B^&{5LYTnd2rX?CiF%=~^WLd*#v098?$#FP8m06| zNqb*0IIa?}ub{f0^JVequN$H~ukT?8_u}oD)4Ot#vv~UtE;`_L?cD5jZO%QkJ=e$j zq)qnk51!5ge64VuAuyA#k^@{FoTv&T9Px#Fi=cXMYH1nIVwn3J8NJnF-b&0R9J=Wm+NxlAPj{qv~_@}@Bg~1BZ$q-;GOL3_D9rd+;9w> zPYCR8+b2HpiBJ55AZZ$e{$cmO5EPOH+S1GtY6lC4Z+1VMrM>ZPP%sM=$flOiI+#0r zv-@E`ggL-9pgPdLM1cbl40H~r4#_&ay3?O_KkW0={|t~A1Z-0?{B!4E258+Wcc*dp z8DN5%`(FTJ(11bmXEVVaKy{}X#^<>E1kn65JG$QcD?oG2{QBsYY5|xORES->nHGS_ zzpl`5Z`=dqP{xIW6R-t9ZMfiAe~Gy3z5q=2^jBoOPnUql6gj#Xx#3B1ui`=abKo3#x>r0glQen>sCrqW8j{i@$40C5Tp$u%LU1lhQzS`009$>tIzc0jNe+sy9}by4&Y6M#g>DIPIHL5H7~A&+TIdoyqqb28#%8td3xK(v z@6tl|y0%v@D>EGEX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-sv*Q099U&+vI5{~%B2sZyR$5R{ zVA>TGaCnF)fxu$D?wFvksjs{M007tB+{Ml2QEm@1000BLNklgg%uw>0IflYe5{o1en+J9x<`!C0e$oc*+;%R9+x*Po6* z-D0GJ=+E+bt&vWAJOH8>eAc=b_yX{Z*Gefpi5~-=@&RBBWDW^td{Cfu23RuyPxxYZ z3iyma0baz90h3RbA0x=T?W=sj=P{k4%ZeW)P)J!!asgPx95^vWwNveg>L=-0YW7l4oW z7^!0tKLqrVH;M29i6pbOlz72+m{<`TO#(2HAL_O43Q%lTCtJ>B$MG)!(_JnmWjFw~ zl3>R75TGF%)31pY`gJYf3J~#G|DFl@_$eULuF#Kpvp@`&1XI21@vobk63@`mvX(I^W_N)0Cu0&X}<%&ln!AC7^--2)P)LDsS{HtxCCT<)4Vh- zN^PaYIbU|c$^Ci~QN!I};FV>QeQc7Syc8J{F(d9k{Oa(n|A8UQ{mrwnf4 zct=q1IavR+WFe6V4)Sa(Ahdus)B+Hn8=op{>jJ>B2W+n4JWJM(ak%?th6f)qyN(Zc zmt_W^aegdy#X3!?_5gGTpbb?E7@x|!rT04i8t~!7(k@CZSaRDEGoL^7_k0k5Jz_gr zykWa&1aSGVZc{j<0=5F*h@S&yfCZ*9Kx~@`{lMd`9|nBFg&PuR{Ho`r7hqW*_Q=^z zz;*l_@BrXA&2yD)JfJ(PcO$;X4F1J`HLwJS00iiReEd27WY z51ZJC?+s%UY26<3zP$vjJjU5M7&b)_1HLQE`|0CD^BD0nc07}OwR&~nH=6KuI|zP0 b@!z#SP|H?foLjv700000NkvXXu0mjfhvlWF literal 0 HcmV?d00001 diff --git a/graphics/pokemon/glalie/mega/overworld_normal.pal b/graphics/pokemon/glalie/mega/overworld_normal.pal new file mode 100644 index 0000000000..e10d60b62e --- /dev/null +++ b/graphics/pokemon/glalie/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +29 29 33 +40 40 56 +57 57 65 +34 82 113 +86 86 90 +80 80 96 +218 21 21 +112 120 136 +40 129 192 +98 189 238 +152 160 176 +169 175 188 +0 0 0 +215 221 220 +197 205 230 diff --git a/graphics/pokemon/glalie/mega/overworld_shiny.pal b/graphics/pokemon/glalie/mega/overworld_shiny.pal new file mode 100644 index 0000000000..da25f12f0b --- /dev/null +++ b/graphics/pokemon/glalie/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +29 29 33 +40 40 56 +57 57 65 +34 82 113 +86 86 90 +80 80 96 +218 21 21 +112 120 136 +186 98 71 +98 189 238 +152 160 176 +169 175 188 +0 0 0 +215 221 220 +197 205 230 diff --git a/graphics/pokemon/groudon/primal/overworld.png b/graphics/pokemon/groudon/primal/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..79dbede948e0628bc5659a05c053bab3c5ef8188 GIT binary patch literal 2384 zcmV-W39t5vP)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_42?l7 zHg@&@fBUXvAdsYkj5~8qU#)3op}E3bt(Nn6G-=YLNs}f`nlx$Bq)C$|O`0@m(xgd~ zCQX_&Y0{)glYdiqef?8-BC5D$J$@H{kmm<`y2-&`iYM=@2&~2L!k)>KzWf~q{!Tmz ze-$oVi$4gK9ev>7<81tDv4k`SQL6BApBcL3g`4jetIRznbSql1@TKrjy4e-w7}>?C#Y`bu)aPGL2^@A;5HB!|eQ zZ^iHYtw95`sqI3t-Ln>dTK_oD^XOv276zM1O3~>RD+9H7t)Xuzq$mQ4@s#aF2$n@8 z`KVqD=P`Crb@;O|kE8Gw1NJZ>3X`}{;DPmc79ZLLDdd~+w9*#^=N!R-(9nB$aWXX! zwfOf(5PhUOS<)`1xCY$E!&)Qz_+&6euh+g4FRMh^Q2yqT#?gU6cyTheaJBf?M;K5# znQ~a+Ck+J&q#6$oro8l(K=hG?5m1h2H$=_d!HpvkSVSGCB&o%eMQZUUU7iOd?_UGV zN;LdJDj!M)GPQW}?#+W;QAhXze>I@t;g^09yO9IF!DO6kxhad(;*Y9G#u->M^buZo z8c8W+P5~q-=LIjDAtRo2hIY!~awS+Tfc^I;{G|mrGl+VPjmv;lqm5JsZC!LN{-8+c zf)No^A`a|JN;jJ^zxj;U36)X7YJhZZWAGq03&8vz@z*m-W-OQGPFOlpI0zJ6u+DR9 z@mV_QqgY52Wh_dCKs$fgf-iX1&3R|SQ#bK(l%vBOo;u@{m;7(=2Dm&VtE;&V%;8V` zNa{YOd)MM2onH{V3n_D}aOTfA)68#u!OJE+E#6`Q%KNDEM#|@l2Ke^Y4|tmaSwmfY z$GcHdi5C)0*gt^pe9-JE^tmhplk#U&qAmDB#5-PMKx>iB0G_)KDMYRrVnFBdzrhz6 z08cCl9BX$v;7`vaa+L};1B82cEK>*QBRjV`u+y$SNkX%%--kt;U*7RfH%2LuMFC=O zo{>W0!GmMW7flBE0&lVa_;D0;s+oOA@_5`+F#C&=s{ad*1&Md?;=f7g>z)~8npitr zs{w*o5TIQ{Cnij`7y?t^3eKMP6Rjj=SuYz5@Fm``{)f!+)OwjgBoRcDoNJDn;kCS7 zFJpnjA_?5UYxD+prcd}ITO-MO2B7ulU_uu(4;b*IgA7TVeiQjkhZzLBHUjg%>j=nA0QleFg?Kp8k-n~DDmmg* zLwDWD0A$_>=T9^|{df0a`#$6|-h6-8OA-QwQqNx5Bfi{{N~Y0_yW-gw;;~-vb>MGM zi<$}0n-53+iF~q0kjz4ok53T-$x0#Xd*AT|9)!M4q5yIKZUBEh+7)opJpRFe*ZAx| z^ki^YGorZ$=!dfJgb>3nh`8!4OMgm>k+3@}90eI0=W=^EltXaIV_(=7vJPm(9$xfk~4 zUOU1|Me5_yyKD+d@ItpP*G;;So%DRq8@B;@BjEKEaL0=}a~01KAhhWWNq!LLifT51 zf5YD}04$Kym}-C#9Lo1#CgRbn0f6tz@SG^o+JR{@B+aSTd4{Yy>AE+(Xn;=pI9m*` zCy+IHdgDNwY3p2$_;`bVapct%9nYD=X(~G1BNi&9FD}8mDW$`Dv;P)+J}{3RUNodM zS&!BAhB9~Xetm7dv<;r$d&b`h06|4@9nN)iE^Mb)72?iZf_K=xp>96kxB4#|8N{Yx zjiJLjpb>g)ct_;$#ZU1lVp743c(3n2;8hpu!)oH}b6Q7z!F@X5>U`j!QW*v8o7ulCcA~4aUT)+Vj7=f0HInnlx$Bq)C%MDgOccCb%aA7LADj0000SVqE literal 0 HcmV?d00001 diff --git a/graphics/pokemon/groudon/primal/overworld_normal.pal b/graphics/pokemon/groudon/primal/overworld_normal.pal new file mode 100644 index 0000000000..95041cbb07 --- /dev/null +++ b/graphics/pokemon/groudon/primal/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +19 21 27 +32 40 56 +48 51 59 +114 10 16 +53 57 66 +61 67 72 +66 70 80 +98 98 106 +190 23 38 +234 48 77 +250 94 117 +238 102 102 +229 229 166 +184 200 216 +0 0 0 diff --git a/graphics/pokemon/groudon/primal/overworld_shiny.pal b/graphics/pokemon/groudon/primal/overworld_shiny.pal new file mode 100644 index 0000000000..7f44addd16 --- /dev/null +++ b/graphics/pokemon/groudon/primal/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +19 21 27 +32 40 56 +48 51 59 +37 37 37 +53 57 66 +61 67 72 +66 70 80 +98 98 106 +64 64 64 +84 84 84 +103 103 103 +238 102 102 +229 229 166 +184 200 216 +0 0 0 diff --git a/graphics/pokemon/gyarados/mega/overworld.png b/graphics/pokemon/gyarados/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..e204b06025eb073d1dd056a7941e42cf76a9d4cd GIT binary patch literal 1618 zcmV-Y2CeytP)Px#Fi=cXMTqsX7#J8ZFfc#>3|K!DFgQ?9NJxkP7`{q!vx+hN+H@dbfIxVdM4{;b z0073u)}pqEd;kCi&`Cr=R9J3eg;0wiBBohI*P zx(xAte0~MkcR7JB5B@a%GTSff1uX00{~u5vtouEM-@h{YM)5NH4zdBR1W)u{0ft#N z2_&!_5pM!d^q2GcSIAyKJb7!)Cjl>jrl3iv1WtfAf%WmU&HfUh^K@BsRen$ozOTCM zXTJivfJ)K`T==~RoMe(8)js<^LiY;2Uv&jR!RyKo{I(v7_yth;)t!l`@7EA~69_s# zSyvhK|6d_iCL_&8Z_T8sm`=uD0XGg_DrUL5_)TEt4^o}}h5xfcW(a2H)jTZO_yMU> z6XyXi1lBR=HHzz>1a|(bKBeFng&x!LnzQ~WUcrw*zY}l|*zCi@c?dWmy(jSP7=#U_?nH1+*Ni_GM>33Y?5P7}7sI!Hy~T zT_I8=sAWhdK@BTsLqU#Jz%5`C*a)Unn?zoNq~zhTq!xU&no4{7QJ`3Sxg5dkHG^Ih z`XykAwWTZoLMlY@LzbicP z3st~mvz`H6U?&(`h6wn z`Kf}S83YgI3!n+?1TDJN$;xa=?W|D~da~~XT8V)x3J1E-3smryyyP?l+$(HmToAC6T-UfF|%r5Q*CaB#E`xi%XfQbg~bDSSkEQEo#Jb2u!fr z1yip<0!|8tKAf|%rV`-d9}Ok($nll9*yZ^F;Fo^PHG-DoAt6H;ZU(&j&&hJI9|a;o zet*3daju^9ZCV;VqyY{JH+^sfwoJ$jG$=e17QG3G*uy^phQLN};!!mR83MH5ltgCc z%GtgNTtb0kiz}|yYHJ-S9{^pUSm}XKH=8WUcEiY)naU2Wd}=2_ck)fsO3r@IX%O2iOfj z_X1rYK?^^+%!k>U=~CDVcXC1fw6mWC(%X~!IET)OGe)h!A#alI0aanOQ=pII9JBTo z14krh7MX1l^cf&SAP71TWXN+0BxtoZQ9uzEi#nbYoBb%T4fnwaR#%=`J5K6hcdpsH zKoihbP;dOaa-BI9WHn9-ruG9shd>b2*>VEOPJ+^YI>Teq07v^#U?+%$U6^YCke;K2 zul6Reor0Ah^5ggS7dZl*E);lcS%O+^-UEg}5_EyLR0d7p;IU`h!pD>SByf266Y|V! ziZVUsV*n2Jg;m+@HInF1;1|__AX??j<0eq(BcKa3g2?g&FV886JML?M2m9eaCv@&LMcP*GTeQM6&{_6p-VU1$QTX1`L75P(Dr<=i&psH@jh2#8@_w3 za9YDJ7q3l!vDZvf)}P3E@w)ZrgP$Xh_5r&kegin;-e&&a%KFuNW07Y62e-G8{Aqr0 Q-T(jq07*qoM6N<$f=AuwD*ylh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/gyarados/mega/overworld_normal.pal b/graphics/pokemon/gyarados/mega/overworld_normal.pal new file mode 100644 index 0000000000..88ab19a395 --- /dev/null +++ b/graphics/pokemon/gyarados/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +24 24 24 +48 48 48 +64 0 12 +88 63 20 +48 56 80 +80 72 72 +136 0 24 +190 74 114 +179 138 49 +252 218 116 +32 96 128 +64 120 152 +68 161 233 +0 0 0 +198 198 214 diff --git a/graphics/pokemon/gyarados/mega/overworld_shiny.pal b/graphics/pokemon/gyarados/mega/overworld_shiny.pal new file mode 100644 index 0000000000..06527bc415 --- /dev/null +++ b/graphics/pokemon/gyarados/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +146 124 78 +220 202 148 +64 0 12 +88 63 20 +79 37 49 +239 57 106 +136 0 24 +190 74 114 +179 138 49 +252 218 116 +128 24 56 +159 53 84 +239 57 106 +0 0 0 +198 198 214 diff --git a/graphics/pokemon/heracross/mega/overworld.png b/graphics/pokemon/heracross/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..dc10314d1cf75f2b5abf0266ca8b03c97a648242 GIT binary patch literal 1414 zcmV;11$p|3P)EX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-sv*P~{5D*A3KoCe^AYgc~C@|n4 zIG9)f_+WV0hzRhoKsb1iP?)fQz{mgq0QmU$d{i7Y000AlNklzdLws&(P)Z9=|>A3izEn zjMkeyep|pz?qXcmhQuC!`Nsq;1%1B$%Hdiiwx(|K&B{mL6wu@A+FXJr?IV`mR=>$Kh4-sQdqd$2@-EDPi5hG$iP&ZIT|( zGekm+f$;ewe~rKAs0*H;&nl#%u*YpM(J)NIKvXyA@?GE$TotPKbaBx1c=kUH6T+P8 z3cldY2-+OWBYv8~uiPeBo+Dx$pUZ`SHcy4X+BWNOlBk|91-7|%SP)1f?&^_D;78Nd z<2k@PE1(X|vo>vE9{-A?NA$QPNX8lG{5;~gNbKKzV~^(yQP}liqw^sFeBft&;>Ovr z-VO&s2(?gq>jbpNx&QAi?)@$Kk?%V;*xP3tXo`` zd9DO-$5 z&6&kpT_Qxw5YlY*>cz6u<5?j7R=3*^Ti;p+(Bdy0uyUl83X4h&UGX$c)+M7sae1Iq zu_x1%zTjJiJ!N(F8+R?f`s@MVZ#*fvr(*zY*?~e#QwyNv;WGe{K^p|@OJ|*e!;aO@ zA-7yTo&};ono%6851-mL`M190<;05sO&@x!ED((6<+#h=99swm1y9c?149$a(h`h< zhFTsZKGPRG3uMM2fsucqR=Jc1^CK7kxd1U}dhlGU>qFpyo55J}l%5IAlGETl_7*{@ zPxiFnc(!wFrh=P55>LB8@|AY_!1=HP)~BBFk{mmjo-1hQ0)s;{V?ua!gu@);p#mSp zw~owR!PgIN0$C$7ftG+%0G5D_tL=fid^$j&(+nN;zd1Af_)0fK@5==OEB(9%c((m~ zKL?0%IbXGS#v8A`pPoVWVIE(TxAVuPMLn42v+MUO0rcK?F6o-m)kGU_So}A~A7#Bl Um_n`~(f|Me07*qoM6N<$f|#(Ve*gdg literal 0 HcmV?d00001 diff --git a/graphics/pokemon/heracross/mega/overworld_normal.pal b/graphics/pokemon/heracross/mega/overworld_normal.pal new file mode 100644 index 0000000000..f8e603f12d --- /dev/null +++ b/graphics/pokemon/heracross/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 16 16 +8 48 64 +16 72 96 +32 96 120 +176 40 48 +224 32 56 +152 88 0 +248 96 120 +216 136 8 +240 176 64 +56 120 144 +80 152 176 +128 192 200 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/heracross/mega/overworld_shiny.pal b/graphics/pokemon/heracross/mega/overworld_shiny.pal new file mode 100644 index 0000000000..520daaa6f0 --- /dev/null +++ b/graphics/pokemon/heracross/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 16 16 +70 15 58 +106 27 88 +133 47 115 +176 40 48 +224 32 56 +152 88 0 +248 96 120 +216 136 8 +240 176 64 +160 76 143 +194 104 178 +218 158 215 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/houndoom/mega/overworld.png b/graphics/pokemon/houndoom/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf4de427a45528c5614b8b6ff6e0e96408639eb GIT binary patch literal 1270 zcmVEX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-si1o54C@?rUKu9=HP*7NCaBz?q zD2QM{xQJkgfRL!5xZt>;0002!==cBt00000Kb=AT0008!$S_tp12Mlt~v;Ps_gmtIp^Xh;PV?C+%hu)`rKb0J${3O z*Aws*_V{H1dY*`0aUXIKXw?2Ken$c&Ow(j95}!k$QQPo;6m#Mkfg;j)7q<0K=R3AmgOwLRXodi=73A}}ic zieqY)MYcP^pKz3jt3j}cn^z%^s~sa0V%j(kCx3bzCsr)4FvXX`V*(wn0^^j{BqcTy zusN52QF6w#ndL2i#8X<=>dxyt@7{O07!oL!IIlB~6dDftyp*!2J`uR!zmNF1V#IO~ zNc=9Z4lP_Bhq5fSgs`E|HDnh+q~ z$b;#qu*b3Aj-2KsC2l+DaZF5cb2w6?Kpn0jLG^_w0%0}%f4v1Ko69v;6te1TI@sYH z;cz5Oo8$SbM~_#5EKih(v-bLF9XcGT1sEg+%ChlpIOy_$wL4^)YNMXzbvPn$nZg5! zV%N~P+4&p}qcN78^MYn+R>0-;Mk~_v*wWYGvd+XJ>GXDt&l$?l9gFnI(%A0wIF{7b zA(5y-!D-{M&2^n3!<4KfpS+zQ76mkpP)F?wcX$<;EX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-si1o54CoO0Q0a!>Vcu+VvI6zQ1 zKuAbPaBy&-cqq7daL}k=_{eww005}C(CFy+m(4s&000AWNklER zu6YB?w!++R0)3tZf_v{f3J0761b$7hF9;0bwTMH_U)R?nU-lwj+D+h!Yl3TZ*lVe^ z1P(X^+Gm==_UnM3Jy;f>1^Q)a=o|1&AgMxW_2>bIB$buTE~-I%=BF8SZ}TzXTa9AC zF{f^>rl$xs5^TT;11JgMTM|)t8N=Xo@WMd{)6h7FBF{Ba75Rui1!7V`cEX5S6>`lP zx=>l9ZI0B(P$dbg;)=_T9daA(d0JK`4H9xJl+KTM8DcYC<9*ILD=nK5iw3U13DNIx zQGHOz&kU>cZ^So09hxlmm@F0E<`&_nzGK&)P9Wyo;}TUMTV;@af|T1g;wEqPE+2E6 zDyKF*;yJ>!_-x0nug5MRe>&VnDAc%6D87y~A90MpWOhU&N?L5M6*%HK!e~&E142m)Y%#OQXu+8+$EJ#t%tf^Zb?MJ6xiR)&r2D zIYr1W_AKe~LxMwl^ouw>?I6$!wal@KXM8?MZ+KVXEyBz$q2);`%2*wsCYLBtA@PwS zdVM%>%{9j)dHAV^-JMfNq`n?c8zs+}E53VxBx5rnLEgsb${o;`F==w7h^eT z3f}K5xi#o~ajdUN7Bxfe_q+9IbC|fv<;+ip8{9NGyQy-p&Cyf!h#;%YpeG)cPiu(X zlPeBXJ7_bQLWkX@r~ggvxy4ToBw4**CAA)^8XQ?-4Ptx9(4(?;z2xQr*JbDu3I!i^ zbaTIMLp%3*0JW;PQW)d9rr6Q1Jgw`oK_(C(u>uUbMCHKK!JX@VRP*6EBbtdk=s~A- z3*H%Vb|7B9TLH!*!z6bp3$pF*OMV)+;AMW!UrF1Fy?3@eU|W0mLW>BG$Gq&2H36$F zJ8n+HH$b_OpQjuDH|3r8@b3(6jmgQ|T+9CWn%uv3`vWuuO=-sdN*w?I002ovPDHLk FV1jEX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_6)u55FA?t z9I*5LZ+m(HH3=wcZsz`=zDy=AMWA}2!TkI*G&D3cG&D3cG&D3cG&D3cG&D3cG&D3c zG&D3cG&D3cG&D4P5uo@p{vRWC{jY|AXn(DxKg2)b|0PIrfWb!t_(6`p+y|VdU;Fz@ zf75hD!Mpt1AiG~Qy+}{8uLjWLubKcSa$fOZdb^}wa!{X7)SnIm)@{@jSgb>1M1Bmp3D|~PU_{}R1y>WDGPUv_)g>{oPi-5*Xrwwq6 zzv##EIp*NpJz;E%W`r8)+2>*%!<{2krrfIVDM<4janE~A8E69JH=y-zq5k56QaU;49 zqCH1ZeJe`}O9nWd!f>X_h4m8wCqos@Ndw&AbNGbdvX`*F^~&;#|m23&v|lS@OqKjd+b<1a&MMjlMCQCt{udM zDRNo9XZ?2tJmgD0Ip_qBBCs2hcHVf&|Ll3kv^#wAe;CJ+J%>a_7Mdmxh6gqb(jQ-> zd!QHts9{1G@10L(kl@E168VL4>EB8%nH5g3Ub$> z1@inoQ22F@)eS6|2*?r|@m~>;j`-y0x@-`xIV>6Ag)au!%V21|=hPuHDCxIm5cYd1 z!T7LP*H`d&cE?Frs(MI)z&Q>BClF5-op=xq*eqlm9zQ}M2G$go=gWms3L~$U7>N2m zoG2)hIQQwXT0rj1^*`k>PGK3o8larPe$ZQz&`TLfGE%oyK*!q&ejp(1t*a{d1!f!o zk6@%U%Ij9_#d$?Q`qU$@WhsG`#}vljlH;@bpG5LV+{|W4-qrpii)%V?eilmOx>(5anr10eIJ6b2bSq!gCVVEmQyY;_VB z0o{v$4&v@~!3}@o#2w1nBm~t4D__&wBQWMrlE`3M}ivosT_r~0wfNy+}{FyJ6acLHZr5c>mieU#{P}ysLm&nK7EsxT0>1F2WaZ8L z#D_Q^ly{cWEwS%ZQ)v#T4>}6HoSlR^G5Q)oZ+y3jphE*->a1>MR7b(Gk}vUVOsS6} zdyIo!2#Wv*Ev$Umx>~;w6Utmj*FlZVYl=zz9#RX18h|p;CPwg$kDCz6rLd=N$Rh}g z{3yXwpX8`!59>qxA6>Ub0iVv-?TE{BM9H}GnXS|ffPFQt>qs*?I_^F|3L(G@KY3-v zPo?+)f;@sl&kv^gkq|##sP4Qs0Lon60gONORQjfX8~&vRa2`09L;+_ys%s^MP?ooVuyD`XXO` zM&Zp;Y^Vnh)dGTe{jlK=a^{Qy?h1&yZNpnT2h)B59ojI<%9<8;!B%WRe~!QLV8Lk* zmfuw2hL5LzrFK_9u0Ofp8@cAYl*F(@T3E9O+ZnqHPnECpKjFdK72BnU;x`4<-*pN3 z>Q7U-n39$CQd@tG{{auai`xQfF^U)6KeeGNimOfBF$8vJMc pzr_axY-ng`XlQ6?XlVFf;vf97rG3ksFg^eP002ovPDHLkV1j}uPDTI# literal 0 HcmV?d00001 diff --git a/graphics/pokemon/kyogre/primal/overworld_normal.pal b/graphics/pokemon/kyogre/primal/overworld_normal.pal new file mode 100644 index 0000000000..7731a6b32e --- /dev/null +++ b/graphics/pokemon/kyogre/primal/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +56 56 56 +24 56 88 +18 82 110 +161 103 64 +227 88 88 +227 144 88 +250 229 87 +56 56 188 +80 80 198 +98 98 201 +75 75 227 +35 132 207 +62 167 255 +0 0 0 +253 254 255 diff --git a/graphics/pokemon/kyogre/primal/overworld_shiny.pal b/graphics/pokemon/kyogre/primal/overworld_shiny.pal new file mode 100644 index 0000000000..b2a123d274 --- /dev/null +++ b/graphics/pokemon/kyogre/primal/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +56 56 56 +32 32 32 +87 74 40 +68 127 160 +118 180 196 +125 194 165 +236 225 154 +69 69 69 +79 79 79 +85 85 85 +86 86 86 +222 205 69 +252 245 121 +0 0 0 +253 254 255 diff --git a/graphics/pokemon/latias/mega/overworld.png b/graphics/pokemon/latias/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..5e768685df6f68c86d91cf8781bcfb9321d32c84 GIT binary patch literal 1666 zcmV-|27UR7P)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_5MoT?zL_|cWd>m&{ zns{WXkaER*j+U6HumAu6sDR$M$k6EM_y7O^KPC8;000DiNklea#gS@Cnod5vl9HU1a4!p^P=`0M!lm^NHAKyKh=0se4) zro`-;otg~T_$>xf+z*&LlLfyh;E&@kl=+$gSNIFp0mW@S{i1+BkI$4vKsz-Vu<=_B z0NJ@2fCTAI$QKG|8FldwO}`WW2*ditY(Vhx4W#5(8E}}D8D=tZPKbu)!MtpG3bBC{ zrfGU~{3<@TK*R8{yK4#LoPm0|04$Ms6D|0)20jUZB91ejP25wI3h>Ur7XzRvfq3V# zOZ?1F@hvym+C0&}nm{f`WdSWkmO!T1AC`_o0u=^+PM{4~z|jofh#R9{QSHEiFEua; zFhgz{O}xW_aE}H8;E_;(oq_cN5V^>Lb9|lweBk)#FS?KK6UquY8u&4R7C5BLeRfzu z(i-Y5Z=+Q2z@9HR5V3gO!U9GP;z2}5Ch!ydP%FSZ9Sy9gpsf>w6(e}Wci2BB7s>d5 zHO15%C5sB$8CX+684hE;vwHZT0Kmd78sNakgWMTkZs09#91+tP=+2Veae+aESoJ<@ ztDwDsRTZ?r%p=C@se^3e2<5tTJI+;8SSu)$28PNCVqn207q-pAL&>y@RvWP6%MDC( z;H8i3KuB6kgJl8g^e-#uVPJIyEmJ_sb9}!npea7|tQ~%?pkyGg0&HM)1+9~SkK;PT`QjXzU&U<|lpw62r4Qdza==nApF1az zUn|H96Q}^P*d+CRXn7^a{8j^r2hD34Po_zL<_gL^^oY!SN|$25z_o%J4BQO_=NLXg z*Bv3A`E3S5Ksvh?bkJTwnNB?U^xYJ{e^gM5f%~3_-=MTQ(6<=4%leiQ=*kLe;U`M2 zoTm6i1+^G>?CX{+XmbF3sexqa&23fCO9p-^{*wF+2A*_wtN1_28@|lIEX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_5MoT?zL_|cuARuQ^ zns{WXkaER*j+U6HumAu6sDR$M$k6EM_y7O^wHfuT000DiNklea#gS@Cnod5vl9HU1a4!p^P=`0M!lm^NHAKyKh=0se4) zro`-;otg~T_$>xf+z*&LlLfyh;E&@kl=+$gSNIFp0mW@S{i1+BkI$4vKsz-Vu<=_B z0NJ@2fCTAI$QKG|8FldwO}`WW2*ditY(Vhx4W#5(8E}}D8D=tZPKbu)!MtpG3bBC{ zrfGU~{3<@TK*R8{yK4#LoPm0|04$Ms6D|0)20jUZB91ejP25wI3h>Ur7XzRvfq3V# zOZ?1F@hvym+C0&}nm{f`WdSWkmO!T1AC`_o0u=^+PM{4~z|jofh#R9{QSHEiFEua; zFhgz{O}xW_aE}H8;E_;(oq_cN5V^>Lb9|lweBk)#FS?KK6UquY8u&4R7C5BLeRfzu z(i-Y5Z=+Q2z@9HR5V3gO!U9GP;z2}5Ch!ydP%FSZ9Sy9gpsf>w6(e}Wci2BB7s>d5 zHO15%C5sB$8CX+684hE;vwHZT0Kmd78sNakgWMTkZs09#91+tP=+2Veae+aESoJ<@ ztDwDsRTZ?r%p=C@se^3e2<5tTJI+;8SSu)$28PNCVqn207q-pAL&>y@RvWP6%MDC( z;H8i3KuB6kgJl8g^e-#uVPJIyEmJ_sb9}!npea7|tQ~%?pkyGg0&HM)1+9~SkK;PT`QjXzU&U<|lpw62r4Qdza==nApF1az zUn|H96Q}^P*d+CRXn7^a{8j^r2hD34Po_zL<_gL^^oY!SN|$25z_o%J4BQO_=NLXg z*Bv3A`E3S5Ksvh?bkJTwnNB?U^xYJ{e^gM5f%~3_-=MTQ(6<=4%leiQ=*kLe;U`M2 zoTm6i1+^G>?CX{+XmbF3sexqa&23fCO9p-^{*wF+2A*_wtN1_28@|lIKfU*Z=?k literal 0 HcmV?d00001 diff --git a/graphics/pokemon/latios/mega/overworld_normal.pal b/graphics/pokemon/latios/mega/overworld_normal.pal new file mode 100644 index 0000000000..babb8855dc --- /dev/null +++ b/graphics/pokemon/latios/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +75 61 110 +68 68 68 +192 32 32 +103 81 154 +120 100 169 +144 114 197 +124 142 150 +152 168 176 +0 0 0 +168 128 222 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/latios/mega/overworld_shiny.pal b/graphics/pokemon/latios/mega/overworld_shiny.pal new file mode 100644 index 0000000000..016c1dc733 --- /dev/null +++ b/graphics/pokemon/latios/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +44 109 44 +68 68 68 +192 32 32 +63 152 63 +76 165 75 +90 164 92 +124 142 150 +152 168 176 +0 0 0 +98 205 100 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/lopunny/mega/overworld.png b/graphics/pokemon/lopunny/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..d87a196fa4e825b862ac6c24e2979aafaa6ddc18 GIT binary patch literal 1284 zcmV+f1^fDmP)EX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-sv*Q0F8xlA$AUr%ZP*6xu%&A423f$ zfkNE(f89Mcy(SSDcB378uK`aD6Oawtsme4#`bJI2=L^s!8^ zBSx42@!3rQeZEkP*m=jfLSJ5^oWr(}qiqX3 z#qSy=Jfs!VxXN0X^qD65l3p~a{B?K@auFz5PAYJMABL6DCKBbYs`Y2g7M3Rl%T>)P z5SJac>E<=Y<-Mn8R9|{CJX?@U3P+Tr$kwl|f`xx#l20fy=IiBr^zQY_ADj-aQNFNq zcxpOV4(uqu6ykPsn&rleJ7aI*^G`;CGnWaj=8HS!zQb|Jb^BYq81INMyG<1ul`>=5 zpihhEX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4L}y*-tFDq?cM%n^FQRj-FzA=9CLqq{sy0Z zXu#k6{i@sR%$24sZC+~00DnFLR}%cr>iKL4=+xp7$l&u?-FduIJ4mAJ}~*9NfwO_EowGG4Px z)as*#*CE9CBgA}^7tQVXl`2kan*wYw%*;h#@mL#p#dSKIFc}fb_&mO7TE**jL>Qro zG3sg6L|E-Kd~Q>qXAB?uvaHvB*YIu^Pm^;Yhy>l8)NQhcTmBGQf+>QgLhioKhQJiH zMmDXGm~z`ea>Y#t*=cOZX|SCe@u|-s1mdFR@}3<&``0WE+7s^$3Jij4g~;U1@h2WT zgJq5oaMwYaof_>e-1+7#e<~0I-Hu;}|MpzryhGB1+XlTa3kT=DIsU}^@!Bx8*8@g- zX}_MMgy5p^#zGP3Bc=!rq3lml{o=`OgT9o=CYR%-2oqy`X`WH083t6NQ9~YwXO?hx z&=|x5!twrdb=i7yOQ1v*7&b9>NEr{VODi{CGsgqW6)t53Oo#6r2hc2;f%U8AcbF!Kkgituq^PR$49p>f@c%^ m8uc7+yyCvL#3w}jU+oW^urfBwjzH1?0000EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4LMSU^BXm;eC4I5@zN zAmG4AAb6Nin7H`(kbt<@h}if5008Ld_y7O^U|2PV0008qNkloSy8dGEZ3I;&$wM*kGN25ws%;6~7rTfMeO47W8f7ZGu|Rl+Ym*^#%BrbkFs;;mDU;Z7czn4B<(LeFpd{t1MPa%D9Kdwty zxSL>+gdlich#vQ`JkkUAs6D@$VTtPrE|UaCT)%ZWZ$OpwvMd2U&R=T-ze4;UR8?^4 z(Iul%0+^v5fOzTkX$|mkouymBf!i)P9fP2cV}=hmY!C49KRJE@R_sSb=(CVb00000 LNkvXXu0mjfr8!Rs literal 0 HcmV?d00001 diff --git a/graphics/pokemon/manectric/mega/overworld_normal.pal b/graphics/pokemon/manectric/mega/overworld_normal.pal new file mode 100644 index 0000000000..1cfb140de9 --- /dev/null +++ b/graphics/pokemon/manectric/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 72 48 +24 48 88 +64 64 72 +152 0 0 +192 56 56 +192 144 32 +224 192 72 +32 120 152 +80 152 184 +248 248 144 +128 184 216 +136 216 248 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/manectric/mega/overworld_shiny.pal b/graphics/pokemon/manectric/mega/overworld_shiny.pal new file mode 100644 index 0000000000..648a273aac --- /dev/null +++ b/graphics/pokemon/manectric/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 72 48 +39 39 39 +64 64 72 +152 0 0 +192 56 56 +192 123 32 +224 171 72 +64 64 64 +92 92 92 +248 234 144 +121 121 121 +134 134 134 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/mawile/mega/overworld.png b/graphics/pokemon/mawile/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..b65c2c37d72ad81e28c8dd6a36b501dabefaa909 GIT binary patch literal 1464 zcmV;p1xNacP)EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4Lf6-kz@4B4$7%M0khN6Da~%-#98Pd=UJ$x~rigEcIn??&J@#+Y*Yj}X zRghq7gDj^eh_DymbL&Mf$ouCYSmNX5g$K*>u>>STc$3aueI3_LjF#_$DAkqcPZiYd z{c+?Uy3t#~!dpR3k=<3e%@jL9su-Xv#Km9AGOz=e&K;PaDw|sccV9UuX_N<@!8yJPQ&F z>Q4e#ker~%pYi}|1i8A_FtmbJ8&w|pwh~R?3GHim9 zN*Wv=jc4Eliy?+ika9Slb5|F@x-FlQ;*d)qj|`k~i(u#3Lw@-uaF`Pk=~V_fmE1$g z_++C8ssZR%dSQxDc`HcyVlw`s+T|KQ;HNm{+}LBKi6C>*0gl&NQ;I9F#&=DumS8_C zZ{w+~T(^+eP)MurHFbieKvcL6KI|b$a*`*E?l8HDmC^GRq%Q@IJHaFsPO036W(6P_ ze|IaFEskXozAT-fJSFtEuW;xdz@Y>QueUns89O|OkQm2N`{<10y(DhS<(oQ;zq>c# zEGS$BQ!gm*u$lnlsC``ka_fRZ`!{Olz^m#V-?(K4ndCBn3tnVAKM{PIe_T>vJYFq7 zzCya=vI54DF8!sn<9P8$>7vw0000EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4L!zVuRiBEju?*#z-iWAYV_-_N2ed#HD<23GL zPvIMnPw6MA$6??1?gCyo3GXi8g{MK?F+EPpvJ}urRQT=k?f$*I{~J7x*{L#jhes(= zo@5tGgRj#|pK%0Jx;Dwkg3uyA7kenli1z1n+`V2dXjO(T1 zA?SoVd|tdc_2jvQq6&anT$Z!S0@^$%6kQJeE1aMDbS+gLS7?$F^5Y!S<7zUn;JJm8 z9!HuZudlX%77q$F#mJ5^CirqdqQcJv`rCaCx)8ns&k3S|B`+)l=Urw9@`_EC@!JBt zLPTMbU@-~trZ0*tcxIqMH0;yPdV1-L2G+Q%3M8hgLpjejvgVfvXF2#H&;0XSAaZ>2 zppeamCY<0FPND?<~hFNO^aKB_dz#(p~6kU%_9eQg*AO|+y??_i4zW0hjM;4k)#mu zSfxtV1M#LWRJbd+i#bT^lnaLaylldJ=8U1r^D>6Tt%vp*9O@1|IiF1=Dm2a;QI4*PruSea6}}vOgE;vJ`qmav(&(Q*y5^ zIru)MJt`HAX6ZDr#-H0%K4tw5Z8%i$w15=I$nsS|j(9i!9QEYc`eS~5n>{T`4zzgr zQMQE^Q*|ig#rj0orahK7IV=2Y^2;FQ@pQeaF(syO=*f%q`456aUg%uy z3s;wWgLsxk=MQMI2J*(^6J&1rt`OxF4psQmAev`slJng7)%42OS;WbE{TcT;qIt3~ z)E$a^h2g$Q&wz1~Cdu+1$J&n;7{|z`79Zz{r+IAN-{m?)o^9=_E2#b+5WZRoxHj%{ z0h4Idr!)lUvxQF$ZpU%8WY=-DKj9LZ-XO5a#|{UO-APsi)(3znw&|M-uY{~mt; X#TH1t=D`j700000NkvXXu0mjf7jBeV literal 0 HcmV?d00001 diff --git a/graphics/pokemon/medicham/mega/overworld_normal.pal b/graphics/pokemon/medicham/mega/overworld_normal.pal new file mode 100644 index 0000000000..dad60f896f --- /dev/null +++ b/graphics/pokemon/medicham/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 24 32 +56 56 64 +86 88 94 +144 56 88 +184 80 104 +185 159 44 +255 216 49 +200 96 128 +88 144 192 +136 136 152 +232 136 160 +0 0 0 +176 184 200 +216 224 232 +232 232 248 diff --git a/graphics/pokemon/medicham/mega/overworld_shiny.pal b/graphics/pokemon/medicham/mega/overworld_shiny.pal new file mode 100644 index 0000000000..d163e9eff8 --- /dev/null +++ b/graphics/pokemon/medicham/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +24 32 48 +56 56 64 +86 88 94 +56 88 144 +80 104 184 +185 159 44 +255 216 49 +96 128 200 +88 144 192 +136 136 152 +136 160 232 +0 0 0 +208 195 168 +237 223 210 +232 232 248 diff --git a/graphics/pokemon/metagross/mega/overworld.png b/graphics/pokemon/metagross/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a6ae4fb724c3f3f8574badd1588ab758ad880b GIT binary patch literal 1687 zcmV;I259+-P)EX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-si1o53EH@xPP)JZ(CFy+;^Q{J000D%NkliSb-6*&K ztmB1<(&8w=j<0jfbB>0$zVDLmGIT?zt)%NL41hxyb5!Vy)u;%CYVewXnIB$^MAQnn z%}^&iA`>AQexXv&))pLgfX-q16*K!!Fpdueo;8?nXWioTH+JNnp-rI6kRdz(#F9*D z*4Q+1oC67TI2pj?99{&3Ft-9iFCfox9^$pe3cv_mpv#aYJOC6;=nd}I5WPvYfn7Cs zfD9u8afwG{z%~HSQ9O15ONQ3|eTH^~4p6@Z;W{taU}gh)!DX|pnq`VufN_dcz*rrO z4KUjV2k~8oT>m{o2ZR<-r-|W|xHRj>l>@Zdmc%>k0agN?xiAnhD5Mh{ssCHeeF0#b~d z0t&zoIn~c6{DnaPQ(^?V4DAR9K;`O0{Tt&leZpnJ7Z^~*I@|%R!w@r-A~WLek7W6v zBb}v`DfWE^gD7pq=V>eFGjIKa;gHm!yBM=7y=3v zV4q_Hgz<{}#RwoFJIb7U^>rKsi~@ZF5S{{}$i^R+(~K)2wD9Jz1vCz8KzN!&<;4aF zzwmlu<**3w!@{TMt4FOD=nt$*z#2#RwZ>DuGbjgrScf~HI)|0vC+c1=dB5L$s6N@i z-PQn5+woRZecI9ciUOqR6S3va+Yk5AER|!lq!35(~LZ8nv zFlMcLcj7TPoc61LE^x@u6=1aozVedBOGo{usS8{kwt&{*ns7{9ggLu@(133_DJ(;~ z4TW|SI=DT1fkTF{f=>b0HI8__bx0Yf*y6AQG!8GjRAiWZXb}B5Q2Dc#YH`R#^Zwh+ zg}_dD1UT-p2=j7E2|eI& z&ebK(1ATuEI6!v}z!%}E7J`&-5!|tG_6ch3cdk%4aq$Xw%~---z?r}ULJR0_8tt+) z)fQgpl z!v@eejG?D(Ma#DxjjhW19BTT*_S`8r6SybzfV$qc+X-PZw{D}x;SJC_33iA@xpVlwEQ6elbtUkQ@E3;u hrMf>WHv<2wEX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-sv*Q0UDmOqdP((yTfk=pec$m0Y z(6E@m0002k$k^!U_y7O^000000000000000{|GHQ000A>Nklz3;v2!)H$ zg1-L)pAFhH7trafS?5gsP z_*R@6nFk7zH0PwKHT@RFKjoSuK+GNqTyY3w^T1&MQ;wNiGlkLZD-N`&zTa`P;AUUp z3^Pt$UyBxa$y-H*1B-94;t#ElF3?}21t;DGvU~f2WByI)CP9i;+yp`$M@e3A;8%%6 zx6e6mgI2f5R~+53+7jymyA}&B^*y57XPhcmX2bj&{zw98*rxVf(#KqQ*XKG|aDuqp z*EdMeoIld@NiA!Xu%qYms&K`7jnoo4Sa1kz(k2O5a1|(Q77afk@bt_frvsf-6VvDWqN??CV?cp>RZq)u!V@=^u3B=^_yVvk)UTCdqJhi64Fs+FE>`wv(0-rX2PUtwL>>Q3!`X_!((U=AXYI7HOO~-y4H6+QY0E*tJJ;pF?Qeb#@GS#XR(1NDzzf%@ z&H6owXu`ZJS8( z-+DKssPul~4KyLa<`iv-?m?-|&nzT5NHqeu@VGuo6yviGM$jAV)j!}M-NX-|khUL< zqqqV~R}QOy+w!4Jd7SLJcA?_lJ!Xi+{m2BJ#eReWsh>T=?lyX9stY#*Whf6n7Q*zr w2;c`M6M@n7%Lw<_>H|ITn(N0V-|@f4KPO@^o!uOiF8}}l07*qoM6N<$f;(rGJ^%m! literal 0 HcmV?d00001 diff --git a/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal b/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal new file mode 100644 index 0000000000..6ec07f7967 --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +50 42 55 +64 48 80 +68 68 68 +129 72 136 +128 120 152 +184 88 208 +176 152 192 +0 0 0 +216 200 216 +232 232 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal b/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal new file mode 100644 index 0000000000..b1353cc5b1 --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +50 42 55 +58 80 48 +68 68 68 +72 136 75 +128 120 152 +92 208 88 +176 152 192 +0 0 0 +216 200 216 +232 232 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/mewtwo/mega_y/overworld.png b/graphics/pokemon/mewtwo/mega_y/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..1119dc6ee0dd94c0c293189e0ae396c35a248123 GIT binary patch literal 1372 zcmV-i1*7_jP)EX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-si1o5w3=cpsP(VOHU|?XuVrYm+ zh=6#QxLDBUfP?@50I-+YY>8$$pc?YFqPjwcN#fznauZex+*`r~Q-%dsq*jP4Xq^Aa;IaKw4bEF*9H zU%2{7fg}F`m;B`$dxocZ@yk4_V8|K$(LIVDnF0@U><)=Rp&h{qN7`k{SRwh3+Zmqb z=q`#&sIMb9~HYWp=+#-;f!;FTEa)(l3BozAATzM26x(_lrFzkaKf?2 zzEtpQGgo-bE5SFoG$^O9?bK@oXIvsaJ^?>J5}WtHjhliYgw@ARgJ)c(PoE!KSs;dA zXbKo}Ii<=1B{q&JIlnI67U;z<1fOFhJmHg+mnoI78lux#JJwMdnvFCywj2V#ntd1@LdpY`oR(qs}4fI-FRJKC72Q=VwQw-T^>Tk zsVeXgT$h#58TsA^qkukFLG+c9{*yh1Ij>udVZ*vkC4{IdPzA3ghzP-QSJ$I)6|V|B z4Qb(WMEPJ8FyJZ(HRLA!B71bb39PzlPY!{X0wH)-fDIEt4KFR%#a{XR|hllFx-zY^fCKnqK9tAHU_L99-aQDT}=3KVV& zu$*FIh*PZdR%FOY1CmS*zcymVvF&k0$}!dHpghTUZVM&}P{Vfl_XKgsv8HE(Ex`$Q zIHNri$Ig4LB0wx*UGB8W_Vs$!dDkwS17GdjGe+}sI{bcJ20`&hPRbAK~k>*7G z9AennYZ}nu(iyAj@A5rrxJTxE*VH3-P^ZOte9@HuT@qFF-L25&Jjp%df0g6?!ILdA ePx#Fi=cXMgQr4H7*BvZ8!usvc00000 z000000K}~?YXATPU`a$lR9J=8my2?(APhx?HbQRs|L?s?2=Ach(RQYErXF4Fu)!Gd zIL79W>-NL^-SCG`*Ij;?zZ?E9PXN7_4oSLrkH5^-AJYxI;YbVsXaM?89Tx)+@sy;) z3%nRieh2S3jQ}A){%3S~fOqYAuKvIb{t%}Tkj#aEc9#cu0{MH5vq1n_ot^(X9s&N5 z!+@Uv@dfTBJ%Xf(^{CzP;{dt4G5XDuddXen;9nTcP=YmU=Gt$K?OE9pXz#R(QPc=ay}a|S$+0s{?1zvvutu4202{6H1GBQAB0xHI$? zA0J33!9ALAzBrl)Ji>k(#HNb?p z;RNt~eb)$9e+!&=YW`90vScPmw(2e97^ogs&HzV!p37c8@T~9K5`1clxqMr65?o}% ziD!^%tE*dPY4D0Vz21zizUOO(I5!91@_B+{f>!sWI(_n%2jyDd7Cu1boSErD-*dyD z9em}>c8*FC*N9x8s6=s{IOZ}oa$8USV!F^bZZ-|RR?vyhHP*|Eg^L7GiU5}hdGWML z%LWHN7;O67_WH_=2}+7kaK9QHxgUdGQshEk`RpMZG=f`v z2!51Zmb~QY2@kSwhHlTL1_$29==72z7y8O)54jn^E#3z&<0su|Q;J~znQA9BIPfk; zr{|B2nD+X{Cl576=HMppgKK;#<@CyowAYt`m@=N(LiP@q-w-uII17ae|GH2D!8NBzv@NHuWQ)JZM9Rd)RmvypAvQgq&$7 z=#~5ptrHx0i_!FA4R?As@X4&+x?Pc%EY@RzwV%PuX07;>j|M%i`jsyp z9b8YK=ksRIoWKJU{4Ra%gtKzT7l@jpdi-s!4)^Sy<8=IOF6`3(J^y>{Kc{wBg+x*= QQ2+n{07*qoM6N<$g8aST)c^nh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/necrozma/ultra/overworld_normal.pal b/graphics/pokemon/necrozma/ultra/overworld_normal.pal new file mode 100644 index 0000000000..28fabb96d9 --- /dev/null +++ b/graphics/pokemon/necrozma/ultra/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 233 127 +53 46 7 +121 109 57 +44 77 106 +194 54 54 +150 133 35 +230 207 53 +235 216 89 +219 199 118 +0 0 0 +125 52 134 +61 168 194 +250 237 207 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/necrozma/ultra/overworld_shiny.pal b/graphics/pokemon/necrozma/ultra/overworld_shiny.pal new file mode 100644 index 0000000000..79f1fc8cdb --- /dev/null +++ b/graphics/pokemon/necrozma/ultra/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 233 127 +53 46 7 +74 106 133 +151 163 36 +189 75 177 +54 107 159 +70 150 232 +115 188 246 +130 181 222 +0 0 0 +46 131 58 +255 214 46 +228 245 253 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/pidgeot/mega/overworld.png b/graphics/pokemon/pidgeot/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..4364335afe5998b12c461918f6503cfdac38a601 GIT binary patch literal 1375 zcmV-l1)%zgP)Px#Fi=cXMTqsX5imPYI2e8)R+U>a&~Pa7IY+QSV7Rbj9d3;W`0002% z?W^+j<#lm@_y7O|-AP12R9J*YtHG5q*#!Zbb2e75{kApeBg>y0r?zKhFjcYTMR(fkEGs01giT zc|=EKh4+GhCoopwol05}vDz$iEXnZE`##3ZHyF9Gzs z0`vmdJ}0v8p@N%F_)D&J(*j^8*8_jHXP5wrnt1|3i39-5wo)dlz?KUuprdsILdj%M z{#@JmC_wW;kAGVoKS`7Va$TGO%BA1}q*W|Hx9)GS2a!uKi+>{NS^z09CCK4L0UeK~ z<`d6aZ3V%bCqz9!&Oki`C_pH6I0MACzthJBV69!i3yJUoWQ=Ot7;+M*$o4>h;-lPE zj(@-(buk7w1!zDP-~pKKo#y0ghy>6nc;S*RK;YkO0#5K*@luAhGX*fRzQ%0t5&bpfnPjK+M+|1>Af+0qc+evLi;v=dK|Q7*r4zKBN14 zP9}oX1r7lkPz2Z>06c-uXZ9QyUp`8Y_ckr`y;JhIJp~E~px2NAlnSat3D0bY5~e@{ z1_>aqatw4FH(!p}@O)N4rflV9UN&<=X~$YlKq{aSpkS55&i`QX0JMMxbVVR%6YEtaSfdok@{B+5 z9Z^2J8)j-+vz}ViU8x@w&$}YCzlSIN+7q^l7Iz=IRR>j-~lH1$;cC z9s*Vby0R>b2Y?$8e5V%yxlf=iM1a5SXh63$ivnD_!dw^H%cr2g zRbHY7w3cbD@~!~q`ixWu0SYh@@WLwPL6Lj~0;rB@ZEC0h5#P01{>nyS8hQ=Ajigh&=eq>dr<=Y7v;z9QALzPABYmLX z_{Rv`fOhllk6X7h0sBXy+}g;=RpE8U-Z{6 z1@vu9!xye8{AzatKKY;4*#BuzU*P_@ZU4ysYXMJ(@b~`lfR!S%#liXA7{62h-KX>a h^`{0Kertcd{s01yP0M6-e^LMd002ovPDHLkV1mdccLo3e literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pidgeot/mega/overworld_normal.pal b/graphics/pokemon/pidgeot/mega/overworld_normal.pal new file mode 100644 index 0000000000..c18feb0a77 --- /dev/null +++ b/graphics/pokemon/pidgeot/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +17 48 59 +80 56 24 +126 32 86 +149 91 50 +208 112 40 +242 57 71 +176 64 96 +184 176 99 +29 110 141 +48 150 203 +177 170 153 +244 138 140 +0 0 0 +235 237 171 +242 245 229 diff --git a/graphics/pokemon/pidgeot/mega/overworld_shiny.pal b/graphics/pokemon/pidgeot/mega/overworld_shiny.pal new file mode 100644 index 0000000000..69da1cc4ac --- /dev/null +++ b/graphics/pokemon/pidgeot/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 29 88 +76 70 27 +110 77 47 +149 91 50 +196 158 50 +211 208 87 +157 139 82 +184 176 99 +91 48 164 +126 59 215 +233 193 97 +224 226 155 +0 0 0 +235 237 171 +248 255 219 diff --git a/graphics/pokemon/pinsir/mega/overworld.png b/graphics/pokemon/pinsir/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..1c851f84f2b34e476bfc20fb8f847b407bfa8b71 GIT binary patch literal 1551 zcmV+q2JrcbP)EX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-sv*Q0SFfdpw98f?oU{E-CXi#Wq zXpTT4-IW)ZfMDR`Tab{D0002Mz|iRE_}!HkP?F}$000CENklz1P+5QNhL zGHAQJ|J!a=gGvlu=FFb`HSA8JRNH)gfh4cj@Aw`6Yls{#{eB#0%^ z;^Jj@T2pibSQmH+j5Y^slhW*u09n+9+X`CHq^8FZY_SJ`QMjuymCE3bK+DM%z!hN8 zu@v;pfu&fRZFmB>wYU`tT?svC$P|N!PWlK?GHN?+29!r6E;k3qHQICJm&@GvzXXg?L(Bm>gd#(WDF8!bya2?Q z)*?t!8PQ~v9YnznZut9v7Ja`1du1;FXhh5Z?kulF$gLg+Y0P z#Oc@voZ1vuJ$#w&q{^#mzHxf`x#o#DfTsV@gD&cngifYSdO7AUihVve_qN|{h*A~UiA&I&2U@? z9#59xI$j6DE?||JS+t3IF9#hxf@U}Z+GJyeUG2R`fOuWMcfHmCn9L*KA;WM0G^}nf z?+$jtE?|w18`0|Ejt?_gAAq^}vT6=6ZHvSIF-MlnBj9I-(cZ;@IQ?W?2|IvQXOXaU zU%mvS?8*r(Tpedc58x7zd)rk9yy`h%=bi%60>`886z>Tj4@VWAkWTFSyMXFuS58{K z&7A B&`1CP literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pinsir/mega/overworld_normal.pal b/graphics/pokemon/pinsir/mega/overworld_normal.pal new file mode 100644 index 0000000000..4a7eb110b8 --- /dev/null +++ b/graphics/pokemon/pinsir/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 48 48 +88 44 28 +80 64 48 +96 80 56 +120 104 80 +104 104 104 +142 64 34 +221 149 23 +152 128 96 +224 227 91 +144 144 144 +0 0 0 +192 192 208 +232 232 248 +221 149 23 diff --git a/graphics/pokemon/pinsir/mega/overworld_shiny.pal b/graphics/pokemon/pinsir/mega/overworld_shiny.pal new file mode 100644 index 0000000000..4b03f94e57 --- /dev/null +++ b/graphics/pokemon/pinsir/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 48 48 +88 44 28 +50 54 93 +62 60 118 +95 93 154 +134 134 93 +142 64 34 +74 135 51 +118 119 194 +131 227 91 +173 173 132 +0 0 0 +217 217 175 +232 232 248 +221 142 23 diff --git a/graphics/pokemon/rayquaza/mega/overworld.png b/graphics/pokemon/rayquaza/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..09bd6792dc2328ce913adb0994c1e2c948f3ebe1 GIT binary patch literal 3459 zcmV-}4Se#6P)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_Z%?F4 z82@`^N|tiKpeXRjFlfGv=b5;e;E(_S0Ij~p1uLit000YqNklt|8L)w1l|p}YVvY&#>z>imGUJkw+eRv+FkUe^AiPG11IFz-$1r&bh?|p)~|E z{`j;Re(U+4#8aYg44KDlfX2Ze6m*LX+b4j3!F+V<00_-Nh}S3_0;m~}v7f$(r%fL8 z4LT>P1wmWDa5#O;*fvSgeMnv0dxZ&CORdMrY0J`!Ds#`Qg@ci zt8!G}lkwVhz<5M9!2fBL$U!JkBLR5Rg+lf@HJZ~a^-?K670;nDDK;ZF30)ecOYRh{CU%|>N6q`)_Pbd&2 zVu7&cAMxADU$OuUxCx*;_&6bp$d8UiAL1F0r=dJ9;ww-m1XBF82>)6Ei=pWSXW6(K z-0C&8>SR1^0_Y|_XA90I%TIxp5dRckLkfQszcj!X3LwTf!nj4j>_PLBCI#{~^ZyZ^ z<3-SR7y%mxDGf@9zHC=6l8uVkE4`VpWtgk*?-+a8HranQuwt3@E5$L?!<#y@m{|6DPBZ; zJz_D9afnDBR?uPqq2E@5;1XXGQvc;LE>lKMrPTo6Dq#QD@xz0dKQQPLe+@HW`-$<- z@XaCvK-wmi$=URjR~E#lyi~A&3>5e%28av3Cgha5h``}B%x3yp{kKg)Asnn>Qw1qo z;!Gekg|-Pu{^Fkwcw_Q&6bn$Vl-MND6nG2;>M3oe6aYdGo8AjsxE0-!zEVQ7ZlHKDw>R{8z(S z@X@+t0A~|EP4bFAvX(dkq@ejagg}-Eb`0il=E%Dc)pj62jH+T+mUNgzQUJmX%PVV*MBx(+( zJba(+mum1mUeJvOAnN-bqfh)9-?JbBns+x|691CIFkv-7aU(}AN)tGjS^Pl_p%tja zUr|Ah+)^b6mIm*%Xd(Oia6CJ19a?Cn1unr2cCkT=*}#F^>a-8sdp=B z+{|d>udKi-$X-@*?6qQn;IWu6^4GplOTWOR=rO*s3@7^qAL$G~`Gz`*`R_;0AXzl_ zERVO%0;D0dO<|;QAT<%2;dBLL|21)`+hyEN>R?MX{^|-i4;Y@&c_qhw!hRPBY1~bg zbNP#fi&^<3ilb`=7yDh~r@95G4?_<%0*`aqL)-J&vIYsET?&&mM6&}={VWR!f5xmU z-7%=^lCAT1Pyob6f%p+>LA$I6TeytY2D}5R7zbUhI@*?#sz*!x_2WHia4%_dnK^MUy}l7 ztiM{xf=-yv(_uFzaQrbyA?9Z!P9V?*7S#YJJSO|$4ReV%rqB}RIl*M`Sd(&WD&uWT zyYn{w{V;L_?NXR#F;enQ2f?{|qFg2;5`uN;$Wrl!xH2H z*HQ-V)nBybf?5F8hAg;@x8wo${Da_QKl&5`=LX~~f!#ZHFB}h=G&PwZuXS|oe1hLc z(6SFxeAxh&PcVKgCk<%^v%f_`_6%H8`8t0m3Z|Wcat}p2SbVRA8<6V4N}yT<{Kwvh zaBcv(3&B%nzHP!o0ZQ_$599>z%~c4ImKSUQD^FjW-m)cQy)IdWdPmE*{JKe-LOo^=LCQczWqT?gJ(J z&3K5J@mQD?9!?{`sR6|8opcq&h*r#DP#kzn=X&^?2=cVxWmATwu@pfx@)@4c2M@E@ zKnnj(ds`^02IcSaZqY_TND8!ET@+joK5@9@S#eq3&V#^cNG}u!gT1-#Y0h|?@K_7Y z2H*Ss@@SB<0krAHN29r;!UctMp&S9b2-@Od!4lr`i5Vr2gCc}sd_ ztyuwAe>(+LNf%kHRnBDHmm^{sx)BCTnON{hmhl|#Tt8f2wpkfK>uf_QjetNu1}dMb z?<2@;@Z3!gg$P2et9u#ky>b^n^GC|xdEj3uFj4?Y>vd7k>Gi~`ES6;^kQp>4{n+Vo zZ$DhuF`0-rnIm4?dE;OTdBDiLl|OwVE<6D23*I+Vu!*28KA@(tr6M>+n}32YZ}~&< z(bo;IQ9wNua0{+mDQLSOs01b#W=i;{H|ugW1{KcjmpxvxAslK9ML6+J)7Vt6XZ~#7 zh&3BPv(5_drA8>>_0R|27bnTui9bwWl)ap(ov5u9bgCd44&zxto5tLd^J#D_KDKnQv18Lg7)j7i9k8Kv#FvG z0y&Us3~uyj;7~FIFKNB0#ZMpjUbb#K`C5rVPFX=}2FMY_N1E{-o}_^s(^9GY5%{yV z@qYALK_1GYpp~|@zLW=aQ!33ZQ)O_ECpjlh{8uY6%-i?eN|U|A0D%`DuE`hhDS~YG z0iIu*2RQR5g>2iknvDYSrJD+N>WobrDbg*b^jO<3mna_9OV7DW`FF9r85tx2a#chm^p53a}F!SveK zsf;A(G7$RSGIot z7$h}U`A=8kLI8{DMwvCoH%baf14vtN_wm~a5Se_-?*?omUnxjeL%5YU^eK|=sLEGM z2DYJ<`|2(2DDEirVgY-+2vIXYjv#lAzr+75^f~`uD$q`%8o{I^zFSFX#`94|OYnpY zOf~#X{=;F5+9>UlDY?64f;js7Wkc#yQ~I{+i%cZqNBo zE11udK2$X0n`9wqz6f&q+bj6O@EQKI6!bSq7;~%e%xVpP)qLUqhSeWgq*7-7pGNV> lBab}t$Rm$D^2k3d{{wjz!}O%nRlEQI002ovPDHLkV1oN$aIpXY literal 0 HcmV?d00001 diff --git a/graphics/pokemon/rayquaza/mega/overworld_normal.pal b/graphics/pokemon/rayquaza/mega/overworld_normal.pal new file mode 100644 index 0000000000..59daaaf12f --- /dev/null +++ b/graphics/pokemon/rayquaza/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 48 48 +88 16 8 +11 72 54 +63 74 65 +43 111 79 +164 75 24 +255 123 101 +74 150 114 +192 160 40 +240 200 48 +104 190 140 +231 153 184 +152 224 144 +0 0 0 +173 190 198 diff --git a/graphics/pokemon/rayquaza/mega/overworld_shiny.pal b/graphics/pokemon/rayquaza/mega/overworld_shiny.pal new file mode 100644 index 0000000000..82199ef8e0 --- /dev/null +++ b/graphics/pokemon/rayquaza/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 48 48 +88 16 8 +41 41 41 +63 74 65 +77 77 77 +148 40 39 +255 151 101 +112 112 112 +175 56 70 +255 89 89 +147 147 147 +231 153 184 +184 184 184 +0 0 0 +173 190 198 diff --git a/graphics/pokemon/sableye/mega/overworld.png b/graphics/pokemon/sableye/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..0439ee4046ee5e64918b10884e4fe663fcea417b GIT binary patch literal 1192 zcmV;Z1XufsP)EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4L&MdBJm@^}Bc+Q-SvemjWv;3ka!QL`5L5 zKBM*~7p?f&Unh?-08ko|J_ga|A`l4x6EeqMpuro5Di8odFa?s=bvNabaU3x}#gs5N zYhuvms*o^A2nT09f{XiRj^!&rLJqq*H(d3JgKQwN$!-c8g9euw}xBY8_W_#f0&%WwruC4~0|dhT5#FjEApIh(uToFVd#L&h&9=dicg z7&N$~;71{Ul81iBuNuyu4D9CIaLG7IgE2YY5ui(|4O(0}46;N;9tVW}G+S}f(bC4~ zG9Trw`ME-Jg9Ezw=Ka3C`(@DNl0t-6@VDMT&#NiV0$ud(G}qUb5m<1|kp8MbJ}Tei zGrSC1{LH%adD-`jjkNFp`PixiN?#m;nj7T#CC}Sbbo=gPo9CkrRt61z25PuwY}h)!TR@ICXJ7ql|hS_v_P*EdA|V|hq&glfNFnE9dKoS zI$uV0y5TuP^z%!W+1`)A2`^>%E{+WS*NZ_mpE&~6a1flc|uK*^BzjaduCAoIoFf^z*Juox)Uk8>)w z-&SwS=kL>mtLEf&^=!d?m;zU&Yjk^upZ{(AYkxSOXyP~R-8FuG;s!AQ0000EX>4Tx04R}tkv&MmP!xqvTcsiu5sO%H$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;545AZiCOf|dWfT~$W zI++l%xm6+f3Ll0rfCwTIGxa%9Ou@6h?x~yVF2=LG`~IvxC2umoClJS(Zdk+{#50?g z&Uv3W%u13%d`>)J&;^Mfxh}i>#<}RQpJ#@ROnRO;Oe_>TSngm}GF0Me;;5o(l<&{F ztZ?4qtX68Qbx;1nP+nVE<~prWB(aDkh!7y7hB7L!5Tjiq#YCFU6CVB%$1jpgCRZ7Z z91EyIh2;3b|KRs*&BD~An-od_-7mKNF$M&8fo9#dzmILZc>)BUfh(=;uQq_$Ptxmc zEqVm>Zvz+CZB5<-E_Z<8CtWfmM+(sL7Ye}p8GTa@7`z2~*W9_a&T;wxWN22Y8{ps& z7%x)xy2rbFI_LIpPiuZZfhKaSK?Ij|0000mP)t-si1o5yARst6Krl#fpg=&tP+-_t zcqovlP`Jo|fRLb|umAu6n8?uR==cBt00000=D1wt000A_*`r;82SD;3g0>>1#2W;9 zPg8*G;Sy5<`ISyuJ%M6HpXWKikN#j6$oFyf9pMR(G!_U@9?1~CpJNYo&?NERsgy>W&jsH^;cojEv^9d_y~}5enL110Ca@U zCglmhnt)sVW5CnOuG~Tba5o1-Ky6#L`~$~x!zbD|0gr&CLY$Q9X_)~$PxwT7gJDTA z6%%L%Fr`?|R!CcHIS9|GoGuBL}9HX8vifYmuY z+Y>qg7}C)=PrYgbZVbNUjR18H=JR0~0wB+^Ik*4M6!SFak9DzO!7DHiUfB zGLf}2fLVb#4iiMD3(~A!MFxNu0&hOmrv4Qj0Lm*S34t}nL;|Cl?F^ur-4sB|Lkh6j zM!_3k(!dFz_eTE?m_5Mrp#TCnD1c8Bf`K`K* zSAe&1F$2f@ZdAWRiY|Z=pzbs53qgQWYw@9}QZRy(SE37|(PbBvx&m4FcD<^(cJK+{}9{P>hBbOGKf zB+w|0E{v@nU%Zf)9-&S#`E8*ip(0#j>+a*pa)mx(+X__?d;hJFsC1}H7}vdOiiD}% utI+G>*9v{n!7nV&>$qtDl8EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4L3Pn2rbUJuw z7^N#Kh(rL)W&lu-Fvy@dfUroQ&}jJBSO5S3s1ijE000BhNklVi`Z{T+T3wIRm5*qULNX97Rr(s{1OGl5$&+ZqmZxDUSZ;y>V$nk3L=Y3OhB zyoXIG5!bq-J&qZ^T6E+a>8{Qp(4$EkX6f^JQ`qCVz!c(ofIEB~M?!T$G=A^^!OogHpW>y!O|GEuScN6-Hl%a8r_~61nP4`&FV4baA$A)bWp^yIK*JwYMYD> z-=%^Z14GE0M>M}?4nT_*d?*}@0-s9~xIDE;+PuXAp7X-NL8fVr@vTOKtJzyo#_z6-=WHHKf@jqKux zpvKp&iH}3!;2{tr2LhF2oKeXzeJyzDAO)gZL6$|T=YI8`#S(Tkeh9=g=Tt|exooQ0 z4Kyx-88?N4K_DjOA1o5elv3Ja;hmfjo&e9g-X@W^DB>Qp7y5M0Xa7T{Bf8`EwF?e~iHXL}#F+D631-tN^X;iQe0pJ0gS*XEj0_XUO zGzg@;aw5^e$emO;hZhx6U&DcuyUK1!!vGcJe5_ei$dd0`rfAXP7#J>|S);&P9taMG zgB_38H_qs!ETc7nd^&O0I2uL|pcMT>B9ivS4oAy24=X_m6$IWkJHf%onf7m-VAgrU zmkRHYLn!f@`e>3oX8`B%s{b^o^Sv4bR$4!{@vWn^QXxJKt_QC_EEX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-si1o4?AS_rA2q-W>IYe7fSa6^q zAka8CXmE%+fS9MGmXMgRzrC{n006ki*y!l^Ox54r000AvNklvH2D426x9 zf*o7<{ol4n2x9QPo9*oW2-9haKLyT_0MoAfv`_oAPy3%5(R=(Kwj_;0pl)C06|bVM zW_c^(kV}vvFm->*|4srr^3;j!jDN``KvtR{_5Ogrmw>D)5iONp+yHQ@(K@Sd z$ZKlj zuN{znZn*b*_dSo%wa&1(r~i;=f#~S+)Z5ljJ1{)R!dC`OV8p)kng?_k@wEYrx8i{} z4xn$){BS?^+XZyOi$HR=L>yrod;hv}>A~l*g)2U+N;L43O`j>mM_z7hg6wSgur{EB zV|eed=l2S5%(FlWPCRZ);`Bu`O_(WjAErrPL$ya?b)x|Y`lO(2q^`ANqd6zY@L_n*eexES~AliJEd zd%L6NI{_xp6lVRp#WL;y0000EX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4L6W0U+fO=}8HjZrfUW~lNhyh5Ffhq9U)HY~7=Yg3bc3wuFb~0G9Rpc&Y#=nK zE1=VbG$-7j@-zfo<8^XnW=s%9FEqFVo~m@qsY0(QPeQ;|yhVs*lprPu$}l#_JK$*# z(o}~*Ttfq#qn#j-wboj4seXWBgS-Pe<4esdnrpPYgD_|HySOsOuT|=}p58t)I0NLG zVPA0#Gh8#47(+N7T$zopN;U(?lT*If-~^EG1CMFKGOLED==ldS4$w9x7<`zZy&S1i zgA+i$>vGrqGE-Y%VIZEa!kG+Kk+K@7tAT=Ek7=$Li~+en8SGviRa@aK$~ONs*+xuN z`jde!_-;*w3kK(an=X+7MWMMXsALM$T{89Y-;cdAlFa&YnHL1 zK1Y^Xl7mK`9E7qG6*GYF*q<3FL>CQS07MAu7$4i%$V2GQ8G@8HvU+UxT&0&}Yt)b@ z=D_%c+tX1K8=L`J%nO-$po*HwPb>VE|(MkC&q|FgO83 zNTjbi<{Vekk%e20iNQ%43xo||ZJ5RgC-MX1rX|_rH5GjRY``}-1w{N6Ptw{p92DmE7>-m^|< z&;@*SAarPrUSz}yNI4Pl&4Skrc(V3nF-%9OEZh1i038gTKMuQqM^f(@?QTNf zjc^&yjmy4|F9zK``RJga+{-yXUPyL>?hARSAlUi0}+JSbIRlU%>IP)Px#Fi=cXMTqsXA|fJiFgQd+M6h6J*uYrOcz~FgnDD5u0002+@TkDZ(CFy+00000 z000000N4mX-~a#u^+`lQR9J=Wn2U0pFbqYJ&Dse3|KHmynF4-8NT$VOvPFa1&#`?ImbP~O#cy})Mex5-|4e6Qtmhmz z0c55CfQTTi33NT`rUsapux6z-Xl<9H0xxPO&ID*CxGfl`sKJ`4qrg z@qkaj7heGM0WFpn&jyx61b)i_dVtu}*qB#+*{m0bLYM=(VhPeHyL*5DV7;9T%u5si zAP~YjAmdy+dx`_VUH6C*CV&Z_4zYfhj`B9UhX;TY34ojrie<7xtSc1n-zp#w*q-{9 z^DWLfVDa}52rdA*{~@3NxDz1vhkhRk>wrW3DF@8^WyDdzSNewnNWxt~CT@`8K`H

;hCx(9%|J>rkr zfC1nw{T?6&Z2L`%=l+)fnf9pu&pZNrt*_4#&Cj1AHwAdxpLX2n?*qQp-)l6o?+6SH z^a0=M$3cx34tE5;!@x`ZY4~1kAn@M6OZ{<-UL5|kffp|>zb6U8hf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/slowbro/mega/overworld_normal.pal b/graphics/pokemon/slowbro/mega/overworld_normal.pal new file mode 100644 index 0000000000..f447c1383d --- /dev/null +++ b/graphics/pokemon/slowbro/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +34 34 34 +112 48 56 +68 68 68 +176 96 104 +216 192 88 +208 120 128 +152 152 152 +240 168 176 +0 0 0 +240 240 168 +192 200 208 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/slowbro/mega/overworld_shiny.pal b/graphics/pokemon/slowbro/mega/overworld_shiny.pal new file mode 100644 index 0000000000..14445e3628 --- /dev/null +++ b/graphics/pokemon/slowbro/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +34 34 34 +75 48 112 +82 71 58 +132 96 176 +216 192 88 +149 121 187 +177 160 109 +200 168 240 +0 0 0 +240 240 168 +247 222 152 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/steelix/mega/overworld.png b/graphics/pokemon/steelix/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c39bbd09d2f13a78464e7d781de3e355eab2fc GIT binary patch literal 2703 zcmV;A3UKv_P)EX>4Tx04R}tkv&MmP!xqvQ>7vmhZYfW2vVKwq9Tr3g(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsR9{p+$@r9`ED4dk*j22MCP{)2yypK+|nA zolJ)W(glehxvqHp#<}RSz%!#}COuCaB^HYvtaLCdnHupFaZJ^8$``U8 ztDLtuYn2*n-IKpCoYz;DxlU^sNi1Rs5=1Ddp^OS_#A(+_v5=KlnXct1vm?C500}_lx6vi~^xupjmgE?_V!Z000000000000000%M0A^000PzNkl6+sx475cY zBESCwuPzQJ287cyz5A{8WBLjLs#HS4o@Kf1w%cyI?Y7%)yY05yZoBQa+itt3jehIYVg22W(MZO zYK*k9i%VO9UjyK~;DNI9OWTeo)3PV1r>LP5i@l8!OzG+apf+v2dpt2I4o(SNT(7*bl zieof#=_+VAwW3b}aLAq$5&%oX)p*}%4m;X7W3?rdA8b>u^m{dO%j#_@Mu5gaMSypF zV;w^?_=$AnOjK>o&A_RGe1{Lj?Sz2M5}Lz7PeIN@M9JRZg8NPdF#{MY0*2#b>?-II0TqBofX7c;K?5KP{@bQVW)z)yys04P_LTr*AjAU! zA0UWlml5B}>1&s-yESkcfftW0#n+oz7;ia$_0_eL`Q;iCcFBO!% z6ap-R9|-9Bg0$3@g1VasXu%_qr-68kh#G%n+Hdjj|_^~0_g+8f`aJfGP0kUOZhg1m;W*S;ec zk*SK&_>bd8ia*m=P`ebModeAq`P2kW<6O&sKAvd|A1TOnk&B!%Vju?CfC5==XJIG& z`ySGjX-h#f&jg4842EC;?PtR#mn)84bQRPc8>nW9V0nXt3%EXVH#>e3(NK^#ft$Fw zj?pwG&lR|c#C<13mO&kvo*JAhXkiKU7f>0#F!fOy&5T~RhN)N4Q&1m(xD{jKnSfv! zc-YM}6yzqbRPqpuF?sW1wnzYmBC3sVxXm<-bj>VO9FV) z4jL(c1&PKT(!+(0gHr{Ce1s0i>*nM(TYE@FkJjP9KMy}q(83b(U#Rn5k&0 z(NfSN63RKW>7e`pBBp!f&0Y~I54s%&rwST7(1$31>FPjJmuSKFH0@nMg+Skvfy19n zxdKC;AK*0}{-&Ts8MKSywgdW0VL5fLq+Km`o^Y5QLuRG_ZV)qM#*7NROhP14>k7aydnXfE^Z3{;BxW(FXR|JA$x;8poayknpGSZbV=8!$Cs2tG)w#@mZaJ5?hh- zZ*R(actt_2AnnoTy1`t)TJFmv3}euyD+C&VhUzecQ?k{SgT}x4UO0_2(qU74!DQi?WoWiK+>3-fr>v9kSb^z|HWP^=Pygo2Ly&@dDoQY~-mb^=&-%mK`LFb6P)zci2hU+Wzs zpLl4f-fO(WMc1xX*8^CmANDeO!&=bQtkf6d;NT6QrtnNpfa%M4w zxPqooVbJ9OS9z%qP%aUs@IUZZ1msrGnL{gPan~0P-2k>6%)Bk03JGfn=Uy~V5|VS= z81y+%(a9Ao$zb;N_KLr00iC%EdXtKhilrv_(!tbVu7Ko515+X6wxfh_#(@w(ONIS4 z|KAHTe^&%_V)Blg-03ixbNGGjfN#|4RFhL^e3y4JK1*ndL9QKWPR=9KQ!a_WivoH# zzC`CJkUJUw)3Kj&z$L^EI^J=a_c=aEXof+aNlOM#*L^Zx`MW5fH_JhQbFanxoCC~_ zk?R)XZLmpbhQTt=HT0Cf>jFAh6$2cM7XEX>4Tx04R}tkv&MmP!xqvQ;Q-M2a6PO$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>wLJl@B7_Z;544-lGFrdd4+K+|nA zlS+!Y{HoadiU5WYL4Lrk&aXKN3wD-+F`iHHLh`uYy8q+uD|}C|Lb7ydEor@UpT*a z?TG8jEPrnVoX43h#%qN~T-LYbV8D^xw{R+FOGIyCe8gu1kuAqJ0#4)5=QYN!vUk8` z5DX;J&C?%q)#oifbA2J)-*9aVvTim2OI@!xofmy`h-sQ?iHCd~**Gk$24Kh;IrVqk zlIZg(rI^p!X|fZ2$}z)?qd{?I0~F=3iO{*6$%;VeOY?220*k^UE>k#+;YP55?S}pC zcK?7!tgZqXar%nmwDi`L3`=52D+Kzci9h0l=6D>#onxdJ`5xr3iQor38k1CDGA4e- zA&vblNnVf`hg&=gTpk!lTmxhz!uKfSE)h0$%jI3(1ek-t$;gcQ2%`zyUBAOuEXlbi z%`0LAg?5sD>gFr^NJlA)lS3vV4nmn6hR zWl5)0i8!*W19?K`Gj4b=n1Eip2*iT}$BTl37YAD02;>~%?7?~u&3NIRgYuq=_Cz5d z(`J^4_rCSzlRa^Z8_pVGyevJRkoSB>dF7QDbBp85TU-RX92YBT7ANX1wBXEL>!3u~ zBcMduC`F;u3RxYX7H_x~1w)$-q(Doi!?Exdw*n`1p#Ry0!-jVbN_be(iu+Vv7vy8> zHt)5H3hucyYFR^~FZyC$vBRR{;zV@ zXRmI%DbV~Z*YB;MF(uAHdW~h*?apYme0K6zuV46!iR;-fq+H|t@dE*vQBNt+1mgez N002ovPDHLkV1g^UiTMBk literal 0 HcmV?d00001 diff --git a/graphics/pokemon/swampert/mega/overworld_normal.pal b/graphics/pokemon/swampert/mega/overworld_normal.pal new file mode 100644 index 0000000000..b25f6a76d8 --- /dev/null +++ b/graphics/pokemon/swampert/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +28 36 40 +127 55 55 +48 64 72 +48 72 112 +67 78 90 +160 72 16 +167 71 71 +247 114 64 +240 128 16 +87 119 156 +74 156 210 +105 177 241 +0 0 0 +160 160 192 +200 200 224 diff --git a/graphics/pokemon/swampert/mega/overworld_shiny.pal b/graphics/pokemon/swampert/mega/overworld_shiny.pal new file mode 100644 index 0000000000..fda8f013c0 --- /dev/null +++ b/graphics/pokemon/swampert/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +28 36 40 +127 55 55 +48 64 72 +127 55 129 +67 78 90 +160 72 16 +167 71 71 +247 114 64 +240 128 16 +103 117 133 +198 86 229 +234 121 249 +0 0 0 +160 160 192 +200 200 224 diff --git a/graphics/pokemon/tyranitar/mega/overworld.png b/graphics/pokemon/tyranitar/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..9452e416be95ab27d46a2e2a27d17be78f4c7a68 GIT binary patch literal 1505 zcmV<71s?i|P)EX>4Tx04R}tkv&MmKorOSrbw5+})4=z5lzrcYx5WGR^9Z1DbA| znN&i|j&>WGOWz0)b8ou#$Pk9t~F<#3*@6Q-i3l^h;MB+FzOq+Ovcy`k^ zIPVjOSy@(z&xt2Zx*+i**ACqUpCxY9fRS`(Q2B)!qm zqDR2cHgIv>(Ud*lat9cFGGtSBr2q|~SOnhB=$rDu@GUT~=Jl<;kJASrOT9|p00)P_ zM2Tvz`@FlqyKn#IwEOo19V&8!YRum<0000mP)t-sv*Q0CC@6R!ASg&MSa?vlFfeeS zSctf2u-JHbh>)PT$N&HU=;-(W0000000000y@4x)000BrNklvH2T2!$g< zBsb*!pLfpzxwS5_ok@S~R69)@e@HqYz}nmGZ~R|FKH(ot{+%^sJvKPxA5H$HHU1p< zWbt2EL-LxB3=a86lYeOqS=U1k5BUd^MJ6^PZ*qJF|NeTFhfxMp8&|);BQea(H^A>( zn=IG36t%Jz(;{#3EjC%#)fL*9s>j^;-LQD^AEUj!$At>lQt-n+-{Y!tGhE)*SLCwSO22>1Ucb8TookN zNDo;~jv!AtH=w{oKQw8{MLGe3XIeQO>;xE>fB^(zI$>8sC;UfXs2ixiMo@$Lf}0Bz zo~-asqd0A2uecvT2y{Lw6njSgRo>hsECfnga?VRa1w7Rn2TY%+g32Wv zY;zp)Akgj$mv@Cdm#~=daDWPxCGIC=oeu_yjDH*vc>Zw$8SVllCkVt3`@}v*p7F^1 z$|W3Zikvqj6qw!NfoQauj%!$qyvB$Mk)YxYj;*kXGUh*-!=)^hXW4GX=7R$BvM|V@ zr+HOz#~&^+Wfx%fSx&nz3xCVL%7cr##e`P}Tp^AJCKe&yU)}K#^F8{NYjd-Q<4K|K zPK9Z5>G$Iajy}}gcG+YM?Ga6y?sMs`Nnw7qAWvf>!OCp#$TdNTjO#Qiz(c=Vcvo*k zc=(nWHmNbM(v8!2;Hfs6lIiO(AJ5b(rvpQTa5U^vobIC&2)<}*(f*f!uc_tEv6xQV z;Ev1S06e(rK(R4Cw+OLc*77!_=WOw1)9+>62*9%S09b2-1N16*Uw<5l54Qm8pr0P# z*y1|C1=7TWg?XJ3cvs&G+O=%*K4yNd5 zw=|VcI9>R%#YU!9?x3}XuNRsboM^kU@D+;#t80`0#+&0GzP~@DlzKBS00000NkvXX Hu0mjfc74R! literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tyranitar/mega/overworld_normal.pal b/graphics/pokemon/tyranitar/mega/overworld_normal.pal new file mode 100644 index 0000000000..2c15c90a73 --- /dev/null +++ b/graphics/pokemon/tyranitar/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 40 40 +120 32 32 +40 72 48 +88 120 80 +184 48 48 +112 160 88 +136 184 104 +176 216 120 +120 136 144 +160 184 200 +0 0 0 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/tyranitar/mega/overworld_shiny.pal b/graphics/pokemon/tyranitar/mega/overworld_shiny.pal new file mode 100644 index 0000000000..c4a90c104c --- /dev/null +++ b/graphics/pokemon/tyranitar/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +34 42 42 +84 28 131 +74 65 43 +124 119 85 +143 93 186 +169 151 98 +191 164 113 +222 198 130 +126 143 152 +169 194 210 +0 0 0 +239 239 250 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/venusaur/mega/overworld.png b/graphics/pokemon/venusaur/mega/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..45ddccb4014ae6e1503bb422591aabf1d7ffcdf3 GIT binary patch literal 859 zcmV-h1ElPx#Fi=cXMYH1nBReB#ASgg!FpxkXV5ks4m|(zwD2U)7_}~cWz;MV&fbe*rXxP92 z008Ld_`3)d82|tR*-1n}R9J=WmeG2vAP|JbjYPAszW>{voy8=AR%rBmy$Nko!oQK( zaj@;W@A!`ISVoVryne#}di4Bw1nxOJ9=xZp#xK$ExrbN_fhYY6VW*(RuhIXxhlcuo zy5H}UD%}*+xYeAD;3*H$72tHAfYE378-8q0JO9|jo|)0$G)-s@?}|?!^9v$)#zP_z zRTY%8z4pBbQ8T|Jf+swrVIW~_5m?aNgITcH$WPk$99xeXxu_HfWWB81RH5oqfvQlN z_(}T~lW6NvE0=Ld7VDb3yEIXG!zfMsiU`s$4o{EV+oMJJ=WX161V>XWX3i+Gett z$TjnG5mbF4=^LJxR-xnSh}3vTs?cl__G}i*T3?l)i=bYggKFetu+YZh8t-U!&O8Yy zG`}=7T{B-rj4Kh`;}n_kZBH6lqY6<>jT|N7qliyYV?8XIl(m5s{*IVhbr`{2P8!VU zqwWBCgTwun)gOu)w_B_wF#S&?#$ORryce-!PEhCL9KFf&4$oar%^dp3ctqBC zsm&VL;n`DoiJ0*vVqH5YwIud)j2bLx)qdUDp&Ez5;^!V7N48ooxj@?R>;hspSYx4w z9B~odPmxwyxlLvh&viGNpVK&TK<<1j|=FxijQlnuoA;=atF9;z87YoS?( zTV6CU`&nj78eZn|l;Um1QJ?c{Yy_sIY?RMg+##RZ^xIRGxDg_&>NcMjNjfko1>*gh zOZlAlc309MDFvp5j2HjxFWbZ!!1gaCt}1?_OCQUm1R3A^Bt31g=iau#6+gI& Date: Thu, 30 Jan 2025 22:46:49 -0300 Subject: [PATCH 046/125] Fix master -> upcoming compile error --- test/battle/gimmick/dynamax.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 35b801a3ff..4b5c05dfa7 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1205,7 +1205,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_TERROR].argument == MAX_EFFECT_MEAN_LOOK); + ASSUME(GetMoveMaxEffect(MOVE_G_MAX_TERROR) == MAX_EFFECT_MEAN_LOOK); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); From 89cfd85b8fa8a2d5156182541f13aff958889fd5 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 31 Jan 2025 21:49:26 +0100 Subject: [PATCH 047/125] Fixes battler mutation during the intim script (#6151) Co-authored-by: Bassoonian --- data/battle_scripts_1.s | 4 ++++ test/battle/ability/intimidate.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0703dc09c0..bb4e4ea2bd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7821,8 +7821,12 @@ BattleScript_IntimidateEffect: printstring STRINGID_PKMNCUTSATTACKWITH BattleScript_IntimidateEffect_WaitString: waitmessage B_WAIT_TIME_LONG + saveattacker + savetarget copybyte sBATTLER, gBattlerTarget call BattleScript_TryIntimidateHoldEffects + restoreattacker + restoretarget BattleScript_IntimidateLoopIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_IntimidateLoop diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index e0f97d5bda..6aea91de25 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -351,3 +351,27 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral } } +DOUBLE_BATTLE_TEST("Intimidate will correctly decrease the attack of the second mon after Protosynthesis activated") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { SWITCH(opponentLeft, 2); SEND_OUT(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} From c5c22a0005e2317d37667e7458d1431074457206 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 31 Jan 2025 21:50:26 +0100 Subject: [PATCH 048/125] Fixes Dynamic Moves types in SumScreen while in Battle (#6145) --- src/battle_main.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 5028a02e33..43bc13277b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5844,11 +5844,12 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) u32 moveType = gMovesInfo[move].type; u32 moveEffect = gMovesInfo[move].effect; u32 species, heldItem, holdEffect, ability, type1, type2, type3; + bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE; if (move == MOVE_STRUGGLE) return TYPE_NORMAL; - if (gMain.inBattle) + if (monInBattle) { species = gBattleMons[battler].species; heldItem = gBattleMons[battler].item; @@ -5872,18 +5873,21 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) switch (moveEffect) { case EFFECT_WEATHER_BALL: - if (gMain.inBattle && WEATHER_HAS_EFFECT) + if (monInBattle) { - if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) - return TYPE_WATER; - else if (gBattleWeather & B_WEATHER_SANDSTORM) - return TYPE_ROCK; - else if (gBattleWeather & B_WEATHER_SUN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) - return TYPE_FIRE; - else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) - return TYPE_ICE; - else - return moveType; + if (WEATHER_HAS_EFFECT) + { + if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_WATER; + else if (gBattleWeather & B_WEATHER_SANDSTORM) + return TYPE_ROCK; + else if (gBattleWeather & B_WEATHER_SUN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_FIRE; + else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) + return TYPE_ICE; + else + return moveType; + } } else { @@ -5909,7 +5913,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) case EFFECT_HIDDEN_POWER: { u32 typeBits = 0; - if (gMain.inBattle) + if (monInBattle) { typeBits = ((gBattleMons[battler].hpIV & 1) << 0) | ((gBattleMons[battler].attackIV & 1) << 1) @@ -5985,7 +5989,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) else return moveType; case EFFECT_TERRAIN_PULSE: - if (gMain.inBattle) + if (monInBattle) { if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY)) { From 97d8bd2646f8cde956a05872ee048d6a7f3ba873 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 31 Jan 2025 22:02:26 +0100 Subject: [PATCH 049/125] Fixes Dragon Tail missing timing against Rocky Helmet / Iron Barbs (#6154) --- asm/macros/battle_script.inc | 5 -- data/battle_scripts_1.s | 29 ++++++----- include/battle_scripts.h | 5 +- include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 57 +++++++++++++-------- src/data/battle_move_effects.h | 2 +- test/battle/move_effect/hit_switch_target.c | 49 ++++++++++++++++++ 7 files changed, 109 insertions(+), 39 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a5e21af674..67d97fda02 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1721,11 +1721,6 @@ .4byte \failInstr .endm - .macro tryhitswitchtarget failInstr:req - callnative BS_TryHitSwitchTarget - .4byte \failInstr - .endm - .macro setmagiccoattarget callnative BS_SetMagicCoatTarget .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bb4e4ea2bd..88cd06d596 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1798,25 +1798,17 @@ BattleScript_EffectFinalGambit:: jumpifmovehadnoeffect BattleScript_MoveEnd goto BattleScript_MoveEnd -BattleScript_EffectHitSwitchTarget:: - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd - jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut - jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd - jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted - jumpiftargetdynamaxed BattleScript_HitSwitchTargetDynamaxed - tryhitswitchtarget BattleScript_MoveEnd +BattleScript_TryHitSwitchTarget:: forcerandomswitch BattleScript_HitSwitchTargetForceRandomSwitchFailed - goto BattleScript_MoveEnd + return -BattleScript_HitSwitchTargetDynamaxed: +BattleScript_HitSwitchTargetDynamaxed:: printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG BattleScript_HitSwitchTargetForceRandomSwitchFailed: hitswitchtargetfailed setbyte sSWITCH_CASE, B_SWITCH_NORMAL - goto BattleScript_MoveEnd + return BattleScript_EffectToxicThread:: setstatchanger STAT_SPEED, 1, TRUE @@ -6774,6 +6766,12 @@ BattleScript_PrintMonIsRooted:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_PrintMonIsRootedRet:: + pause B_WAIT_TIME_SHORT + printstring STRINGID_PKMNANCHOREDITSELF + waitmessage B_WAIT_TIME_LONG + return + BattleScript_AtkDefDown:: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS @@ -8261,6 +8259,13 @@ BattleScript_AbilityPreventsPhasingOut:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_AbilityPreventsPhasingOutRet:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNANCHORSITSELFWITH + waitmessage B_WAIT_TIME_LONG + return + BattleScript_AbilityNoStatLoss:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1404a40718..fb830c275b 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -770,7 +770,10 @@ extern const u8 BattleScript_EffectDefenseUp3[]; extern const u8 BattleScript_EffectNobleRoar[]; extern const u8 BattleScript_EffectVenomDrench[]; extern const u8 BattleScript_EffectToxicThread[]; -extern const u8 BattleScript_EffectHitSwitchTarget[]; +extern const u8 BattleScript_TryHitSwitchTarget[]; +extern const u8 BattleScript_HitSwitchTargetDynamaxed[]; +extern const u8 BattleScript_AbilityPreventsPhasingOutRet[]; +extern const u8 BattleScript_PrintMonIsRootedRet[]; extern const u8 BattleScript_EffectFinalGambit[]; extern const u8 BattleScript_EffectAutotomize[]; extern const u8 BattleScript_EffectCopycat[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 20858c2365..c8f6b7cd5b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -276,6 +276,7 @@ enum MoveEndEffects MOVEEND_ITEM_EFFECTS_TARGET, MOVEEND_MOVE_EFFECTS2, MOVEEND_ITEM_EFFECTS_ALL, + MOVEEND_HIT_SWITCH_TARGET, MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move MOVEEND_NUM_HITS, MOVEEND_SUBSTITUTE, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 61082d33cd..7a7fddac98 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6077,6 +6077,43 @@ static void Cmd_moveend(void) else gBattleScripting.moveendState++; break; + case MOVEEND_HIT_SWITCH_TARGET: + if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_SWITCH_TARGET + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) + { + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + if (targetAbility == ABILITY_GUARD_DOG) + { + gBattleScripting.moveendState++; + break; + } + + effect = TRUE; + BattleScriptPushCursor(); + if (targetAbility == ABILITY_SUCTION_CUPS) + { + gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet; + } + else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) + { + gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet; + } + else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + { + gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed; + } + else + { + gBattleScripting.switchCase = B_SWITCH_HIT; + gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget; + } + } + gBattleScripting.moveendState++; + break; case MOVEEND_KINGSROCK: // King's rock // These effects will occur at each hit in a multi-strike move if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0, FALSE)) @@ -17381,26 +17418,6 @@ void BS_JumpIfBlockedBySoundproof(void) } } -void BS_TryHitSwitchTarget(void) -{ - NATIVE_ARGS(const u8 *failInstr); - - if (IsBattlerAlive(gBattlerAttacker) - && IsBattlerAlive(gBattlerTarget) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED - && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT - && GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG) - { - gBattleScripting.switchCase = B_SWITCH_HIT; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - void BS_SetMagicCoatTarget(void) { NATIVE_ARGS(); diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index ee281d6fe2..0b6a1dd72f 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1571,7 +1571,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_HIT_SWITCH_TARGET] = { - .battleScript = BattleScript_EffectHitSwitchTarget, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index a899ae0b33..bc026110ee 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -69,3 +69,52 @@ SINGLE_BATTLE_TEST("Dragon Tail does not fail if replacements fainted") NOT MESSAGE("But it failed!"); } } + +SINGLE_BATTLE_TEST("Dragon Tail switches the target after Rocky Helmet and Iron Barbs") +{ + PASSES_RANDOMLY(1, 2, RNG_FORCE_RANDOM_SWITCH); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TOGEDEMARU) { Ability(ABILITY_IRON_BARBS); Item(ITEM_ROCKY_HELMET); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHARMANDER); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the opposing Togedemaru's Iron Barbs!"); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the opposing Togedemaru's Rocky Helmet!"); + MESSAGE("The opposing Charmander was dragged out!"); + } +} + +SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Guard Dog ability") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_OKIDOGI) { Ability(ABILITY_GUARD_DOG); } + OPPONENT(SPECIES_CHARMANDER); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); + NOT MESSAGE("The opposing Charmander was dragged out!"); + } +} + +SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Suction Cups ability") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_OCTILLERY) { Ability(ABILITY_SUCTION_CUPS); } + OPPONENT(SPECIES_CHARMANDER); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); + MESSAGE("The opposing Octillery anchors itself with Suction Cups!"); + NOT MESSAGE("The opposing Charmander was dragged out!"); + } +} From 1c821c2ff7db00b87dfbc86a5fb24cbecc11eb21 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 1 Feb 2025 14:35:11 +0100 Subject: [PATCH 050/125] Tests for Big Pecks (#6158) Co-authored-by: Hedara --- test/battle/ability/big_pecks.c | 116 ++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 test/battle/ability/big_pecks.c diff --git a/test/battle/ability/big_pecks.c b/test/battle/ability/big_pecks.c new file mode 100644 index 0000000000..0c61dd3ba3 --- /dev/null +++ b/test/battle/ability/big_pecks.c @@ -0,0 +1,116 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Big Pecks prevents Defense stage reduction from moves") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(player, MOVE_LEER); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_BIG_PECKS); + MESSAGE("The opposing Pidgey's Big Pecks prevents Defense loss!"); + } +} + +SINGLE_BATTLE_TEST("Big Pecks is ignored by Mold Breaker") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(player, MOVE_LEER); } + } SCENE { + ABILITY_POPUP(player, ABILITY_MOLD_BREAKER); + MESSAGE("Pinsir breaks the mold!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEER, player); + MESSAGE("The opposing Pidgey's Defense fell!"); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_BIG_PECKS); + MESSAGE("The opposing Pidgey's Big Pecks prevents Defense loss!"); + } + } +} + +SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Defense stage reduction from moves used by the user") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_SUPERPOWER, MOVE_EFFECT_ATK_DEF_DOWN) == TRUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUPERPOWER); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPERPOWER, opponent); + MESSAGE("The opposing Pidgey's Attack fell!"); + MESSAGE("The opposing Pidgey's Defense fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Topsy-Turvy") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); + ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(opponent, MOVE_HARDEN); MOVE(player, MOVE_TOPSY_TURVY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, opponent); + MESSAGE("The opposing Pidgey's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOPSY_TURVY, player); + MESSAGE("All stat changes on the opposing Pidgey were inverted!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting positive Defense stage changes") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF)); + ASSUME(gMovesInfo[MOVE_SOAK].effect == EFFECT_SOAK); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player,MOVE_SOAK); } + TURN { MOVE(opponent, MOVE_HARDEN); MOVE(player, MOVE_SPECTRAL_THIEF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, opponent); + MESSAGE("The opposing Pidgey's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); + MESSAGE("Wobbuffet stole the target's boosted stats!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Big Pecks doesn't prevent receiving negative Defense stage changes from Baton Pass") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } + } WHEN { + TURN { MOVE(player, MOVE_LEER); + MOVE(opponent, MOVE_BATON_PASS); + SEND_OUT(opponent, 1); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEER, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent); + MESSAGE("2 sent out Pidgey!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + } +} From 8bb52b572796f469354251d5c241f8baa9ecae22 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 1 Feb 2025 17:34:17 +0100 Subject: [PATCH 051/125] Water Compaction tests (#6159) Co-authored-by: Hedara Co-authored-by: Eduardo Quezada --- test/battle/ability/water_compaction.c | 61 ++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/battle/ability/water_compaction.c diff --git a/test/battle/ability/water_compaction.c b/test/battle/ability/water_compaction.c new file mode 100644 index 0000000000..51297f5a8a --- /dev/null +++ b/test/battle/ability/water_compaction.c @@ -0,0 +1,61 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages when hit by a water type move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + ABILITY_POPUP(player, ABILITY_WATER_COMPACTION); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a multi-hit Water type move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].type == TYPE_WATER); + ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].strikeCount == 3); + PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SURGING_STRIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponent); + ABILITY_POPUP(player, ABILITY_WATER_COMPACTION); + MESSAGE("Sandygast's Defense sharply rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponent); + ABILITY_POPUP(player, ABILITY_WATER_COMPACTION); + MESSAGE("Sandygast's Defense sharply rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponent); + ABILITY_POPUP(player, ABILITY_WATER_COMPACTION); + MESSAGE("Sandygast's Defense sharply rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 6); + } +} + +SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water type moves", s16 damage) +{ + u16 ability; + PARAMETRIZE { ability = ABILITY_SAND_VEIL; } + PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; } + GIVEN { + ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + PLAYER(SPECIES_SANDYGAST) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} From 7c6eda21b1f9af04bdf0ee246559b1a5d5d0384f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 1 Feb 2025 14:47:36 -0300 Subject: [PATCH 052/125] Added missing in-battle "Move Info" button prompt (#6155) --- .../battle_interface/move_info_window_l.png | Bin 0 -> 291 bytes .../battle_interface/move_info_window_r.png | Bin 0 -> 295 bytes include/battle.h | 1 + include/battle_interface.h | 2 + src/battle_controller_player.c | 5 +- src/battle_interface.c | 99 ++++++++++++++++-- 6 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 graphics/battle_interface/move_info_window_l.png create mode 100644 graphics/battle_interface/move_info_window_r.png diff --git a/graphics/battle_interface/move_info_window_l.png b/graphics/battle_interface/move_info_window_l.png new file mode 100644 index 0000000000000000000000000000000000000000..548acf653bf3ae29820f5ee08e8449599140aeae GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy1_3@Hu8bR_tBae1yrL`(9W^-| zfsE(xzyAFDA1Dt5*~P_PP9V+KuAOV?=>am5omCeBDS?t8zu^C9;H=`NDL}bNo-U3d z7QI&|d-EMo;BdJ+K`r^izvFAW_JGyg44KXMZn9 RnFw?pgQu&X%Q~loCIA$4daVEe literal 0 HcmV?d00001 diff --git a/graphics/battle_interface/move_info_window_r.png b/graphics/battle_interface/move_info_window_r.png new file mode 100644 index 0000000000000000000000000000000000000000..f83e8f7f884a0cbcfe3e0f9f37fd500a63de7ea2 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy1_3@Hu8bR_tBae1yrL`(9W^-| zfsE(xzyAFDA1Dt5*~P_PP9V+KuAOV?=>am5omCeBDS?t8zu^C9;H=`NDL}bto-U3d z7QI&|-{xZw|N3{AcI99F%;)qaWs4Jsq7_%9pa(l+;NzGtK22{n2o&}) z-{|1U*u!**{XizWS-XBgX#s;ys02f@m~_KR#tD2{i??iwV4M_p*r(0;?t1P`{ROgB zd{*x*V^+WTccq4BfvjK7lM6-HyDb>Q+r#G1JiL?3qGgZgoX(H$_SP5vkF>wQeIily V=AM~sT0j>vc)I$ztaD0e0ss~vcG3U< literal 0 HcmV?d00001 diff --git a/include/battle.h b/include/battle.h index 9a4a57d004..56aad13594 100644 --- a/include/battle.h +++ b/include/battle.h @@ -780,6 +780,7 @@ struct BattleStruct u8 ballSwapped:1; // Used for the last used ball feature u8 throwingPokeBall:1; u8 ballSpriteIds[2]; // item gfx, window gfx + u8 moveInfoSpriteId; // move info, window gfx u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. // When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without. diff --git a/include/battle_interface.h b/include/battle_interface.h index 3280826ff7..600a9a956d 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -128,5 +128,7 @@ void SwapBallToDisplay(bool32 sameBall); void ArrowsChangeColorLastBallCycle(bool32 showArrows); void UpdateAbilityPopup(u8 battlerId); void CategoryIcons_LoadSpritesGfx(void); +void TryToAddMoveInfoWindow(void); +void TryToHideMoveInfoWindow(void); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index fcadd22dc7..77ce6083f9 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -673,6 +673,7 @@ void HandleInputChooseMove(u32 battler) if (JOY_NEW(A_BUTTON) && !gBattleStruct->descriptionSubmenu) { + TryToHideMoveInfoWindow(); PlaySE(SE_SELECT); moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[gMoveSelectionCursor[battler]]); @@ -783,6 +784,7 @@ void HandleInputChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, 0xFFFF); HideGimmickTriggerSprite(); PlayerBufferExecCompleted(battler); + TryToHideMoveInfoWindow(); } } else if (JOY_NEW(DPAD_LEFT) && !gBattleStruct->zmove.viewing) @@ -882,7 +884,7 @@ void HandleInputChooseMove(u32 battler) MoveSelectionDisplayMoveType(battler); } } - else if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON) && B_MOVE_DESCRIPTION_BUTTON != B_LAST_USED_BALL_BUTTON) + else if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON)) { gBattleStruct->descriptionSubmenu = TRUE; MoveSelectionDisplayMoveDescription(battler); @@ -2133,6 +2135,7 @@ void PlayerHandleChooseMove(u32 battler) InitMoveSelectionsVarsAndStrings(battler); gBattleStruct->gimmick.playerSelect = FALSE; + TryToAddMoveInfoWindow(); AssignUsableZMoves(battler, moveInfo->moves); gBattleStruct->zmove.viable = (gBattleStruct->zmove.possibleZMoves[battler] & (1u << gMoveSelectionCursor[battler])) != 0; diff --git a/src/battle_interface.c b/src/battle_interface.c index 5c514a0d80..0c2aac1898 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -206,6 +206,7 @@ static void Task_FreeAbilityPopUpGfx(u8); static void SpriteCB_LastUsedBall(struct Sprite *); static void SpriteCB_LastUsedBallWin(struct Sprite *); +static void SpriteCB_MoveInfoWin(struct Sprite *sprite); static const struct OamData sOamData_64x32 = { @@ -732,6 +733,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; + gBattleStruct->moveInfoSpriteId = MAX_SPRITES; return healthboxLeftSpriteId; } @@ -2874,6 +2876,36 @@ static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = .callback = SpriteCB_LastUsedBallWin }; +#define MOVE_INFO_WINDOW_TAG 0xE722 + +static const struct OamData sOamData_MoveInfoWindow = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_MoveInfoWindow = +{ + .tileTag = MOVE_INFO_WINDOW_TAG, + .paletteTag = ABILITY_POP_UP_TAG, + .oam = &sOamData_MoveInfoWindow, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MoveInfoWin +}; + #if B_LAST_USED_BALL_BUTTON == R_BUTTON && B_LAST_USED_BALL_CYCLE == TRUE static const u8 ALIGNED(4) sLastUsedBallWindowGfx[] = INCBIN_U8("graphics/battle_interface/last_used_ball_r_cycle.4bpp"); #elif B_LAST_USED_BALL_CYCLE == TRUE @@ -2888,6 +2920,17 @@ static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), LAST_BALL_WINDOW_TAG }; +#if B_MOVE_DESCRIPTION_BUTTON == R_BUTTON +static const u8 sMoveInfoWindowGfx[] = INCBIN_U8("graphics/battle_interface/move_info_window_r.4bpp"); +#else +static const u8 sMoveInfoWindowGfx[] = INCBIN_U8("graphics/battle_interface/move_info_window_l.4bpp"); +#endif + +static const struct SpriteSheet sSpriteSheet_MoveInfoWindow = +{ + sMoveInfoWindowGfx, sizeof(sMoveInfoWindowGfx), MOVE_INFO_WINDOW_TAG +}; + #define LAST_USED_BALL_X_F 14 #define LAST_USED_BALL_X_0 -14 #define LAST_USED_BALL_Y ((IsDoubleBattle()) ? 78 : 68) @@ -2946,7 +2989,7 @@ void TryAddLastUsedBallItemSprites(void) gBattleStruct->ballSpriteIds[0] = AddItemIconSprite(102, 102, gBallToDisplay); gSprites[gBattleStruct->ballSpriteIds[0]].x = LAST_USED_BALL_X_0; gSprites[gBattleStruct->ballSpriteIds[0]].y = LAST_USED_BALL_Y; - gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; gLastUsedBallMenuPresent = TRUE; gSprites[gBattleStruct->ballSpriteIds[0]].callback = SpriteCB_LastUsedBall; } @@ -2961,7 +3004,8 @@ void TryAddLastUsedBallItemSprites(void) gBattleStruct->ballSpriteIds[1] = CreateSprite(&sSpriteTemplate_LastUsedBallWindow, LAST_BALL_WIN_X_0, LAST_USED_WIN_Y, 5); - gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore + gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; + gSprites[gBattleStruct->moveInfoSpriteId].sHide = TRUE; gLastUsedBallMenuPresent = TRUE; } if (B_LAST_USED_BALL_CYCLE == TRUE) @@ -2984,6 +3028,32 @@ static void DestroyLastUsedBallGfx(struct Sprite *sprite) gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; } +void TryToAddMoveInfoWindow(void) +{ + LoadSpritePalette(&sSpritePalette_AbilityPopUp); + if (GetSpriteTileStartByTag(MOVE_INFO_WINDOW_TAG) == 0xFFFF) + LoadSpriteSheet(&sSpriteSheet_MoveInfoWindow); + + if (gBattleStruct->moveInfoSpriteId == MAX_SPRITES) + { + gBattleStruct->moveInfoSpriteId = CreateSprite(&sSpriteTemplate_MoveInfoWindow, LAST_BALL_WIN_X_0, LAST_USED_WIN_Y + 32, 6); + gSprites[gBattleStruct->moveInfoSpriteId].sHide = FALSE; + } +} + +void TryToHideMoveInfoWindow(void) +{ + gSprites[gBattleStruct->moveInfoSpriteId].sHide = TRUE; +} + +static void DestroyMoveInfoWinGfx(struct Sprite *sprite) +{ + FreeSpriteTilesByTag(MOVE_INFO_WINDOW_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + DestroySprite(sprite); + gBattleStruct->moveInfoSpriteId = MAX_SPRITES; +} + static void SpriteCB_LastUsedBallWin(struct Sprite *sprite) { if (sprite->sHide) @@ -3021,6 +3091,23 @@ static void SpriteCB_LastUsedBall(struct Sprite *sprite) } } +static void SpriteCB_MoveInfoWin(struct Sprite *sprite) +{ + if (sprite->sHide) + { + if (sprite->x != LAST_BALL_WIN_X_0) + sprite->x--; + + if (sprite->x == LAST_BALL_WIN_X_0) + DestroyMoveInfoWinGfx(sprite); + } + else + { + if (sprite->x != LAST_BALL_WIN_X_F) + sprite->x++; + } +} + static void TryHideOrRestoreLastUsedBall(u8 caseId) { if (B_LAST_USED_BALL == FALSE) @@ -3032,16 +3119,16 @@ static void TryHideOrRestoreLastUsedBall(u8 caseId) { case 0: // hide if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) - gSprites[gBattleStruct->ballSpriteIds[0]].sHide = TRUE; // hide + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = TRUE; if (gBattleStruct->ballSpriteIds[1] != MAX_SPRITES) - gSprites[gBattleStruct->ballSpriteIds[1]].sHide = TRUE; // hide + gSprites[gBattleStruct->ballSpriteIds[1]].sHide = TRUE; gLastUsedBallMenuPresent = FALSE; break; case 1: // restore if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES) - gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore + gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; if (gBattleStruct->ballSpriteIds[1] != MAX_SPRITES) - gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore + gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; gLastUsedBallMenuPresent = TRUE; break; } From 881c7bd8ff9dbb331a3cb727255bb36faf19478d Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 1 Feb 2025 14:34:25 -0500 Subject: [PATCH 053/125] Clarify MOVE_EFFECT_SLEEP sleep clause handling (#6161) --- src/battle_ai_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3f0b86fcd1..61bff76fb2 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2398,6 +2398,7 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); switch (additionalEffect->moveEffect) { + // Skip MOVE_EFFECT_SLEEP as moves with a secondary chance of applying sleep are allowed by Smogon's rules (ie. Relic Song) case MAX_EFFECT_EFFECT_SPORE_FOES: case MAX_EFFECT_YAWN_FOE: return TRUE; From a0097ef395a610b564976ca5c77bfdac96981491 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sat, 1 Feb 2025 21:46:59 +0100 Subject: [PATCH 054/125] Add Poltchageist family form data (#6163) --- src/data/pokemon/form_species_tables.h | 14 ++++++++++++++ src/data/pokemon/species_info/gen_9_families.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index f2c4560216..ee391a74a0 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -2155,6 +2155,20 @@ static const u16 sGimmighoulFormSpeciesIdTable[] = { }; #endif //P_FAMILY_GIMMIGHOUL +#if P_FAMILY_POLTCHAGEIST +static const u16 sPoltchageistFormSpeciesIdTable[] = { + SPECIES_POLTCHAGEIST_COUNTERFEIT, + SPECIES_POLTCHAGEIST_ARTISAN, + FORM_SPECIES_END, +}; + +static const u16 sSinistchaFormSpeciesIdTable[] = { + SPECIES_SINISTCHA_UNREMARKABLE, + SPECIES_SINISTCHA_MASTERPIECE, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_POLTCHAGEIST + #if P_FAMILY_OGERPON static const u16 sOgerponFormSpeciesIdTable[] = { SPECIES_OGERPON_TEAL, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 7402619b9a..d0fa8ab74d 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -6986,6 +6986,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sPoltchageistLevelUpLearnset, .teachableLearnset = sPoltchageistTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_UNREMARKABLE_TEACUP, SPECIES_SINISTCHA_UNREMARKABLE}), + .formSpeciesIdTable = sPoltchageistFormSpeciesIdTable, }, [SPECIES_POLTCHAGEIST_ARTISAN] = { @@ -7048,6 +7049,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sPoltchageistLevelUpLearnset, .teachableLearnset = sPoltchageistTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_MASTERPIECE_TEACUP, SPECIES_SINISTCHA_MASTERPIECE}), + .formSpeciesIdTable = sPoltchageistFormSpeciesIdTable, }, [SPECIES_SINISTCHA_UNREMARKABLE] = @@ -7110,6 +7112,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = ) .levelUpLearnset = sSinistchaLevelUpLearnset, .teachableLearnset = sSinistchaTeachableLearnset, + .formSpeciesIdTable = sSinistchaFormSpeciesIdTable, }, [SPECIES_SINISTCHA_MASTERPIECE] = { @@ -7171,6 +7174,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = ) .levelUpLearnset = sSinistchaLevelUpLearnset, .teachableLearnset = sSinistchaTeachableLearnset, + .formSpeciesIdTable = sSinistchaFormSpeciesIdTable, }, #endif //P_FAMILY_POLTCHAGEIST From 959e5a9e8278780b72e037d5a10853337bbdeb03 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 1 Feb 2025 22:58:26 +0100 Subject: [PATCH 055/125] Add the header required for TPP tags to work (#6162) Co-authored-by: Hedara --- src/data.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data.c b/src/data.c index 66d575e66a..f5035262c5 100644 --- a/src/data.c +++ b/src/data.c @@ -3,6 +3,7 @@ #include "battle.h" #include "data.h" #include "graphics.h" +#include "trainer_pools.h" #include "battle_transition.h" #include "constants/abilities.h" #include "constants/items.h" From f8c2e860d7540c3e26ffe6d13a8d8f0ee1dfc460 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:50:39 +0100 Subject: [PATCH 056/125] Remove unused PainSplit scripting global (#6164) --- include/constants/battle_script_commands.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bcf11683a1..5e995cffbe 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -2,7 +2,7 @@ #define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H // The following correspond to the struct members of BattleScripting by adding their offset -#define sPAINSPLIT_HP (gBattleScripting + 0x00) // painSplitHp +#define sUNUSED_0x00 (gBattleScripting + 0x00) // unused_0x00 #define sUNUSED_0x04 (gBattleScripting + 0x04) // unused_0x04 #define sMULTIHIT_STRING (gBattleScripting + 0x08) // multihitString #define sEXP_CATCH (gBattleScripting + 0x0E) // expOnCatch From ddff2def40ac95588ed82b758a6547d49c1e073f Mon Sep 17 00:00:00 2001 From: moostoet <70690976+moostoet@users.noreply.github.com> Date: Sun, 2 Feb 2025 22:11:25 +0100 Subject: [PATCH 057/125] Prevent sameMoveTurns from incrementing when unable to use move (#6167) --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7a7fddac98..4449040a73 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6744,7 +6744,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_SAME_MOVE_TURNS: - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) gBattleStruct->sameMoveTurns[gBattlerAttacker]++; From 37dd57b1b54257f4da3f5692ad76274a0609d17d Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 3 Feb 2025 07:00:42 -0500 Subject: [PATCH 058/125] AI adds score to Pursuit if it OHKOs (#6166) --- src/battle_ai_util.c | 6 +++++- test/battle/ai/ai_check_viability.c | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 61bff76fb2..ad5943cc0e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -787,7 +787,11 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 return TRUE; break; case EFFECT_FELL_STINGER: - if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) + if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK) && noOfHitsToKo == 1) + return TRUE; + break; + case EFFECT_PURSUIT: + if(noOfHitsToKo == 1) return TRUE; break; } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 2c20a08db6..35f74d43c0 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -254,3 +254,16 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha TURN { EXPECT_MOVE(opponentLeft, MOVE_SKILL_SWAP, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_OVERHEAT); } } } + +AI_SINGLE_BATTLE_TEST("AI prioritizes Pursuit if it would KO opponent") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PURSUIT) == EFFECT_PURSUIT); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_ESPEON) { Level(5); } + PLAYER(SPECIES_TYRANITAR); + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_CRUNCH, MOVE_PURSUIT); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } + } +} From fe41f9eaf5cd97e704a5df701ac96578a79634ac Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 3 Feb 2025 13:03:29 -0300 Subject: [PATCH 059/125] Fixed non-regional forms breeding incorrectly (#4985) --- include/constants/regions.h | 21 +++++ include/daycare.h | 1 + include/pokemon.h | 3 + include/regions.h | 12 +++ src/daycare.c | 34 ++++++-- src/pokemon.c | 68 +++++++++++++++ test/daycare.c | 164 ++++++++++++++++++++++++++++++++++++ 7 files changed, 298 insertions(+), 5 deletions(-) create mode 100644 include/constants/regions.h create mode 100644 include/regions.h create mode 100644 test/daycare.c diff --git a/include/constants/regions.h b/include/constants/regions.h new file mode 100644 index 0000000000..3f7397ced6 --- /dev/null +++ b/include/constants/regions.h @@ -0,0 +1,21 @@ +#ifndef GUARD_CONSTANTS_REGIONS_H +#define GUARD_CONSTANTS_REGIONS_H + +// Core-series regions +enum Region +{ + REGION_NONE, + REGION_KANTO, + REGION_JOHTO, + REGION_HOENN, + REGION_SINNOH, + REGION_UNOVA, + REGION_KALOS, + REGION_ALOLA, + REGION_GALAR, + REGION_HISUI, + REGION_PALDEA, + REGIONS_COUNT, +}; + +#endif // GUARD_CONSTANTS_REGIONS_H diff --git a/include/daycare.h b/include/daycare.h index 4d5b470f8b..37a325d655 100644 --- a/include/daycare.h +++ b/include/daycare.h @@ -34,5 +34,6 @@ void ShowDaycareLevelMenu(void); void ChooseSendDaycareMon(void); u8 GetEggMovesBySpecies(u16 species, u16 *eggMoves); bool8 SpeciesCanLearnEggMove(u16 species, u16 move); +void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon); #endif // GUARD_DAYCARE_H diff --git a/include/pokemon.h b/include/pokemon.h index 706b0cbf65..ff3d06cdd1 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -3,6 +3,7 @@ #include "sprite.h" #include "constants/items.h" +#include "constants/regions.h" #include "constants/region_map_sections.h" #include "constants/map_groups.h" #include "contest_effect.h" @@ -912,5 +913,7 @@ void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier); +u32 GetRegionalFormByRegion(u32 species, u32 region); +bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); #endif // GUARD_POKEMON_H diff --git a/include/regions.h b/include/regions.h new file mode 100644 index 0000000000..2f44896ea2 --- /dev/null +++ b/include/regions.h @@ -0,0 +1,12 @@ +#ifndef GUARD_REGIONS_H +#define GUARD_REGIONS_H + +#include "constants/regions.h" + +static inline u32 GetCurrentRegion(void) +{ + // TODO: Since there's no current multi-region support, we have this constant for the purposes of regional form comparisons. + return REGION_HOENN; +} + +#endif // GUARD_REGIONS_H diff --git a/src/daycare.c b/src/daycare.c index 4997f4efe9..49fce40c0a 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -21,6 +21,7 @@ #include "list_menu.h" #include "overworld.h" #include "item.h" +#include "regions.h" #include "constants/form_change_types.h" #include "constants/items.h" #include "constants/hold_effects.h" @@ -244,7 +245,7 @@ static void TransferEggMoves(void) } } -static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon) +void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon) { if (MonHasMail(mon)) { @@ -979,9 +980,12 @@ STATIC_ASSERT(P_SCATTERBUG_LINE_FORM_BREED == SPECIES_SCATTERBUG_ICY_SNOW || (P_ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) { - u16 i; - u16 species[DAYCARE_MON_COUNT]; - u16 eggSpecies; + u32 i; + u32 species[DAYCARE_MON_COUNT]; + u32 eggSpecies, parentSpecies; + bool32 hasMotherEverstone, hasFatherEverstone, motherIsForeign, fatherIsForeign; + bool32 motherEggSpecies, fatherEggSpecies; + u32 currentRegion = GetCurrentRegion(); for (i = 0; i < DAYCARE_MON_COUNT; i++) { @@ -998,7 +1002,24 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent } } - eggSpecies = GetEggSpecies(species[parentSlots[0]]); + motherEggSpecies = GetEggSpecies(species[parentSlots[0]]); + fatherEggSpecies = GetEggSpecies(species[parentSlots[1]]); + hasMotherEverstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[parentSlots[0]].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; + hasFatherEverstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[parentSlots[1]].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; + motherIsForeign = IsSpeciesForeignRegionalForm(motherEggSpecies, currentRegion); + fatherIsForeign = IsSpeciesForeignRegionalForm(fatherEggSpecies, currentRegion); + + if (hasMotherEverstone) + parentSpecies = motherEggSpecies; + else if (fatherIsForeign && hasFatherEverstone) + parentSpecies = fatherEggSpecies; + else if (motherIsForeign) + parentSpecies = GetRegionalFormByRegion(motherEggSpecies, currentRegion); + else + parentSpecies = motherEggSpecies; + + eggSpecies = GetEggSpecies(parentSpecies); + if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE) eggSpecies = SPECIES_NIDORAN_M; else if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & EGG_GENDER_MALE) @@ -1043,6 +1064,9 @@ static void _GiveEggFromDaycare(struct DayCare *daycare) u8 parentSlots[DAYCARE_MON_COUNT] = {0}; bool8 isEgg; + if (GetDaycareCompatibilityScore(daycare) == PARENTS_INCOMPATIBLE) + return; + species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots); if (P_INCENSE_BREEDING < GEN_9) AlterEggSpeciesWithIncenseItem(&species, daycare); diff --git a/src/pokemon.c b/src/pokemon.c index 01a82d66e0..437ed55e4b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -56,6 +56,7 @@ #include "constants/items.h" #include "constants/layouts.h" #include "constants/moves.h" +#include "constants/regions.h" #include "constants/songs.h" #include "constants/trainers.h" #include "constants/union_room.h" @@ -6985,3 +6986,70 @@ uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier) return UQ_4_12(1.0/(1.5 + 0.05 * dynamaxLevel)); return UQ_4_12(1.5 + 0.05 * dynamaxLevel); } + +bool32 IsSpeciesRegionalForm(u32 species) +{ + return gSpeciesInfo[species].isAlolanForm + || gSpeciesInfo[species].isGalarianForm + || gSpeciesInfo[species].isHisuianForm + || gSpeciesInfo[species].isPaldeanForm; +} + +bool32 IsSpeciesRegionalFormFromRegion(u32 species, u32 region) +{ + switch (region) + { + case REGION_ALOLA: return gSpeciesInfo[species].isAlolanForm; + case REGION_GALAR: return gSpeciesInfo[species].isGalarianForm; + case REGION_HISUI: return gSpeciesInfo[species].isHisuianForm; + case REGION_PALDEA: return gSpeciesInfo[species].isPaldeanForm; + default: return FALSE; + } +} + +bool32 SpeciesHasRegionalForm(u32 species) +{ + u32 formId; + const u16 *formTable = GetSpeciesFormTable(species); + for (formId = 0; formTable != NULL && formTable[formId] != FORM_SPECIES_END; formId++) + { + if (IsSpeciesRegionalForm(formTable[formId])) + return TRUE; + } + return FALSE; +} + +u32 GetRegionalFormByRegion(u32 species, u32 region) +{ + u32 formId = 0; + u32 firstFoundSpecies = 0; + const u16 *formTable = GetSpeciesFormTable(species); + + if (formTable != NULL) + { + for (formId = 0; formTable[formId] != FORM_SPECIES_END; formId++) + { + if (firstFoundSpecies == 0) + firstFoundSpecies = formTable[formId]; + + if (IsSpeciesRegionalFormFromRegion(formTable[formId], region)) + return formTable[formId]; + } + if (firstFoundSpecies != 0) + return firstFoundSpecies; + } + return species; +} + +bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion) +{ + u32 i; + for (i = 0; i < REGIONS_COUNT; i++) + { + if (currentRegion != i && IsSpeciesRegionalFormFromRegion(species, i)) + return TRUE; + else if (currentRegion == i && SpeciesHasRegionalForm(species) && !IsSpeciesRegionalFormFromRegion(species, i)) + return TRUE; + } + return FALSE; +} diff --git a/test/daycare.c b/test/daycare.c new file mode 100644 index 0000000000..1f142f1154 --- /dev/null +++ b/test/daycare.c @@ -0,0 +1,164 @@ +#include "global.h" +#include "daycare.h" +#include "event_data.h" +#include "malloc.h" +#include "party_menu.h" +#include "regions.h" +#include "test/overworld_script.h" +#include "test/test.h" + +// We don't run the StoreSelectedPokemonInDaycare special because it relies on calling the +// party select screen and the GetCursorSelectionMonId function, so we store directly to the struct. +#define STORE_IN_DAYCARE_AND_GET_EGG() \ + StorePokemonInDaycare(&gPlayerParty[0], &gSaveBlock1Ptr->daycare.mons[0]); \ + StorePokemonInDaycare(&gPlayerParty[0], &gSaveBlock1Ptr->daycare.mons[1]); \ + RUN_OVERWORLD_SCRIPT( special GiveEggFromDaycare; ); + +TEST("(Daycare) Pokémon generate Eggs of the lowest member of the evolutionary family") +{ + ASSUME(P_FAMILY_PIKACHU == TRUE); + ASSUME(P_GEN_2_CROSS_EVOS == TRUE); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100, gender=MON_MALE; + givemon SPECIES_PIKACHU, 100, gender=MON_FEMALE; + ); + STORE_IN_DAYCARE_AND_GET_EGG(); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_PICHU); +} + +TEST("(Daycare) Pokémon offspring species is based off the mother's species") +{ + u32 offspring = 0; + ASSUME(P_FAMILY_PIKACHU == TRUE); + ASSUME(P_GEN_2_CROSS_EVOS == TRUE); + ASSUME(P_FAMILY_RIOLU == TRUE); + + ZeroPlayerPartyMons(); + PARAMETRIZE { offspring = SPECIES_RIOLU; RUN_OVERWORLD_SCRIPT(givemon SPECIES_PIKACHU, 100, gender=MON_MALE; givemon SPECIES_LUCARIO, 100, gender=MON_FEMALE, item=ITEM_NONE; ); } + PARAMETRIZE { offspring = SPECIES_PICHU; RUN_OVERWORLD_SCRIPT(givemon SPECIES_PIKACHU, 100, gender=MON_FEMALE; givemon SPECIES_LUCARIO, 100, gender=MON_MALE;); } + STORE_IN_DAYCARE_AND_GET_EGG(); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), offspring); +} + +TEST("(Daycare) Pokémon can breed with Ditto if they don't belong to the Ditto or No Eggs Discovered group") +{ + u32 j = 0; + u32 parentSpecies = 0; + + ZeroPlayerPartyMons(); + for (j = 1; j < NUM_SPECIES; j++) + PARAMETRIZE { parentSpecies = j; } + VarSet(VAR_TEMP_C, parentSpecies); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_DITTO, 100; givemon VAR_TEMP_C, 100; + ); + STORE_IN_DAYCARE_AND_GET_EGG(); + + if (gSpeciesInfo[parentSpecies].eggGroups[0] != EGG_GROUP_NO_EGGS_DISCOVERED + && gSpeciesInfo[parentSpecies].eggGroups[0] != EGG_GROUP_DITTO) + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_NONE); + else + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_NONE); +} + +TEST("(Daycare) Shellos' form is always based on the mother's form") +{ + u32 offspring = 0; + ASSUME(P_FAMILY_MEOWTH == TRUE); + ASSUME(P_ALOLAN_FORMS == TRUE); + ASSUME(P_GALARIAN_FORMS == TRUE); + + ZeroPlayerPartyMons(); + PARAMETRIZE { offspring = SPECIES_SHELLOS_WEST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_EAST, 1, gender=MON_MALE; givemon SPECIES_SHELLOS_WEST, 1, gender=MON_FEMALE, item=ITEM_NONE; ); } + PARAMETRIZE { offspring = SPECIES_SHELLOS_WEST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_EAST, 1, gender=MON_MALE, item=ITEM_EVERSTONE; givemon SPECIES_SHELLOS_WEST, 1, gender=MON_FEMALE, item=ITEM_NONE; ); } + PARAMETRIZE { offspring = SPECIES_SHELLOS_WEST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_EAST, 1, gender=MON_MALE; givemon SPECIES_SHELLOS_WEST, 1, gender=MON_FEMALE, item=ITEM_EVERSTONE;); } + PARAMETRIZE { offspring = SPECIES_SHELLOS_EAST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_WEST, 1, gender=MON_MALE; givemon SPECIES_SHELLOS_EAST, 1, gender=MON_FEMALE, item=ITEM_NONE; ); } + PARAMETRIZE { offspring = SPECIES_SHELLOS_EAST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_WEST, 1, gender=MON_MALE, item=ITEM_EVERSTONE; givemon SPECIES_SHELLOS_EAST, 1, gender=MON_FEMALE, item=ITEM_NONE; ); } + PARAMETRIZE { offspring = SPECIES_SHELLOS_EAST; RUN_OVERWORLD_SCRIPT(givemon SPECIES_SHELLOS_WEST, 1, gender=MON_MALE; givemon SPECIES_SHELLOS_EAST, 1, gender=MON_FEMALE, item=ITEM_EVERSTONE;); } + STORE_IN_DAYCARE_AND_GET_EGG(); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), offspring); +} + +TEST("(Daycare) Pokémon with regional forms give the correct offspring") +{ + u32 region = 0, offspring = 0, species1 = 0, item1 = 0, species2 = 0, item2 = 0; + + ZeroPlayerPartyMons(); + + region = GetCurrentRegion(); + if (region == REGION_ALOLA) { + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERSIAN_ALOLA; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_EVERSTONE; } + } else if (region == REGION_GALAR) { + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERSIAN_ALOLA; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN; item2=ITEM_EVERSTONE; } + } else { + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_ALOLA; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_ALOLA, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_MEOWTH; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_DIGLETT; item1=ITEM_NONE; species2=SPECIES_MEOWTH_GALAR, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH_GALAR; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERRSERKER; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_MEOWTH; species1=SPECIES_PERSIAN_ALOLA; item1=ITEM_EVERSTONE; species2=SPECIES_PERSIAN, item2=ITEM_EVERSTONE; } + } + + if (region == REGION_HISUI) { + PARAMETRIZE { offspring=SPECIES_SNEASEL_HISUI; species1=SPECIES_SNEASEL; item1=ITEM_NONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL; species1=SPECIES_SNEASEL; item1=ITEM_EVERSTONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL_HISUI; species1=SPECIES_SNEASEL; item1=ITEM_NONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL; species1=SPECIES_SNEASLER; item1=ITEM_EVERSTONE; species2=SPECIES_WEAVILE, item2=ITEM_EVERSTONE; } + } else { + PARAMETRIZE { offspring=SPECIES_SNEASEL; species1=SPECIES_SNEASEL; item1=ITEM_NONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL; species1=SPECIES_SNEASEL; item1=ITEM_EVERSTONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL_HISUI; species1=SPECIES_SNEASEL; item1=ITEM_NONE; species2=SPECIES_SNEASEL_HISUI, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_SNEASEL; species1=SPECIES_SNEASLER; item1=ITEM_EVERSTONE; species2=SPECIES_WEAVILE, item2=ITEM_EVERSTONE; } + } + + if (region == REGION_PALDEA) { + PARAMETRIZE { offspring=SPECIES_WOOPER_PALDEA; species1=SPECIES_WOOPER; item1=ITEM_NONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER; species1=SPECIES_WOOPER; item1=ITEM_EVERSTONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER_PALDEA; species1=SPECIES_WOOPER; item1=ITEM_NONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER; species1=SPECIES_CLODSIRE; item1=ITEM_EVERSTONE; species2=SPECIES_QUAGSIRE, item2=ITEM_EVERSTONE; } + } else { + PARAMETRIZE { offspring=SPECIES_WOOPER; species1=SPECIES_WOOPER; item1=ITEM_NONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER; species1=SPECIES_WOOPER; item1=ITEM_EVERSTONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_NONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER_PALDEA; species1=SPECIES_WOOPER; item1=ITEM_NONE; species2=SPECIES_WOOPER_PALDEA, item2=ITEM_EVERSTONE; } + PARAMETRIZE { offspring=SPECIES_WOOPER; species1=SPECIES_CLODSIRE; item1=ITEM_EVERSTONE; species2=SPECIES_QUAGSIRE, item2=ITEM_EVERSTONE; } + } + ASSUME(IsSpeciesEnabled(species1) == TRUE); + ASSUME(IsSpeciesEnabled(species2) == TRUE); + ASSUME(IsSpeciesEnabled(offspring) == TRUE); + + VarSet(VAR_0x8000, species1); + VarSet(VAR_0x8001, item1); + VarSet(VAR_0x8002, species2); + VarSet(VAR_0x8003, item2); + + RUN_OVERWORLD_SCRIPT(givemon VAR_0x8000, 1, gender=MON_MALE, item=VAR_0x8001;); + RUN_OVERWORLD_SCRIPT(givemon VAR_0x8002, 1, gender=MON_FEMALE, item=VAR_0x8003;); + + STORE_IN_DAYCARE_AND_GET_EGG(); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), offspring); +} From 5238665a7a754bd00f819e55b57ab47ac6b5f7f9 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Mon, 3 Feb 2025 17:31:14 +0000 Subject: [PATCH 060/125] Fixes Suction Cups ability popup and Red Card + Guard Dog interaction (#6171) --- data/battle_scripts_1.s | 7 ++-- src/battle_script_commands.c | 6 ++-- test/battle/hold_effect/red_card.c | 38 ++++++++++++++++++--- test/battle/move_effect/hit_switch_target.c | 5 +-- test/battle/move_effect/roar.c | 35 +++++++++++++++++++ 5 files changed, 77 insertions(+), 14 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 88cd06d596..fff1961a9c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8253,15 +8253,12 @@ BattleScript_FlashFireBoost:: goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOut:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PKMNANCHORSITSELFWITH - waitmessage B_WAIT_TIME_LONG + call BattleScript_AbilityPreventsPhasingOutRet goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOutRet:: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpTarget printstring STRINGID_PKMNANCHORSITSELFWITH waitmessage B_WAIT_TIME_LONG return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4449040a73..a07ac4579f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6566,8 +6566,7 @@ static void Cmd_moveend(void) if (redCardBattlers && (gMovesInfo[gCurrentMove].effect != EFFECT_HIT_SWITCH_TARGET || gBattleStruct->hitSwitchTargetFailed) && IsBattlerAlive(gBattlerAttacker) - && !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_GUARD_DOG) + && !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) { // Since we check if battler was damaged, we don't need to check move result. // In fact, doing so actually prevents multi-target moves from activating red card properly @@ -6592,7 +6591,8 @@ static void Cmd_moveend(void) if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_ESCAPE) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection BattleScriptPushCursor(); - if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE) + if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE + || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG) { gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; } diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index aa312797b2..6bf34b8f75 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -273,12 +273,13 @@ DOUBLE_BATTLE_TEST("Red Card activates but fails if the attacker is rooted") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); MESSAGE("Wobbuffet held up its Red Card against the opposing Wobbuffet!"); MESSAGE("The opposing Wobbuffet anchored itself with its roots!"); + NOT MESSAGE("The opposing Unown was dragged out!"); // Red Card already consumed so cannot activate. ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); - MESSAGE("Wynaut held up its Red Card against the opposing Wynaut!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("Wobbuffet held up its Red Card against the opposing Wynaut!"); } } } @@ -301,12 +302,41 @@ DOUBLE_BATTLE_TEST("Red Card activates but fails if the attacker has Suction Cup ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); MESSAGE("Wobbuffet held up its Red Card against the opposing Octillery!"); MESSAGE("The opposing Octillery anchors itself with Suction Cups!"); + NOT MESSAGE("The opposing Unown was dragged out!"); // Red Card already consumed so cannot activate. ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); - MESSAGE("Wynaut held up its Red Card against the opposing Wynaut!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("Wobbuffet held up its Red Card against the opposing Wynaut!"); + } + } +} + +DOUBLE_BATTLE_TEST("Red Card activates but fails if the attacker has Guard Dog") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_OKIDOGI) { Ability(ABILITY_GUARD_DOG); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_UNOWN); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); + MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("Wobbuffet held up its Red Card against the opposing Okidogi!"); + NOT MESSAGE("The opposing Unown was dragged out!"); + + // Red Card already consumed so cannot activate. + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("Wobbuffet held up its Red Card against the opposing Wynaut!"); } } } diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index bc026110ee..8760dd597c 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -90,7 +90,7 @@ SINGLE_BATTLE_TEST("Dragon Tail switches the target after Rocky Helmet and Iron } } -SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Guard Dog ability") +SINGLE_BATTLE_TEST("Dragon Tail effect fails against target with Guard Dog") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Guard Dog ability") } } -SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Suction Cups ability") +SINGLE_BATTLE_TEST("Dragon Tail effect fails against target with Suction Cups") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -114,6 +114,7 @@ SINGLE_BATTLE_TEST("Dragon Tail effect will fails against Suction Cups ability") TURN { MOVE(player, MOVE_DRAGON_TAIL); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); + ABILITY_POPUP(opponent, ABILITY_SUCTION_CUPS); MESSAGE("The opposing Octillery anchors itself with Suction Cups!"); NOT MESSAGE("The opposing Charmander was dragged out!"); } diff --git a/test/battle/move_effect/roar.c b/test/battle/move_effect/roar.c index f67a24bba1..3819fc2043 100644 --- a/test/battle/move_effect/roar.c +++ b/test/battle/move_effect/roar.c @@ -68,3 +68,38 @@ SINGLE_BATTLE_TEST("Roar fails if replacements fainted") MESSAGE("But it failed!"); } } + +SINGLE_BATTLE_TEST("Roar fails against target with Guard Dog") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_OKIDOGI) { Ability(ABILITY_GUARD_DOG); } + OPPONENT(SPECIES_CHARMANDER); + } WHEN { + TURN { MOVE(player, MOVE_ROAR); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, player); + MESSAGE("The opposing Charmander was dragged out!"); + } + MESSAGE("Wobbuffet used Roar!"); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Roar fails to switch out target with Suction Cups") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_OCTILLERY) { Ability(ABILITY_SUCTION_CUPS); } + OPPONENT(SPECIES_CHARMANDER); + } WHEN { + TURN { MOVE(player, MOVE_ROAR); } + } SCENE { + MESSAGE("Wobbuffet used Roar!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, player); + ABILITY_POPUP(opponent, ABILITY_SUCTION_CUPS); + MESSAGE("The opposing Octillery anchors itself with Suction Cups!"); + NOT MESSAGE("The opposing Charmander was dragged out!"); + } +} From 14178edfe34f3a6d0d0d150ae5a5ef59df0e4930 Mon Sep 17 00:00:00 2001 From: tertu Date: Mon, 3 Feb 2025 13:03:13 -0600 Subject: [PATCH 061/125] Don't use SeedRng some places where it isn't necessary (#6156) --- include/random.h | 9 +++++++-- src/battle_pyramid.c | 18 ++++++++++++------ src/contest_painting.c | 2 -- src/daycare.c | 8 ++++---- src/record_mixing.c | 7 ++----- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/include/random.h b/include/random.h index 1a735097d3..80e4ea8a24 100644 --- a/include/random.h +++ b/include/random.h @@ -30,7 +30,7 @@ struct Sfc32State { typedef struct Sfc32State rng_value_t; -#define RNG_VALUE_EMPTY {} +#define RNG_VALUE_EMPTY {0} // Calling this function directly is discouraged. // Use LocalRandom() instead. @@ -43,9 +43,14 @@ static inline u32 _SFC32_Next(struct Sfc32State *state) return result; } +static inline u32 LocalRandom32(rng_value_t *val) +{ + return _SFC32_Next(val); +} + static inline u16 LocalRandom(rng_value_t *val) { - return _SFC32_Next(val) >> 16; + return LocalRandom32(val) >> 16; } u32 Random32(void); diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index c881dab38f..33f2717597 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -983,8 +983,10 @@ static void SetPickupItem(void) { int i; int itemIndex; - int rand; + int randVal; + u32 randSeedIndex, randSeed; u8 id; + rng_value_t rand; u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u32 floor = gSaveBlock2Ptr->frontier.curChallengeBattleNum; u32 round = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / FRONTIER_STAGES_PER_CHALLENGE) % TOTAL_PYRAMID_ROUNDS; @@ -994,15 +996,19 @@ static void SetPickupItem(void) id = GetPyramidFloorTemplateId(); itemIndex = (gSpecialVar_LastTalked - sPyramidFloorTemplates[id].numTrainers) - 1; - rand = gSaveBlock2Ptr->frontier.pyramidRandoms[itemIndex / 2]; - SeedRng2(rand); + randSeedIndex = (itemIndex & 1) * 2; + randSeed = (u32)gSaveBlock2Ptr->frontier.pyramidRandoms[randSeedIndex + 1] << 16; + randSeed |= gSaveBlock2Ptr->frontier.pyramidRandoms[randSeedIndex]; + rand = LocalRandomSeed(randSeed); - for (i = 0; i < itemIndex + 1; i++) - rand = Random2() % 100; + for (i = 0; i < itemIndex / 2; i++) + LocalRandom(&rand); + + randVal = LocalRandom(&rand) % 100; for (i = sPickupItemOffsets[floor]; i < ARRAY_COUNT(sPickupItemSlots); i++) { - if (rand < sPickupItemSlots[i][0]) + if (randVal < sPickupItemSlots[i][0]) break; } diff --git a/src/contest_painting.c b/src/contest_painting.c index 8b647be12f..1911e70689 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -212,7 +212,6 @@ static void ShowContestPainting(void) gMain.state++; break; case 2: - SeedRng(gMain.vblankCounter1); InitKeys(); InitContestPaintingWindow(); gMain.state++; @@ -595,4 +594,3 @@ static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist) InitPaintingMonOamData(contestWinnerId); LoadContestPaintingFrame(contestWinnerId, isForArtist); } - diff --git a/src/daycare.c b/src/daycare.c index 6b6b84ac58..4e69dd9012 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -549,14 +549,15 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare) { s32 parent; s32 natureTries = 0; + rng_value_t personalityRand; - SeedRng2(gMain.vblankCounter2); + personalityRand = LocalRandomSeed(gMain.vblankCounter2); parent = GetParentToInheritNature(daycare); // don't inherit nature if (parent < 0) { - daycare->offspringPersonality = (Random2() << 16) | ((Random() % 0xfffe) + 1); + daycare->offspringPersonality = (LocalRandom(&personalityRand) << 16) | ((Random() % 0xfffe) + 1); } // inherit nature else @@ -566,7 +567,7 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare) do { - personality = (Random2() << 16) | (Random()); + personality = (LocalRandom(&personalityRand) << 16) | (Random()); if (wantedNature == GetNatureFromPersonality(personality) && personality != 0) break; // found a personality with the same nature @@ -1566,4 +1567,3 @@ static u8 ModifyBreedingScoreForOvalCharm(u8 score) return score; } - diff --git a/src/record_mixing.c b/src/record_mixing.c index 7d78119f86..1ff36d1fe8 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -770,14 +770,12 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size bool8 canHoldItem[MAX_LINK_PLAYERS][DAYCARE_MON_COUNT]; u8 idxs[MAX_LINK_PLAYERS][2]; u8 numDaycareCanHold; - u16 oldSeed; bool32 anyRS; + rng_value_t localRngState = LocalRandomSeed(gLinkPlayers[0].trainerId); // Seed RNG to the first player's trainer id so that // every player has the same random swap occur // (see the other use of Random2 in this function) - oldSeed = Random2(); - SeedRng2(gLinkPlayers[0].trainerId); linkPlayerCount = GetLinkPlayerCount(); for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -907,7 +905,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size itemId2 = GetDaycareMailItemId(&mixMail->mail[1]); if ((!itemId1 && !itemId2) || (itemId1 && itemId2)) - idxs[j][DAYCARE_SLOT] = Random2() % 2; + idxs[j][DAYCARE_SLOT] = LocalRandom32(&localRngState) % 2; else if (itemId1 && !itemId2) idxs[j][DAYCARE_SLOT] = 0; else if (!itemId1 && itemId2) @@ -958,7 +956,6 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size mixMail = (void *)records + multiplayerId * recordSize; memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &mixMail->mail[0], sizeof(struct DaycareMail)); memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &mixMail->mail[1], sizeof(struct DaycareMail)); - SeedRng(oldSeed); } From e9c14e35ca7b37bbda16f06a03d0242d279cf85f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 3 Feb 2025 16:34:15 -0300 Subject: [PATCH 062/125] Cleaned up party data access GetPartyBattlerData (#6172) --- src/battle_ai_util.c | 12 +---- src/battle_anim.c | 7 +-- src/battle_anim_dark.c | 9 +--- src/battle_anim_effects_3.c | 67 +++++++------------------ src/battle_anim_mons.c | 89 +++++++++------------------------ src/battle_anim_throw.c | 5 +- src/battle_anim_utility_funcs.c | 27 ++-------- src/battle_anim_water.c | 22 ++------ src/battle_dynamax.c | 5 +- src/battle_script_commands.c | 9 +--- src/pokeball.c | 7 +-- 11 files changed, 56 insertions(+), 203 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ad5943cc0e..caa27f653b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2699,19 +2699,9 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) return FALSE; } -struct Pokemon *GetPartyBattlerPartyData(u32 battlerId, u32 switchBattler) -{ - struct Pokemon *mon; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - mon = &gPlayerParty[switchBattler]; - else - mon = &gEnemyParty[switchBattler]; - return mon; -} - static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { - struct Pokemon *mon = GetPartyBattlerPartyData(currBattler, switchBattler); + struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; u32 ability = GetMonAbility(mon); // we know our own party data u32 holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); diff --git a/src/battle_anim.c b/src/battle_anim.c index c12a88bec7..38648310a7 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -370,12 +370,7 @@ void LaunchBattleAnimation(u32 animType, u32 animId) InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(0, sAnimHideHpBoxes); for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerSide(i) != B_SIDE_PLAYER) - gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - } + gAnimBattlerSpecies[i] = GetMonData(GetPartyBattlerData(i), MON_DATA_SPECIES); } else { diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index fd9ffdf923..1cada8f825 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -932,16 +932,9 @@ void AnimTask_MetallicShine(u8 taskId) } if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 1530fa37a5..6f34f479b9 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -3417,51 +3417,24 @@ void AnimTask_RolePlaySilhouette(u8 taskId) isShiny = gContestResources->moveAnim->targetIsShiny; species = gContestResources->moveAnim->targetSpecies; xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } else { + struct Pokemon *mon = GetPartyBattlerData(gBattleAnimTarget); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { isBackPic = FALSE; - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - } - - xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } else - { isBackPic = TRUE; - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - } + personality = GetMonData(mon, MON_DATA_PERSONALITY); + isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - xOffset = -20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } + xOffset = -20; } + priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); @@ -5331,28 +5304,22 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) } else { + struct Pokemon *mon = GetPartyBattlerData(gBattleAnimAttacker); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; isBackPic = FALSE; x = DISPLAY_WIDTH + 32; } else { - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; isBackPic = TRUE; x = -32; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 2df2b23089..f5517366ac 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -143,28 +143,16 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) u8 ret; species = SanitizeSpeciesId(species); - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + if (IsContest()) { if (species == SPECIES_UNOWN) { - if (IsContest()) - { - if (gContestResources->moveAnim->hasTargetAnim) - personality = gContestResources->moveAnim->targetPersonality; - else - personality = gContestResources->moveAnim->personality; - } + if (gContestResources->moveAnim->hasTargetAnim) + personality = gContestResources->moveAnim->targetPersonality; else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); - else - personality = gTransformedPersonalities[battlerId]; - } + personality = gContestResources->moveAnim->personality; species = GetUnownSpeciesId(personality); } - ret = gSpeciesInfo[species].backPicYOffset; } else { @@ -172,14 +160,17 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + personality = GetMonData(GetPartyBattlerData(battlerId), MON_DATA_PERSONALITY); else personality = gTransformedPersonalities[battlerId]; - species = GetUnownSpeciesId(personality); } - ret = gSpeciesInfo[species].frontPicYOffset; } + + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + ret = gSpeciesInfo[species].backPicYOffset; + else + ret = gSpeciesInfo[species].frontPicYOffset; return ret; } @@ -279,22 +270,13 @@ u8 GetBattlerYCoordWithElevation(u8 battlerId) y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y); if (!IsContest()) { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + spriteInfo = gBattleSpritesDataPtr->battlerData; + + if (!spriteInfo[battlerId].transformSpecies) + species = GetMonData(GetPartyBattlerData(battlerId), MON_DATA_SPECIES); else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + species = spriteInfo[battlerId].transformSpecies; + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) y -= GetBattlerElevation(battlerId, species); } @@ -845,19 +827,8 @@ bool8 IsBattlerSpritePresent(u8 battlerId) if (GetBattlerPosition(battlerId) == 0xff) return FALSE; - if (!gBattleStruct->spriteIgnore0Hp) - { - if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) - { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) - return FALSE; - } - else - { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) - return FALSE; - } - } + if (!gBattleStruct->spriteIgnore0Hp && GetMonData(GetPartyBattlerData(battlerId), MON_DATA_HP) == 0) + return FALSE; return TRUE; } } @@ -1874,26 +1845,16 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) } else { - if (GetBattlerSide(i) == B_SIDE_PLAYER) - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - - return gSpeciesInfo[species].backPicYOffset; - } + spriteInfo = gBattleSpritesDataPtr->battlerData; + if (!spriteInfo[battlerId].transformSpecies) + species = GetMonData(GetPartyBattlerData(i), MON_DATA_SPECIES); else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battlerId].transformSpecies; + if (GetBattlerSide(i) == B_SIDE_PLAYER) + return gSpeciesInfo[species].backPicYOffset; + else return gSpeciesInfo[species].frontPicYOffset; - } } } } diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index a8c6e4077e..0ede51954a 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -908,10 +908,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId) u32 selectedPalettes; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - ballId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); - else - ballId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); + ballId = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_POKEBALL); switch (gTasks[taskId].data[0]) { diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index a8de8eddd9..47850bc56a 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -316,16 +316,9 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) } if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); @@ -458,16 +451,9 @@ static void StatsChangeAnimation_Step1(u8 taskId) } if (IsContest()) - { sAnimStatsChangeData->species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER) - sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); - else - sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); - } + sAnimStatsChangeData->species = GetMonData(GetPartyBattlerData(sAnimStatsChangeData->battler1), MON_DATA_SPECIES); gTasks[taskId].func = StatsChangeAnimation_Step2; } @@ -840,16 +826,9 @@ void StartMonScrollingBgMask(u8 taskId, int UNUSED unused, u16 scrollSpeed, u8 b SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(battler) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(battler), MON_DATA_SPECIES); spriteId = CreateInvisibleSpriteCopy(battler, gBattlerSpriteIds[battler], species); if (includePartner) diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 65f8178d13..4265e8d03c 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -1349,25 +1349,11 @@ static u8 GetWaterSpoutPowerForAnim(void) u8 i; u16 hp; u16 maxhp; - u16 partyIndex; - struct Pokemon *slot; + struct Pokemon *slot = GetPartyBattlerData(gBattleAnimAttacker); - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; - slot = &gPlayerParty[partyIndex]; - maxhp = GetMonData(slot, MON_DATA_MAX_HP); - hp = GetMonData(slot, MON_DATA_HP); - maxhp /= 4; - } - else - { - partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; - slot = &gEnemyParty[partyIndex]; - maxhp = GetMonData(slot, MON_DATA_MAX_HP); - hp = GetMonData(slot, MON_DATA_HP); - maxhp /= 4; - } + maxhp = GetMonData(slot, MON_DATA_MAX_HP); + hp = GetMonData(slot, MON_DATA_HP); + maxhp /= 4; for (i = 0; i < 3; i++) { if (hp < maxhp * (i + 1)) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index cae562bf4e..3a931af470 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -197,13 +197,10 @@ void ActivateDynamax(u32 battler) // Unsets the flags used for Dynamaxing and reverts max HP if needed. void UndoDynamax(u32 battler) { - u8 side = GetBattlerSide(battler); - u8 monId = gBattlerPartyIndexes[battler]; - // Revert HP if battler is still Dynamaxed. if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - struct Pokemon *mon = (side == B_SIDE_PLAYER) ? &gPlayerParty[monId] : &gEnemyParty[monId]; + struct Pokemon *mon = GetPartyBattlerData(battler); uq4_12_t mult = GetDynamaxLevelHPMultiplier(GetMonData(mon, MON_DATA_DYNAMAX_LEVEL), TRUE); gBattleMons[battler].hp = UQ_4_12_TO_INT((GetMonData(mon, MON_DATA_HP) * mult + 1) + UQ_4_12_ROUND); // round up SetMonData(mon, MON_DATA_HP, &gBattleMons[battler].hp); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8bf9c8731c..33c05ee7c0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14755,16 +14755,9 @@ static void Cmd_trywish(void) case 1: // heal effect PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishPartyId[gBattlerTarget]) if (B_WISH_HP_SOURCE >= GEN_5) - { - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - else - gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - } + gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&GetBattlerParty(gBattlerTarget)[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); else - { gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); - } gBattleStruct->moveDamage[gBattlerTarget] *= -1; if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) diff --git a/src/pokeball.c b/src/pokeball.c index 2b168cd7e3..6db184b496 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -993,16 +993,11 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) u16 wantedCryCase; u8 taskId; + mon = GetPartyBattlerData(battlerId); if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - { - mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; pan = 25; - } else - { - mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; pan = -25; - } if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive) From a642759798b672e23fc7eecd0fbe233116f1ae14 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 3 Feb 2025 23:32:29 +0100 Subject: [PATCH 063/125] Changed two LocalRandom calls to new LocalRandom32 (#6173) Co-authored-by: Hedara --- src/trainer_pools.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/trainer_pools.c b/src/trainer_pools.c index a3ea1de22b..a2db4d81f5 100644 --- a/src/trainer_pools.c +++ b/src/trainer_pools.c @@ -257,7 +257,7 @@ static void RandomizePoolIndices(const struct Trainer *trainer, u8 *poolIndexArr u32 seed = GetPoolSeed(trainer); localRngState = LocalRandomSeed(seed); // Replace the LocalRandom with LocalRandom32 when implemented - rnd = LocalRandom(&localRngState) + (LocalRandom(&localRngState) << 16); + rnd = LocalRandom32(&localRngState); } else { @@ -284,7 +284,7 @@ static void RandomizePoolIndices(const struct Trainer *trainer, u8 *poolIndexArr if (usedBits + numBits > 32) { if (B_POOL_SETTING_CONSISTENT_RNG) - rnd = LocalRandom(&localRngState) + (LocalRandom(&localRngState) << 16); + rnd = LocalRandom32(&localRngState); else rnd = Random32(); usedBits = 0; From b4fc611d5fb98901b333727fd1d98c0127c7ddd1 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 4 Feb 2025 12:08:32 -0500 Subject: [PATCH 064/125] Cleanup some global battler ID usage (#6181) Co-authored-by: ghoulslash --- src/battle_util.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a2d6c0fe10..855851586b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1218,7 +1218,7 @@ bool32 IsBelchPreventingMove(u32 battler, u32 move) } // Dynamax bypasses all selection prevention except Taunt and Assault Vest. -#define DYNAMAX_BYPASS_CHECK (!IsGimmickSelected(gBattlerAttacker, GIMMICK_DYNAMAX) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX) +#define DYNAMAX_BYPASS_CHECK (!IsGimmickSelected(battler, GIMMICK_DYNAMAX) && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) u32 TrySetCantSelectMoveBattleScript(u32 battler) { @@ -1228,7 +1228,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = battler; gCurrentMove = move; @@ -1244,7 +1244,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) { CancelMultiTurnMoves(battler); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1259,9 +1259,9 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[battler].tauntTimer != 0 && IS_MOVE_STATUS(move)) + if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].tauntTimer != 0 && IS_MOVE_STATUS(move)) { - if ((GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)) + if ((GetActiveGimmick(battler) == GIMMICK_DYNAMAX)) gCurrentMove = MOVE_MAX_GUARD; else gCurrentMove = move; @@ -1277,7 +1277,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer != 0 && gMovesInfo[move].soundMove) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer != 0 && gMovesInfo[move].soundMove) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1292,7 +1292,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(battler, move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1307,7 +1307,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && IsGravityPreventingMove(move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && IsGravityPreventingMove(move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1322,7 +1322,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && IsHealBlockPreventingMove(battler, move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && IsHealBlockPreventingMove(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1337,7 +1337,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && IsBelchPreventingMove(battler, move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && IsBelchPreventingMove(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1401,7 +1401,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_ME_FIRST) { - if ((GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)) + if ((GetActiveGimmick(battler) == GIMMICK_DYNAMAX)) gCurrentMove = MOVE_MAX_GUARD; else gCurrentMove = move; @@ -8685,8 +8685,8 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) return TRUE; if (!gProtectStructs[battlerDef].maxGuarded // Max Guard cannot be bypassed by Unseen Fist - && IsMoveMakingContact(move, gBattlerAttacker) - && GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST) + && IsMoveMakingContact(move, battlerAtk) + && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) return FALSE; else if ((gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD) && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_COACHING) @@ -8696,7 +8696,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) else if (gProtectStructs[battlerDef].protected) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_WIDE_GUARD - && GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + && GetBattlerMoveTargetType(battlerAtk, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) return TRUE; else if (gProtectStructs[battlerDef].banefulBunkered) return TRUE; @@ -8711,7 +8711,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) else if (gProtectStructs[battlerDef].maxGuarded) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_QUICK_GUARD - && GetChosenMovePriority(gBattlerAttacker) > 0) + && GetChosenMovePriority(battlerAtk) > 0) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MAT_BLOCK && !IS_MOVE_STATUS(move)) @@ -10458,7 +10458,7 @@ static inline bool32 IsFutureSightAttackerInParty(struct DamageCalculationData * if (gMovesInfo[damageCalcData->move].effect != EFFECT_FUTURE_SIGHT) return FALSE; - struct Pokemon *party = GetSideParty(GetBattlerSide(gBattlerAttacker)); + struct Pokemon *party = GetSideParty(GetBattlerSide(damageCalcData->battlerAtk)); return &party[gWishFutureKnock.futureSightPartyIndex[damageCalcData->battlerDef]] != &party[gBattlerPartyIndexes[damageCalcData->battlerAtk]]; } @@ -11157,7 +11157,7 @@ bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) else if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) return FALSE; else if (holdEffect == HOLD_EFFECT_BOOSTER_ENERGY - && (gSpeciesInfo[gBattleMons[gBattlerAttacker].species].isParadox || gSpeciesInfo[gBattleMons[gBattlerTarget].species].isParadox)) + && (gSpeciesInfo[gBattleMons[battler].species].isParadox || gSpeciesInfo[gBattleMons[gBattlerTarget].species].isParadox)) return FALSE; else return TRUE; From ea3b81218b76e23661fc37d04f6542f8de4be155 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 4 Feb 2025 18:37:42 +0100 Subject: [PATCH 065/125] Wrote tests for Electrify (#6179) Co-authored-by: Hedara --- test/battle/move_effect/electrify.c | 73 ++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index 71373cdd58..e60bbdaf22 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -1,5 +1,74 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn"); -TO_DO_BATTLE_TEST("Electrify can change status moves to Electric-type"); // Test type immunity +SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (single move)") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SANDSLASH); + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + } +} + +DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (double move)") +{ + KNOWN_FAILING; + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_SANDSLASH); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); MOVE(opponentRight, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponentLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") +{ + KNOWN_FAILING; + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(gMovesInfo[MOVE_LEER].category == DAMAGE_CATEGORY_STATUS); + ASSUME(gMovesInfo[MOVE_LEER].type != TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SANDSLASH); + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_LEER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_LEER, player); + } +} + +SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves") +{ + KNOWN_FAILING; + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].type != TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SANDSLASH); + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_FUTURE_SIGHT); } + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); + NOT HP_BAR(opponent); + } +} From b90b1e2546b8c9985b536e5cbd518926c262d89f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:04:05 +0100 Subject: [PATCH 066/125] Clean up - Add ability args instead of calcing the ability again (#6186) --- include/battle_script_commands.h | 6 +++--- src/battle_ai_main.c | 2 +- src/battle_ai_switch_items.c | 6 +++--- src/battle_ai_util.c | 2 +- src/battle_script_commands.c | 20 ++++++++++---------- src/battle_util.c | 14 +++++++------- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 7326647d41..8f6bd8dd95 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -42,9 +42,9 @@ bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler); -bool32 IsShieldsDownProtected(u32 battler); -u32 IsAbilityStatusProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler, u32 ability); +bool32 IsShieldsDownProtected(u32 battler, u32 ability); +u32 IsAbilityStatusProtected(u32 battler, u32 ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); u32 GetNaturePowerMove(u32 battler); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 24f60ecfde..740328dab9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -983,7 +983,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_SHIELDS_DOWN: - if (IsShieldsDownProtected(battlerAtk) && IsNonVolatileStatusMoveEffect(moveEffect)) + if (IsShieldsDownProtected(battlerAtk, aiData->abilities[battlerAtk]) && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; case ABILITY_LEAF_GUARD: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c341fb5175..c2f742d273 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1312,9 +1312,9 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 && !(hazardFlags & SIDE_STATUS_SAFEGUARD) - && !(IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL)) - && !(IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) - && !(IsAbilityStatusProtected(battler)) + && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) + && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index caa27f653b..9135884942 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3031,7 +3031,7 @@ bool32 AI_CanGetFrostbite(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 33c05ee7c0..f5af50f450 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9320,25 +9320,25 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler) +u32 IsLeafGuardProtected(u32 battler, u32 ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) - return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + return ability == ABILITY_LEAF_GUARD; else return 0; } -bool32 IsShieldsDownProtected(u32 battler) +bool32 IsShieldsDownProtected(u32 battler, u32 ability) { - return (GetBattlerAbility(battler) == ABILITY_SHIELDS_DOWN + return (ability == ABILITY_SHIELDS_DOWN && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form } -u32 IsAbilityStatusProtected(u32 battler) +u32 IsAbilityStatusProtected(u32 battler, u32 ability) { - return IsFlowerVeilProtected(battler) - || IsLeafGuardProtected(battler) - || IsShieldsDownProtected(battler); + return IsLeafGuardProtected(battler, ability) + || IsShieldsDownProtected(battler, ability) + || IsFlowerVeilProtected(battler); } u32 GetHighestStatId(u32 battler) @@ -9612,7 +9612,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsShieldsDownProtected(battler)) + if (IsShieldsDownProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -11169,7 +11169,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler)) + if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 42cfffc677..7fed3d243a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2687,7 +2687,7 @@ u8 DoBattlerEndTurnEffects(void) if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) && battlerAbility != ABILITY_VITAL_SPIRIT && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) - && !IsLeafGuardProtected(battler)) + && !IsLeafGuardProtected(battler, battlerAbility)) { CancelMultiTurnMoves(battler); gEffectBattler = gBattlerTarget = battler; @@ -6810,7 +6810,7 @@ bool32 CanBeSlept(u32 battler, u32 ability, enum SleepClauseBlock isBlockedBySle || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD || gBattleMons[battler].status1 & STATUS1_ANY || IsAbilityOnSide(battler, ABILITY_SWEET_VEIL) - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6825,7 +6825,7 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility) || defAbility == ABILITY_COMATOSE || defAbility == ABILITY_PURIFYING_SALT || IsAbilityOnSide(battlerDef, ABILITY_PASTEL_VEIL) - || IsAbilityStatusProtected(battlerDef) + || IsAbilityStatusProtected(battlerDef, defAbility) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6841,7 +6841,7 @@ bool32 CanBeBurned(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_THERMAL_EXCHANGE || ability == ABILITY_PURIFYING_SALT - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6855,7 +6855,7 @@ bool32 CanBeParalyzed(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6871,7 +6871,7 @@ bool32 CanBeFrozen(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6886,7 +6886,7 @@ bool32 CanGetFrostbite(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; From cad1a3756602f75aa6db32790538cac5ef3b5824 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 5 Feb 2025 15:27:21 +0100 Subject: [PATCH 067/125] Tachyon Cutter and Salt Cure animations (#6182) Co-authored-by: Hedara --- data/battle_anim_scripts.s | 79 +++++++++++++++++- .../battle_anims/sprites/salt_particle.png | Bin 0 -> 239 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 2 + src/battle_anim_mons.c | 6 ++ src/battle_anim_psychic.c | 11 +++ src/battle_anim_rock.c | 22 +++++ src/data/battle_anim.h | 2 + src/graphics.c | 3 + 9 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 graphics/battle_anims/sprites/salt_particle.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 58d9ddafd8..ceca0ee2d9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -18215,10 +18215,50 @@ TeraStarstormCreateBeam:: createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 return +gBattleAnimMove_TachyonCutter:: + loadspritegfx ANIM_TAG_CUT + loadspritegfx ANIM_TAG_BUBBLE + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + waitforvisualfinish + end + +gBattleAnimMove_SaltCure:: + loadspritegfx ANIM_TAG_SALT_PARTICLE + loadspritegfx ANIM_TAG_WATER_ORB + call SaltCureEffect + call SaltCureEffect + call SaltCureEffect + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + call gBattleAnimGeneral_SaltCureDamage + end + +SaltCureEffect: + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + return + gBattleAnimMove_TeraBlast:: gBattleAnimMove_OrderUp:: gBattleAnimMove_GlaiveRush:: -gBattleAnimMove_SaltCure:: gBattleAnimMove_TripleDive:: gBattleAnimMove_Doodle:: gBattleAnimMove_Ruination:: @@ -18233,7 +18273,6 @@ gBattleAnimMove_MagicalTorque:: gBattleAnimMove_Psyblade:: gBattleAnimMove_MatchaGotcha:: gBattleAnimMove_MightyCleave:: -gBattleAnimMove_TachyonCutter:: gBattleAnimMove_SupercellSlam:: end @to do @@ -28927,7 +28966,41 @@ General_AffectionHangedOn_3Hearts: end gBattleAnimGeneral_SaltCureDamage:: - goto gBattleAnimStatus_Freeze + loadspritegfx ANIM_TAG_SALT_PARTICLE + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -10, -10, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 10, 20, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -29, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 29, -20, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -5, 10, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 17, -12, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -20, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -15, 15, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 26, -5, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 20, 2, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + end gBattleAnimGeneral_Rainbow:: call RainDrops diff --git a/graphics/battle_anims/sprites/salt_particle.png b/graphics/battle_anims/sprites/salt_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..a418f0a17222d863eb40941b0de404cc7df9f906 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4ats1|LR_y` z@0z`K`{~<%{{R2)0alXGp-l5k1hlZIzDHMDmy6|h*CGp+19C&}tF?-oPl t)Y%%f+&Xuv*Q}g<{QA3Rg}45i^s^`YW{ExL9C!@mG*4GQmvv4FO#t<$RZRc@ literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 4026a91c81..b5ccb7bf25 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -418,6 +418,7 @@ #define ANIM_TAG_PURPLE_CHAIN (ANIM_SPRITES_START + 404) #define ANIM_TAG_PINKVIO_ORB (ANIM_SPRITES_START + 405) #define ANIM_TAG_STARSTORM (ANIM_SPRITES_START + 406) +#define ANIM_TAG_SALT_PARTICLE (ANIM_SPRITES_START + 407) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index 87ccadacc9..e0109f8b20 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2895,6 +2895,8 @@ extern const u32 gBattleAnimSpriteGfx_PinkVioletOrb[]; extern const u32 gBattleAnimSpritePal_PinkVioletOrb[]; extern const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[]; extern const u32 gBattleAnimSpritePal_TeraStarstormBeam[]; +extern const u32 gBattleAnimSpriteGfx_SaltParticle[]; +extern const u32 gBattleAnimSpritePal_SaltParticle[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index f5517366ac..718ffb0a49 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -1502,6 +1502,12 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } +// arg0: start x offset +// arg1: start y offset +// arg2: end x offset +// arg3: end y offset +// arg4: duration +// arg5: arc amplitude void AnimThrowProjectile(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index a9c1f0cf67..0b4b67f3b7 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -1379,3 +1379,14 @@ void AnimPsychoBoost(struct Sprite *sprite) break; } } + +const struct SpriteTemplate gTachyonCutterSpriteTemplate = +{ + .tileTag = ANIM_TAG_CUT, + .paletteTag = ANIM_TAG_BUBBLE, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gCuttingSliceAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimCuttingSlice, +}; diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index ec7bc535df..0aaf5f1609 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -1026,3 +1026,25 @@ void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId) DestroyAnimVisualTask(taskId); } } + +const struct SpriteTemplate gSaltCureCrystalSpriteTemplate = +{ + .tileTag = ANIM_TAG_SALT_PARTICLE, + .paletteTag = ANIM_TAG_SALT_PARTICLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle, +}; + +const struct SpriteTemplate gSaltCureSwirlSpriteTemplate = +{ + .tileTag = ANIM_TAG_SALT_PARTICLE, + .paletteTag = ANIM_TAG_SALT_PARTICLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_WaterMudOrb, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex, +}; diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 5f1643f82d..ad0d2d13d8 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1467,6 +1467,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, + {gBattleAnimSpriteGfx_SaltParticle, 0x400, ANIM_TAG_SALT_PARTICLE}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1935,6 +1936,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, + {gBattleAnimSpritePal_SaltParticle, ANIM_TAG_SALT_PARTICLE}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index 19b9570079..b8c95be297 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1290,6 +1290,9 @@ const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sp const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); const u32 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.lz"); +const u32 gBattleAnimSpritePal_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.gbapal.lz"); + const u32 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U32("graphics/battle_anims/unused/unknown_2.gbapal.lz"); #include "data/graphics/trainers.h" From dc21befcc9e0b0801ed6f3d1a0aa95caf59bd322 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:48:51 -0500 Subject: [PATCH 068/125] CanAbilityX Function Cleanup (#6183) Co-authored-by: ghoulslash --- include/battle_util.h | 14 +- src/battle_ai_main.c | 7 +- src/battle_ai_util.c | 14 +- src/battle_util.c | 329 +++++++++++++++++++++--------------------- 4 files changed, 173 insertions(+), 191 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 0dd0d9ce81..f60fb32d18 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -22,13 +22,10 @@ #define MOVE_LIMITATION_PLACEHOLDER (1 << 15) #define MOVE_LIMITATIONS_ALL 0xFFFF -enum MoveBlocked +enum AbilityEffectOptions { - MOVE_BLOCKED_BY_NO_ABILITY, - MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF, - MOVE_BLOCKED_BY_DAZZLING, - MOVE_BLOCKED_BY_PARTNER_DAZZLING, - MOVE_BLOCKED_BY_GOOD_AS_GOLD, + ABILITY_CHECK_TRIGGER, + ABILITY_RUN_SCRIPT, }; enum MoveAbsorbed @@ -216,9 +213,8 @@ u32 AtkCanceller_MoveSuccessOrder(void); void SetAtkCancellerForCalledMove(void); bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); -u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); -u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); -u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef, enum AbilityEffectOptions option); +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option); u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 740328dab9..0a1dcf7679 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -893,10 +893,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // target ability checks if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE)) RETURN_SCORE_MINUS(20); - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE)) RETURN_SCORE_MINUS(20); switch (aiData->abilities[battlerDef]) @@ -997,9 +997,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // target partner ability checks & not attacking partner if (isDoubleBattle) { - if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[BATTLE_PARTNER(battlerDef)])) - RETURN_SCORE_MINUS(20); - switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { case ABILITY_LIGHTNING_ROD: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9135884942..745c8294e4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -424,18 +424,11 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy { struct AiLogicData *aiData = AI_DATA; u32 battlerDefAbility; - u32 partnerBattlerDefAbility; if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) - { battlerDefAbility = ABILITY_NONE; - partnerBattlerDefAbility = ABILITY_NONE; - } else - { battlerDefAbility = aiData->abilities[battlerDef]; - partnerBattlerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; - } if (battlerDef == BATTLE_PARTNER(battlerAtk)) battlerDefAbility = aiData->abilities[battlerDef]; @@ -443,13 +436,10 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE)) return TRUE; - if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, partnerBattlerDefAbility)) - return TRUE; - - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE)) return TRUE; switch (GetMoveEffect(move)) diff --git a/src/battle_util.c b/src/battle_util.c index 7fed3d243a..7525bc6250 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4229,67 +4229,87 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef, enum AbilityEffectOptions option) { - enum MoveBlocked effect = MOVE_BLOCKED_BY_NO_ABILITY; - + const u8 *battleScriptBlocksMove = NULL; + u32 atkPriority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); + u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); + u32 battlerAbility = battlerDef; + switch (abilityDef) { case ABILITY_SOUNDPROOF: - if (IsSoundMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + if (IsSoundMove(move) && !(moveTarget & MOVE_TARGET_USER)) + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_SoundproofProtected; + } break; case ABILITY_BULLETPROOF: if (IsBallisticMove(move)) - effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_SoundproofProtected; + } break; case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + if (atkPriority > 0 && !IsAlly(battlerAtk, battlerDef)) { - u32 priority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); - if (priority > 0) - effect = MOVE_BLOCKED_BY_DAZZLING; + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_DazzlingProtected; } break; case ABILITY_GOOD_AS_GOLD: if (IsBattleMoveStatus(move)) { - u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); if (!(moveTarget & MOVE_TARGET_OPPONENTS_FIELD) && !(moveTarget & MOVE_TARGET_ALL_BATTLERS)) - effect = MOVE_BLOCKED_BY_GOOD_AS_GOLD; + battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; } break; } - if (!effect) - effect = CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, GetBattlerAbility(BATTLE_PARTNER(battlerDef))); - return effect; -} - -u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) -{ - switch (abilityDef) + // Check def partner ability + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerDef))) { - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) { - s32 priority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); - if (priority > 0) - return MOVE_BLOCKED_BY_PARTNER_DAZZLING; + case ABILITY_DAZZLING: + case ABILITY_QUEENLY_MAJESTY: + case ABILITY_ARMOR_TAIL: + if (atkPriority > 0 && !IsAlly(battlerAtk, BATTLE_PARTNER(battlerDef))) + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battlerAbility = BATTLE_PARTNER(battlerDef); + battleScriptBlocksMove = BattleScript_DazzlingProtected; + } + break; } - break; } - return MOVE_BLOCKED_BY_NO_ABILITY; + + if (battleScriptBlocksMove == NULL) + return FALSE; + + if (option == ABILITY_RUN_SCRIPT) + { + gBattleScripting.battler = gBattlerAbility = battlerAbility; + gBattlescriptCurrInstr = battleScriptBlocksMove; + } + return TRUE; } -u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType) +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option) { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; + const u8 *battleScript = NULL; + u32 statId = 0; + u32 statAmount = 1; switch (abilityDef) { @@ -4311,33 +4331,130 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov break; case ABILITY_MOTOR_DRIVE: if (moveType == TYPE_ELECTRIC && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPEED; + } break; case ABILITY_LIGHTNING_ROD: if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPATK; + } break; case ABILITY_STORM_DRAIN: if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPATK; + } break; case ABILITY_SAP_SIPPER: if (moveType == TYPE_GRASS) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_ATK; + } break; case ABILITY_WELL_BAKED_BODY: if (moveType == TYPE_FIRE) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statAmount = 2; + statId = STAT_DEF; + } break; case ABILITY_WIND_RIDER: if (IsWindMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_ATK; + } break; case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[battlerDef].status1 & STATUS1_FREEZE))) effect = MOVE_ABSORBED_BY_BOOST_FLASH_FIRE; break; } + + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option == ABILITY_CHECK_TRIGGER) + return effect; + + switch (effect) + { + default: + return FALSE; + case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: + gBattleStruct->pledgeMove = FALSE; + if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK)) + { + if ((gProtectStructs[battlerAtk].notFirstStrike)) + battleScript = BattleScript_MonMadeMoveUseless; + else + battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_MoveHPDrain; + else + battleScript = BattleScript_MoveHPDrain_PPLoss; + + gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4; + if (gBattleStruct->moveDamage[battlerDef] == 0) + gBattleStruct->moveDamage[battlerDef] = 1; + gBattleStruct->moveDamage[battlerDef] *= -1; + } + break; + case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: + gBattleStruct->pledgeMove = FALSE; + if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + if ((gProtectStructs[battlerAtk].notFirstStrike)) + battleScript = BattleScript_MonMadeMoveUseless; + else + battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_MoveStatDrain; + else + battleScript = BattleScript_MoveStatDrain_PPLoss; + + SET_STATCHANGER(statId, statAmount, FALSE); + if (B_ABSORBING_ABILITY_STRING < GEN_5) + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + } + break; + case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: + gBattleStruct->pledgeMove = FALSE; + if (!gDisableStructs[battlerDef].flashFireBoosted) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_FlashFireBoost; + else + battleScript = BattleScript_FlashFireBoost_PPLoss; + gDisableStructs[battlerDef].flashFireBoosted = TRUE; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_FlashFireBoost; + else + battleScript = BattleScript_FlashFireBoost_PPLoss; + } + break; + } + + if (battleScript != NULL) + { + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gBattlescriptCurrInstr = battleScript; + } return effect; } @@ -5470,153 +5587,35 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_WOULD_BLOCK: - effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_CHECK_TRIGGER); if (effect && gLastUsedAbility != 0xFFFF) RecordAbilityBattle(battler, gLastUsedAbility); - break; + return effect; case ABILITYEFFECT_MOVES_BLOCK: + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_RUN_SCRIPT); + + // prankster check + if (effect == 0 + && GetChosenMovePriority(gBattlerAttacker) > 0 + && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) + && !(IsBattleMoveStatus(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) { - effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); - const u8 * battleScriptBlocksMove = NULL; - switch (effect) - { - case MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF: - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battleScriptBlocksMove = BattleScript_SoundproofProtected; - break; - case MOVE_BLOCKED_BY_DAZZLING: - case MOVE_BLOCKED_BY_PARTNER_DAZZLING: - if (effect == MOVE_BLOCKED_BY_PARTNER_DAZZLING) - gBattleScripting.battler = BATTLE_PARTNER(battler); - else - gBattleScripting.battler = battler; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battleScriptBlocksMove = BattleScript_DazzlingProtected; - break; - case MOVE_BLOCKED_BY_GOOD_AS_GOLD: - battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; - break; - default: - if (GetChosenMovePriority(gBattlerAttacker) > 0 - && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) - && !(IsBattleMoveStatus(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) - { - if (!IsDoubleBattle() - || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) - CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; - battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; - effect = 1; - } - } - if (effect) - gBattlescriptCurrInstr = battleScriptBlocksMove; + if (!IsDoubleBattle() + || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattleScripting.battler = gBattlerAbility = gBattlerTarget; + gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; + effect = 1; } break; case ABILITYEFFECT_WOULD_ABSORB: - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_CHECK_TRIGGER); gBattleStruct->pledgeMove = FALSE; if (effect && gLastUsedAbility != 0xFFFF) RecordAbilityBattle(battler, gLastUsedAbility); return effect; case ABILITYEFFECT_ABSORBING: - { - u32 statId = 0; - u32 statAmount = 1; - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); - if (effect) - { - switch(gLastUsedAbility) - { - case ABILITY_MOTOR_DRIVE: - statId = STAT_SPEED; - break; - case ABILITY_LIGHTNING_ROD: - case ABILITY_STORM_DRAIN: - statId = STAT_SPATK; - break; - case ABILITY_SAP_SIPPER: - case ABILITY_WIND_RIDER: - statId = STAT_ATK; - break; - case ABILITY_WELL_BAKED_BODY: - statAmount = 2; - statId = STAT_DEF; - break; - } - } - switch (effect) - { - case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (IsBattlerAtMaxHp(battler) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - { - if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; - else - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; - } - else - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - } - break; - case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (!CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; - else - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; - } - else - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveStatDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveStatDrain_PPLoss; - - SET_STATCHANGER(statId, statAmount, FALSE); - if (B_ABSORBING_ABILITY_STRING < GEN_5) - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - } - break; - case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: - gBattleStruct->pledgeMove = FALSE; - if (!gDisableStructs[battler].flashFireBoosted) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - gDisableStructs[battler].flashFireBoosted = TRUE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - } - break; - } - if (effect) - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - - } + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_RUN_SCRIPT); break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) From 4359cbb77cbd03fe72b39fb78b2e1efa0f39bff7 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:49:53 -0500 Subject: [PATCH 069/125] SwitchType enum to clean up GetMostSuitableMonToSwitchInto (#6184) --- include/battle_ai_switch_items.h | 8 +++++++- src/battle_ai_switch_items.c | 12 ++++++------ src/battle_controller_opponent.c | 2 +- src/battle_controller_player_partner.c | 2 +- src/battle_main.c | 10 +++++----- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 28eb318b2f..d5fbc701a5 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -1,9 +1,15 @@ #ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H #define GUARD_BATTLE_AI_SWITCH_ITEMS_H +enum SwitchType +{ + SWITCH_AFTER_KO, + SWITCH_MID_BATTLE, +}; + void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); -u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd); +u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c2f742d273..6e754121c0 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1732,7 +1732,7 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) return FALSE; } -static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOut, u32 opposingBattler) +static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchingOut, u32 opposingBattler) { bool32 movedSecond = GetBattlerTurnOrderNum(battlerSwitchingOut) > GetBattlerTurnOrderNum(opposingBattler) ? TRUE : FALSE; @@ -1755,7 +1755,7 @@ static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOu } // Post KO check has to be last because the GetMostSuitableMonToSwitchInto call in OpponentHandleChoosePokemon assumes a KO rather than a forced switch choice - if (isSwitchAfterKO) + if (switchType == SWITCH_AFTER_KO) return TRUE; else return FALSE; @@ -1777,7 +1777,7 @@ static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool3 // This function splits switching behaviour depending on whether the switch is free. // Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! -static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, bool32 isSwitchAfterKO) +static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, enum SwitchType switchType) { int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE; int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; @@ -1786,7 +1786,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; u32 aiMove, hitsToKOAI, maxHitsToKO = 0; u16 bestResist = UQ_4_12(1.0), bestResistEffective = UQ_4_12(1.0), typeMatchup; - bool32 isFreeSwitch = IsFreeSwitch(isSwitchAfterKO, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; + bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; // Iterate through mons for (i = firstId; i < lastId; i++) @@ -1979,7 +1979,7 @@ static u32 GetNextMonInParty(struct Pokemon *party, int firstId, int lastId, u32 return PARTY_SIZE; } -u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) +u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) { u32 opposingBattler = 0; u32 bestMonId = PARTY_SIZE; @@ -2024,7 +2024,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { - bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchAfterMonKOd); + bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index adeae79652..28e572d1a5 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -680,7 +680,7 @@ static void OpponentHandleChoosePokemon(u32 battler) // Switching out else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { - chosenMonId = GetMostSuitableMonToSwitchInto(battler, TRUE); + chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); if (chosenMonId == PARTY_SIZE) { s32 battler1, battler2, firstId, lastId; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 4c3163dd9a..a57bb8e2a5 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -387,7 +387,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) // Switching out else if (gBattleStruct->monToSwitchIntoId[battler] >= PARTY_SIZE || !IsValidForBattle(&gPlayerParty[gBattleStruct->monToSwitchIntoId[battler]])) { - chosenMonId = GetMostSuitableMonToSwitchInto(battler, TRUE); + chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); if (chosenMonId == PARTY_SIZE || !IsValidForBattle(&gPlayerParty[chosenMonId])) // just switch to the next mon { diff --git a/src/battle_main.c b/src/battle_main.c index f47c54bcf5..6e51a4d69f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4145,7 +4145,7 @@ enum STATE_SELECTION_SCRIPT_MAY_RUN }; -void SetupAISwitchingData(u32 battler, bool32 isAiRisky) +void SetupAISwitchingData(u32 battler, enum SwitchType switchType) { s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); @@ -4154,7 +4154,7 @@ void SetupAISwitchingData(u32 battler, bool32 isAiRisky) { AI_DATA->aiSwitchPredictionInProgress = TRUE; AI_DATA->battlerDoingPrediction = battler; - AI_DATA->mostSuitableMonId[opposingBattler] = GetMostSuitableMonToSwitchInto(opposingBattler, isAiRisky); + AI_DATA->mostSuitableMonId[opposingBattler] = GetMostSuitableMonToSwitchInto(opposingBattler, switchType); if (ShouldSwitch(opposingBattler)) AI_DATA->shouldSwitch |= (1u << opposingBattler); AI_DATA->aiSwitchPredictionInProgress = FALSE; @@ -4164,7 +4164,7 @@ void SetupAISwitchingData(u32 battler, bool32 isAiRisky) } // AI's data - AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, isAiRisky); + AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); if (ShouldSwitch(battler)) AI_DATA->shouldSwitch |= (1u << battler); } @@ -4182,7 +4182,7 @@ static void HandleTurnActionSelectionState(void) case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn. RecordedBattle_CopyBattlerMoves(battler); gBattleCommunication[battler] = STATE_BEFORE_ACTION_CHOSEN; - u32 isAiRisky = AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY; // Risky AI switches aggressively even mid battle + enum SwitchType switchType = (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; // Risky AI switches aggressively even mid battle // Do AI score computations here so we can use them in AI_TrySwitchOrUseItem if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) @@ -4192,7 +4192,7 @@ static void HandleTurnActionSelectionState(void) // Setup battler data BattleAI_SetupAIData(0xF, battler); - SetupAISwitchingData(battler, isAiRisky); + SetupAISwitchingData(battler, switchType); // Do scoring gBattleStruct->aiMoveOrAction[battler] = BattleAI_ChooseMoveOrAction(battler); From f6d1773e5119f59c58c6a3277fb59fdc6da75080 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 5 Feb 2025 22:29:13 +0100 Subject: [PATCH 070/125] Fixed Unnerve message and wrote tests (#6192) Co-authored-by: Hedara --- src/battle_util.c | 2 + test/battle/ability/unnerve.c | 72 ++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 855851586b..4dc9c9b45e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4629,6 +4629,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -4639,6 +4640,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index 9ad4ee7e5f..ce35cf72c1 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -2,5 +2,73 @@ #include "test/battle.h" // Remember to add a PARAMETRIZE for As One in the following tests: -TO_DO_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own berries"); -TO_DO_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural Gift"); +SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own berries") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + ASSUME(gItemsInfo[ITEM_RAWST_BERRY].holdEffect == HOLD_EFFECT_CURE_BRN); + PLAYER(mon) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RAWST_BERRY); Status1(STATUS1_BURN); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ability); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural Gift") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + PLAYER(mon) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(opponent, MOVE_NATURAL_GIFT); } + } SCENE { + ABILITY_POPUP(player, ability); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + PLAYER(mon) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ability); + MESSAGE("The opposing team is too nervous to eat Berries!"); + } +} + +SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(mon) { Ability(ability); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(opponent, ability); + MESSAGE("Your team is too nervous to eat Berries!"); + } +} From 41bda980318c2bb37b12d99994f1863abea30625 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Thu, 6 Feb 2025 12:22:01 -0500 Subject: [PATCH 071/125] Unify setreflect/setlightscreen and MOVE_EFFECT_REFLECT/LIGHT_SCREEN (#6196) Co-authored-by: ghoulslash --- src/battle_script_commands.c | 107 ++++++++++++++++------------------- 1 file changed, 48 insertions(+), 59 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f5af50f450..1e57dfab2c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3090,6 +3090,50 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) TrySaveExchangedItem(battlerItem, gLastUsedItem); } +static inline bool32 TrySetReflect(u32 battler) +{ + u32 side = GetBattlerSide(battler); + if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) + { + gSideStatuses[side] |= SIDE_STATUS_REFLECT; + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; + else + gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; + gSideTimers[side].reflectBattlerId = battler; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; + + return TRUE; + } + return FALSE; +} + +static inline bool32 TrySetLightScreen(u32 battler) +{ + u32 side = GetBattlerSide(battler); + if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) + { + gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; + else + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; + gSideTimers[side].lightscreenBattlerId = battler; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; + + return TRUE; + } + return FALSE; +} + #define INCREMENT_RESET_RETURN \ { \ gBattlescriptCurrInstr++; \ @@ -3110,7 +3154,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; u32 battlerAbility; - u32 side; bool8 activateAfterFaint = FALSE; // NULL move effect @@ -4220,41 +4263,15 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; case MOVE_EFFECT_REFLECT: - side = GetBattlerSide(gBattlerAttacker); - if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) + if (TrySetReflect(gBattlerAttacker)) { - gSideStatuses[side] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; - else - gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; - gSideTimers[side].reflectBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; - BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; } break; case MOVE_EFFECT_LIGHT_SCREEN: - side = GetBattlerSide(gBattlerAttacker); - if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) + if (TrySetLightScreen(gBattlerAttacker)) { - gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; - else - gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; - gSideTimers[side].lightscreenBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; - BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; } @@ -11626,26 +11643,12 @@ static void Cmd_setfieldweather(void) static void Cmd_setreflect(void) { CMD_ARGS(); - - if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_REFLECT) + if (!TrySetReflect(gBattlerAttacker)) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - else - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = gBattleTurnCounter + 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; - } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12674,25 +12677,11 @@ static void Cmd_setlightscreen(void) { CMD_ARGS(); - if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN) + if (!TrySetLightScreen(gBattlerAttacker)) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - else - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = gBattleTurnCounter + 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; - } gBattlescriptCurrInstr = cmd->nextInstr; } From 3ba4e3c0c73197e807e4ac38b8ef5c1a6d16cea5 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:17:57 -0500 Subject: [PATCH 072/125] Sheer Force Test Fixes (#6198) Co-authored-by: ghoulslash --- test/battle/ability/sheer_force.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index e06e56c2c5..bd8d57a168 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage) PLAYER(SPECIES_TAUROS) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_PRESENT); } + TURN { MOVE(player, MOVE_ERUPTION); } } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage) PLAYER(SPECIES_TAUROS) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_PRESENT); } + TURN { MOVE(player, MOVE_WATER_SPOUT); } } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { @@ -347,7 +347,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) EXPECT_NE(results[0].damage, 0); } } -SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) +SINGLE_BATTLE_TEST("Sheer Force doesn't boost Payback", s16 damage) { u16 ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } From f9d1fdcf4cedb6435cc234ceeaed4ddce954e429 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 6 Feb 2025 21:12:42 +0100 Subject: [PATCH 073/125] Follower Object Event refactor (#6129) Co-authored-by: Hedara --- include/constants/event_objects.h | 20 +-- include/event_object_movement.h | 8 -- src/event_object_movement.c | 225 +++++++++++++----------------- src/load_save.c | 2 +- src/pokemon_sprite_visualizer.c | 18 ++- src/scrcmd.c | 2 +- src/shop.c | 2 +- 7 files changed, 117 insertions(+), 160 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 8891ab27fb..219b990c5d 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -270,19 +270,23 @@ #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) -#define OBJ_EVENT_GFX_MON_BASE 0x200 // 512 -#define OBJ_EVENT_GFX_SPECIES_BITS 12 // This will need to be updated when NUM_SPECIES is > ~3.5k -#define OBJ_EVENT_GFX_SPECIES_MASK ((1 << OBJ_EVENT_GFX_SPECIES_BITS) - 1) +#define OBJ_EVENT_MON (1 << 13) +#define OBJ_EVENT_MON_SHINY (1 << 14) +#define OBJ_EVENT_MON_FEMALE (1 << 15) +#define OBJ_EVENT_MON_SPECIES_MASK (OBJ_EVENT_MON - 1) // Used to call a specific species' follower graphics. Useful for static encounters. -#define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE) -#define OBJ_EVENT_GFX_SPECIES_SHINY(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) +#define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_MON) +#define OBJ_EVENT_GFX_SPECIES_SHINY(name) (SPECIES_##name + OBJ_EVENT_MON + OBJ_EVENT_MON_SHINY) +#define OBJ_EVENT_GFX_SPECIES_FEMALE(name) (SPECIES_##name + OBJ_EVENT_MON + OBJ_EVENT_MON_FEMALE) +#define OBJ_EVENT_GFX_SPECIES_SHINY_FEMALE(name) (SPECIES_##name + OBJ_EVENT_MON + OBJ_EVENT_MON_SHINY + OBJ_EVENT_MON_FEMALE) -#define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE) -#define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS) +#define OW_SPECIES(x) ((x)->graphicsId & OBJ_EVENT_MON_SPECIES_MASK) +#define OW_SHINY(x) ((x)->graphicsId & OBJ_EVENT_MON_SHINY) +#define OW_FEMALE(x) ((x)->graphicsId & OBJ_EVENT_MON_FEMALE) // Whether Object Event is an OW pokemon -#define IS_OW_MON_OBJ(obj) ((obj)->graphicsId >= OBJ_EVENT_GFX_MON_BASE) +#define IS_OW_MON_OBJ(obj) ((obj)->graphicsId & OBJ_EVENT_MON) #define SHADOW_SIZE_S 0 #define SHADOW_SIZE_M 1 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 4b1b3e1f9f..1dc604138b 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -107,13 +107,6 @@ struct LockedAnimObjectEvents u8 count; }; -struct FollowerSpriteVisualizerData -{ - u16 currentmonId; - bool8 isShiny; - bool8 isFemale; -}; - extern const struct OamData gObjectEventBaseOam_32x8; extern const struct OamData gObjectEventBaseOam_32x32; extern const struct OamData gObjectEventBaseOam_64x64; @@ -153,7 +146,6 @@ void RemoveFollowingPokemon(void); struct ObjectEvent *GetFollowerObject(void); void TrySpawnObjectEvents(s16 cameraX, s16 cameraY); u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); -u8 CreateObjectGraphicsFollowerSpriteForVisualizer(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority, struct FollowerSpriteVisualizerData *data); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); u8 SpawnSpecialObjectEventParameterized(u16 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation); u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 0645d7073a..c0b24c9cbe 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -185,7 +185,7 @@ static void SetSpriteDataForNormalStep(struct Sprite *, u8, u8); static void InitSpriteForFigure8Anim(struct Sprite *); static bool8 AnimateSpriteInFigure8(struct Sprite *); u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2); -static void FollowerSetGraphics(struct ObjectEvent *, u16, u8, bool8); +static void FollowerSetGraphics(struct ObjectEvent * objectEvent, u32 species, bool32 shiny, bool32 female); static void ObjectEventSetGraphics(struct ObjectEvent *, const struct ObjectEventGraphicsInfo *); static void SpriteCB_VirtualObject(struct Sprite *); static void DoShadowFieldEffect(struct ObjectEvent *); @@ -196,14 +196,17 @@ static u8 DoJumpSpriteMovement(struct Sprite *); static u8 DoJumpSpecialSpriteMovement(struct Sprite *); static void CreateLevitateMovementTask(struct ObjectEvent *); static void DestroyLevitateMovementTask(u8); -static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny); -static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny); -static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, u8 form); +static bool8 GetFollowerInfo(u32 *species, bool32 *shiny, bool32 *female); +static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female); +static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u32 species, bool32 shiny, bool32 female); static bool8 NpcTakeStep(struct Sprite *); static bool8 IsElevationMismatchAt(u8, s16, s16); static bool8 AreElevationsCompatible(u8, u8); static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables); +static u16 GetGraphicsIdForMon(u32 species, bool32 shiny, bool32 female); +static u16 GetUnownSpecies(struct Pokemon *mon); + static const struct SpriteFrameImage sPicTable_PechaBerryTree[]; static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction); @@ -1678,17 +1681,8 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven if (OW_GFX_COMPRESS) spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, objectEvent->graphicsId, NULL); - if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) - { + if (objectEvent->graphicsId & OBJ_EVENT_MON && objectEvent->graphicsId & OBJ_EVENT_MON_SHINY) objectEvent->shiny = TRUE; - objectEvent->graphicsId -= SPECIES_SHINY_TAG; - } - - if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) - { - objectEvent->shiny = TRUE; - objectEvent->graphicsId -= SPECIES_SHINY_TAG; - } spriteId = CreateSprite(spriteTemplate, 0, 0, 0); if (spriteId == MAX_SPRITES) @@ -1700,7 +1694,7 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven sprite = &gSprites[spriteId]; // Use palette from species palette table if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) - sprite->oam.paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + sprite->oam.paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_SHINY(objectEvent), OW_FEMALE(objectEvent)); if (OW_GFX_COMPRESS && sprite->usingSheet) sprite->sheetSpan = GetSpanPerImage(sprite->oam.shape, sprite->oam.size); GetMapCoordsFromSpritePos(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->x, &sprite->y); @@ -1812,13 +1806,20 @@ static void UNUSED MakeSpriteTemplateFromObjectEventTemplate(const struct Object // Loads information from graphicsId, with shininess separate // also can write palette tag to the template -static u8 LoadDynamicFollowerPaletteFromGraphicsId(u16 graphicsId, bool8 shiny, struct SpriteTemplate *template) +static u32 LoadDynamicFollowerPaletteFromGraphicsId(u16 graphicsId, struct SpriteTemplate *template) { - u16 species = ((graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE); - u8 form = (graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS); - u8 paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + u16 species = graphicsId & OBJ_EVENT_MON_SPECIES_MASK; + bool32 shiny = graphicsId & OBJ_EVENT_MON_SHINY; + bool32 female = graphicsId & OBJ_EVENT_MON_FEMALE; + u8 paletteNum = LoadDynamicFollowerPalette(species, shiny, female); if (template) - template->paletteTag = species; + { + template->paletteTag = species + OBJ_EVENT_MON; + if (shiny) + template->paletteTag += OBJ_EVENT_MON_SHINY; + if (female) + template->paletteTag += OBJ_EVENT_MON_FEMALE; + } return paletteNum; } @@ -1830,7 +1831,7 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); struct Sprite *sprite; u8 spriteId; - bool32 isShiny = graphicsId >= SPECIES_SHINY_TAG + OBJ_EVENT_GFX_MON_BASE; + bool32 isShiny = graphicsId & OBJ_EVENT_MON_SHINY; spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); @@ -1847,52 +1848,7 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { - u32 paletteNum = LoadDynamicFollowerPaletteFromGraphicsId(graphicsId, isShiny, spriteTemplate); - spriteTemplate->paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); - } - else if (spriteTemplate->paletteTag != TAG_NONE) - { - LoadObjectEventPalette(spriteTemplate->paletteTag); - } - - spriteId = CreateSprite(spriteTemplate, x, y, subpriority); - - Free(spriteTemplate); - - if (spriteId != MAX_SPRITES && subspriteTables != NULL) - { - sprite = &gSprites[spriteId]; - if (OW_GFX_COMPRESS && graphicsInfo->compressed) - sprite->sheetSpan = GetSpanPerImage(sprite->oam.shape, sprite->oam.size); - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; - } - return spriteId; -} - -// Horrible workaround for sprite the visualizer, this should probably be reworked later -u8 CreateObjectGraphicsFollowerSpriteForVisualizer(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, struct FollowerSpriteVisualizerData *data) -{ - struct SpriteTemplate *spriteTemplate; - const struct SubspriteTable *subspriteTables; - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - struct Sprite *sprite; - u8 spriteId; - bool32 isShiny = data->isShiny; - - spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); - CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); - - if (OW_GFX_COMPRESS) - { - // Checking only for compressed here so as not to mess with decorations - if (graphicsInfo->compressed) - spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, graphicsId, NULL); - } - - if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) - { - u32 paletteNum = LoadDynamicFollowerPaletteFromGraphicsId(graphicsId, isShiny, spriteTemplate); + u32 paletteNum = LoadDynamicFollowerPaletteFromGraphicsId(graphicsId, spriteTemplate); spriteTemplate->paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); } else if (spriteTemplate->paletteTag != TAG_NONE) @@ -1988,19 +1944,18 @@ struct ObjectEvent *GetFollowerObject(void) } // Return graphicsInfo for a pokemon species & form -static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, u8 form) +static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u32 species, bool32 shiny, bool32 female) { const struct ObjectEventGraphicsInfo *graphicsInfo = NULL; #if OW_POKEMON_OBJECT_EVENTS switch (species) { - case SPECIES_UNOWN: // Letters >A are defined as species >= NUM_SPECIES, so are not contiguous with A - form %= NUM_UNOWN_FORMS; - graphicsInfo = &gSpeciesInfo[form ? SPECIES_UNOWN_B + form - 1 : species].overworldData; + case SPECIES_UNOWN: // Deal with Unown forms later + graphicsInfo = &gSpeciesInfo[species].overworldData; break; default: #if P_GENDER_DIFFERENCES - if (form == 1 && gSpeciesInfo[species].overworldDataFemale.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + if (female && gSpeciesInfo[species].overworldDataFemale.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { graphicsInfo = &gSpeciesInfo[species].overworldDataFemale; } @@ -2024,17 +1979,18 @@ static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, } // Find, or load, the palette for the specified pokemon info -static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) +static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) { u32 paletteNum; - bool32 female = (form == 1); // Use standalone palette, unless entry is OOB or NULL (fallback to front-sprite-based) #if OW_POKEMON_OBJECT_EVENTS == TRUE && OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE if ((shiny && gSpeciesInfo[species].overworldPalette) || (!shiny && gSpeciesInfo[species].overworldShinyPalette)) { struct SpritePalette spritePalette; - u16 palTag = shiny ? (species + SPECIES_SHINY_TAG + OBJ_EVENT_PAL_TAG_DYNAMIC) : (species + OBJ_EVENT_PAL_TAG_DYNAMIC); + u16 palTag = species + OBJ_EVENT_MON + (shiny ? OBJ_EVENT_MON_SHINY : 0); + if (female && gSpeciesInfo[species].overworldShinyPaletteFemale != NULL) + palTag += OBJ_EVENT_MON_FEMALE; // palette already loaded if ((paletteNum = IndexOfSpritePaletteTag(palTag)) < 16) return paletteNum; @@ -2056,7 +2012,6 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) spritePalette.data = gSpeciesInfo[species].overworldPalette; } - // Check if pal data must be decompressed if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) { @@ -2087,13 +2042,11 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) } // Set graphics & sprite for a follower object event by species & shininess. -static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny) +static void FollowerSetGraphics(struct ObjectEvent *objEvent, u32 species, bool32 shiny, bool32 female) { - const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); + const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, shiny, female); ObjectEventSetGraphics(objEvent, graphicsInfo); - objEvent->graphicsId = (OBJ_EVENT_GFX_MON_BASE + species) & OBJ_EVENT_GFX_SPECIES_MASK; - objEvent->graphicsId |= form << OBJ_EVENT_GFX_SPECIES_BITS; - objEvent->shiny = shiny; + objEvent->graphicsId = GetGraphicsIdForMon(species, shiny, female); if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) // Use palette from species palette table { struct Sprite *sprite = &gSprites[objEvent->spriteId]; @@ -2101,7 +2054,7 @@ static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 fo sprite->inUse = FALSE; FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); sprite->inUse = TRUE; - sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, shiny, female); } else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog { @@ -2114,9 +2067,9 @@ static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 fo static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { u32 species = OW_SPECIES(objEvent); - u32 form = OW_FORM(objEvent); - u32 shiny = objEvent->shiny; - const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); + bool32 shiny = OW_SHINY(objEvent); + bool32 female = OW_FEMALE(objEvent); + const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, shiny, female); struct Sprite *sprite = &gSprites[objEvent->spriteId]; u32 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); @@ -2145,7 +2098,7 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) sprite->inUse = FALSE; FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); sprite->inUse = TRUE; - sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, shiny, female); } else if (i != 0xFF) { @@ -2172,23 +2125,22 @@ static u16 GetOverworldCastformSpecies(void) return SPECIES_CASTFORM_NORMAL; } -static bool8 GetMonInfo(struct Pokemon *mon, u16 *species, u8 *form, u8 *shiny) +static bool8 GetMonInfo(struct Pokemon *mon, u32 *species, bool32 *shiny, bool32 *female) { - *form = 0; // default if (!mon) { *species = SPECIES_NONE; - *form = 0; - *shiny = 0; + *shiny = FALSE; + *female = FALSE; return FALSE; } *species = GetMonData(mon, MON_DATA_SPECIES); - *form = GetMonGender(mon) == MON_FEMALE; - *shiny = IsMonShiny(mon); + *shiny = IsMonShiny(mon) ? OBJ_EVENT_MON_SHINY : 0; + *female = GetMonGender(mon) == MON_FEMALE ? OBJ_EVENT_MON_FEMALE : 0; switch (*species) { case SPECIES_UNOWN: - *form = GET_UNOWN_LETTER(mon->box.personality); + *species = GetUnownSpecies(mon); break; case SPECIES_CASTFORM: // form is based on overworld weather *species = GetOverworldCastformSpecies(); @@ -2198,9 +2150,9 @@ static bool8 GetMonInfo(struct Pokemon *mon, u16 *species, u8 *form, u8 *shiny) } // Retrieve graphic information about the following pokemon, if any -static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) +static bool8 GetFollowerInfo(u32 *species, bool32 *shiny, bool32 *female) { - return GetMonInfo(GetFirstLiveMon(), species, form, shiny); + return GetMonInfo(GetFirstLiveMon(), species, shiny, female); } // Update following pokemon if any @@ -2208,18 +2160,18 @@ void UpdateFollowingPokemon(void) { struct ObjectEvent *objEvent = GetFollowerObject(); struct Sprite *sprite; - u16 species; - bool8 shiny; - u8 form; + u32 species; + bool32 shiny; + bool32 female; // Don't spawn follower if: // 1. GetFollowerInfo returns FALSE // 2. Map is indoors and gfx is larger than 32x32 // 3. flag is set if (OW_POKEMON_OBJECT_EVENTS == FALSE || OW_FOLLOWERS_ENABLED == FALSE - || !GetFollowerInfo(&species, &form, &shiny) - || SpeciesToGraphicsInfo(species, form) == NULL - || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, form)->oam->size > ST_OAM_SIZE_2) + || !GetFollowerInfo(&species, &shiny, &female) + || SpeciesToGraphicsInfo(species, shiny, female) == NULL + || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, shiny, female)->oam->size > ST_OAM_SIZE_2) || FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) { RemoveFollowingPokemon(); @@ -2233,7 +2185,7 @@ void UpdateFollowingPokemon(void) struct ObjectEventTemplate template = { .localId = OBJ_EVENT_ID_FOLLOWER, - .graphicsId = OBJ_EVENT_GFX_MON_BASE + species, + .graphicsId = GetGraphicsIdForMon(species, shiny, female), .flagId = 0, .x = gSaveBlock1Ptr->pos.x, .y = gSaveBlock1Ptr->pos.y, @@ -2241,7 +2193,7 @@ void UpdateFollowingPokemon(void) .elevation = gObjectEvents[objId].active ? gObjectEvents[objId].currentElevation : 3, .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, // store form info in template - .trainerRange_berryTreeId = (form & 0x1F) | (shiny << 5), + //.trainerRange_berryTreeId = (form & 0x1F) | (shiny << 5), // ???? what? }; if ((objId = SpawnSpecialObjectEvent(&template)) >= OBJECT_EVENTS_COUNT) return; @@ -2250,12 +2202,12 @@ void UpdateFollowingPokemon(void) } sprite = &gSprites[objEvent->spriteId]; // Follower appearance changed; move to player and set invisible - if (species != OW_SPECIES(objEvent) || shiny != objEvent->shiny || form != OW_FORM(objEvent)) + if (species != OW_SPECIES(objEvent) || shiny != OW_SHINY(objEvent) || female != OW_FEMALE(objEvent)) { MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - FollowerSetGraphics(objEvent, species, form, shiny); + FollowerSetGraphics(objEvent, species, shiny, female); objEvent->invisible = TRUE; } sprite->data[6] = 0; // set animation data @@ -2696,7 +2648,7 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) if (spriteTemplate.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { - u32 paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + u32 paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_SHINY(objectEvent), OW_FEMALE(objectEvent)); spriteTemplate.paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); } else if (spriteTemplate.paletteTag != TAG_NONE) @@ -2891,24 +2843,14 @@ static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId) { - u32 form = 0; - if (graphicsId >= OBJ_EVENT_GFX_VARS && graphicsId <= OBJ_EVENT_GFX_VAR_F) graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS); - if (graphicsId > OBJ_EVENT_GFX_SPECIES_MASK) - { - form = graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS; - graphicsId = graphicsId & OBJ_EVENT_GFX_SPECIES_MASK; - } - if (graphicsId == OBJ_EVENT_GFX_BARD) - { return gMauvilleOldManGraphicsInfoPointers[GetCurrentMauvilleOldMan()]; - } - if (graphicsId >= OBJ_EVENT_GFX_MON_BASE) - return SpeciesToGraphicsInfo(graphicsId - OBJ_EVENT_GFX_MON_BASE, form); + if (graphicsId & OBJ_EVENT_MON) + return SpeciesToGraphicsInfo(graphicsId & OBJ_EVENT_MON_SPECIES_MASK, graphicsId & OBJ_EVENT_MON_SHINY, graphicsId & OBJ_EVENT_MON_FEMALE); if (graphicsId >= NUM_OBJ_EVENT_GFX) graphicsId = OBJ_EVENT_GFX_NINJA_BOY; @@ -5385,7 +5327,7 @@ static bool8 UpdateFollowerTransformEffect(struct ObjectEvent *objectEvent, stru objectEvent->graphicsId = multi; break; } - objectEvent->graphicsId += OBJ_EVENT_GFX_MON_BASE; + objectEvent->graphicsId += OBJ_EVENT_MON; RefreshFollowerGraphics(objectEvent); break; case TRANSFORM_TYPE_RANDOM_WILD: @@ -5396,7 +5338,7 @@ static bool8 UpdateFollowerTransformEffect(struct ObjectEvent *objectEvent, stru objectEvent->graphicsId = multi; break; } - objectEvent->graphicsId += OBJ_EVENT_GFX_MON_BASE; + objectEvent->graphicsId += OBJ_EVENT_MON; RefreshFollowerGraphics(objectEvent); objectEvent->graphicsId = multi; break; @@ -7457,7 +7399,7 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct // Set graphics, palette, and affine animation else if (sprite->sDuration == animStepFrame) { - FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_SHINY(objectEvent), OW_FEMALE(objectEvent)); LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); // Initialize affine animation sprite->affineAnims = sAffineAnims_PokeballFollower; @@ -7474,7 +7416,7 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_SHINY(objectEvent), OW_FEMALE(objectEvent)); } return FALSE; } @@ -7530,7 +7472,7 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + FollowerSetGraphics(objectEvent, OW_SPECIES(objectEvent), OW_SHINY(objectEvent), OW_FEMALE(objectEvent)); objectEvent->invisible = TRUE; sprite->sTypeFuncId = 0; sprite->sSpeedFlip = 0; @@ -10992,20 +10934,23 @@ void GetDaycareGraphics(struct ScriptContext *ctx) { u16 varGfx[] = {ScriptReadHalfword(ctx), ScriptReadHalfword(ctx)}; u16 varForm[] = {ScriptReadHalfword(ctx), ScriptReadHalfword(ctx)}; - u16 specGfx; - u8 form; - u8 shiny; + u32 specGfx; + bool32 shiny; + bool32 female; s32 i; for (i = 0; i < 2; i++) { - GetMonInfo((struct Pokemon *) &gSaveBlock1Ptr->daycare.mons[i].mon, &specGfx, &form, &shiny); + GetMonInfo((struct Pokemon *) &gSaveBlock1Ptr->daycare.mons[i].mon, &specGfx, &shiny, &female); if (specGfx == SPECIES_NONE) break; // Assemble gfx ID like FollowerSetGraphics - specGfx = (OBJ_EVENT_GFX_MON_BASE + specGfx) & OBJ_EVENT_GFX_SPECIES_MASK; - specGfx |= form << OBJ_EVENT_GFX_SPECIES_BITS; - VarSet(varGfx[i], specGfx); - VarSet(varForm[i], form | (shiny << 5)); + specGfx = specGfx + OBJ_EVENT_MON; + if (shiny) + specGfx += OBJ_EVENT_MON_SHINY; + if (female) + specGfx += OBJ_EVENT_MON_FEMALE; + VarSet(varGfx[i], (u16)specGfx); + VarSet(varForm[i], 0); // This shouldn't be needed anymore, track down } gSpecialVar_Result = i; } @@ -11056,3 +11001,21 @@ bool8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct S } return FALSE; } + +static u16 GetGraphicsIdForMon(u32 species, bool32 shiny, bool32 female) +{ + u16 graphicsId = species + OBJ_EVENT_MON; + if (shiny) + graphicsId += OBJ_EVENT_MON_SHINY; + if (female) + graphicsId += OBJ_EVENT_MON_FEMALE; + return graphicsId; +} + +static u16 GetUnownSpecies(struct Pokemon *mon) +{ + u32 form = GET_UNOWN_LETTER(mon->box.personality); + if (form == 0) + return SPECIES_UNOWN; + return SPECIES_UNOWN_B + form - 1; +} diff --git a/src/load_save.c b/src/load_save.c index 6fde540b8c..9c94808536 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -235,7 +235,7 @@ void LoadObjectEvents(void) // Try to restore saved inactive follower if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && !gObjectEvents[i].active && - gObjectEvents[i].graphicsId >= OBJ_EVENT_GFX_MON_BASE) + gObjectEvents[i].graphicsId & OBJ_EVENT_MON) gObjectEvents[i].active = TRUE; } } diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index c6bb39faaf..f798b08b97 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -1310,7 +1310,7 @@ void CB2_Pokemon_Sprite_Visualizer(void) gSprites[data->iconspriteId].oam.priority = 0; //Follower Sprite - data->followerspriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MON_BASE + species, SpriteCB_Follower, VISUALIZER_FOLLOWER_X, VISUALIZER_FOLLOWER_Y, 0); + data->followerspriteId = CreateObjectGraphicsSprite(OBJ_EVENT_MON + species, SpriteCB_Follower, VISUALIZER_FOLLOWER_X, VISUALIZER_FOLLOWER_Y, 0); gSprites[data->followerspriteId].oam.priority = 0; gSprites[data->followerspriteId].anims = sAnims_Follower; @@ -2001,18 +2001,16 @@ static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data) gSprites[data->iconspriteId].oam.priority = 0; //Follower Sprite - u16 graphicsId = (OBJ_EVENT_GFX_MON_BASE + species) & OBJ_EVENT_GFX_SPECIES_MASK; - struct FollowerSpriteVisualizerData followerData; - followerData.currentmonId = graphicsId; - followerData.isFemale = data->isFemale; - followerData.isShiny = data->isShiny; - graphicsId |= data->isFemale << OBJ_EVENT_GFX_SPECIES_BITS; - data->followerspriteId = CreateObjectGraphicsFollowerSpriteForVisualizer(graphicsId, + u16 graphicsId = species + OBJ_EVENT_MON; + if (data->isShiny) + graphicsId += OBJ_EVENT_MON_SHINY; + if (data->isFemale) + graphicsId += OBJ_EVENT_MON_FEMALE; + data->followerspriteId = CreateObjectGraphicsSprite(graphicsId, SpriteCB_Follower, VISUALIZER_FOLLOWER_X, VISUALIZER_FOLLOWER_Y, - 0, - &followerData); + 0); gSprites[data->followerspriteId].oam.priority = 0; gSprites[data->followerspriteId].anims = sAnims_Follower; diff --git a/src/scrcmd.c b/src/scrcmd.c index 87e79745bd..58a7c510a6 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1701,7 +1701,7 @@ bool8 ScrCmd_vmessage(struct ScriptContext *ctx) bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 species = VarGet(ScriptReadHalfword(ctx)) & OBJ_EVENT_GFX_SPECIES_MASK; // ignore possible shiny / form bits + u16 species = VarGet(ScriptReadHalfword(ctx)) & OBJ_EVENT_MON_SPECIES_MASK; // ignore possible shiny / form bits StringCopy(sScriptStringVars[stringVarIndex], GetSpeciesName(species)); return FALSE; diff --git a/src/shop.c b/src/shop.c index effb638984..d73e4ecd13 100644 --- a/src/shop.c +++ b/src/shop.c @@ -871,7 +871,7 @@ static void BuyMenuCollectObjectEventData(void) u8 objEventId = GetObjectEventIdByXY(facingX - 4 + x, facingY - 2 + y); // skip if invalid or an overworld pokemon that is not following the player - if (objEventId != OBJECT_EVENTS_COUNT && !(gObjectEvents[objEventId].active && gObjectEvents[objEventId].graphicsId >= OBJ_EVENT_GFX_MON_BASE && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) + if (objEventId != OBJECT_EVENTS_COUNT && !(gObjectEvents[objEventId].active && gObjectEvents[objEventId].graphicsId & OBJ_EVENT_MON && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) { sShopData->viewportObjects[numObjects][OBJ_EVENT_ID] = objEventId; sShopData->viewportObjects[numObjects][X_COORD] = x; From 58eb635499b921cc751c381d73408e6cf4fb3a71 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 6 Feb 2025 21:20:38 +0100 Subject: [PATCH 074/125] Follower Object Event refactor (#6129) Co-authored-by: Hedara From 473cf265a40a6bb88bc6daaa4e82d29c076c077f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 6 Feb 2025 20:03:57 -0300 Subject: [PATCH 075/125] Fixed regression from master/upcoming merge (#6199) --- src/battle_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index f43e77a1f6..2b284a27de 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8783,8 +8783,8 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) else if (gProtectStructs[battlerDef].maxGuarded && IsMoveBlockedByMaxGuard(move)) isProtected = TRUE; else if (!gProtectStructs[battlerDef].maxGuarded // Max Guard cannot be bypassed by Unseen Fist - && IsMoveMakingContact(move, gBattlerAttacker) - && GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST) + && IsMoveMakingContact(move, battlerAtk) + && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) isProtected = FALSE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD && IsBattleMoveStatus(move) && GetMoveEffect(move) != EFFECT_COACHING) isProtected = TRUE; From 765a12f52056bf4a12806992f2bf8cad2a1a652f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:02:39 +0100 Subject: [PATCH 076/125] Convert max effects to normal move effects (#6143) --- asm/macros/battle_script.inc | 38 ++- data/battle_scripts_1.s | 159 +++++++--- include/battle_dynamax.h | 56 +--- include/battle_scripts.h | 10 +- include/constants/battle.h | 228 ++++++++------ include/move.h | 6 - src/battle_ai_util.c | 4 +- src/battle_anim_new.c | 24 +- src/battle_dynamax.c | 542 +-------------------------------- src/battle_script_commands.c | 549 +++++++++++++++++++++++++++++++++- src/battle_util.c | 2 +- src/data/moves_info.h | 301 +++++++++++++++---- test/battle/gimmick/dynamax.c | 66 ++-- test/battle/sleep_clause.c | 4 +- 14 files changed, 1151 insertions(+), 838 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d57d95ffcd..ae47761d7c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1555,13 +1555,43 @@ .4byte \failInstr .endm - .macro trysetstatus1, ptr:req - callnative BS_TrySetStatus1 + .macro trysetparalysis, ptr:req + callnative BS_TrySetParalysis .4byte \ptr .endm - .macro trysetstatus2, ptr:req - callnative BS_TrySetStatus2 + .macro trysetpoison, ptr:req + callnative BS_TrySetPoison + .4byte \ptr + .endm + + .macro trysetpoisonparalysis, ptr:req + callnative BS_TrySetPoisonParalyzis + .4byte \ptr + .endm + + .macro tryseteffectspore, ptr:req + callnative BS_TrySetEffectSpore + .4byte \ptr + .endm + + .macro trysetconfusion, ptr:req + callnative BS_TrySetConfusion + .4byte \ptr + .endm + + .macro trysetinfatuation, ptr:req + callnative BS_TrySetInfatuation + .4byte \ptr + .endm + + .macro trysetescapeprevention, ptr:req + callnative BS_TrySetEscapePrevention + .4byte \ptr + .endm + + .macro trysettorment, ptr:req + callnative BS_TrySetTorment .4byte \ptr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index eb84d295fe..7f796eb0be 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9699,7 +9699,7 @@ BattleScript_EffectMaxMove:: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET - setmaxmoveeffect + setadditionaleffects moveendall end @@ -9773,61 +9773,158 @@ BattleScript_EffectTryReducePP:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectStatus1Foes:: +BattleScript_EffectParalyzeSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status1FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status1FoesIncrement - trysetstatus1 BattleScript_Status1FoesIncrement +BattleScript_ParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_ParalyzeSideIncrement + trysetparalysis BattleScript_ParalyzeSideIncrement statusanimation BS_TARGET updatestatusicon BS_TARGET printfromtable gStatusConditionsStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate -BattleScript_Status1FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status1FoesEnd - setallytonexttarget BattleScript_Status1FoesLoop -BattleScript_Status1FoesEnd: +BattleScript_ParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ParalyzeSideEnd + setallytonexttarget BattleScript_ParalyzeSideLoop +BattleScript_ParalyzeSideEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStatus2Foes:: +BattleScript_EffectPoisonSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status2FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status2FoesIncrement - trysetstatus2 BattleScript_Status2FoesIncrement - jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_DoConfuseAnim - jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_DoInfatuationAnim -BattleScript_Status2FoesPrintMessage: +BattleScript_PoisonSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonSideIncrement + trysetpoison BattleScript_PoisonSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonSideEnd + setallytonexttarget BattleScript_PoisonSideLoop +BattleScript_PoisonSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectPoisonParalyzeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_PoisonParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonParalyzeSideIncrement + trysetpoisonparalysis BattleScript_PoisonParalyzeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonParalyzeSideEnd + setallytonexttarget BattleScript_PoisonParalyzeSideLoop +BattleScript_PoisonParalyzeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectEffectSporeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_EffectSporeSideLoop: + jumpifabsent BS_TARGET, BattleScript_EffectSporeSideIncrement + tryseteffectspore BattleScript_EffectSporeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_EffectSporeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_EffectSporeSideEnd + setallytonexttarget BattleScript_EffectSporeSideLoop +BattleScript_EffectSporeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectConfuseSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_ConfuseSideLoop: + jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement + trysetconfusion BattleScript_ConfuseSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION +BattleScript_ConfuseSidePrintMessage: printfromtable gStatus2StringIds waitmessage B_WAIT_TIME_LONG -BattleScript_Status2FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status2FoesEnd - setallytonexttarget BattleScript_Status2FoesLoop -BattleScript_Status2FoesEnd: +BattleScript_ConfuseSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd + setallytonexttarget BattleScript_ConfuseSideLoop +BattleScript_ConfuseSideEnd: restoretarget jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush goto BattleScript_MoveEnd -BattleScript_DoConfuseAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION - goto BattleScript_Status2FoesPrintMessage - -BattleScript_DoInfatuationAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION - goto BattleScript_Status2FoesPrintMessage - BattleScript_PrintCoinsScattered: printstring STRINGID_COINSSCATTERED goto BattleScript_MoveEnd +BattleScript_EffectInfatuateSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_InfatuateSideLoop: + jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement + trysetinfatuation BattleScript_InfatuateSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION +BattleScript_InfatuateSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_InfatuateSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd + setallytonexttarget BattleScript_InfatuateSideLoop +BattleScript_InfatuateSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectTormentSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_TormentSideLoop: + jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement + trysettorment BattleScript_TormentSideIncrement +BattleScript_TormentSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_TormentSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd + setallytonexttarget BattleScript_TormentSideLoop +BattleScript_TormentSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_TormentEnds:: printstring STRINGID_TORMENTEDNOMORE waitmessage B_WAIT_TIME_LONG end2 +BattleScript_EffectMeanLookSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_MeanLookSideLoop: + jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement + trysetescapeprevention BattleScript_MeanLookSideIncrement +BattleScript_MeanLookSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_MeanLookSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd + setallytonexttarget BattleScript_MeanLookSideLoop +BattleScript_MeanLookSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_EffectRaiseCritAlliesAnim:: savetarget copybyte gBattlerTarget, gBattlerAttacker @@ -9905,12 +10002,6 @@ BattleScript_RecycleBerriesAlliesEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStonesurge:: - setstealthrock BattleScript_MoveEnd - printfromtable gDmgHazardsStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectSteelsurge:: setsteelsurge BattleScript_MoveEnd printfromtable gDmgHazardsStringIds diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index 9957c37a10..0762601c89 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -3,59 +3,6 @@ #define DYNAMAX_TURNS_COUNT 3 -enum MaxMoveEffect -{ - MAX_EFFECT_NONE, - MAX_EFFECT_RAISE_TEAM_ATTACK, - MAX_EFFECT_RAISE_TEAM_DEFENSE, - MAX_EFFECT_RAISE_TEAM_SPEED, - MAX_EFFECT_RAISE_TEAM_SP_ATK, - MAX_EFFECT_RAISE_TEAM_SP_DEF, - MAX_EFFECT_LOWER_ATTACK, - MAX_EFFECT_LOWER_DEFENSE, - MAX_EFFECT_LOWER_SPEED, - MAX_EFFECT_LOWER_SP_ATK, - MAX_EFFECT_LOWER_SP_DEF, - MAX_EFFECT_SUN, - MAX_EFFECT_RAIN, - MAX_EFFECT_SANDSTORM, - MAX_EFFECT_HAIL, - MAX_EFFECT_MISTY_TERRAIN, - MAX_EFFECT_GRASSY_TERRAIN, - MAX_EFFECT_ELECTRIC_TERRAIN, - MAX_EFFECT_PSYCHIC_TERRAIN, - MAX_EFFECT_VINE_LASH, - MAX_EFFECT_WILDFIRE, - MAX_EFFECT_CANNONADE, - MAX_EFFECT_EFFECT_SPORE_FOES, - MAX_EFFECT_PARALYZE_FOES, - MAX_EFFECT_CONFUSE_FOES_PAY_DAY, - MAX_EFFECT_CRIT_PLUS, - MAX_EFFECT_MEAN_LOOK, - MAX_EFFECT_AURORA_VEIL, - MAX_EFFECT_INFATUATE_FOES, - MAX_EFFECT_RECYCLE_BERRIES, - MAX_EFFECT_POISON_FOES, - MAX_EFFECT_STEALTH_ROCK, - MAX_EFFECT_DEFOG, - MAX_EFFECT_POISON_PARALYZE_FOES, - MAX_EFFECT_HEAL_TEAM, - MAX_EFFECT_SPITE, - MAX_EFFECT_GRAVITY, - MAX_EFFECT_VOLCALITH, - MAX_EFFECT_SANDBLAST_FOES, - MAX_EFFECT_YAWN_FOE, - MAX_EFFECT_LOWER_EVASIVENESS_FOES, - MAX_EFFECT_AROMATHERAPY, - MAX_EFFECT_CONFUSE_FOES, - MAX_EFFECT_STEELSURGE, - MAX_EFFECT_TORMENT_FOES, - MAX_EFFECT_LOWER_SPEED_2_FOES, - MAX_EFFECT_FIRE_SPIN_FOES, - MAX_EFFECT_FIXED_POWER, - MAX_EFFECT_BYPASS_PROTECT, -}; - bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); void ApplyDynamaxHPMultiplier(struct Pokemon* mon); @@ -67,12 +14,11 @@ bool32 IsMoveBlockedByMaxGuard(u32 move); bool32 IsMoveBlockedByDynamax(u32 move); u16 GetMaxMove(u32 battler, u32 baseMove); -u8 GetMaxMovePower(u32 move); +u32 GetMaxMovePower(u32 move); bool32 IsMaxMove(u32 move); void ChooseDamageNonTypesString(u8 type); void BS_UpdateDynamax(void); -void BS_SetMaxMoveEffect(void); void BS_SetSteelsurge(void); void BS_TrySetStatus1(void); void BS_TrySetStatus2(void); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 5b02c4a225..64e6018bcb 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -543,8 +543,14 @@ extern const u8 BattleScript_EffectAuroraVeilSuccess[]; extern const u8 BattleScript_EffectGravitySuccess[]; extern const u8 BattleScript_EffectYawnSuccess[]; extern const u8 BattleScript_EffectTryReducePP[]; -extern const u8 BattleScript_EffectStatus1Foes[]; -extern const u8 BattleScript_EffectStatus2Foes[]; +extern const u8 BattleScript_EffectParalyzeSide[]; +extern const u8 BattleScript_EffectPoisonSide[]; +extern const u8 BattleScript_EffectPoisonParalyzeSide[]; +extern const u8 BattleScript_EffectEffectSporeSide[]; +extern const u8 BattleScript_EffectConfuseSide[]; +extern const u8 BattleScript_EffectInfatuateSide[]; +extern const u8 BattleScript_EffectTormentSide[]; +extern const u8 BattleScript_EffectMeanLookSide[]; extern const u8 BattleScript_TormentEnds[]; extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; extern const u8 BattleScript_EffectHealOneSixthAllies[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index 7f09e7f89b..13a91ade64 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -322,102 +322,150 @@ enum BattleWeather #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -// Move Effects -#define MOVE_EFFECT_SLEEP 1 -#define MOVE_EFFECT_POISON 2 -#define MOVE_EFFECT_BURN 3 -#define MOVE_EFFECT_FREEZE 4 -#define MOVE_EFFECT_PARALYSIS 5 -#define MOVE_EFFECT_TOXIC 6 -#define MOVE_EFFECT_FROSTBITE 7 +enum MoveEffects +{ + MOVE_EFFECT_NONE, + MOVE_EFFECT_SLEEP, + MOVE_EFFECT_POISON, + MOVE_EFFECT_BURN, + MOVE_EFFECT_FREEZE, + MOVE_EFFECT_PARALYSIS, + MOVE_EFFECT_TOXIC, + MOVE_EFFECT_FROSTBITE, + MOVE_EFFECT_CONFUSION, + MOVE_EFFECT_FLINCH, + MOVE_EFFECT_TRI_ATTACK, + MOVE_EFFECT_UPROAR, + MOVE_EFFECT_PAYDAY, + MOVE_EFFECT_CHARGING, + MOVE_EFFECT_WRAP, + MOVE_EFFECT_ATK_PLUS_1, + MOVE_EFFECT_DEF_PLUS_1, + MOVE_EFFECT_SPD_PLUS_1, + MOVE_EFFECT_SP_ATK_PLUS_1, + MOVE_EFFECT_SP_DEF_PLUS_1, + MOVE_EFFECT_ACC_PLUS_1, + MOVE_EFFECT_EVS_PLUS_1, + MOVE_EFFECT_ATK_MINUS_1, + MOVE_EFFECT_DEF_MINUS_1, + MOVE_EFFECT_SPD_MINUS_1, + MOVE_EFFECT_SP_ATK_MINUS_1, + MOVE_EFFECT_SP_DEF_MINUS_1, + MOVE_EFFECT_ACC_MINUS_1, + MOVE_EFFECT_EVS_MINUS_1, + MOVE_EFFECT_REMOVE_ARG_TYPE, + MOVE_EFFECT_RECHARGE, + MOVE_EFFECT_RAGE, + MOVE_EFFECT_STEAL_ITEM, + MOVE_EFFECT_PREVENT_ESCAPE, + MOVE_EFFECT_NIGHTMARE, + MOVE_EFFECT_ALL_STATS_UP, + MOVE_EFFECT_REMOVE_STATUS, + MOVE_EFFECT_ATK_DEF_DOWN, + MOVE_EFFECT_ATK_PLUS_2, + MOVE_EFFECT_DEF_PLUS_2, + MOVE_EFFECT_SPD_PLUS_2, + MOVE_EFFECT_SP_ATK_PLUS_2, + MOVE_EFFECT_SP_DEF_PLUS_2, + MOVE_EFFECT_ACC_PLUS_2, + MOVE_EFFECT_EVS_PLUS_2, + MOVE_EFFECT_ATK_MINUS_2, + MOVE_EFFECT_DEF_MINUS_2, + MOVE_EFFECT_SPD_MINUS_2, + MOVE_EFFECT_SP_ATK_MINUS_2, + MOVE_EFFECT_SP_DEF_MINUS_2, + MOVE_EFFECT_ACC_MINUS_2, + MOVE_EFFECT_EVS_MINUS_2, + MOVE_EFFECT_SCALE_SHOT, + MOVE_EFFECT_THRASH, + MOVE_EFFECT_KNOCK_OFF, + MOVE_EFFECT_DEF_SPDEF_DOWN, + MOVE_EFFECT_CLEAR_SMOG, + MOVE_EFFECT_SMACK_DOWN, + MOVE_EFFECT_FLAME_BURST, + MOVE_EFFECT_FEINT, + MOVE_EFFECT_SPECTRAL_THIEF, + MOVE_EFFECT_V_CREATE, + MOVE_EFFECT_HAPPY_HOUR, + MOVE_EFFECT_CORE_ENFORCER, + MOVE_EFFECT_THROAT_CHOP, + MOVE_EFFECT_INCINERATE, + MOVE_EFFECT_BUG_BITE, + MOVE_EFFECT_RECOIL_HP_25, + MOVE_EFFECT_TRAP_BOTH, + MOVE_EFFECT_ROUND, + MOVE_EFFECT_STOCKPILE_WORE_OFF, + MOVE_EFFECT_DIRE_CLAW, + MOVE_EFFECT_STEALTH_ROCK, + MOVE_EFFECT_SPIKES, + MOVE_EFFECT_SYRUP_BOMB, + MOVE_EFFECT_FLORAL_HEALING, + MOVE_EFFECT_SECRET_POWER, + MOVE_EFFECT_PSYCHIC_NOISE, + MOVE_EFFECT_TERA_BLAST, + MOVE_EFFECT_ORDER_UP, + MOVE_EFFECT_ION_DELUGE, + MOVE_EFFECT_HAZE, + MOVE_EFFECT_LEECH_SEED, + MOVE_EFFECT_REFLECT, + MOVE_EFFECT_LIGHT_SCREEN, + MOVE_EFFECT_SALT_CURE, + MOVE_EFFECT_EERIE_SPELL, + MOVE_EFFECT_RAISE_TEAM_ATTACK, + MOVE_EFFECT_RAISE_TEAM_DEFENSE, + MOVE_EFFECT_RAISE_TEAM_SPEED, + MOVE_EFFECT_RAISE_TEAM_SP_ATK, + MOVE_EFFECT_RAISE_TEAM_SP_DEF, + MOVE_EFFECT_LOWER_ATTACK_SIDE, + MOVE_EFFECT_LOWER_DEFENSE_SIDE, + MOVE_EFFECT_LOWER_SPEED_SIDE, + MOVE_EFFECT_LOWER_SP_ATK_SIDE, + MOVE_EFFECT_LOWER_SP_DEF_SIDE, + MOVE_EFFECT_SUN, + MOVE_EFFECT_RAIN, + MOVE_EFFECT_SANDSTORM, + MOVE_EFFECT_HAIL, + MOVE_EFFECT_MISTY_TERRAIN, + MOVE_EFFECT_GRASSY_TERRAIN, + MOVE_EFFECT_ELECTRIC_TERRAIN, + MOVE_EFFECT_PSYCHIC_TERRAIN, + MOVE_EFFECT_VINE_LASH, + MOVE_EFFECT_WILDFIRE, + MOVE_EFFECT_CANNONADE, + MOVE_EFFECT_EFFECT_SPORE_SIDE, + MOVE_EFFECT_PARALYZE_SIDE, + MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + MOVE_EFFECT_CRIT_PLUS_SIDE, + MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + MOVE_EFFECT_AURORA_VEIL, + MOVE_EFFECT_INFATUATE_SIDE, + MOVE_EFFECT_RECYCLE_BERRIES, + MOVE_EFFECT_POISON_SIDE, + MOVE_EFFECT_DEFOG, + MOVE_EFFECT_POISON_PARALYZE_SIDE, + MOVE_EFFECT_HEAL_TEAM, + MOVE_EFFECT_SPITE, + MOVE_EFFECT_GRAVITY, + MOVE_EFFECT_VOLCALITH, + MOVE_EFFECT_SANDBLAST_SIDE, + MOVE_EFFECT_YAWN_FOE, + MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + MOVE_EFFECT_AROMATHERAPY, + MOVE_EFFECT_CONFUSE_SIDE, + MOVE_EFFECT_STEELSURGE, + MOVE_EFFECT_TORMENT_SIDE, + MOVE_EFFECT_LOWER_SPEED_2_SIDE, + MOVE_EFFECT_FIRE_SPIN_SIDE, + MOVE_EFFECT_FIXED_POWER, + NUM_MOVE_EFFECTS +}; + #define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status #if B_USE_FROSTBITE == TRUE #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FROSTBITE #else #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_CONFUSION 8 -#define MOVE_EFFECT_FLINCH 9 -#define MOVE_EFFECT_TRI_ATTACK 10 -#define MOVE_EFFECT_UPROAR 11 -#define MOVE_EFFECT_PAYDAY 12 -#define MOVE_EFFECT_CHARGING 13 -#define MOVE_EFFECT_WRAP 14 -#define MOVE_EFFECT_ATK_PLUS_1 15 -#define MOVE_EFFECT_DEF_PLUS_1 16 -#define MOVE_EFFECT_SPD_PLUS_1 17 -#define MOVE_EFFECT_SP_ATK_PLUS_1 18 -#define MOVE_EFFECT_SP_DEF_PLUS_1 19 -#define MOVE_EFFECT_ACC_PLUS_1 20 -#define MOVE_EFFECT_EVS_PLUS_1 21 -#define MOVE_EFFECT_ATK_MINUS_1 22 -#define MOVE_EFFECT_DEF_MINUS_1 23 -#define MOVE_EFFECT_SPD_MINUS_1 24 -#define MOVE_EFFECT_SP_ATK_MINUS_1 25 -#define MOVE_EFFECT_SP_DEF_MINUS_1 26 -#define MOVE_EFFECT_ACC_MINUS_1 27 -#define MOVE_EFFECT_EVS_MINUS_1 28 -#define MOVE_EFFECT_REMOVE_ARG_TYPE 29 -#define MOVE_EFFECT_RECHARGE 30 -#define MOVE_EFFECT_RAGE 31 -#define MOVE_EFFECT_STEAL_ITEM 32 -#define MOVE_EFFECT_PREVENT_ESCAPE 33 -#define MOVE_EFFECT_NIGHTMARE 34 -#define MOVE_EFFECT_ALL_STATS_UP 35 -#define MOVE_EFFECT_REMOVE_STATUS 36 -#define MOVE_EFFECT_ATK_DEF_DOWN 37 -#define MOVE_EFFECT_ATK_PLUS_2 38 -#define MOVE_EFFECT_DEF_PLUS_2 39 -#define MOVE_EFFECT_SPD_PLUS_2 40 -#define MOVE_EFFECT_SP_ATK_PLUS_2 41 -#define MOVE_EFFECT_SP_DEF_PLUS_2 42 -#define MOVE_EFFECT_ACC_PLUS_2 43 -#define MOVE_EFFECT_EVS_PLUS_2 44 -#define MOVE_EFFECT_ATK_MINUS_2 45 -#define MOVE_EFFECT_DEF_MINUS_2 46 -#define MOVE_EFFECT_SPD_MINUS_2 47 -#define MOVE_EFFECT_SP_ATK_MINUS_2 48 -#define MOVE_EFFECT_SP_DEF_MINUS_2 49 -#define MOVE_EFFECT_ACC_MINUS_2 50 -#define MOVE_EFFECT_EVS_MINUS_2 51 -#define MOVE_EFFECT_SCALE_SHOT 52 -#define MOVE_EFFECT_THRASH 53 -#define MOVE_EFFECT_KNOCK_OFF 54 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 55 -#define MOVE_EFFECT_CLEAR_SMOG 56 -#define MOVE_EFFECT_SMACK_DOWN 57 -#define MOVE_EFFECT_FLAME_BURST 58 -#define MOVE_EFFECT_FEINT 59 -#define MOVE_EFFECT_SPECTRAL_THIEF 60 -#define MOVE_EFFECT_V_CREATE 61 -#define MOVE_EFFECT_HAPPY_HOUR 62 -#define MOVE_EFFECT_CORE_ENFORCER 63 -#define MOVE_EFFECT_THROAT_CHOP 64 -#define MOVE_EFFECT_INCINERATE 65 -#define MOVE_EFFECT_BUG_BITE 66 -#define MOVE_EFFECT_RECOIL_HP_25 67 -#define MOVE_EFFECT_TRAP_BOTH 68 -#define MOVE_EFFECT_ROUND 69 -#define MOVE_EFFECT_STOCKPILE_WORE_OFF 70 -#define MOVE_EFFECT_DIRE_CLAW 71 -#define MOVE_EFFECT_STEALTH_ROCK 72 -#define MOVE_EFFECT_SPIKES 73 -#define MOVE_EFFECT_SYRUP_BOMB 74 -#define MOVE_EFFECT_FLORAL_HEALING 75 -#define MOVE_EFFECT_SECRET_POWER 76 -#define MOVE_EFFECT_PSYCHIC_NOISE 77 -#define MOVE_EFFECT_TERA_BLAST 78 -#define MOVE_EFFECT_ORDER_UP 79 -#define MOVE_EFFECT_ION_DELUGE 80 -#define MOVE_EFFECT_AROMATHERAPY 81 // No functionality yet -#define MOVE_EFFECT_HAZE 82 -#define MOVE_EFFECT_LEECH_SEED 83 -#define MOVE_EFFECT_REFLECT 84 -#define MOVE_EFFECT_LIGHT_SCREEN 85 -#define MOVE_EFFECT_SALT_CURE 86 -#define MOVE_EFFECT_EERIE_SPELL 87 - -#define NUM_MOVE_EFFECTS 88 #define MOVE_EFFECT_AFFECTS_USER 0x2000 #define MOVE_EFFECT_CERTAIN 0x4000 diff --git a/include/move.h b/include/move.h index 67206d9ba2..855dba10c3 100644 --- a/include/move.h +++ b/include/move.h @@ -122,7 +122,6 @@ struct MoveInfo u16 type; u16 fixedDamage; u16 absorbPercentage; - u16 maxEffect; } argument; // primary/secondary effects @@ -489,11 +488,6 @@ static inline u32 GetMoveAbsorbPercentage(u32 moveId) return gMovesInfo[moveId].argument.absorbPercentage; } -static inline u32 GetMoveMaxEffect(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.maxEffect; -} - static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) { return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 745c8294e4..a516093a04 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2393,8 +2393,8 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) switch (additionalEffect->moveEffect) { // Skip MOVE_EFFECT_SLEEP as moves with a secondary chance of applying sleep are allowed by Smogon's rules (ie. Relic Song) - case MAX_EFFECT_EFFECT_SPORE_FOES: - case MAX_EFFECT_YAWN_FOE: + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + case MOVE_EFFECT_YAWN_FOE: return TRUE; } } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 426c196141..f344b711d6 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9267,21 +9267,15 @@ void AnimTask_DynamaxGrowth(u8 taskId) // from CFRU void AnimTask_GetWeatherToSet(u8 taskId) { - switch (GetMoveMaxEffect(gCurrentMove)) - { - case MAX_EFFECT_SUN: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; - break; - case MAX_EFFECT_RAIN: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; - break; - case MAX_EFFECT_SANDSTORM: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; - break; - case MAX_EFFECT_HAIL: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; - break; - } + if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SUN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_RAIN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SANDSTORM)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_HAIL)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 3a931af470..3e8d0e9db7 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -23,7 +23,7 @@ #include "constants/items.h" #include "constants/moves.h" -static u8 GetMaxPowerTier(u32 move); +static u32 GetMaxPowerTier(u32 move); struct GMaxMove { @@ -315,11 +315,11 @@ enum }; // Gets the base power of a Max Move. -u8 GetMaxMovePower(u32 move) +u32 GetMaxMovePower(u32 move) { - u8 tier; + u32 tier; // G-Max Drum Solo, G-Max Hydrosnipe, and G-Max Fireball always have 160 base power. - if (GetMoveMaxEffect(GetMaxMove(gBattlerAttacker, move)) == MAX_EFFECT_FIXED_POWER) + if (MoveHasAdditionalEffect(move, MOVE_EFFECT_FIXED_POWER)) return 160; // Exceptions to all other rules below: @@ -367,7 +367,7 @@ u8 GetMaxMovePower(u32 move) } } -static u8 GetMaxPowerTier(u32 move) +static u32 GetMaxPowerTier(u32 move) { u32 strikeCount = GetMoveStrikeCount(move); if (strikeCount >= 2 && strikeCount <= 5) @@ -468,42 +468,6 @@ void ChooseDamageNonTypesString(u8 type) } } -// Returns the status effect that should be applied by a G-Max Move. -static u32 GetMaxMoveStatusEffect(u32 move) -{ - u8 maxEffect = GetMoveMaxEffect(move); - switch (maxEffect) - { - // Status 1 - case MAX_EFFECT_PARALYZE_FOES: - return STATUS1_PARALYSIS; - case MAX_EFFECT_POISON_FOES: - return STATUS1_POISON; - case MAX_EFFECT_POISON_PARALYZE_FOES: - { - static const u8 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; - return RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); - } - case MAX_EFFECT_EFFECT_SPORE_FOES: - { - static const u8 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; - return RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); - } - // Status 2 - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - return STATUS2_CONFUSION; - case MAX_EFFECT_INFATUATE_FOES: - return STATUS2_INFATUATION; - case MAX_EFFECT_MEAN_LOOK: - return STATUS2_ESCAPE_PREVENTION; - case MAX_EFFECT_TORMENT_FOES: - return STATUS2_TORMENT; - default: - return STATUS1_NONE; - } -} - // Updates Dynamax HP multipliers and healthboxes. void BS_UpdateDynamax(void) { @@ -518,502 +482,6 @@ void BS_UpdateDynamax(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// Activates the secondary effect of a Max Move. -void BS_SetMaxMoveEffect(void) -{ - NATIVE_ARGS(); - u16 effect = 0; - u8 maxEffect = GetMoveMaxEffect(gCurrentMove); - - // Don't continue if the move didn't land. - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - switch (maxEffect) - { - case MAX_EFFECT_RAISE_TEAM_ATTACK: - case MAX_EFFECT_RAISE_TEAM_DEFENSE: - case MAX_EFFECT_RAISE_TEAM_SPEED: - case MAX_EFFECT_RAISE_TEAM_SP_ATK: - case MAX_EFFECT_RAISE_TEAM_SP_DEF: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(maxEffect, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - effect++; - } - break; - case MAX_EFFECT_LOWER_ATTACK: - case MAX_EFFECT_LOWER_DEFENSE: - case MAX_EFFECT_LOWER_SPEED: - case MAX_EFFECT_LOWER_SP_ATK: - case MAX_EFFECT_LOWER_SP_DEF: - case MAX_EFFECT_LOWER_SPEED_2_FOES: - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - if (!NoAliveMonsForEitherParty()) - { - u8 statId = 0; - u8 stage = 1; - switch (maxEffect) - { - case MAX_EFFECT_LOWER_SPEED_2_FOES: - statId = STAT_SPEED; - stage = 2; - break; - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - statId = STAT_EVASION; - break; - default: - // Max Effects are ordered by stat ID. - statId = maxEffect - MAX_EFFECT_LOWER_ATTACK + 1; - break; - } - SET_STATCHANGER(statId, stage, TRUE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; - effect++; - } - break; - case MAX_EFFECT_SUN: - case MAX_EFFECT_RAIN: - case MAX_EFFECT_SANDSTORM: - case MAX_EFFECT_HAIL: - { - u8 weather = 0, msg = 0; - switch (maxEffect) - { - case MAX_EFFECT_SUN: - weather = BATTLE_WEATHER_SUN; - msg = B_MSG_STARTED_SUNLIGHT; - break; - case MAX_EFFECT_RAIN: - weather = BATTLE_WEATHER_RAIN; - msg = B_MSG_STARTED_RAIN; - break; - case MAX_EFFECT_SANDSTORM: - weather = BATTLE_WEATHER_SANDSTORM; - msg = B_MSG_STARTED_SANDSTORM; - break; - case MAX_EFFECT_HAIL: - weather = BATTLE_WEATHER_HAIL; - msg = B_MSG_STARTED_HAIL; - break; - } - if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = msg; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetWeather; - effect++; - } - break; - } - case MAX_EFFECT_MISTY_TERRAIN: - case MAX_EFFECT_GRASSY_TERRAIN: - case MAX_EFFECT_ELECTRIC_TERRAIN: - case MAX_EFFECT_PSYCHIC_TERRAIN: - { - u32 statusFlag = 0; - switch (GetMoveEffectArg_MoveProperty(gCurrentMove)) - { - case MAX_EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - break; - case MAX_EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - break; - case MAX_EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - break; - case MAX_EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) - { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = gBattleTurnCounter + 8; - else - gFieldTimers.terrainTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; - effect++; - } - break; - } - case MAX_EFFECT_VINE_LASH: - case MAX_EFFECT_CANNONADE: - case MAX_EFFECT_WILDFIRE: - case MAX_EFFECT_VOLCALITH: - { - u8 side = GetBattlerSide(gBattlerTarget); - if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) - { - u32 moveType = GetMoveType(gCurrentMove); - gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th - gSideTimers[side].damageNonTypesType = moveType; - BattleScriptPush(gBattlescriptCurrInstr + 1); - ChooseDamageNonTypesString(moveType); - gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; - effect++; - } - break; - } - case MAX_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEALTH_ROCK)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStonesurge; - effect++; - } - break; - case MAX_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; - effect++; - } - break; - case MAX_EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY - || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefogTryHazards; - effect++; - } - break; - case MAX_EFFECT_AURORA_VEIL: - if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; - effect++; - } - break; - case MAX_EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; - effect++; - } - break; - case MAX_EFFECT_SANDBLAST_FOES: - case MAX_EFFECT_FIRE_SPIN_FOES: - { - // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) - { - if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) - continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) - { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - #if B_BINDING_TURNS >= GEN_5 - gDisableStructs[battler].wrapTurns = 7; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; - #else - gDisableStructs[battler].wrapTurns = 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 4) + 2; - #endif - // The Wrap effect does not expire when the user switches, so here's some cheese. - gBattleStruct->wrappedBy[battler] = gBattlerTarget; - if (maxEffect == MAX_EFFECT_SANDBLAST_FOES) - gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; - else - gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; - } - } - break; - } - case MAX_EFFECT_YAWN_FOE: - { - static const u8 sSnoozeEffects[] = {TRUE, FALSE}; - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) - && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) - && RandomElement(RNG_G_MAX_SNOOZE, sSnoozeEffects)) // 50% chance of success - { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; - effect++; - } - break; - } - case MAX_EFFECT_SPITE: - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; - effect++; - } - break; - case MAX_EFFECT_PARALYZE_FOES: - case MAX_EFFECT_POISON_FOES: - case MAX_EFFECT_POISON_PARALYZE_FOES: - case MAX_EFFECT_EFFECT_SPORE_FOES: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus1Foes; - effect++; - break; - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u16 payday = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message - } - // fall through - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_INFATUATE_FOES: - case MAX_EFFECT_TORMENT_FOES: - case MAX_EFFECT_MEAN_LOOK: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus2Foes; - effect++; - break; - case MAX_EFFECT_CRIT_PLUS: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; - effect++; - break; - case MAX_EFFECT_HEAL_TEAM: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; - effect++; - break; - case MAX_EFFECT_AROMATHERAPY: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; - effect++; - break; - case MAX_EFFECT_RECYCLE_BERRIES: - { - static const u8 sReplenishEffects[] = {TRUE, FALSE}; - if (RandomElement(RNG_G_MAX_REPLENISH, sReplenishEffects)) // 50% chance of success - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; - effect++; - } - break; - } - } - - if (!effect) - gBattlescriptCurrInstr = cmd->nextInstr; -} - -// Sets up sharp steel on the target's side. -void BS_SetSteelsurge(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; - gSideTimers[targetSide].steelsurgeAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -// Applies the status1 effect associated with a given G-Max Move. -// Could be expanded to function for any move. -void BS_TrySetStatus1(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status1 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status1) - { - case STATUS1_POISON: - if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - effect++; - } - break; - case STATUS1_PARALYSIS: - if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - case STATUS1_SLEEP: - if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) - { - if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); - else - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); - - TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Applies the status2 effect associated with a given G-Max Move. -void BS_TrySetStatus2(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status2 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status2) - { - case STATUS2_CONFUSION: - if (CanBeConfused(gBattlerTarget)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleCommunication[MULTIUSE_STATE] = 1; - effect++; - } - break; - case STATUS2_INFATUATION: - { - u8 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); - u8 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) - && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) - && atkGender != defGender - && atkGender != MON_GENDERLESS - && defGender != MON_GENDERLESS) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleCommunication[MULTIUSE_STATE] = 2; - effect++; - } - break; - } - case STATUS2_ESCAPE_PREVENTION: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - effect++; - } - break; - case STATUS2_TORMENT: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Heals one-sixth of the target's HP, including for Dynamaxed targets. -void BS_HealOneSixth(void) -{ - NATIVE_ARGS(const u8* failInstr); - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal -} - -// Recycles the target's item if it is specifically holding a berry. -void BS_TryRecycleBerry(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; - if (gBattleMons[gBattlerTarget].item == ITEM_NONE - && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item - && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) - { - gLastUsedItem = *usedHeldItem; - *usedHeldItem = ITEM_NONE; - gBattleMons[gBattlerTarget].item = gLastUsedItem; - - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - // Goes to the jump instruction if the target is Dynamaxed. void BS_JumpIfDynamaxed(void) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 56baac23b5..b0fe3281bf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4244,9 +4244,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; } break; - // TODO: The moves aromatherapy and heal bell need a refactor first - // case MOVE_EFFECT_AROMATHERAPY: - // break; case MOVE_EFFECT_HAZE: for (i = 0; i < gBattlersCount; i++) TryResetBattlerStatChanges(i); @@ -4321,6 +4318,322 @@ void SetMoveEffect(bool32 primary, bool32 certain) } } break; + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SPEED: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + if (!NoAliveMonsForEitherParty()) + { + u32 statId = 0; + u32 stage = 1; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + statId = STAT_SPEED; + stage = 2; + break; + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + statId = STAT_EVASION; + break; + default: + // Max Effects are ordered by stat ID. + statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + } + break; + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + { + u8 weather = 0, msg = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_SUN: + weather = BATTLE_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; + case MOVE_EFFECT_RAIN: + weather = BATTLE_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; + case MOVE_EFFECT_SANDSTORM: + weather = BATTLE_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; + case MOVE_EFFECT_HAIL: + weather = BATTLE_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + } + break; + } + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + break; + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = gBattleTurnCounter + 8; + else + gFieldTimers.terrainTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + } + break; + } + case MOVE_EFFECT_VINE_LASH: + case MOVE_EFFECT_CANNONADE: + case MOVE_EFFECT_WILDFIRE: + case MOVE_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + u32 moveType = GetMoveType(gCurrentMove); + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesType = moveType; + BattleScriptPush(gBattlescriptCurrInstr + 1); + ChooseDamageNonTypesString(moveType); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + } + break; + } + case MOVE_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + } + break; + case MOVE_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY + || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefogTryHazards; + } + break; + case MOVE_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; + } + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + } + break; + case MOVE_EFFECT_SANDBLAST_SIDE: + case MOVE_EFFECT_FIRE_SPIN_SIDE: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) + continue; + if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + { + gBattleMons[battler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleStruct->wrappedBy[battler] = gBattlerTarget; + if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) + gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; + else + gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; + } + } + break; + } + case MOVE_EFFECT_YAWN_FOE: + { + if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) + { + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; + } + break; + } + case MOVE_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + } + break; + case MOVE_EFFECT_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; + break; + case MOVE_EFFECT_POISON_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; + break; + case MOVE_EFFECT_POISON_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + break; + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + break; + case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MOVE_EFFECT_CONFUSE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; + break; + case MOVE_EFFECT_INFATUATE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; + break; + case MOVE_EFFECT_TORMENT_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + break; + case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; + break; + case MOVE_EFFECT_CRIT_PLUS_SIDE: + gBattleStruct->bonusCritStages[gBattlerAttacker]++; + gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + break; + case MOVE_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + break; + case MOVE_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; + break; + case MOVE_EFFECT_RECYCLE_BERRIES: + { + if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + } + break; + } } } } @@ -13580,7 +13893,7 @@ static void Cmd_tryspiteppreduce(void) { s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; // G-Max Depletion only deducts 2 PP. - if (IsMaxMove(gCurrentMove) && GetMoveMaxEffect(gCurrentMove) == MAX_EFFECT_SPITE) + if (IsMaxMove(gCurrentMove) && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SPITE)) ppToDeduct = 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) @@ -17996,3 +18309,231 @@ void BS_SwapStats(void) PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattlescriptCurrInstr = cmd->nextInstr; } + +static void TrySetParalysis(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetPoison(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetSleep(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) + { + if (B_SLEEP_TURNS >= GEN_5) + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); + else + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); + + TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +void BS_TrySetParalysis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetParalysis(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoison(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoisonParalyzis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; + u32 status = RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetEffectSpore(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; + u32 status = RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else if (status == STATUS1_POISON) + TrySetPoison(cmd->nextInstr, cmd->failInstr); + else + TrySetSleep(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetConfusion(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (CanBeConfused(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTIUSE_STATE] = 1; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetInfatuation(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) + && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) + && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTIUSE_STATE] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetEscapePrevention(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetTorment(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Heals one-sixth of the target's HP, including for Dynamaxed targets. +void BS_HealOneSixth(void) +{ + NATIVE_ARGS(const u8* failInstr); + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; + + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal +} + +// Recycles the target's item if it is specifically holding a berry. +void BS_TryRecycleBerry(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerTarget].item = gLastUsedItem; + + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Sets up sharp steel on the target's side. +void BS_SetSteelsurge(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; + gSideTimers[targetSide].steelsurgeAmount = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/src/battle_util.c b/src/battle_util.c index 2b284a27de..d300bd5d2c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8778,7 +8778,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) bool32 isProtected = FALSE; if ((IsZMove(move) || IsMaxMove(move)) - && (!gProtectStructs[battlerDef].maxGuarded || GetMoveMaxEffect(move) == MAX_EFFECT_BYPASS_PROTECT)) + && (!gProtectStructs[battlerDef].maxGuarded || MoveIgnoresProtect(move))) isProtected = FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). else if (gProtectStructs[battlerDef].maxGuarded && IsMoveBlockedByMaxGuard(move)) isProtected = TRUE; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 76ed741f77..0a71a24ab7 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -21249,8 +21249,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SUN }, .battleAnimScript = gBattleAnimMove_MaxFlare, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SUN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_FLUTTERBY] = @@ -21265,8 +21269,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SP_ATK }, .battleAnimScript = gBattleAnimMove_MaxFlutterby, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_ATK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_LIGHTNING] = @@ -21281,8 +21289,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_ELECTRIC_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxLightning, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ELECTRIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STRIKE] = @@ -21297,8 +21309,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SPEED }, .battleAnimScript = gBattleAnimMove_MaxStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_KNUCKLE] = @@ -21313,8 +21329,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_ATTACK }, .battleAnimScript = gBattleAnimMove_MaxKnuckle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_ATTACK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_PHANTASM] = @@ -21329,8 +21349,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_DEFENSE }, .battleAnimScript = gBattleAnimMove_MaxPhantasm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_DEFENSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_HAILSTORM] = @@ -21345,8 +21369,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_HAIL }, .battleAnimScript = gBattleAnimMove_MaxHailstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HAIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OOZE] = @@ -21361,8 +21389,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SP_ATK }, .battleAnimScript = gBattleAnimMove_MaxOoze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_ATK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_GEYSER] = @@ -21377,8 +21409,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAIN }, .battleAnimScript = gBattleAnimMove_MaxGeyser, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_AIRSTREAM] = @@ -21393,8 +21429,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SPEED }, .battleAnimScript = gBattleAnimMove_MaxAirstream, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SPEED, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STARFALL] = @@ -21409,8 +21449,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_MISTY_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxStarfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_MISTY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_WYRMWIND] = @@ -21425,8 +21469,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_ATTACK }, .battleAnimScript = gBattleAnimMove_MaxWyrmwind, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_ATTACK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_MINDSTORM] = @@ -21441,8 +21489,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_PSYCHIC_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxMindstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_ROCKFALL] = @@ -21457,8 +21509,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SANDSTORM }, .battleAnimScript = gBattleAnimMove_MaxRockfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDSTORM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_QUAKE] = @@ -21473,9 +21529,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SP_DEF }, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .battleAnimScript = gBattleAnimMove_MaxQuake, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_DEF, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_DARKNESS] = @@ -21490,8 +21550,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SP_DEF }, .battleAnimScript = gBattleAnimMove_MaxDarkness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_DEF_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OVERGROWTH] = @@ -21506,8 +21570,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_GRASSY_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxOvergrowth, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRASSY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STEELSPIKE] = @@ -21522,8 +21590,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_DEFENSE }, .battleAnimScript = gBattleAnimMove_MaxSteelspike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_DEFENSE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VINE_LASH] = @@ -21538,8 +21610,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_VINE_LASH }, .battleAnimScript = gBattleAnimMove_GMaxVineLash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VINE_LASH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WILDFIRE] = @@ -21554,8 +21630,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_WILDFIRE }, .battleAnimScript = gBattleAnimMove_GMaxWildfire, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WILDFIRE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CANNONADE] = @@ -21570,8 +21650,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CANNONADE }, .battleAnimScript = gBattleAnimMove_GMaxCannonade, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CANNONADE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_BEFUDDLE] = @@ -21586,8 +21670,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_EFFECT_SPORE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxBefuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_EFFECT_SPORE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLT_CRASH] = @@ -21602,8 +21690,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_PARALYZE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GOLD_RUSH] = @@ -21618,8 +21710,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CONFUSE_FOES_PAY_DAY }, .battleAnimScript = gBattleAnimMove_GMaxGoldRush, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CHI_STRIKE] = @@ -21634,8 +21730,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CRIT_PLUS }, .battleAnimScript = gBattleAnimMove_GMaxChiStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CRIT_PLUS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TERROR] = @@ -21650,8 +21750,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_MEAN_LOOK }, .battleAnimScript = gBattleAnimMove_GMaxTerror, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FOAM_BURST] = @@ -21666,8 +21770,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SPEED_2_FOES }, .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_2_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_RESONANCE] = @@ -21682,8 +21790,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_AURORA_VEIL }, .battleAnimScript = gBattleAnimMove_GMaxResonance, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AURORA_VEIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CUDDLE] = @@ -21698,8 +21810,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_INFATUATE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxCuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_INFATUATE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_REPLENISH] = @@ -21714,8 +21830,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RECYCLE_BERRIES }, .battleAnimScript = gBattleAnimMove_GMaxReplenish, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECYCLE_BERRIES, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MALODOR] = @@ -21730,8 +21850,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_POISON_FOES }, .battleAnimScript = gBattleAnimMove_GMaxMalodor, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MELTDOWN] = @@ -21746,8 +21870,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_TORMENT_FOES }, .battleAnimScript = gBattleAnimMove_GMaxMeltdown, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TORMENT_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DRUM_SOLO] = @@ -21762,9 +21890,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxDrumSolo, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FIREBALL] = @@ -21779,9 +21911,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxFireball, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_HYDROSNIPE] = @@ -21796,9 +21932,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxHydrosnipe, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WIND_RAGE] = @@ -21813,8 +21953,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_DEFOG }, .battleAnimScript = gBattleAnimMove_GMaxWindRage, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEFOG, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GRAVITAS] = @@ -21829,8 +21973,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_GRAVITY }, .battleAnimScript = gBattleAnimMove_GMaxGravitas, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRAVITY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STONESURGE] = @@ -21845,8 +21993,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_STEALTH_ROCK }, .battleAnimScript = gBattleAnimMove_GMaxStonesurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEALTH_ROCK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLCALITH] = @@ -21861,8 +22013,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_VOLCALITH }, .battleAnimScript = gBattleAnimMove_GMaxVolcalith, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VOLCALITH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TARTNESS] = @@ -21877,8 +22033,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_EVASIVENESS_FOES }, .battleAnimScript = gBattleAnimMove_GMaxTartness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SWEETNESS] = @@ -21893,8 +22053,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_AROMATHERAPY }, .battleAnimScript = gBattleAnimMove_GMaxSweetness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AROMATHERAPY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SANDBLAST] = @@ -21909,8 +22073,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SANDBLAST_FOES }, .battleAnimScript = gBattleAnimMove_GMaxSandblast, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDBLAST_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STUN_SHOCK] = @@ -21925,8 +22093,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_POISON_PARALYZE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxStunShock, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CENTIFERNO] = @@ -21941,8 +22113,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIRE_SPIN_FOES }, .battleAnimScript = gBattleAnimMove_GMaxCentiferno, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIRE_SPIN_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SMITE] = @@ -21957,8 +22133,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CONFUSE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxSmite, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, @@ -21974,8 +22154,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_YAWN_FOE }, .battleAnimScript = gBattleAnimMove_GMaxSnooze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_YAWN_FOE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FINALE] = @@ -21990,8 +22174,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_HEAL_TEAM }, .battleAnimScript = gBattleAnimMove_GMaxFinale, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HEAL_TEAM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STEELSURGE] = @@ -22006,8 +22194,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_STEELSURGE }, .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEELSURGE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DEPLETION] = @@ -22022,8 +22214,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SPITE }, .battleAnimScript = gBattleAnimMove_GMaxDepletion, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPITE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_ONE_BLOW] = @@ -22038,14 +22234,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_BYPASS_PROTECT }, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxOneBlow, }, [MOVE_G_MAX_RAPID_FLOW] = { .name = COMPOUND_STRING("G-Max Rapid Flow"), - .description = sNullDescription, //ANIM TODO + .description = sNullDescription, .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22054,8 +22250,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_BYPASS_PROTECT }, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxRapidFlow, }, - }; diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 4b5c05dfa7..b2f659faa0 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -683,7 +683,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") { GIVEN { // Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE); - ASSUME(GetMoveMaxEffect(MOVE_MAX_STRIKE) == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } PLAYER(SPECIES_WOBBUFFET) { Speed(80); } } WHEN { @@ -707,7 +707,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_STRIKE) == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); PLAYER(SPECIES_WOBBUFFET) { Speed(80); } PLAYER(SPECIES_WOBBUFFET) { Speed(79); } OPPONENT(SPECIES_WOBBUFFET) {Speed(100); } @@ -744,7 +744,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") { s16 damage[4]; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_KNUCKLE) == MAX_EFFECT_RAISE_TEAM_ATTACK); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_KNUCKLE, MOVE_EFFECT_RAISE_TEAM_ATTACK)); ASSUME(GetMoveCategory(MOVE_CLOSE_COMBAT) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); @@ -786,7 +786,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_FLARE) == MAX_EFFECT_SUN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLARE, MOVE_EFFECT_SUN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -802,7 +802,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_GEYSER) == MAX_EFFECT_RAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_GEYSER, MOVE_EFFECT_RAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -818,7 +818,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_HAILSTORM) == MAX_EFFECT_HAIL); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_HAILSTORM, MOVE_EFFECT_HAIL)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -834,7 +834,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_ROCKFALL) == MAX_EFFECT_SANDSTORM); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_ROCKFALL, MOVE_EFFECT_SANDSTORM)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -851,7 +851,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") { s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_OVERGROWTH) == MAX_EFFECT_GRASSY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; @@ -871,7 +871,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_MINDSTORM) == MAX_EFFECT_PSYCHIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_MINDSTORM, MOVE_EFFECT_PSYCHIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -888,7 +888,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_LIGHTNING) == MAX_EFFECT_ELECTRIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_LIGHTNING, MOVE_EFFECT_ELECTRIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -903,7 +903,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_STARFALL) == MAX_EFFECT_MISTY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STARFALL, MOVE_EFFECT_MISTY_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -918,7 +918,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STONESURGE) == MAX_EFFECT_STEALTH_ROCK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STONESURGE, MOVE_EFFECT_STEALTH_ROCK)); PLAYER(SPECIES_DREDNAW) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -938,7 +938,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STEELSURGE) == MAX_EFFECT_STEELSURGE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_HATTERENE); @@ -969,7 +969,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili PARAMETRIZE { move = MOVE_WATER_GUN; } PARAMETRIZE { move = MOVE_HYDRO_CANNON; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_HYDROSNIPE) == MAX_EFFECT_FIXED_POWER); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_HYDROSNIPE, MOVE_EFFECT_FIXED_POWER)); PLAYER(SPECIES_INTELEON) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_ARCTOVISH) { Ability(ABILITY_WATER_ABSORB); } } WHEN { @@ -985,7 +985,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_VOLT_CRASH) == MAX_EFFECT_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_VOLT_CRASH, MOVE_EFFECT_PARALYZE_SIDE)); PLAYER(SPECIES_PIKACHU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PICHU); OPPONENT(SPECIES_WOBBUFFET); @@ -1012,7 +1012,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = STATUS1_PARALYSIS; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STUN_SHOCK) == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_WOBBUFFET); @@ -1049,7 +1049,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before considering immunities") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STUN_SHOCK) == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_GARBODOR); @@ -1082,7 +1082,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = STATUS1_SLEEP; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_BEFUDDLE) == MAX_EFFECT_EFFECT_SPORE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CATERPIE); OPPONENT(SPECIES_WOBBUFFET); @@ -1126,7 +1126,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and generates money") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_GOLD_RUSH) == MAX_EFFECT_CONFUSE_FOES_PAY_DAY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_GOLD_RUSH, MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE)); PLAYER(SPECIES_MEOWTH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PERSIAN); OPPONENT(SPECIES_WOBBUFFET); @@ -1146,7 +1146,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and genera DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SMITE) == MAX_EFFECT_CONFUSE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SMITE, MOVE_EFFECT_CONFUSE_SIDE)); PLAYER(SPECIES_HATTERENE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_HATENNA); OPPONENT(SPECIES_WOBBUFFET); @@ -1165,7 +1165,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possible") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CUDDLE) == MAX_EFFECT_INFATUATE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CUDDLE, MOVE_EFFECT_INFATUATE_SIDE)); PLAYER(SPECIES_EEVEE) { Gender(MON_MALE); GigantamaxFactor(TRUE); } PLAYER(SPECIES_EEVEE); OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } @@ -1186,7 +1186,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possibl DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_TERROR) == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_GASTLY); OPPONENT(SPECIES_WOBBUFFET); @@ -1205,7 +1205,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_TERROR) == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -1222,7 +1222,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_MELTDOWN) == MAX_EFFECT_TORMENT_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_MELTDOWN, MOVE_EFFECT_TORMENT_SIDE)); PLAYER(SPECIES_MELMETAL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MELTAN); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_CELEBRATE); } @@ -1259,7 +1259,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages no { s16 damage; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_WILDFIRE) == MAX_EFFECT_WILDFIRE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_WILDFIRE, MOVE_EFFECT_WILDFIRE)); PLAYER(SPECIES_CHARIZARD) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CHARMANDER); OPPONENT(SPECIES_WOBBUFFET) { HP(600); MaxHP(600); } @@ -1305,7 +1305,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of t { PASSES_RANDOMLY(1, 2, RNG_G_MAX_REPLENISH); GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_REPLENISH) == MAX_EFFECT_RECYCLE_BERRIES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_REPLENISH, MOVE_EFFECT_RECYCLE_BERRIES)); PLAYER(SPECIES_SNORLAX) { Item(ITEM_APICOT_BERRY); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); Ability(ABILITY_THICK_FAT); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } @@ -1333,7 +1333,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") { PASSES_RANDOMLY(1, 2, RNG_G_MAX_SNOOZE); GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SNOOZE) == MAX_EFFECT_YAWN_FOE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SNOOZE, MOVE_EFFECT_YAWN_FOE)); ASSUME(GetMoveCategory(MOVE_DARK_PULSE) == DAMAGE_CATEGORY_SPECIAL); // Otherwise, Blissey faints. PLAYER(SPECIES_GRIMMSNARL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_IMPIDIMP); @@ -1357,7 +1357,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") { s16 damage1, damage2; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_FINALE) == MAX_EFFECT_HEAL_TEAM); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_FINALE, MOVE_EFFECT_HEAL_TEAM)); PLAYER(SPECIES_ALCREMIE) { HP(1); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MILCERY) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -1377,7 +1377,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SWEETNESS) == MAX_EFFECT_AROMATHERAPY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); PLAYER(SPECIES_APPLETUN) { Status1(STATUS1_POISON); GigantamaxFactor(TRUE); } PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } OPPONENT(SPECIES_WOBBUFFET); @@ -1397,7 +1397,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CENTIFERNO) == MAX_EFFECT_FIRE_SPIN_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CENTIFERNO, MOVE_EFFECT_FIRE_SPIN_SIDE)); PLAYER(SPECIES_CENTISKORCH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_SIZZLIPEDE); PLAYER(SPECIES_SIZZLIPEDE); @@ -1426,7 +1426,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance") u32 j; GIVEN { ASSUME(B_CRIT_CHANCE >= GEN_6); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CHI_STRIKE) == MAX_EFFECT_CRIT_PLUS); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); OPPONENT(SPECIES_WOBBUFFET); @@ -1458,7 +1458,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's { GIVEN { ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_DEPLETION) == MAX_EFFECT_SPITE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_DEPLETION, MOVE_EFFECT_SPITE)); PLAYER(SPECIES_DURALUDON) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WYNAUT); // Dynamax behaves weird with test turn order because stats are recalculated. @@ -1480,7 +1480,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage" PARAMETRIZE { protect = TRUE; } PARAMETRIZE { protect = FALSE; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_ONE_BLOW) == MAX_EFFECT_BYPASS_PROTECT); + ASSUME(MoveIgnoresProtect(MOVE_G_MAX_RAPID_FLOW)); PLAYER(SPECIES_URSHIFU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_KUBFU); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index a5f28f4f22..ae20a0acad 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -507,7 +507,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: G-Max Befuddle can only sleep one opposing mon { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_BEFUDDLE) == MAX_EFFECT_EFFECT_SPORE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CATERPIE); OPPONENT(SPECIES_WOBBUFFET); @@ -1131,7 +1131,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SWEETNESS) == MAX_EFFECT_AROMATHERAPY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); PLAYER(SPECIES_APPLETUN) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WOBBUFFET); From b51598c14d414a19b89e162536fa02e5e17d3387 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 7 Feb 2025 09:30:57 -0300 Subject: [PATCH 077/125] Removed Trainer Slides footgun (#6205) --- include/constants/trainer_slide.h | 1 + test/battle/trainer_slides.c | 26 +++++++++++++------------- test/battle/trainer_slides.h | 26 +++++++++++++------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/constants/trainer_slide.h b/include/constants/trainer_slide.h index 5ddab7be00..26635b164b 100644 --- a/include/constants/trainer_slide.h +++ b/include/constants/trainer_slide.h @@ -13,6 +13,7 @@ enum ComparisonOperators enum TrainerSlideType { + TRAINER_SLIDE_NONE, TRAINER_SLIDE_BEFORE_FIRST_TURN, TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT, TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT, diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index ee8b632f25..b5bb127a0c 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_BEFORE_FIRST_TURN; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_BEFORE_FIRST_TURN; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; GIVEN { ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; GIVEN { ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; GIVEN { ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; GIVEN { ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -107,7 +107,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_SWITCHIN; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_SWITCHIN; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_HALF_HP; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); @@ -154,7 +154,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_LAST_LOW_HP; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_LOW_HP; GIVEN { ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); PLAYER(SPECIES_WOBBUFFET) { Attack(999);} @@ -168,7 +168,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_MEGA_EVOLUTION; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_MEGA_EVOLUTION; GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -184,7 +184,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") SINGLE_BATTLE_TEST("Trainer Slide: Z Move") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_Z_MOVE; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_Z_MOVE; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } @@ -200,7 +200,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Z Move") SINGLE_BATTLE_TEST("Trainer Slide: Dynamax") { - gBattleTestRunnerState->data.recordedBattle.opponentA = 1 + TRAINER_SLIDE_DYNAMAX; + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_DYNAMAX; GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/trainer_slides.h b/test/battle/trainer_slides.h index 3c4dff852a..cb62a00800 100644 --- a/test/battle/trainer_slides.h +++ b/test/battle/trainer_slides.h @@ -1,54 +1,54 @@ [DIFFICULTY_NORMAL] = { - [1 + TRAINER_SLIDE_BEFORE_FIRST_TURN] = + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = { [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = { [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = { [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = { [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_LAST_SWITCHIN] = + [TRAINER_SLIDE_LAST_SWITCHIN] = { [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_LAST_HALF_HP] = + [TRAINER_SLIDE_LAST_HALF_HP] = { [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_LAST_LOW_HP] = + [TRAINER_SLIDE_LAST_LOW_HP] = { [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_MEGA_EVOLUTION] = + [TRAINER_SLIDE_MEGA_EVOLUTION] = { [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_Z_MOVE] = + [TRAINER_SLIDE_Z_MOVE] = { [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), }, - [1 + TRAINER_SLIDE_DYNAMAX] = + [TRAINER_SLIDE_DYNAMAX] = { [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), }, From 96ee24c72614b733f9d709a9cebd4fc41dd7b42a Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:40:10 -0500 Subject: [PATCH 078/125] Minor Terrain Seed Test Improvement (#6207) Co-authored-by: ghoulslash --- test/battle/hold_effect/seeds.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index 22e94baa8c..11aa9037db 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -40,6 +40,8 @@ SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrai SEND_IN_MESSAGE("Wobbuffet"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Electric Seed, the Defense of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); } } @@ -69,6 +71,8 @@ SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") SEND_IN_MESSAGE("Wobbuffet"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Grassy Seed, the Defense of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); } } @@ -98,6 +102,8 @@ SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain" SEND_IN_MESSAGE("Wobbuffet"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Misty Seed, the Sp. Def of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); } } @@ -127,5 +133,7 @@ SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terr SEND_IN_MESSAGE("Wobbuffet"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Using Psychic Seed, the Sp. Def of Wobbuffet rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); } } From e77fe32dec398196ff87cf34627a784cc25e5a4b Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:42:08 -0500 Subject: [PATCH 079/125] Fix Choice'd mons referring to incorrect move when switching (#6204) --- src/battle_ai_switch_items.c | 2 +- test/battle/ai/ai_choice.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 6e754121c0..0001ad6c78 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -875,7 +875,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) if (HOLD_EFFECT_CHOICE(holdEffect) && gBattleMons[battler].ability != ABILITY_KLUTZ) { - if (GetMoveCategory(gLastUsedMove) == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(AI_DATA->lastUsedMove[battler]) == DAMAGE_CATEGORY_STATUS) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index f1f13a373e..c3d3e02c03 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -42,6 +42,20 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc } } +AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves when determining if they should switch") +{ + GIVEN + { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_TAIL_WHIP, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(5); Moves(MOVE_TACKLE); Item(ITEM_CHOICE_BAND); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(5); Moves(MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TAIL_WHIP); } + TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TAIL_WHIP); } + } +} + AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") { // Moves defined by MOVE_TARGET_USER (with exceptions?) From f9ad4097154183146fd1bd9a4fae675870e7460e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 7 Feb 2025 13:37:36 -0300 Subject: [PATCH 080/125] Adjusted G-Max Depletion test (#6201) --- test/battle/gimmick/dynamax.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index b2f659faa0..05b48cc5ed 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1459,10 +1459,11 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's GIVEN { ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_DEPLETION, MOVE_EFFECT_SPITE)); + ASSUME(GetMovePP(MOVE_CELEBRATE) >= 3); PLAYER(SPECIES_DURALUDON) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WYNAUT); // Dynamax behaves weird with test turn order because stats are recalculated. - OPPONENT(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); Moves(MOVE_CELEBRATE); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_DRAGON_CLAW, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } @@ -1470,6 +1471,8 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's MESSAGE("The opposing Sableye used Celebrate!"); MESSAGE("Duraludon used G-Max Depletion!"); MESSAGE("The opposing Sableye's PP was reduced!"); + } THEN { + EXPECT_EQ(opponentLeft->pp[0], GetMovePP(MOVE_CELEBRATE) - 3); // 1 from regular use + 2 from G-Max Depletion } } From 82b0eff16c47b7a623ee69f825ac50f32d93342b Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 7 Feb 2025 19:26:16 +0100 Subject: [PATCH 081/125] Fix typo in Nuzzle's description (#6209) --- src/data/moves_info.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 50f8cebbd3..a7c46bd1fc 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -15157,7 +15157,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = { .name = COMPOUND_STRING("Nuzzle"), .description = COMPOUND_STRING( - "Rubs its cheecks against\n" + "Rubs its cheeks against\n" "the foe, paralyzing it."), .effect = EFFECT_HIT, .power = 20, From de9e9af1b7bb30e8c45df2d9990bb59c1a607166 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 7 Feb 2025 22:24:05 +0100 Subject: [PATCH 082/125] Fixes Spectral Thief stealing boost at the wrong time (#6197) Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.com> --- asm/macros/battle_script.inc | 14 +- data/battle_scripts_1.s | 18 ++- include/battle_scripts.h | 2 +- include/constants/battle.h | 57 ++++---- include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 - src/battle_ai_main.c | 8 +- src/battle_script_commands.c | 143 +++++++++++---------- src/data/battle_move_effects.h | 6 + src/data/moves_info.h | 5 +- test/battle/ability/big_pecks.c | 4 +- test/battle/ability/clear_body.c | 2 +- test/battle/ability/hyper_cutter.c | 4 +- test/battle/ability/keen_eye.c | 4 +- test/battle/move_effect/spectral_thief.c | 52 ++++++++ 15 files changed, 203 insertions(+), 118 deletions(-) create mode 100644 test/battle/move_effect/spectral_thief.c diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 67d97fda02..cd52f9629b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1751,6 +1751,16 @@ callnative BS_RemoveTerrain .endm + .macro tryspectralthiefsteal jumpInstr:req + callnative BS_TrySpectralThiefSteal + .4byte \jumpInstr + .endm + + .macro spectralthiefprintstats + callnative BS_SpectralThiefPrintStats + .endm + + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -2045,10 +2055,6 @@ various \battler, VARIOUS_SET_POWDER .endm - .macro spectralthiefprintstats - various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF - .endm - .macro bringdownairbornebattler battler:req various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fff1961a9c..e56cf1eeaf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1296,7 +1296,23 @@ BattleScript_SpectralThiefSteal:: setbyte sB_ANIM_ARG2, 0 playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 spectralthiefprintstats - return + goto BattleScript_EffectSpectralThiefFromDamage + +BattleScript_EffectSpectralThief:: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + typecalc + tryspectralthiefsteal BattleScript_SpectralThiefSteal +BattleScript_EffectSpectralThiefFromDamage: + critcalc + damagecalc + adjustdamage + call BattleScript_Hit_RetFromAtkAnimation + tryfaintmon BS_TARGET + moveendall + end BattleScript_EffectPartingShot:: attackcanceler diff --git a/include/battle_scripts.h b/include/battle_scripts.h index fb830c275b..40352b88e4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -340,7 +340,7 @@ extern const u8 BattleScript_PsychicSurgeActivates[]; extern const u8 BattleScript_GrassySurgeActivates[]; extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; -extern const u8 BattleScript_SpectralThiefSteal[]; +extern const u8 BattleScript_EffectSpectralThief[]; extern const u8 BattleScript_StatUpMsg[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index 865f5ce886..37cdf440d4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -388,36 +388,35 @@ #define MOVE_EFFECT_SMACK_DOWN 57 #define MOVE_EFFECT_FLAME_BURST 58 #define MOVE_EFFECT_FEINT 59 -#define MOVE_EFFECT_SPECTRAL_THIEF 60 -#define MOVE_EFFECT_V_CREATE 61 -#define MOVE_EFFECT_HAPPY_HOUR 62 -#define MOVE_EFFECT_CORE_ENFORCER 63 -#define MOVE_EFFECT_THROAT_CHOP 64 -#define MOVE_EFFECT_INCINERATE 65 -#define MOVE_EFFECT_BUG_BITE 66 -#define MOVE_EFFECT_RECOIL_HP_25 67 -#define MOVE_EFFECT_TRAP_BOTH 68 -#define MOVE_EFFECT_ROUND 69 -#define MOVE_EFFECT_STOCKPILE_WORE_OFF 70 -#define MOVE_EFFECT_DIRE_CLAW 71 -#define MOVE_EFFECT_STEALTH_ROCK 72 -#define MOVE_EFFECT_SPIKES 73 -#define MOVE_EFFECT_SYRUP_BOMB 74 -#define MOVE_EFFECT_FLORAL_HEALING 75 -#define MOVE_EFFECT_SECRET_POWER 76 -#define MOVE_EFFECT_PSYCHIC_NOISE 77 -#define MOVE_EFFECT_TERA_BLAST 78 -#define MOVE_EFFECT_ORDER_UP 79 -#define MOVE_EFFECT_ION_DELUGE 80 -#define MOVE_EFFECT_AROMATHERAPY 81 // No functionality yet -#define MOVE_EFFECT_HAZE 82 -#define MOVE_EFFECT_LEECH_SEED 83 -#define MOVE_EFFECT_REFLECT 84 -#define MOVE_EFFECT_LIGHT_SCREEN 85 -#define MOVE_EFFECT_SALT_CURE 86 -#define MOVE_EFFECT_EERIE_SPELL 87 +#define MOVE_EFFECT_V_CREATE 60 +#define MOVE_EFFECT_HAPPY_HOUR 61 +#define MOVE_EFFECT_CORE_ENFORCER 62 +#define MOVE_EFFECT_THROAT_CHOP 63 +#define MOVE_EFFECT_INCINERATE 64 +#define MOVE_EFFECT_BUG_BITE 65 +#define MOVE_EFFECT_RECOIL_HP_25 66 +#define MOVE_EFFECT_TRAP_BOTH 67 +#define MOVE_EFFECT_ROUND 68 +#define MOVE_EFFECT_STOCKPILE_WORE_OFF 69 +#define MOVE_EFFECT_DIRE_CLAW 70 +#define MOVE_EFFECT_STEALTH_ROCK 71 +#define MOVE_EFFECT_SPIKES 72 +#define MOVE_EFFECT_SYRUP_BOMB 73 +#define MOVE_EFFECT_FLORAL_HEALING 74 +#define MOVE_EFFECT_SECRET_POWER 75 +#define MOVE_EFFECT_PSYCHIC_NOISE 76 +#define MOVE_EFFECT_TERA_BLAST 77 +#define MOVE_EFFECT_ORDER_UP 78 +#define MOVE_EFFECT_ION_DELUGE 79 +#define MOVE_EFFECT_AROMATHERAPY 80 // No functionality yet +#define MOVE_EFFECT_HAZE 81 +#define MOVE_EFFECT_LEECH_SEED 82 +#define MOVE_EFFECT_REFLECT 83 +#define MOVE_EFFECT_LIGHT_SCREEN 84 +#define MOVE_EFFECT_SALT_CURE 85 +#define MOVE_EFFECT_EERIE_SPELL 86 -#define NUM_MOVE_EFFECTS 88 +#define NUM_MOVE_EFFECTS 87 #define MOVE_EFFECT_AFFECTS_USER 0x2000 #define MOVE_EFFECT_CERTAIN 0x4000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b32b7a3837..b321f488b0 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -349,6 +349,7 @@ enum { EFFECT_SHELL_SIDE_ARM, EFFECT_ORDER_UP, EFFECT_RAPID_SPIN, + EFFECT_SPECTRAL_THIEF, NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index c8f6b7cd5b..5d5eb54e04 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -153,7 +153,6 @@ enum CmdVarious VARIOUS_TRY_THIRD_TYPE, VARIOUS_ACUPRESSURE, VARIOUS_SET_POWDER, - VARIOUS_SPECTRAL_THIEF, VARIOUS_GRAVITY_ON_AIRBORNE_MONS, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS, VARIOUS_JUMP_IF_ROAR_FAILS, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c3cd5a4d5e..d65a5eaeaf 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3814,7 +3814,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_FLATTER: if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY) || HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveWithAdditionalEffect(battlerAtk, MOVE_EFFECT_SPECTRAL_THIEF)) + || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4422,8 +4422,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)) ADJUST_SCORE(GOOD_EFFECT); + case EFFECT_SPECTRAL_THIEF: + ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; - } // move effect checks // check move additional effects that are likely to happen @@ -4547,9 +4548,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case MOVE_EFFECT_CLEAR_SMOG: score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); break; - case MOVE_EFFECT_SPECTRAL_THIEF: - score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); - break; case MOVE_EFFECT_BUG_BITE: // And pluck if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a07ac4579f..bd4451f7d7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3662,52 +3662,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; } break; - case MOVE_EFFECT_SPECTRAL_THIEF: - if (!NoAliveMonsForEitherParty()) - { - bool32 contrary = (GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY); - gBattleStruct->stolenStats[0] = 0; // Stats to steal. - gBattleScripting.animArg1 = 0; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE) - { - bool32 byTwo = FALSE; - - gBattleStruct->stolenStats[0] |= (1 << (i)); - // Store by how many stages to raise the stat. - gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; - while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) - gBattleStruct->stolenStats[i]--; - gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE; - - if (gBattleStruct->stolenStats[i] >= 2) - byTwo++; - - if (gBattleScripting.animArg1 == 0) - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + i; - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + i; - } - else - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); - } - } - } - - if (gBattleStruct->stolenStats[0] != 0) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; - } - } - break; case MOVE_EFFECT_V_CREATE: if (!NoAliveMonsForEitherParty()) { @@ -9543,26 +9497,6 @@ static void Cmd_various(void) gStatuses3[battler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); break; } - case VARIOUS_SPECTRAL_THIEF: - { - VARIOUS_ARGS(); - // Raise stats - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) - { - if (gBattleStruct->stolenStats[0] & (1u << i)) - { - gBattleStruct->stolenStats[0] &= ~(1u << i); - SET_STATCHANGER(i, gBattleStruct->stolenStats[i], FALSE); - if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), i, MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StatUpMsg; - return; - } - } - } - break; - } case VARIOUS_SET_POWDER: { VARIOUS_ARGS(); @@ -17646,3 +17580,80 @@ void BS_RemoveTerrain(void) RemoveAllTerrains(); gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_TrySpectralThiefSteal(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + + bool32 contrary = GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY; + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + { + if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) + { + bool32 byTwo = FALSE; + + gBattleStruct->stolenStats[0] |= (1 << (stat)); + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[stat] = gBattleMons[gBattlerTarget].statStages[stat] - DEFAULT_STAT_STAGE; + + while (gBattleMons[gBattlerAttacker].statStages[stat] + gBattleStruct->stolenStats[stat] > MAX_STAT_STAGE) + gBattleStruct->stolenStats[stat]--; + + gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; + + if (gBattleStruct->stolenStats[stat] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + stat; + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + stat; + } + else + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); + } + } + } + + if (gBattleStruct->stolenStats[0] != 0) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SpectralThiefPrintStats(void) +{ + NATIVE_ARGS(); + + for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + { + if (gBattleStruct->stolenStats[0] & (1u << stat)) + { + gBattleStruct->stolenStats[0] &= ~(1u << stat); + SET_STATCHANGER(stat, gBattleStruct->stolenStats[stat], FALSE); + if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), + stat, + MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StatUpMsg; + return; + } + } + } + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 0b6a1dd72f..7d244b5ebf 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2225,4 +2225,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_SPECTRAL_THIEF] = + { + .battleScript = BattleScript_EffectSpectralThief, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index a7c46bd1fc..31ac2afe4c 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -16562,7 +16562,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .description = COMPOUND_STRING( "Steals the target's stat\n" "boosts, then attacks."), - .effect = EFFECT_HIT, + .effect = EFFECT_SPECTRAL_THIEF, .power = 90, .type = TYPE_GHOST, .accuracy = 100, @@ -16573,9 +16573,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .ignoresSubstitute = TRUE, .makesContact = TRUE, .metronomeBanned = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_SPECTRAL_THIEF, - }), .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, diff --git a/test/battle/ability/big_pecks.c b/test/battle/ability/big_pecks.c index 0c61dd3ba3..e8449fdf1a 100644 --- a/test/battle/ability/big_pecks.c +++ b/test/battle/ability/big_pecks.c @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting posi { GIVEN { ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); - ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF)); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); ASSUME(gMovesInfo[MOVE_SOAK].effect == EFFECT_SOAK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } @@ -86,8 +86,8 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting posi } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HARDEN, opponent); MESSAGE("The opposing Pidgey's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); MESSAGE("Wobbuffet stole the target's boosted stats!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); } THEN { EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE); } diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index 1e955431a1..cb4b21aefe 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -377,7 +377,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF) == TRUE); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); ASSUME(gMovesInfo[MOVE_AGILITY].effect == EFFECT_SPEED_UP_2); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(species) { Speed(5); Ability(ability); } diff --git a/test/battle/ability/hyper_cutter.c b/test/battle/ability/hyper_cutter.c index a688da2531..d63938b606 100644 --- a/test/battle/ability/hyper_cutter.c +++ b/test/battle/ability/hyper_cutter.c @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p { GIVEN { ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); - ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF)); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -125,8 +125,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); MESSAGE("The opposing Krabby's Attack sharply rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); MESSAGE("Wobbuffet stole the target's boosted stats!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); } THEN { EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); } diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index b047ec988f..d1dfad7ceb 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -174,7 +174,7 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro GIVEN { ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP); - ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF) == TRUE); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -191,8 +191,8 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro MESSAGE("The opposing Staryu's Attack rose!"); MESSAGE("The opposing Staryu's accuracy rose!"); } - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); MESSAGE("Wobbuffet stole the target's boosted stats!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, player); } THEN { EXPECT_EQ(opponent->statStages[STAT_ACC], DEFAULT_STAT_STAGE); } diff --git a/test/battle/move_effect/spectral_thief.c b/test/battle/move_effect/spectral_thief.c new file mode 100644 index 0000000000..7bb5d5a536 --- /dev/null +++ b/test/battle/move_effect/spectral_thief.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Spectral Thief steals opponents boost before attacking", s16 damage) +{ + u32 move; + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_SWORDS_DANCE; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (move == MOVE_CELEBRATE) + TURN { MOVE(player, move); MOVE(opponent, MOVE_SPECTRAL_THIEF); } + else + TURN { MOVE(player, move); MOVE(opponent, MOVE_SPECTRAL_THIEF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + MESSAGE("The opposing Wobbuffet used Spectral Thief!"); + if (move == MOVE_SWORDS_DANCE) + MESSAGE("The opposing Wobbuffet stole the target's boosted stats!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Spectral Thief can't steal opponent's boost if target is immune") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + PLAYER(SPECIES_MEOWTH); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_SPECTRAL_THIEF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + MESSAGE("The opposing Wobbuffet used Spectral Thief!"); + NONE_OF { + MESSAGE("The opposing Wobbuffet stole the target's boosted stats!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPECTRAL_THIEF, opponent); + } + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} From 41882b267df9eac9dbfbfe6fe4e897c9975aa82c Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 8 Feb 2025 15:51:22 -0500 Subject: [PATCH 083/125] Consolidate duplicate dialogue of nature girl in Battle Frontier (#6195) --- data/maps/BattleFrontier_Lounge5/scripts.inc | 116 +++---------------- include/strings.h | 31 ++--- src/pokemon.c | 50 ++++---- 3 files changed, 53 insertions(+), 144 deletions(-) diff --git a/data/maps/BattleFrontier_Lounge5/scripts.inc b/data/maps/BattleFrontier_Lounge5/scripts.inc index b81c748e5d..7dc4251fcc 100644 --- a/data/maps/BattleFrontier_Lounge5/scripts.inc +++ b/data/maps/BattleFrontier_Lounge5/scripts.inc @@ -51,138 +51,60 @@ BattleFrontier_Lounge5_Text_NatureGirlNoneShown:: .string "Boo!\n" .string "Cheapie!$" -BattleFrontier_Lounge5_Text_NatureGirlHardy:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "It will battle even if it has a lot\l" .string "of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlLonely:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlBrave:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "But if it gets enough ouchies,\l" .string "it will worry about itself!$" -BattleFrontier_Lounge5_Text_NatureGirlAdamant:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlNaughty:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlBold:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" - -BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlRelaxed:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlImpish:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" - -BattleFrontier_Lounge5_Text_NatureGirlLax:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "It says it likes to be sneaky even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlTimid:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "But if it gets enough ouchies,\l" .string "it will turn sneaky!$" -BattleFrontier_Lounge5_Text_NatureGirlHasty:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow:: .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlSerious:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "It says it likes to be sneaky even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlJolly:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" + .string "This one says it looks after itself!\n" .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" + .string "it will hit back!$" -BattleFrontier_Lounge5_Text_NatureGirlModest:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow:: .string "Hmhm…\p" .string "This one says it looks after itself!\n" .string "It says it worries about itself whether\l" .string "or not it has a lot of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlMild:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow:: .string "Hmhm…\p" .string "This one says it looks after itself!\n" .string "But if it gets enough ouchies,\l" .string "it will turn sneaky!$" -BattleFrontier_Lounge5_Text_NatureGirlBashful:: +BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow:: .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "It says it worries about itself even\l" - .string "if it has a lot of ouchies!$" + .string "This one says it likes to be sneaky!\n" + .string "But if it gets enough ouchies,\l" + .string "it will hit back!$" -BattleFrontier_Lounge5_Text_NatureGirlRash:: +BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow:: + .string "Hmhm…\p" + .string "This one says it likes to be sneaky!\n" + .string "But if it gets enough ouchies,\l" + .string "it will worry about itself!$" + +BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow:: .string "Hmhm…\p" .string "This one says it likes to be sneaky!\n" .string "It says it likes to be sneaky even\l" .string "if it has a lot of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlCalm:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "It says it worries about itself even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlGentle:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlSassy:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "But if it gets enough ouchies,\l" - .string "it will turn sneaky!$" - -BattleFrontier_Lounge5_Text_NatureGirlCareful:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will turn sneaky!$" - BattleFrontier_Lounge5_Text_NatureGirlEgg:: .string "That's silly! An EGG is asleep!\n" .string "I can't talk to it!$" diff --git a/include/strings.h b/include/strings.h index 06a3a658a2..9eb678d23e 100644 --- a/include/strings.h +++ b/include/strings.h @@ -553,28 +553,15 @@ extern const u8 BattleFrontier_Lounge2_Text_PyramidKingSilverMons[]; extern const u8 BattleFrontier_Lounge2_Text_PyramidKingGoldMons[]; // Battle Frontier Nature Girl -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlHardy[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlLonely[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBrave[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAdamant[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlNaughty[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBold[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlRelaxed[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlImpish[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlLax[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlTimid[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlHasty[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSerious[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlJolly[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlModest[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlMild[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBashful[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlRash[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlCalm[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlGentle[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSassy[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlCareful[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow[]; // Battle Frontier Gambler extern const u8 BattleFrontier_Lounge3_Text_ChallengeBattleTowerSingle[]; diff --git a/src/pokemon.c b/src/pokemon.c index 830b1878f1..128f09f514 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -382,7 +382,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 0, .pokeBlockAnim = {ANIM_HARDY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlHardy, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(61, 7, 61, 7), //32% support >= 50% HP, 32% support < 50% HP .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -394,7 +394,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_LONELY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlLonely, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow, .battlePalacePercents = PALACE_STYLE(20, 25, 84, 8), //55%, 8% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -406,7 +406,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 0, .pokeBlockAnim = {ANIM_BRAVE, AFFINE_TURN_UP}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBrave, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow, .battlePalacePercents = PALACE_STYLE(70, 15, 32, 60), //15%, 8% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -418,7 +418,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_ADAMANT, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAdamant, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(38, 31, 70, 15), //31%, 15% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -430,7 +430,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 0, .pokeBlockAnim = {ANIM_NAUGHTY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlNaughty, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow, .battlePalacePercents = PALACE_STYLE(20, 70, 70, 22), //10%, 8% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -442,7 +442,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 1, .pokeBlockAnim = {ANIM_BOLD, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBold, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow, .battlePalacePercents = PALACE_STYLE(30, 20, 32, 58), //50%, 10% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -454,7 +454,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 1, .pokeBlockAnim = {ANIM_DOCILE, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_RANDOM, @@ -466,7 +466,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_RELAXED, AFFINE_TURN_UP_AND_DOWN}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlRelaxed, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow, .battlePalacePercents = PALACE_STYLE(25, 15, 75, 15), //60%, 10% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -478,7 +478,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_IMPISH, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlImpish, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow, .battlePalacePercents = PALACE_STYLE(69, 6, 28, 55), //25%, 17% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -490,7 +490,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_LAX, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlLax, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(35, 10, 29, 6), //55%, 65% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -502,7 +502,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 2, .pokeBlockAnim = {ANIM_TIMID, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlTimid, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow, .battlePalacePercents = PALACE_STYLE(62, 10, 30, 20), //28%, 50% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -514,7 +514,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 0, .pokeBlockAnim = {ANIM_HASTY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlHasty, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(58, 37, 88, 6), //5%, 6% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -526,7 +526,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_SERIOUS, AFFINE_TURN_DOWN}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSerious, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(34, 11, 29, 11), //55%, 60% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -538,7 +538,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_JOLLY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlJolly, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow, .battlePalacePercents = PALACE_STYLE(35, 5, 35, 60), //60%, 5% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -550,7 +550,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 0, .pokeBlockAnim = {ANIM_NAIVE, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_RANDOM, @@ -562,7 +562,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 2, .pokeBlockAnim = {ANIM_MODEST, AFFINE_TURN_DOWN_SLOW}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlModest, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(35, 45, 34, 60), //20%, 6% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -574,7 +574,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_MILD, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlMild, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow, .battlePalacePercents = PALACE_STYLE(44, 50, 34, 6), //6%, 60% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -586,7 +586,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 2, .pokeBlockAnim = {ANIM_QUIET, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -598,7 +598,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 2, .pokeBlockAnim = {ANIM_BASHFUL, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBashful, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(30, 58, 30, 58), //12%, 12% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -610,7 +610,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_RASH, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlRash, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(30, 13, 27, 6), //57%, 67% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -622,7 +622,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 1, .pokeBlockAnim = {ANIM_CALM, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlCalm, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(40, 50, 25, 62), //10%, 13% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -634,7 +634,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_GENTLE, AFFINE_TURN_DOWN_SLIGHT}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlGentle, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow, .battlePalacePercents = PALACE_STYLE(18, 70, 90, 5), //12%, 5% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -646,7 +646,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_SASSY, AFFINE_TURN_UP_HIGH}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSassy, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow, .battlePalacePercents = PALACE_STYLE(88, 6, 22, 20), //6%, 58% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -658,7 +658,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 2, .pokeBlockAnim = {ANIM_CAREFUL, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlCareful, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow, .battlePalacePercents = PALACE_STYLE(42, 50, 42, 5), //8%, 53% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -670,7 +670,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_QUIRKY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, From 6f541bb4490021907d43d3bface6edb5ebcbe45f Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:42:25 -0500 Subject: [PATCH 084/125] Fix Liquid Ooze + Leech Seed Test (#6217) Co-authored-by: ghoulslash --- data/battle_scripts_1.s | 4 ++++ test/battle/ability/liquid_ooze.c | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7f796eb0be..8f739ac707 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5952,10 +5952,14 @@ BattleScript_SafeguardEnds:: waitmessage B_WAIT_TIME_LONG end2 +@ Leech Seed end turn effect +@ attacker is the victim +@ target is the leech seeder (recieving HP) BattleScript_LeechSeedTurnDrainLiquidOoze:: call BattleScript_LeechSeedTurnDrain copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp + copybyte gBattlerAttacker, gBattlerTarget @ needed to get liquid ooze message correct goto BattleScript_LeechSeedTurnDrainGainHp BattleScript_LeechSeedTurnDrainHealBlock:: diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index 6398a0be2b..fb20522937 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -108,9 +108,11 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of } } -SINGLE_BATTLE_TEST("Liquid Ooze causes leech seedee to faint before seeder") +/* * https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(Ability)#In_battle: + * If the recipient of Leech Seed's effect were to faint due to Liquid Ooze on the same turn as the victim of Leech Seed, then the victim faints before the recipient. This means that the victim's team loses the battle if both teams had their final Pokémon sent out. + */ +SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder") { - KNOWN_FAILING; // Message fails u16 ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIQUID_OOZE; } @@ -120,16 +122,17 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seedee to faint before seeder") } WHEN { TURN { MOVE(player, MOVE_LEECH_SEED); } } SCENE { + // Player seeds opponent MESSAGE("Bulbasaur used Leech Seed!"); // Drain at end of turn ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, opponent); if (ability != ABILITY_LIQUID_OOZE) { - MESSAGE("The opposing Tentacool's health is sapped by Leech Seed!"); MESSAGE("The opposing Tentacool fainted!"); + MESSAGE("The opposing Tentacool's health is sapped by Leech Seed!"); } else { + MESSAGE("The opposing Tentacool fainted!"); ABILITY_POPUP(opponent, ABILITY_LIQUID_OOZE); MESSAGE("Bulbasaur sucked up the liquid ooze!"); - MESSAGE("The opposing Tentacool fainted!"); MESSAGE("Bulbasaur fainted!"); } } From 43bce41796f8298aea53813c21ebf144f371dcae Mon Sep 17 00:00:00 2001 From: Zatsu <118256341+fakuzatsu@users.noreply.github.com> Date: Sat, 8 Feb 2025 23:54:58 +0000 Subject: [PATCH 085/125] Add caught mon to full party by sending a different mon to the Box (#6058) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- asm/macros/battle_script.inc | 6 +- data/battle_scripts_2.s | 6 +- data/text/pc_transfer.inc | 6 + include/config/battle.h | 2 + include/constants/battle_string_ids.h | 14 +- include/constants/party_menu.h | 4 +- include/naming_screen.h | 2 + include/strings.h | 5 + src/battle_controller_player.c | 3 +- src/battle_message.c | 11 +- src/battle_script_commands.c | 178 +++++++++++++++++++++----- src/data/party_menu.h | 1 + src/naming_screen.c | 22 ++-- src/party_menu.c | 74 ++++++++++- src/strings.c | 2 + 15 files changed, 268 insertions(+), 68 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ae47761d7c..63b1be9f76 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1277,8 +1277,9 @@ .byte 0xef .endm - .macro givecaughtmon + .macro givecaughtmon passInstr:req .byte 0xf0 + .4byte \passInstr .endm .macro trysetcaughtmondexflags failInstr:req @@ -1290,9 +1291,8 @@ .byte 0xf2 .endm - .macro trygivecaughtmonnick successInstr:req + .macro trygivecaughtmonnick .byte 0xf3 - .4byte \successInstr .endm .macro subattackerhpbydmg diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index bd87dbf3ef..572d076fab 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -195,13 +195,13 @@ BattleScript_TryNicknameCaughtMon:: printstring STRINGID_GIVENICKNAMECAPTURED waitstate setbyte gBattleCommunication, 0 - trygivecaughtmonnick BattleScript_GiveCaughtMonEnd - givecaughtmon + trygivecaughtmonnick + givecaughtmon BattleScript_SuccessBallThrowEnd printfromtable gCaughtMonStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_SuccessBallThrowEnd BattleScript_GiveCaughtMonEnd:: - givecaughtmon + givecaughtmon BattleScript_SuccessBallThrowEnd BattleScript_SuccessBallThrowEnd:: setbyte gBattleOutcome, B_OUTCOME_CAUGHT finishturn diff --git a/data/text/pc_transfer.inc b/data/text/pc_transfer.inc index 3fa255340b..b6995d1111 100644 --- a/data/text/pc_transfer.inc +++ b/data/text/pc_transfer.inc @@ -22,6 +22,12 @@ gText_PkmnTransferredLanettesPCBoxFull:: .string "{STR_VAR_2} was transferred to\n" .string "BOX “{STR_VAR_1}.”$" +gText_PkmnSentToPCAfterCatch:: + .string "{STR_VAR_2} was sent to\n" + .string "{B_PC_CREATOR_NAME} PC.\p" + .string "It was placed in \n" + .string "BOX “{STR_VAR_1}”.$" + gText_NoMoreRoomForPokemon:: .string "There's no more room for POKéMON!\p" .string "The POKéMON BOXES are full and\n" diff --git a/include/config/battle.h b/include/config/battle.h index 898fc4416b..f7b2825b0b 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -250,6 +250,8 @@ #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. #define B_LAST_USED_BALL_CYCLE TRUE // If TRUE, then holding B_LAST_USED_BALL_BUTTON while pressing the D-Pad cycles through the balls +#define B_CATCH_SWAP_INTO_PARTY GEN_LATEST // In Gen 7+, the option to swap the caught wild mon to the party will appear, allowing you to send a different mon to the box. +#define B_CATCH_SWAP_CHECK_HMS TRUE // If TRUE, the catch swap feature above will prevent returning mons to the box if they know HMs. // Other settings #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index a70ccbe5e8..3ba637c690 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -727,8 +727,10 @@ #define STRINGID_SUPEREFFECTIVETWOFOES 725 #define STRINGID_NOTVERYEFFECTIVETWOFOES 726 #define STRINGID_ITDOESNTAFFECTTWOFOES 727 +#define STRINGID_SENDCAUGHTMONPARTYORBOX 728 +#define STRINGID_PKMNSENTTOPCAFTERCATCH 729 -#define BATTLESTRINGS_COUNT 728 +#define BATTLESTRINGS_COUNT 730 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, @@ -892,10 +894,12 @@ #define B_MSG_WEAKEN_FIRE 1 // gCaughtMonStringIds -#define B_MSG_SENT_SOMEONES_PC 0 -#define B_MSG_SENT_LANETTES_PC 1 -#define B_MSG_SOMEONES_BOX_FULL 2 -#define B_MSG_LANETTES_BOX_FULL 3 +#define B_MSG_NO_MESSSAGE_SKIP 0 +#define B_MSG_SENT_SOMEONES_PC 1 +#define B_MSG_SENT_LANETTES_PC 2 +#define B_MSG_SOMEONES_BOX_FULL 3 +#define B_MSG_LANETTES_BOX_FULL 4 +#define B_MSG_SWAPPED_INTO_PARTY 5 // gPrimalWeatherBlocksStringIds #define B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN 0 diff --git a/include/constants/party_menu.h b/include/constants/party_menu.h index e997dd566d..76360d8ee8 100644 --- a/include/constants/party_menu.h +++ b/include/constants/party_menu.h @@ -48,7 +48,7 @@ #define PARTY_ACTION_CHOOSE_AND_CLOSE 11 #define PARTY_ACTION_MOVE_TUTOR 12 #define PARTY_ACTION_MINIGAME 13 -#define PARTY_ACTION_REUSABLE_ITEM 14 // Unused. The only reusable items are handled separately +#define PARTY_ACTION_SEND_MON_TO_BOX 14 #define PARTY_ACTION_CHOOSE_FAINTED_MON 15 // IDs for DisplayPartyMenuStdMessage, to display the message at the bottom of the party menu @@ -82,6 +82,8 @@ #define PARTY_MSG_WHICH_APPLIANCE 27 #define PARTY_MSG_CHOOSE_SECOND_FUSION 28 #define PARTY_MSG_NO_POKEMON 29 +#define PARTY_MSG_CHOOSE_MON_FOR_BOX 30 + #define PARTY_MSG_NONE 127 // IDs for DisplayPartyPokemonDescriptionText, to display a message in the party pokemon's box diff --git a/include/naming_screen.h b/include/naming_screen.h index a0cd3cf74b..315868c3ab 100644 --- a/include/naming_screen.h +++ b/include/naming_screen.h @@ -12,6 +12,8 @@ enum { NAMING_SCREEN_CODE, }; +extern void BattleMainCB2(void); + void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback); #endif // GUARD_NAMING_SCREEN_H diff --git a/include/strings.h b/include/strings.h index 9eb678d23e..588d513d4b 100644 --- a/include/strings.h +++ b/include/strings.h @@ -1538,6 +1538,7 @@ extern const u8 gText_PkmnTransferredSomeonesPCBoxFull[]; extern const u8 gText_PkmnTransferredLanettesPCBoxFull[]; extern const u8 gText_PkmnTransferredSomeonesPC[]; extern const u8 gText_PkmnTransferredLanettesPC[]; +extern const u8 gText_PkmnSentToPCAfterCatch[]; // hall of fame extern const u8 gText_LeagueChamp[]; @@ -1571,6 +1572,7 @@ extern const u8 gDaycareText_PlayOther[]; extern const u8 gText_ChoosePokemon[]; extern const u8 gText_ChoosePokemonCancel[]; extern const u8 gText_ChoosePokemonConfirm[]; +extern const u8 gText_SendWhichMonToPC[]; extern const u8 gText_MoveToWhere[]; extern const u8 gText_TeachWhichPokemon[]; extern const u8 gText_UseOnWhichPokemon[]; @@ -2416,4 +2418,7 @@ extern const u8 gText_PlayerScurriedBackHome[]; extern const u8 gText_Relearn[]; // move relearner from summary screen extern const u8 gText_Rename[]; // change nickname from summary screen +// Switch Caught Mon into Party +extern const u8 gText_CannotSendMonToBoxHM[]; + #endif // GUARD_STRINGS_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 13b9213b8e..78b7852374 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2174,7 +2174,8 @@ static void PlayerHandleChoosePokemon(u32 battler) gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON) + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(battler); diff --git a/src/battle_message.c b/src/battle_message.c index 1538aec1c9..c463474d40 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -891,6 +891,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_SUPEREFFECTIVETWOFOES] = COMPOUND_STRING("It's super effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"), [STRINGID_NOTVERYEFFECTIVETWOFOES] = COMPOUND_STRING("It's not very effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"), [STRINGID_ITDOESNTAFFECTTWOFOES] = COMPOUND_STRING("It doesn't affect {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}…"), + [STRINGID_SENDCAUGHTMONPARTYORBOX] = COMPOUND_STRING("Add {B_DEF_NAME} to your party?"), + [STRINGID_PKMNSENTTOPCAFTERCATCH] = gText_PkmnSentToPCAfterCatch, }; const u16 gTrainerUsedItemStringIds[] = @@ -1361,10 +1363,11 @@ const u16 gFlashFireStringIds[] = const u16 gCaughtMonStringIds[] = { - [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, - [B_MSG_SENT_LANETTES_PC] = STRINGID_PKMNTRANSFERREDLANETTESPC, - [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, - [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, + [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, + [B_MSG_SENT_LANETTES_PC] = STRINGID_PKMNTRANSFERREDLANETTESPC, + [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, + [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, + [B_MSG_SWAPPED_INTO_PARTY] = STRINGID_PKMNSENTTOPCAFTERCATCH, }; const u16 gRoomsStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b0fe3281bf..6efa734d10 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -302,6 +302,16 @@ static const u16 sTrappingMoves[NUM_TRAPPING_MOVES] = static const u16 sWhiteOutBadgeMoney[9] = { 8, 16, 24, 36, 48, 64, 80, 100, 120 }; +enum GiveCaughtMonStates +{ + GIVECAUGHTMON_CHECK_PARTY_SIZE, + GIVECAUGHTMON_ASK_ADD_TO_PARTY, + GIVECAUGHTMON_HANDLE_INPUT, + GIVECAUGHTMON_DO_CHOOSE_MON, + GIVECAUGHTMON_HANDLE_CHOSEN_MON, + GIVECAUGHTMON_GIVE_AND_SHOW_MSG, +}; + #define STAT_CHANGE_WORKED 0 #define STAT_CHANGE_DIDNT_WORK 1 @@ -16111,41 +16121,145 @@ static void Cmd_handleballthrow(void) static void Cmd_givecaughtmon(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *passInstr); + enum GiveCaughtMonStates state = gBattleCommunication[MULTIUSE_STATE]; - if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) + switch (state) { - u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; - if (lostItem != ITEM_NONE && ItemId_GetPocket(lostItem) != POCKET_BERRIES) - SetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items - } - - if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY) - { - if (!ShouldShowBoxWasFullMessage()) + case GIVECAUGHTMON_CHECK_PARTY_SIZE: + if (CalculatePlayerPartyCount() == PARTY_SIZE && B_CATCH_SWAP_INTO_PARTY >= GEN_7) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + PrepareStringBattle(STRINGID_SENDCAUGHTMONPARTYORBOX, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_ASK_ADD_TO_PARTY; } else { - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); - StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NO_MESSSAGE_SKIP; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_ASK_ADD_TO_PARTY: + HandleBattleWindow(YESNOBOX_X_Y, 0); + BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_INPUT; + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + break; + case GIVECAUGHTMON_HANDLE_INPUT: + if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + } + if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 1; + BattleCreateYesNoCursorAt(1); + } + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[CURSOR_POSITION] == 0) + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_DO_CHOOSE_MON; + } + else + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_DO_CHOOSE_MON: + if (!gPaletteFade.active) + { + BtlController_EmitChoosePokemon(gBattlerAttacker, BUFFER_A, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; + } + break; + case GIVECAUGHTMON_HANDLE_CHOSEN_MON: + if (gSelectedMonPartyId != PARTY_SIZE) + { + if (gSelectedMonPartyId > PARTY_SIZE) + { + // Choosing Pokemon was cancelled + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + // Mon chosen, try to put it in the PC + if (CopyMonToPC(&gPlayerParty[gSelectedMonPartyId]) == MON_GIVEN_TO_PC) + { + GetMonNickname(&gPlayerParty[gSelectedMonPartyId], gStringVar2); + StringCopy(gStringVar1, GetBoxNamePtr(GetPCBoxToSendMon())); + ZeroMonData(&gPlayerParty[gSelectedMonPartyId]); + gBattleStruct->itemLost[B_SIDE_PLAYER][gSelectedMonPartyId].originalItem = ITEM_NONE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWAPPED_INTO_PARTY; + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + } + break; + case GIVECAUGHTMON_GIVE_AND_SHOW_MSG: + if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) + { + u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; + if (lostItem != ITEM_NONE && ItemId_GetPocket(lostItem) != POCKET_BERRIES) + SetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items } - // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL - if (FlagGet(FLAG_SYS_PC_LANETTE)) - gBattleCommunication[MULTISTRING_CHOOSER]++; + if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY + && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) + { + if (!ShouldShowBoxWasFullMessage()) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + } + else + { + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; + } + + // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL + if (FlagGet(FLAG_SYS_PC_LANETTE)) + gBattleCommunication[MULTISTRING_CHOOSER]++; + } + + gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_POKEBALL, NULL); + + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = 0; + + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_NO_MESSSAGE_SKIP) + gBattlescriptCurrInstr = cmd->passInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; } - - gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_POKEBALL, NULL); - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_trysetcaughtmondexflags(void) @@ -16288,7 +16402,7 @@ void BattleDestroyYesNoCursorAt(u8 cursorPosition) static void Cmd_trygivecaughtmonnick(void) { - CMD_ARGS(const u8 *successInstr); + CMD_ARGS(); switch (gBattleCommunication[MULTIUSE_STATE]) { @@ -16343,7 +16457,7 @@ static void Cmd_trygivecaughtmonnick(void) GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL), - BattleMainCB2); + ReshowBattleScreenAfterMenu); gBattleCommunication[MULTIUSE_STATE]++; } @@ -16352,14 +16466,12 @@ static void Cmd_trygivecaughtmonnick(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); - gBattlescriptCurrInstr = cmd->successInstr; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->successInstr; + gBattleCommunication[MULTIUSE_STATE] = 0; + gBattlescriptCurrInstr = cmd->nextInstr; break; } } diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 168387dbf4..ec7026fcb5 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -660,6 +660,7 @@ static const u8 *const sActionStringTable[] = [PARTY_MSG_WHICH_APPLIANCE] = gText_WhichAppliance, [PARTY_MSG_CHOOSE_SECOND_FUSION] = gText_NextFusionMon, [PARTY_MSG_NO_POKEMON] = COMPOUND_STRING("You have no POKéMON."), + [PARTY_MSG_CHOOSE_MON_FOR_BOX] = gText_SendWhichMonToPC, }; static const u8 *const sDescriptionStringTable[] = diff --git a/src/naming_screen.c b/src/naming_screen.c index f5f780ed1c..e1307aa658 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -672,18 +672,8 @@ static bool8 MainState_PressedOKButton(void) SetInputState(INPUT_STATE_DISABLED); SetCursorFlashing(FALSE); TryStartButtonFlash(BUTTON_COUNT, FALSE, TRUE); - if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON - && CalculatePlayerPartyCount() >= PARTY_SIZE) - { - DisplaySentToPCMessage(); - sNamingScreen->state = STATE_WAIT_SENT_TO_PC_MESSAGE; - return FALSE; - } - else - { - sNamingScreen->state = STATE_FADE_OUT; - return TRUE; - } + sNamingScreen->state = STATE_FADE_OUT; + return TRUE; } static bool8 MainState_FadeOut(void) @@ -699,7 +689,11 @@ static bool8 MainState_Exit(void) { if (sNamingScreen->templateNum == NAMING_SCREEN_PLAYER) SeedRngAndSetTrainerId(); - SetMainCallback2(sNamingScreen->returnCallback); + if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON + && CalculatePlayerPartyCount() < PARTY_SIZE) + SetMainCallback2(BattleMainCB2); + else + SetMainCallback2(sNamingScreen->returnCallback); DestroyTask(FindTaskIdByFunc(Task_NamingScreen)); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sNamingScreen); @@ -707,7 +701,7 @@ static bool8 MainState_Exit(void) return FALSE; } -static void DisplaySentToPCMessage(void) +static UNUSED void DisplaySentToPCMessage(void) { u8 stringToDisplay = 0; diff --git a/src/party_menu.c b/src/party_menu.c index bda62ba3d1..784f13acdd 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -174,6 +174,14 @@ enum { #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 +#define HM_MOVES_END 0xFFFF + +static const u16 sHMMoves[] = +{ + MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, + MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END +}; + enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, @@ -320,6 +328,7 @@ static void HandleChooseMonSelection(u8, s8 *); static u16 PartyMenuButtonHandler(s8 *); static s8 *GetCurrentPartySlotPtr(void); static bool8 IsSelectedMonNotEgg(u8 *); +static bool8 DoesSelectedMonKnowHM(u8 *); static void PartyMenuRemoveWindow(u8 *); static void CB2_SetUpExitToBattleScreen(void); static void Task_ClosePartyMenuAfterText(u8); @@ -1524,6 +1533,30 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) } break; } + case PARTY_ACTION_SEND_MON_TO_BOX: + { + u8 partyId = GetPartyIdFromBattleSlot((u8)*slotPtr); + if (partyId == 0 || ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && partyId == 2) + || ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && partyId >= (PARTY_SIZE / 2))) + { + // Can't select if mon is currently on the field, or doesn't belong to you + PlaySE(SE_FAILURE); + } + else if (DoesSelectedMonKnowHM((u8 *)slotPtr)) + { + PlaySE(SE_FAILURE); + DisplayPartyMenuMessage(gText_CannotSendMonToBoxHM, FALSE); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = Task_ReturnToChooseMonAfterText; + } + else + { + PlaySE(SE_SELECT); + gSelectedMonPartyId = partyId; + Task_ClosePartyMenu(taskId); + } + break; + } default: case PARTY_ACTION_ABILITY_PREVENTS: case PARTY_ACTION_SWITCHING: @@ -1544,6 +1577,25 @@ static bool8 IsSelectedMonNotEgg(u8 *slotPtr) return TRUE; } +static bool8 DoesSelectedMonKnowHM(u8 *slotPtr) +{ + if (B_CATCH_SWAP_CHECK_HMS == FALSE) + return FALSE; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + u32 j = 0; + u16 move = GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i); + + while (sHMMoves[j] != HM_MOVES_END) + { + if (sHMMoves[j++] == move) + return TRUE; + } + } + return FALSE; +} + static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr) { switch (gPartyMenu.action) @@ -1561,6 +1613,11 @@ static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr) PlaySE(SE_SELECT); CancelParticipationPrompt(taskId); break; + case PARTY_ACTION_SEND_MON_TO_BOX: + PlaySE(SE_SELECT); + gSelectedMonPartyId = PARTY_SIZE + 1; + Task_ClosePartyMenu(taskId); + break; default: PlaySE(SE_SELECT); if (DisplayCancelChooseMonYesNo(taskId) != TRUE) @@ -1924,7 +1981,10 @@ static void Task_ReturnToChooseMonAfterText(u8 taskId) } else { - DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); + if (gPartyMenu.action == PARTY_ACTION_SEND_MON_TO_BOX) + DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON_FOR_BOX); + else + DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } @@ -4665,8 +4725,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) if (!IsItemFlute(item)) { PlaySE(SE_USE_ITEM); - if (gPartyMenu.action != PARTY_ACTION_REUSABLE_ITEM) - RemoveBagItem(item, 1); + RemoveBagItem(item, 1); } else { @@ -7124,7 +7183,14 @@ static u8 GetPartyLayoutFromBattleType(void) void OpenPartyMenuInBattle(u8 partyAction) { - InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); + u8 partyMessage; + + if (partyAction == PARTY_ACTION_SEND_MON_TO_BOX) + partyMessage = PARTY_MSG_CHOOSE_MON_FOR_BOX; + else + partyMessage = PARTY_MSG_CHOOSE_MON; + + InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, partyMessage, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } diff --git a/src/strings.c b/src/strings.c index 37feea0da0..c112db4616 100644 --- a/src/strings.c +++ b/src/strings.c @@ -319,6 +319,7 @@ const u8 gText_CurrentIsTooFast[] = _("The current is much too fast!"); const u8 gText_DoWhatWithMail[] = _("Do what with the MAIL?"); const u8 gText_ChoosePokemonCancel[] = _("Choose POKéMON or CANCEL."); const u8 gText_ChoosePokemonConfirm[] = _("Choose POKéMON and confirm."); +const u8 gText_SendWhichMonToPC[] = _("Send which POKéMON to the PC?"); const u8 gText_EnjoyCycling[] = _("Let's enjoy cycling!"); const u8 gText_InUseAlready_PM[] = _("This is in use already."); const u8 gText_AlreadyHoldingOne[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}."); @@ -1293,3 +1294,4 @@ const u8 gText_AM[] = _("AM"); const u8 gText_PM[] = _("PM"); const u8 gText_Relearn[] = _("{START_BUTTON} RELEARN"); // future note: don't decap this, because it mimics the summary screen BG graphics which will not get decapped const u8 gText_Rename[] = _("RENAME"); +const u8 gText_CannotSendMonToBoxHM[] = _("Cannot send that mon to the box,\nbecause it knows a HM move.{PAUSE_UNTIL_PRESS}"); From a8c9857a56532103bbdda02ad34120d75b637916 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:06:22 -0800 Subject: [PATCH 086/125] Prevented fanfares from playing in headless mode (#6219) --- src/sound.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/sound.c b/src/sound.c index db59e7e73c..9a67f2c21b 100644 --- a/src/sound.c +++ b/src/sound.c @@ -8,6 +8,7 @@ #include "constants/cries.h" #include "constants/songs.h" #include "task.h" +#include "test_runner.h" struct Fanfare { @@ -237,6 +238,13 @@ bool8 IsFanfareTaskInactive(void) static void Task_Fanfare(u8 taskId) { + if (gTestRunnerHeadless) + { + DestroyTask(taskId); + sFanfareCounter = 0; + return; + } + if (sFanfareCounter) { sFanfareCounter--; From d45a6487abaf9ce9f02bde5ccd1d5ab89a77805e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E9=9B=85?= <56014327+ExMingYan@users.noreply.github.com> Date: Sun, 9 Feb 2025 20:50:01 +0800 Subject: [PATCH 087/125] Fix Using a Safari Ball crashes the game #6206 (#6220) --- src/battle_main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index 43bc13277b..c3c3c11610 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -42,6 +42,7 @@ #include "pokemon.h" #include "random.h" #include "recorded_battle.h" +#include "reshow_battle_screen.h" #include "roamer.h" #include "safari_zone.h" #include "scanline_effect.h" @@ -3719,6 +3720,10 @@ static void DoBattleIntro(void) PrepareStringBattle(STRINGID_INTROSENDOUT, battler); } + else + { + CreateBattlerSprite(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); + } gBattleStruct->introState++; break; case BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT: From d3417b00a2b95d129c9f8fa785a66a5f8c33185c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 9 Feb 2025 11:37:56 -0300 Subject: [PATCH 088/125] Fixed compilation error when turning P_GENDER_DIFFERENCES off (#6223) --- src/event_object_movement.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index c0b24c9cbe..40ec9a411a 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1989,8 +1989,10 @@ static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) { struct SpritePalette spritePalette; u16 palTag = species + OBJ_EVENT_MON + (shiny ? OBJ_EVENT_MON_SHINY : 0); + #if P_GENDER_DIFFERENCES if (female && gSpeciesInfo[species].overworldShinyPaletteFemale != NULL) palTag += OBJ_EVENT_MON_FEMALE; + #endif // palette already loaded if ((paletteNum = IndexOfSpritePaletteTag(palTag)) < 16) return paletteNum; From 621d2ef83d91113b483df0dcadeda1cbd6f054d9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 9 Feb 2025 16:03:53 -0300 Subject: [PATCH 089/125] Fixed missing move encapsulation in upcoming (#6226) --- src/battle_ai_main.c | 8 ++++---- src/battle_ai_switch_items.c | 4 ++-- src/battle_ai_util.c | 2 +- src/battle_script_commands.c | 6 +++--- src/battle_tv.c | 2 +- src/battle_util.c | 4 ++-- test/battle/ability/aroma_veil.c | 28 +++++++++++++------------- test/battle/ability/big_pecks.c | 16 +++++++-------- test/battle/ability/innards_out.c | 6 +++--- test/battle/ability/lightning_rod.c | 2 +- test/battle/ability/liquid_voice.c | 4 ++-- test/battle/ability/shield_dust.c | 2 +- test/battle/ability/snow_cloak.c | 2 +- test/battle/ability/unnerve.c | 2 +- test/battle/ability/water_compaction.c | 8 ++++---- test/battle/ai/ai_switching.c | 2 +- test/battle/gimmick/terastal.c | 2 +- test/battle/hold_effect/covert_cloak.c | 2 +- test/battle/hold_effect/shell_bell.c | 2 +- test/battle/move_effect/charge.c | 2 +- test/battle/move_effect/electrify.c | 12 +++++------ test/battle/move_effect/evasion_up_2.c | 6 +++--- test/battle/move_effect/rapid_spin.c | 20 +++++++++--------- test/battle/trainer_slides.c | 2 +- 24 files changed, 73 insertions(+), 73 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 0a1dcf7679..261bfb83d0 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -760,7 +760,7 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink && aiThink->score[aiThink->movesetIndex] > 0 && ShouldConsiderMoveForBattler(battlerAtk, battlerDef, aiThink->moveConsidered)) { - if (IsChaseEffect(gMovesInfo[aiThink->moveConsidered].effect)) + if (IsChaseEffect(GetMoveEffect(aiThink->moveConsidered))) { // Save new switchin data simulatedDamageSwitchin[aiThink->movesetIndex] = aiData->simulatedDmg[battlerAtk][battlerDef][aiThink->movesetIndex]; @@ -5398,7 +5398,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 ability = gBattleMons[battlerAtk].ability; u32 opposingHazardFlags = gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES); u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); - u32 moveEffect = gMovesInfo[move].effect; + u32 moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = AI_DATA; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; @@ -5518,9 +5518,9 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Additional effects - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (GetMoveAdditionalEffectById(move, i)->moveEffect) { case MOVE_EFFECT_WRAP: ADJUST_SCORE(-GOOD_EFFECT); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 0001ad6c78..a10ed1f550 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -164,7 +164,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && gMovesInfo[playerMove].effect != EFFECT_FOCUS_PUNCH) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_CalcDamage(playerMove, opposingBattler, battler, &effectiveness, FALSE, weather, DMG_ROLL_HIGHEST).expected; if (damageTaken > maxDamageTaken) @@ -1703,7 +1703,7 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && gMovesInfo[playerMove].effect != EFFECT_FOCUS_PUNCH) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, FALSE, DMG_ROLL_HIGHEST); if (damageTaken > maxDamageTaken) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a516093a04..a2fa13bf84 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3923,7 +3923,7 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && gMovesInfo[GetBestDmgMoveFromBattler(battlerAtk, battlerDef)].effect != EFFECT_FOCUS_PUNCH) + if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef)) != EFFECT_FOCUS_PUNCH) || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6efa734d10..f01f029451 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6468,7 +6468,7 @@ static void Cmd_moveend(void) break; } case MOVEEND_RAPID_SPIN: - if (gMovesInfo[gCurrentMove].effect == EFFECT_RAPID_SPIN + if (GetMoveEffect(gCurrentMove) == EFFECT_RAPID_SPIN && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsBattlerTurnDamaged(gBattlerTarget)) { @@ -6644,7 +6644,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_HIT_SWITCH_TARGET: - if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_SWITCH_TARGET + if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_SWITCH_TARGET && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) @@ -7088,7 +7088,7 @@ static void Cmd_moveend(void) else // Eject Pack { if (!gDisableStructs[gBattlerTarget].startEmergencyExit - && !(gMovesInfo[gCurrentMove].effect == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) + && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) { effect = TRUE; gBattleStruct->battlerState[battler].usedEjectItem = TRUE; diff --git a/src/battle_tv.c b/src/battle_tv.c index 3ac5259c74..bdf3359b84 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -934,7 +934,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) // Various cases to add/remove points if (GetMoveRecoil(arg2) > 0) baseFromEffect++; // Recoil moves - if (gMovesInfo[arg2].effect == EFFECT_RAPID_SPIN) + if (GetMoveEffect(arg2) == EFFECT_RAPID_SPIN) baseFromEffect++; if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_SP_ATK_MINUS_2) || MoveHasAdditionalEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN)) baseFromEffect += 2; // Overheat, Superpower, etc. diff --git a/src/battle_util.c b/src/battle_util.c index d300bd5d2c..9ab49ee690 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8189,8 +8189,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && gBattlerAttacker != gBattlerTarget && !IsBattlerAtMaxHp(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker) - && gMovesInfo[gCurrentMove].effect != EFFECT_FUTURE_SIGHT - && gMovesInfo[gCurrentMove].effect != EFFECT_PAIN_SPLIT + && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { gLastUsedItem = atkItem; diff --git a/test/battle/ability/aroma_veil.c b/test/battle/ability/aroma_veil.c index 4965fec217..08dedfae6e 100644 --- a/test/battle/ability/aroma_veil.c +++ b/test/battle/ability/aroma_veil.c @@ -7,8 +7,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Taunt") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -28,8 +28,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Torment") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_TORMENT) == EFFECT_TORMENT); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -51,8 +51,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Encore") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -74,8 +74,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_DISABLE) == EFFECT_DISABLE); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -94,7 +94,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable") DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Cursed Body") { GIVEN { - ASSUME(gMovesInfo[MOVE_PECK].makesContact); + ASSUME(MoveMakesContact(MOVE_PECK)); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_JELLICENT) { Ability(ABILITY_CURSED_BODY); } @@ -118,8 +118,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Heal Block") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEAL_BLOCK].effect == EFFECT_HEAL_BLOCK); - ASSUME(gMovesInfo[MOVE_RECOVER].effect == EFFECT_RESTORE_HP); + ASSUME(GetMoveEffect(MOVE_HEAL_BLOCK) == EFFECT_HEAL_BLOCK); + ASSUME(GetMoveEffect(MOVE_RECOVER) == EFFECT_RESTORE_HP); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); HP(1); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -139,7 +139,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT); + ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -156,7 +156,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation") DOUBLE_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Imprison") { GIVEN { - ASSUME(gMovesInfo[MOVE_IMPRISON].effect == EFFECT_IMPRISON); + ASSUME(GetMoveEffect(MOVE_IMPRISON) == EFFECT_IMPRISON); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) {Moves(MOVE_IMPRISON, MOVE_CELEBRATE); } @@ -180,7 +180,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil prevents Psychic Noise's effect") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC_NOISE].additionalEffects[0].moveEffect == MOVE_EFFECT_PSYCHIC_NOISE); + ASSUME(GetMoveAdditionalEffectById(MOVE_PSYCHIC_NOISE, 0)->moveEffect == MOVE_EFFECT_PSYCHIC_NOISE); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/big_pecks.c b/test/battle/ability/big_pecks.c index 0c61dd3ba3..ec33dfb085 100644 --- a/test/battle/ability/big_pecks.c +++ b/test/battle/ability/big_pecks.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Big Pecks prevents Defense stage reduction from moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Big Pecks prevents Defense stage reduction from moves") SINGLE_BATTLE_TEST("Big Pecks is ignored by Mold Breaker") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Defense stage reduction from moves SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Topsy-Turvy") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); - ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); + ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -75,9 +75,9 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Topsy-Turvy") SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting positive Defense stage changes") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF)); - ASSUME(gMovesInfo[MOVE_SOAK].effect == EFFECT_SOAK); + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting posi SINGLE_BATTLE_TEST("Big Pecks doesn't prevent receiving negative Defense stage changes from Baton Pass") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } diff --git a/test/battle/ability/innards_out.c b/test/battle/ability/innards_out.c index ed11354e3a..516bde342e 100644 --- a/test/battle/ability/innards_out.c +++ b/test/battle/ability/innards_out.c @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Innards Out does not damage Magic Guard Pokemon") SINGLE_BATTLE_TEST("Innards Out uses correct damage amount for Future Sight") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Innards Out uses correct damage amount for Future Sight") SINGLE_BATTLE_TEST("Innards Out doesn't trigger if Future Sight user is not on field") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Innards Out doesn't trigger if Future Sight user is not on f SINGLE_BATTLE_TEST("Innards Out triggers if Future Sight user is back on the field") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index e3c0a59212..f2e9e434ce 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -75,7 +75,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to ta DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } diff --git a/test/battle/ability/liquid_voice.c b/test/battle/ability/liquid_voice.c index 79fec2f2a6..6d3fa992f1 100644 --- a/test/battle/ability/liquid_voice.c +++ b/test/battle/ability/liquid_voice.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].power > 0); + ASSUME(GetMoveType(MOVE_HYPER_VOICE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_HYPER_VOICE) > 0); } SINGLE_BATTLE_TEST("Liquid voice turns a sound move into a Water-type move") diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index c5a9fbec66..59f5b1162c 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -93,7 +93,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); diff --git a/test/battle/ability/snow_cloak.c b/test/battle/ability/snow_cloak.c index 35f0b01bf2..fe0adeaff9 100644 --- a/test/battle/ability/snow_cloak.c +++ b/test/battle/ability/snow_cloak.c @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Snow Cloak increases evasion during snow") { PASSES_RANDOMLY(4, 5, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_POUND].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_POUND) == 100); PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index ce35cf72c1..4547854231 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); PLAYER(mon) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } } WHEN { diff --git a/test/battle/ability/water_compaction.c b/test/battle/ability/water_compaction.c index 51297f5a8a..e4e32e2713 100644 --- a/test/battle/ability/water_compaction.c +++ b/test/battle/ability/water_compaction.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages when hit by a water type move") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -20,8 +20,8 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages when hit by a water SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a multi-hit Water type move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].strikeCount == 3); + ASSUME(GetMoveType(MOVE_SURGING_STRIKES) == TYPE_WATER); + ASSUME(GetMoveStrikeCount(MOVE_SURGING_STRIKES) == 3); PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water typ PARAMETRIZE { ability = ABILITY_SAND_VEIL; } PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_SANDYGAST) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index a6a0eb8d76..4f42fa9233 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -975,7 +975,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out if Yawn'd wi PARAMETRIZE{ aceFlag = 0; } PARAMETRIZE{ aceFlag = AI_FLAG_ACE_POKEMON; } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SLOWKING) { Moves(MOVE_YAWN, MOVE_CONFUSION, MOVE_POWER_GEM, MOVE_WATER_PULSE); Item(ITEM_LEFTOVERS); } OPPONENT(SPECIES_SCOLIPEDE) { Moves(MOVE_POISON_TAIL); } diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index c9e51faa8b..7ea75c3e4a 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -192,7 +192,7 @@ SINGLE_BATTLE_TEST("(TERA) Terastallization's 60 BP floor does not apply to dyna PARAMETRIZE { tera = GIMMICK_NONE; } PARAMETRIZE { tera = GIMMICK_TERA; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_SPOUT].effect == EFFECT_POWER_BASED_ON_USER_HP); + ASSUME(GetMoveEffect(MOVE_WATER_SPOUT) == EFFECT_POWER_BASED_ON_USER_HP); PLAYER(SPECIES_WOBBUFFET) { HP(1); TeraType(TYPE_WATER); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index 0920fc0ab9..583a250bcd 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index 32a105e46f..b0ed83d540 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -133,7 +133,7 @@ SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP of damage dealt") SINGLE_BATTLE_TEST("Shell Bell doesn't restore HP for damage dealt by a foreseen move") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_WOBBUFFET) { Level(16); Item(ITEM_SHELL_BELL); HP(10); } OPPONENT(SPECIES_WOBBUFFET) { Level(16); }; } WHEN { diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index dfbbc82283..8d4bbd9bcc 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_IRON_HEAD].additionalEffects[0].moveEffect == MOVE_EFFECT_FLINCH); + ASSUME(GetMoveAdditionalEffectById(MOVE_IRON_HEAD, 0)->moveEffect == MOVE_EFFECT_FLINCH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } } WHEN { diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index e60bbdaf22..12f9bec44f 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema { GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { @@ -21,7 +21,7 @@ DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_SANDSLASH); @@ -41,8 +41,8 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_LEER].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_LEER].type != TYPE_ELECTRIC); + ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveType(MOVE_LEER) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { @@ -58,8 +58,8 @@ SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves") KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].type != TYPE_ELECTRIC); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveType(MOVE_FUTURE_SIGHT) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { diff --git a/test/battle/move_effect/evasion_up_2.c b/test/battle/move_effect/evasion_up_2.c index cd5cb543a9..e38f037545 100644 --- a/test/battle/move_effect/evasion_up_2.c +++ b/test/battle/move_effect/evasion_up_2.c @@ -6,14 +6,14 @@ /* ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_X].effect == EFFECT_EVASION_UP_2); + ASSUME(GetMoveEffect(MOVE_X) == EFFECT_EVASION_UP_2); } SINGLE_BATTLE_TEST("Double Team raises Evasion by 1 stage") { - PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 5, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 5, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/rapid_spin.c b/test/battle/move_effect/rapid_spin.c index e5457395b9..9d142bf32e 100644 --- a/test/battle/move_effect/rapid_spin.c +++ b/test/battle/move_effect/rapid_spin.c @@ -1,19 +1,13 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); - ASSUME(gMovesInfo[MOVE_MORTAL_SPIN].effect == EFFECT_RAPID_SPIN); -#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 - ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); -#endif - ASSUME(MoveHasAdditionalEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON) == TRUE); -} - SINGLE_BATTLE_TEST("Rapid Spin activates after Toxic Debris") { GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); + #endif PLAYER(SPECIES_GLIMMORA) { Ability(ABILITY_TOXIC_DEBRIS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -29,6 +23,10 @@ SINGLE_BATTLE_TEST("Rapid Spin activates after Toxic Debris") SINGLE_BATTLE_TEST("Rapid Spin blows away Wrap, hazards and raises Speed (Gen 8+)") { GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); + #endif PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -49,6 +47,8 @@ SINGLE_BATTLE_TEST("Rapid Spin blows away Wrap, hazards and raises Speed (Gen 8+ SINGLE_BATTLE_TEST("Rapid Spin: Mortal Spin blows away Wrap, hazards and poisons foe") { GIVEN { + ASSUME(GetMoveEffect(MOVE_MORTAL_SPIN) == EFFECT_RAPID_SPIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index b5bb127a0c..3ad0c38248 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -141,7 +141,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { - ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); From 5f13f9545f17e97b68d4c11bb4b524fac2af2e59 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 9 Feb 2025 20:09:23 +0100 Subject: [PATCH 090/125] Redefine IsBattlerAlive in battle.h as a static inline (#6211) --- include/battle.h | 12 ++++++++++++ include/battle_util.h | 1 - src/battle_util.c | 12 ------------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/include/battle.h b/include/battle.h index e417d176b8..b7c0d5c7b7 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1186,6 +1186,18 @@ extern bool8 gLastUsedBallMenuPresent; extern u8 gPartyCriticalHits[PARTY_SIZE]; extern u8 gCategoryIconSpriteId; +static inline bool32 IsBattlerAlive(u32 battler) +{ + if (gBattleMons[battler].hp == 0) + return FALSE; + else if (battler >= gBattlersCount) + return FALSE; + else if (gAbsentBattlerFlags & (1u << battler)) + return FALSE; + else + return TRUE; +} + static inline bool32 IsBattlerTurnDamaged(u32 battler) { return gSpecialStatuses[battler].physicalDmg != 0 diff --git a/include/battle_util.h b/include/battle_util.h index f60fb32d18..e8b0dc697f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -241,7 +241,6 @@ u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 check u32 GetBattlerHoldEffectParam(u32 battler); bool32 IsMoveMakingContact(u32 move, u32 battlerAtk); bool32 IsBattlerGrounded(u32 battler); -bool32 IsBattlerAlive(u32 battler); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); diff --git a/src/battle_util.c b/src/battle_util.c index 9ab49ee690..e292c25493 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8853,18 +8853,6 @@ bool32 IsBattlerGrounded(u32 battler) return IsBattlerGroundedInverseCheck(battler, FALSE); } -bool32 IsBattlerAlive(u32 battler) -{ - if (gBattleMons[battler].hp == 0) - return FALSE; - else if (battler >= gBattlersCount) - return FALSE; - else if (gAbsentBattlerFlags & (1u << battler)) - return FALSE; - else - return TRUE; -} - u32 GetMoveSlot(u16 *moves, u32 move) { u32 i; From a2ad5d2ca3e49e02138ffbb434f26734fae55878 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 9 Feb 2025 17:54:03 -0300 Subject: [PATCH 091/125] Heal Bell/Aromatherapy/Sparkly Swirl improvements and fixes (#6210) --- data/battle_scripts_1.s | 41 +---- include/battle.h | 1 + include/battle_scripts.h | 3 +- include/constants/battle_move_effects.h | 1 - include/constants/generational_changes.h | 1 + include/generational_changes.h | 3 +- src/battle_ai_util.c | 11 +- src/battle_main.c | 1 - src/battle_script_commands.c | 155 ++++++++---------- src/data/battle_move_effects.h | 6 - src/data/moves_info.h | 12 +- test/battle/ai/ai_check_viability.c | 13 +- test/battle/gimmick/dynamax.c | 10 +- test/battle/move_effect/heal_bell.c | 103 ++++++++---- .../move_effect_secondary/aromatherapy.c | 51 ++++++ test/battle/sleep_clause.c | 3 +- 16 files changed, 230 insertions(+), 185 deletions(-) create mode 100644 test/battle/move_effect_secondary/aromatherapy.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8f739ac707..e77f288f57 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -956,15 +956,6 @@ BattleScript_MoveEffectIonDeluge:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectSparklySwirl:: - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - healpartystatus - waitstate - updatestatusicon BS_ATTACKER_WITH_PARTNER - waitstate - goto BattleScript_MoveEnd - BattleScript_MoveEffectHaze:: printstring STRINGID_STATCHANGESGONE waitmessage B_WAIT_TIME_LONG @@ -4075,13 +4066,16 @@ BattleScript_EffectHealBell:: attackcanceler attackstring ppreduce - healpartystatus - waitstate attackanimation waitanimation +BattleScript_EffectHealBell_FromHeal:: + healpartystatus + waitstate printfromtable gPartyStatusHealStringIds waitmessage B_WAIT_TIME_LONG - jumpifnotmove MOVE_HEAL_BELL, BattleScript_PartyHealEnd + jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_HealBellSoundproof + goto BattleScript_PartyHealEnd +BattleScript_HealBellSoundproof:: jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_ATTACKER, BattleScript_CheckHealBellMon2Unaffected printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG @@ -9966,29 +9960,6 @@ BattleScript_HealOneSixthAlliesEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectCureStatusAllies:: - jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd - savetarget - copybyte gBattlerTarget, gBattlerAttacker -BattleScript_CureStatusAlliesLoop: - jumpifabsent BS_TARGET, BattleScript_CureStatusAlliesIncrement - jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_CureStatusActivate -BattleScript_CureStatusAlliesIncrement: - jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_CureStatusAlliesEnd - setallytonexttarget BattleScript_CureStatusAlliesLoop -BattleScript_CureStatusAlliesEnd: - restoretarget - goto BattleScript_MoveEnd - -BattleScript_CureStatusActivate: - curestatus BS_TARGET - updatestatusicon BS_TARGET - swapattackerwithtarget - printstring STRINGID_PKMNSTATUSNORMAL - waitmessage B_WAIT_TIME_LONG - swapattackerwithtarget - goto BattleScript_CureStatusAlliesIncrement - BattleScript_EffectRecycleBerriesAllies:: savetarget copybyte gBattlerTarget, gBattlerAttacker diff --git a/include/battle.h b/include/battle.h index b7c0d5c7b7..c78101b1a2 100644 --- a/include/battle.h +++ b/include/battle.h @@ -17,6 +17,7 @@ #include "battle_dynamax.h" #include "battle_terastal.h" #include "battle_gimmick.h" +#include "generational_changes.h" #include "move.h" #include "random.h" // for rng_value_t #include "trainer_slide.h" diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 64e6018bcb..901d5d8c78 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -554,7 +554,6 @@ extern const u8 BattleScript_EffectMeanLookSide[]; extern const u8 BattleScript_TormentEnds[]; extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; extern const u8 BattleScript_EffectHealOneSixthAllies[]; -extern const u8 BattleScript_EffectCureStatusAllies[]; extern const u8 BattleScript_EffectRecycleBerriesAllies[]; extern const u8 BattleScript_RemoveGenericType[]; @@ -644,6 +643,7 @@ extern const u8 BattleScript_EffectSleepTalk[]; extern const u8 BattleScript_EffectDestinyBond[]; extern const u8 BattleScript_EffectSpite[]; extern const u8 BattleScript_EffectHealBell[]; +extern const u8 BattleScript_EffectHealBell_FromHeal[]; extern const u8 BattleScript_EffectMeanLook[]; extern const u8 BattleScript_EffectNightmare[]; extern const u8 BattleScript_EffectMinimize[]; @@ -822,7 +822,6 @@ extern const u8 BattleScript_MoveEffectLightScreen[]; extern const u8 BattleScript_MoveEffectReflect[]; extern const u8 BattleScript_MoveEffectLeechSeed[]; extern const u8 BattleScript_MoveEffectHaze[]; -extern const u8 BattleScript_EffectSparklySwirl[]; extern const u8 BattleScript_MoveEffectIonDeluge[]; extern const u8 BattleScript_EffectHyperspaceFury[]; extern const u8 BattleScript_EffectAuraWheel[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4d2ccef9ac..5b5b872da5 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -295,7 +295,6 @@ enum { EFFECT_RECOIL_HP_25, EFFECT_STUFF_CHEEKS, EFFECT_GRAV_APPLE, - EFFECT_SPARKLY_SWIRL, EFFECT_HYPERSPACE_FURY, EFFECT_AURA_WHEEL, EFFECT_PHOTON_GEYSER, diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 557b34b653..370853b73d 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -4,6 +4,7 @@ enum GenConfigTag { GEN_CONFIG_GALE_WINGS, + GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 5a726007c3..c517357c15 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -6,7 +6,8 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = { - [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, + [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, + [GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF, }; #if TESTING diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a2fa13bf84..05c4f5dac3 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3160,7 +3160,9 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; // Check partner's status - if ((B_HEAL_BELL_SOUNDPROOF == GEN_5 || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) + if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF + || !checkSoundproof) && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; } @@ -3171,7 +3173,8 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) } // Check attacker's status - if ((B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8 + if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 || AI_DATA->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; @@ -3181,7 +3184,9 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) { if (i == battlerOnField1 || i == battlerOnField2) continue; - if (B_HEAL_BELL_SOUNDPROOF < GEN_5 && checkSoundproof && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) + if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 + && checkSoundproof + && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) continue; if (GetMonData(&party[i], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; diff --git a/src/battle_main.c b/src/battle_main.c index 6e51a4d69f..5d16f5c3bc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -25,7 +25,6 @@ #include "event_data.h" #include "evolution_scene.h" #include "field_weather.h" -#include "generational_changes.h" #include "graphics.h" #include "gpu_regs.h" #include "international_string_util.h" diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f01f029451..f372df183b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4633,7 +4633,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) break; case MOVE_EFFECT_AROMATHERAPY: BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; + gBattlescriptCurrInstr = BattleScript_EffectHealBell_FromHeal; break; case MOVE_EFFECT_RECYCLE_BERRIES: { @@ -13946,106 +13946,87 @@ static void Cmd_healpartystatus(void) { CMD_ARGS(); - u32 zero = 0; + u32 i, zero = 0; u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); u8 toHeal = 0; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - s32 i; + bool32 isSoundMove = IsSoundMove(gCurrentMove); - if (gCurrentMove == MOVE_HEAL_BELL) + if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; - - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF - || B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8) - { - gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - } + if (isSoundMove) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; else - { - RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER; - } - - gBattleScripting.battler = partner; - - if (IsBattlerAlive(partner)) - { - if (GetBattlerAbility(partner) != ABILITY_SOUNDPROOF || B_HEAL_BELL_SOUNDPROOF == GEN_5) - { - gBattleMons[partner].status1 = 0; - gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE; - } - else - { - RecordAbilityBattle(partner, gBattleMons[partner].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER; - } - } - - // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF - - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); - - if (species != SPECIES_NONE && species != SPECIES_EGG) - { - u16 ability; - bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; - bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); - - if (B_HEAL_BELL_SOUNDPROOF == GEN_5 || (isAttacker && B_HEAL_BELL_SOUNDPROOF >= GEN_8)) - ability = ABILITY_NONE; - else if (B_HEAL_BELL_SOUNDPROOF > GEN_5 && !isAttacker && !isDoublesPartner) - ability = ABILITY_NONE; - else if (isAttacker) - ability = GetBattlerAbility(gBattlerAttacker); - else if (isDoublesPartner) - ability = GetBattlerAbility(partner); - else - { - ability = GetAbilityBySpecies(species, abilityNum); - #if TESTING - if (gTestRunnerEnabled) - { - u32 side = GetBattlerSide(gBattlerAttacker); - if (TestRunner_Battle_GetForcedAbility(side, i)) - ability = TestRunner_Battle_GetForcedAbility(side, i); - } - #endif - } - - if (ability != ABILITY_SOUNDPROOF) - { - toHeal |= (1 << i); - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); - } - } - } - } - else // Aromatherapy - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; - toHeal = (1 << PARTY_SIZE) - 1; - - for (i = 0; i < PARTY_SIZE; i++) - { - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); - } - + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; gBattleMons[gBattlerAttacker].status1 = 0; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + } + else + { + RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_ATTACKER; + } - if (IsDoubleBattle() - && !(gAbsentBattlerFlags & (1u <= GEN_8 && isAttacker)) + ability = ABILITY_NONE; + else if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) + ability = ABILITY_NONE; + else if (isAttacker) + ability = GetBattlerAbility(gBattlerAttacker); + else if (isDoublesPartner) + ability = GetBattlerAbility(partner); + else + { + ability = GetAbilityBySpecies(species, abilityNum); + #if TESTING + if (gTestRunnerEnabled) + { + u32 side = GetBattlerSide(gBattlerAttacker); + if (TestRunner_Battle_GetForcedAbility(side, i)) + ability = TestRunner_Battle_GetForcedAbility(side, i); + } + #endif + } + + if (!(isSoundMove && ability == ABILITY_SOUNDPROOF)) + { + toHeal |= (1 << i); + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); + } + } } if (toHeal) diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index ea6b26902c..4626e8e4fe 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1895,12 +1895,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_SPARKLY_SWIRL] = - { - .battleScript = BattleScript_EffectSparklySwirl, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_HYPERSPACE_FURY] = { .battleScript = BattleScript_EffectHyperspaceFury, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index ad6affabc1..1131846136 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -17068,7 +17068,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .description = COMPOUND_STRING( "Wrap foe with whirlwind of\n" "scent. Heals party's status."), - .effect = EFFECT_SPARKLY_SWIRL, // Temprorary + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_8 ? 120 : 90, .type = TYPE_FAIRY, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 85 : 100, @@ -17078,11 +17078,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, - // .additionalEffects = ADDITIONAL_EFFECTS({ - // .moveEffect = 0, // MOVE_EFFECT_AROMATHERAPY, Added 0 for Sheer Force boost - // .chance = 100, - // .sheerForceBoost = SHEER_FORCE_NO_BOOST, - // }), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AROMATHERAPY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), .battleAnimScript = gBattleAnimMove_SparklySwirl, }, diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 35f74d43c0..0e9377fdea 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -203,7 +203,7 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_8); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -219,21 +219,22 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") { - u32 status, ability; + u32 status, ability, config; PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; } - PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } - PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; config = GEN_5; } GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_5); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_BODY_PRESS, MOVE_HEAL_BELL); } OPPONENT(SPECIES_EXPLOUD) { Status1(status); Ability(ability); } } WHEN { - if (status == STATUS1_NONE) + if (status == STATUS1_NONE || (ability == ABILITY_SOUNDPROOF && config <= GEN_4)) TURN { EXPECT_MOVE(opponent, MOVE_BODY_PRESS); } else TURN { EXPECT_MOVE(opponent, MOVE_HEAL_BELL); } diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 05b48cc5ed..c38b82118c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1376,10 +1376,15 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") { + u32 j; GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); PLAYER(SPECIES_APPLETUN) { Status1(STATUS1_POISON); GigantamaxFactor(TRUE); } PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -1387,9 +1392,10 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") } SCENE { MESSAGE("Appletun used G-Max Sweetness!"); STATUS_ICON(playerLeft, none: TRUE); - MESSAGE("Appletun's status returned to normal!"); STATUS_ICON(playerRight, none: TRUE); - MESSAGE("Applin's status returned to normal!"); + } THEN { + for (j = 0; j < PARTY_SIZE; j++) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); } } diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 5c87171056..7730879d45 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -4,48 +4,70 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); } -DOUBLE_BATTLE_TEST("Heal Bell cures the entire party") +DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user from primary status effects") { - u32 move; - - PARAMETRIZE { move = MOVE_HEAL_BELL; } - PARAMETRIZE { move = MOVE_AROMATHERAPY; } + u32 j, move, status; + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_SLEEP; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_SLEEP; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_POISON; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_POISON; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_BURN; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_BURN; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_FREEZE; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_FREEZE; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_PARALYSIS; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_PARALYSIS; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_FROSTBITE; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_FROSTBITE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + PLAYER(SPECIES_WOBBUFFET) { + if (status != STATUS1_SLEEP && status != STATUS1_FREEZE) + Status1(status); + } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, move, target: playerLeft); } TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } } SCENE { - int i; - ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); - NOT MESSAGE("Wobbuffet was hurt by its poisoning!"); - for (i = 0; i < 6; i++) + switch(status) + { + case STATUS1_SLEEP: STATUS_ICON(playerLeft, sleep: FALSE); STATUS_ICON(playerRight, sleep: FALSE); break; + case STATUS1_POISON: STATUS_ICON(playerLeft, poison: FALSE); STATUS_ICON(playerRight, poison: FALSE); break; + case STATUS1_BURN: STATUS_ICON(playerLeft, burn: FALSE); STATUS_ICON(playerRight, burn: FALSE); break; + case STATUS1_PARALYSIS: STATUS_ICON(playerLeft, paralysis: FALSE); STATUS_ICON(playerRight, paralysis: FALSE); break; + case STATUS1_TOXIC_POISON: STATUS_ICON(playerLeft, badPoison: FALSE); STATUS_ICON(playerRight, badPoison: FALSE); break; + case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; + } + for (j = 0; j < PARTY_SIZE; j++) EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); } } -DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") +DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)") { - u32 ability; + u32 ability, config; - PARAMETRIZE { ability = ABILITY_SCRAPPY; } - PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - - ASSUME(B_HEAL_BELL_SOUNDPROOF != GEN_5); + PARAMETRIZE { ability = ABILITY_SCRAPPY; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_6; } GIVEN { + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -54,7 +76,7 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") TURN { MOVE(playerLeft, MOVE_HEAL_BELL, target: playerLeft); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, playerLeft); - if (ability == ABILITY_SOUNDPROOF) { + if (ability == ABILITY_SOUNDPROOF && config != GEN_5) { MESSAGE("Exploud was hurt by its poisoning!"); } else { NOT MESSAGE("Exploud was hurt by its poisoning!"); @@ -62,16 +84,17 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") } } -SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") +SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") { - u32 ability; + u32 config, ability; - PARAMETRIZE { ability = ABILITY_SCRAPPY; } - PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_5); + PARAMETRIZE { config = GEN_4, ability = ABILITY_SCRAPPY; } + PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { config = GEN_5, ability = ABILITY_SOUNDPROOF; } GIVEN { + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -81,21 +104,35 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, player); SEND_IN_MESSAGE("Exploud"); - NOT MESSAGE("Exploud was hurt by its poisoning!"); + if (ability == ABILITY_SCRAPPY || config >= GEN_5) { + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } else { + MESSAGE("Exploud was hurt by its poisoning!"); + } } } -SINGLE_BATTLE_TEST("Heal Bell cures a soundproof user") +SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } + PARAMETRIZE { config = GEN_8; } GIVEN { - ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8); + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(player, MOVE_HEAL_BELL, target: player); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, player); - NOT MESSAGE("Exploud was hurt by its poisoning!"); + if (config == GEN_5 || config >= GEN_8) { + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } else { + MESSAGE("Exploud was hurt by its poisoning!"); + } } } diff --git a/test/battle/move_effect_secondary/aromatherapy.c b/test/battle/move_effect_secondary/aromatherapy.c new file mode 100644 index 0000000000..9f1e82ba2d --- /dev/null +++ b/test/battle/move_effect_secondary/aromatherapy.c @@ -0,0 +1,51 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); +} + +DOUBLE_BATTLE_TEST("Sparkly Swirl cures the entire party of the user from primary status effects") +{ + u32 j; + u32 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_BURN; } + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { + if (status != STATUS1_SLEEP && status != STATUS1_FREEZE) + Status1(status); + } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPARKLY_SWIRL, target: opponentLeft); } + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } + } SCENE { + MESSAGE("Wobbuffet used Sparkly Swirl!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPARKLY_SWIRL, playerLeft); + switch(status) + { + case STATUS1_SLEEP: STATUS_ICON(playerLeft, sleep: FALSE); STATUS_ICON(playerRight, sleep: FALSE); break; + case STATUS1_POISON: STATUS_ICON(playerLeft, poison: FALSE); STATUS_ICON(playerRight, poison: FALSE); break; + case STATUS1_BURN: STATUS_ICON(playerLeft, burn: FALSE); STATUS_ICON(playerRight, burn: FALSE); break; + case STATUS1_PARALYSIS: STATUS_ICON(playerLeft, paralysis: FALSE); STATUS_ICON(playerRight, paralysis: FALSE); break; + case STATUS1_TOXIC_POISON: STATUS_ICON(playerLeft, badPoison: FALSE); STATUS_ICON(playerRight, badPoison: FALSE); break; + case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; + } + } THEN { + for (j = 0; j < PARTY_SIZE; j++) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); + } +} diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index ae20a0acad..7537fb437a 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -567,7 +567,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - ASSUME(GetMoveEffect(MOVE_SPARKLY_SWIRL) == EFFECT_SPARKLY_SWIRL); + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); ASSUME(B_SLEEP_TURNS >= GEN_5); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1147,7 +1147,6 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); MESSAGE("Wobbuffet fell asleep!"); MESSAGE("Appletun used G-Max Sweetness!"); - MESSAGE("Wobbuffet's status returned to normal!"); MESSAGE("The opposing Wobbuffet used Spore!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); From d510a3957d365187f059d08a274e954d98ce06fd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 9 Feb 2025 17:57:29 -0300 Subject: [PATCH 092/125] Fixed Future Sight not being affected by Electrify (#6213) --- src/battle_main.c | 5 +-- src/battle_script_commands.c | 1 + src/battle_util.c | 5 --- test/battle/ability/color_change.c | 69 ++++++++++++++++------------- test/battle/move_effect/electrify.c | 10 ++--- test/battle/move_effect/instruct.c | 23 ++++++++++ 6 files changed, 68 insertions(+), 45 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index c3c3c11610..606f293454 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4060,11 +4060,10 @@ void BattleTurnPassed(void) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; + gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; + gStatuses4[i] &= ~STATUS4_ELECTRIFIED; } - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; - *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bd4451f7d7..bdf1f8ee53 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10209,6 +10209,7 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->failInstr; else { + SetTypeBeforeUsingMove(gCalledMove, gBattlerTarget); gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattleStruct->atkCancellerTracker = 0; diff --git a/src/battle_util.c b/src/battle_util.c index 4dc9c9b45e..2d4798b0dd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2272,7 +2272,6 @@ enum ENDTURN_ITEMS2, ENDTURN_ORBS, ENDTURN_ROOST, - ENDTURN_ELECTRIFY, ENDTURN_POWDER, ENDTURN_THROAT_CHOP, ENDTURN_SLOW_START, @@ -2866,10 +2865,6 @@ u8 DoBattlerEndTurnEffects(void) gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_ROOST; gBattleStruct->turnEffectsTracker++; break; - case ENDTURN_ELECTRIFY: - gStatuses4[battler] &= ~STATUS4_ELECTRIFIED; - gBattleStruct->turnEffectsTracker++; - break; case ENDTURN_POWDER: gBattleMons[battler].status2 &= ~STATUS2_POWDER; gBattleStruct->turnEffectsTracker++; diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index d3a6489f00..668cb01b62 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -4,29 +4,33 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a move if the type of the move and the Pokemon are different") { GIVEN { + ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_PSYCHIC && gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_PSYCHIC); + ASSUME(gMovesInfo[MOVE_PSYWAVE].type == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_PSYWAVE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYWAVE, player); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Wobbuffet's Color Change made it the Normal type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Psychic type!"); } } SINGLE_BATTLE_TEST("Color Change does not change the type when hit by a move that's the same type as itself") { GIVEN { + ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] == TYPE_NORMAL || gSpeciesInfo[SPECIES_KECLEON].types[1] == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { - TURN { MOVE(player, MOVE_PSYCHO_CUT); } + TURN { MOVE(player, MOVE_TACKLE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_CUT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); NONE_OF { ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Wobbuffet's Color Change made it the Normal type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Normal type!"); } } } @@ -34,11 +38,12 @@ SINGLE_BATTLE_TEST("Color Change does not change the type when hit by a move tha SINGLE_BATTLE_TEST("Color Change does not change the type of a dual-type Pokemon when hit by a move that shares its primary type") { GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_XATU) { Ability(ABILITY_COLOR_CHANGE); } + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_SLOWBRO); } WHEN { - TURN { MOVE(player, MOVE_PSYCHO_CUT); } + TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_PSYCHO_CUT); } } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_CUT, player); NONE_OF { ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); @@ -50,11 +55,12 @@ SINGLE_BATTLE_TEST("Color Change does not change the type of a dual-type Pokemon SINGLE_BATTLE_TEST("Color Change does not change the type of a dual-type Pokemon when hit by a move that shares its secondary type") { GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SLOWBRO) { Ability(ABILITY_COLOR_CHANGE); } + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_SLOWBRO); } WHEN { - TURN { MOVE(player, MOVE_PSYCHO_CUT); } + TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_PSYCHO_CUT); } } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_CUT, player); NONE_OF { ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); @@ -67,13 +73,13 @@ SINGLE_BATTLE_TEST("Color Change changes the user to Electric type if hit by a m { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_PSYCHO_CUT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_CUT, player); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Wobbuffet's Color Change made it the Electric type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Electric type!"); } } @@ -81,16 +87,16 @@ SINGLE_BATTLE_TEST("Color Change changes the type when a Pokemon is hit by Futur { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { } TURN { } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); - MESSAGE("The opposing Snorlax took the Future Sight attack!"); + MESSAGE("The opposing Kecleon took the Future Sight attack!"); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Snorlax's Color Change made it the Psychic type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Psychic type!"); } } @@ -98,35 +104,33 @@ SINGLE_BATTLE_TEST("Color Change changes the type when a Pokemon is hit by Doom { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(player, MOVE_DOOM_DESIRE); } TURN { } TURN { } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOOM_DESIRE, player); - MESSAGE("The opposing Wobbuffet took the Doom Desire attack!"); + MESSAGE("The opposing Kecleon took the Doom Desire attack!"); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Wobbuffet's Color Change made it the Steel type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Steel type!"); } } SINGLE_BATTLE_TEST("Color Change changes the type to Electric when a Pokemon is hit by a forseen attack under the effect of Electrify") { - KNOWN_FAILING; // #4471. GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_BLASTOISE) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FUTURE_SIGHT); } TURN { } TURN { MOVE(opponent, MOVE_ELECTRIFY); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); - MESSAGE("The opposing Blastoise took the Future Sight attack!"); - MESSAGE("It's super effective!"); + MESSAGE("The opposing Kecleon took the Future Sight attack!"); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Blastoise's Color Change made it the Electr type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Electric type!"); } } @@ -134,15 +138,18 @@ SINGLE_BATTLE_TEST("Color Change changes the type to Normal when a Pokemon is hi { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NORMALIZE); } - OPPONENT(SPECIES_BLASTOISE) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FUTURE_SIGHT); } - TURN { } + TURN { MOVE(player, MOVE_SOAK); } TURN { } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); - MESSAGE("The opposing Blastoise took the Future Sight attack!"); + MESSAGE("Wobbuffet used Soak!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SOAK, player); + MESSAGE("The opposing Kecleon transformed into the Water type!"); + MESSAGE("The opposing Kecleon took the Future Sight attack!"); ABILITY_POPUP(opponent, ABILITY_COLOR_CHANGE); - MESSAGE("The opposing Blastoise's Color Change made it the Normal type!"); + MESSAGE("The opposing Kecleon's Color Change made it the Normal type!"); } } diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index e60bbdaf22..374a5b143f 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -18,7 +18,6 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (double move)") { - KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); @@ -53,9 +52,8 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") } } -SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves") +SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves when hitting its target") { - KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); @@ -63,12 +61,12 @@ SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { - TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_FUTURE_SIGHT); } - TURN {} + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FUTURE_SIGHT); } TURN {} + TURN { MOVE(opponent, MOVE_ELECTRIFY); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponent); NOT HP_BAR(opponent); } } diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 59772ea944..b31076f3fe 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -216,3 +216,26 @@ DOUBLE_BATTLE_TEST("Instruct-called moves keep their priority") NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, playerRight); } } + +DOUBLE_BATTLE_TEST("Instructed move will be absorbed by Lightning Rod if it turns into an Electric Type move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); + MOVE(opponentLeft, MOVE_PLASMA_FISTS, target: playerLeft); + MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLASMA_FISTS, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + } +} From 3be1d1d91e8ed592a890ff3fa77e6d875358793d Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sun, 9 Feb 2025 16:17:10 -0500 Subject: [PATCH 093/125] Consolidated Frontier teams into battle_frontier_trainers.h (#5892) --- .../1.11/convert_battle_frontier_trainers.py | 44 + migration_scripts/README.md | 23 +- .../battle_frontier_trainer_mons.h | 1579 +---------------- .../battle_frontier_trainers.h | 603 +++---- 4 files changed, 391 insertions(+), 1858 deletions(-) create mode 100644 migration_scripts/1.11/convert_battle_frontier_trainers.py diff --git a/migration_scripts/1.11/convert_battle_frontier_trainers.py b/migration_scripts/1.11/convert_battle_frontier_trainers.py new file mode 100644 index 0000000000..b218c79e31 --- /dev/null +++ b/migration_scripts/1.11/convert_battle_frontier_trainers.py @@ -0,0 +1,44 @@ +import glob +import re +import os + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +# Read battle_frontier_trainer_mons.h and extract the party information +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainer_mons.h'): + with open(file, 'r') as f: + source_content = f.read() + +# Extract party info from battle_frontier_trainer_mons.h +source_pattern = re.compile(r'gBattleFrontierTrainerMons_(.*)\[\]\s*=\s*\n\{\n\s*(FRONTIER.*)') +source_data = {} +for match in source_pattern.findall(source_content): + if len(match) == 2: + trainer_name, party_group = match + source_data[trainer_name] = (party_group) + +# Read battle_frontier_trainers.h content +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainers.h'): + with open(file, 'r') as f: + destination_content = f.read() + +# Modify battle_frontier_trainers.h content +def add_party_data(match): + trainer_name = match.group(1) + if trainer_name in source_data: + party_group = source_data[trainer_name] + print(f"Updating {trainer_name}: adding {party_group}") + return f'(const u16[]){{{party_group}}}' + else: + return match.group(0) + +destination_pattern = re.compile(r'gBattleFrontierTrainerMons_(.*)') +modified_content = destination_pattern.sub(add_party_data, destination_content) + +# Write the modified content back to battle_frontier_trainers.h +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainers.h'): + with open(file, 'w') as f: + f.write(modified_content) + print("battle_frontier_trainers.h has been updated") diff --git a/migration_scripts/README.md b/migration_scripts/README.md index 46b1e227ef..0b1eb50583 100644 --- a/migration_scripts/README.md +++ b/migration_scripts/README.md @@ -19,7 +19,7 @@ python3 migration_scripts/*.py ; #run the migration script ## 1.10.x to 1.11.x+ -### Battle Frontier Trainers +### Contest Opponents * Filepath [`migration_scripts/1.11/consolidate_contest_opponent_filters.py`](1.11/consolidate_contest_opponent_filters.py) * Introduced in [Consolidated contest opponent filters into gContestOpponents #6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119) @@ -38,6 +38,27 @@ const struct ContestPokemon gContestOpponents[] = - [CONTEST_OPPONENT_JIMMY] = CONTEST_FILTER_NONE, ``` +### Battle Frontier Trainers + +* Filepath [`migration_scripts/1.11/convert_battle_frontier_trainers.py`](1.11/convert_battle_frontier_trainers.py) +* Introduced in [Consolidated Frontier teams into battle_frontier_trainers.h #5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892) + +Moves the Battle Frontier trainer parties from battle_frontier_trainer_mons.h to battle_frontier_trainers.h + +#### [src/data/battle_frontier/battle_frontier_trainer_mons.h](../src/data/battle_frontier/battle_frontier_trainer_mons.h) +```diff +- const u16 gBattleFrontierTrainerMons_Brady[] = +- { +- FRONTIER_MONS_YOUNGSTER_LASS_1 +- }; +``` + +#### [src/data/battle_frontier/battle_frontier_trainers.h](../src/data/battle_frontier/battle_frontier_trainers.h) +```diff +- .monSet = gBattleFrontierTrainerMons_Brady ++ .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} +``` + ## 1.8.x to 1.9.x+ ### Battle Anim Moves diff --git a/src/data/battle_frontier/battle_frontier_trainer_mons.h b/src/data/battle_frontier/battle_frontier_trainer_mons.h index f0a203d56d..af2da019c8 100644 --- a/src/data/battle_frontier/battle_frontier_trainer_mons.h +++ b/src/data/battle_frontier/battle_frontier_trainer_mons.h @@ -1,4 +1,4 @@ -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_YOUNGSTER_LASS_1 \ FRONTIER_MON_SUNKERN, \ FRONTIER_MON_AZURILL, \ @@ -64,7 +64,7 @@ FRONTIER_MON_VULPIX, \ -1 -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_SCHOOL_KID_1 \ FRONTIER_MON_PIKACHU, \ FRONTIER_MON_SANDSHREW, \ @@ -152,7 +152,7 @@ FRONTIER_MON_ARIADOS, \ -1 -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_CAMPER_PICNICKER_1 \ FRONTIER_MON_GRIMER, \ FRONTIER_MON_KRABBY, \ @@ -2833,7 +2833,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Also used by Pkmn Ranger M/F +// Also used by PKMN Ranger M/F // For both classes, M uses Latios and F uses Latias #define FRONTIER_MONS_COOLTRAINER_2D(lati) \ FRONTIER_MON_ARTICUNO_1, \ @@ -3118,7 +3118,7 @@ FRONTIER_MON_RAPIDASH_4, \ -1 -// Used by Pkmn Ranger M, Gentleman, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger M, Gentleman, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_A \ FRONTIER_MON_DUGTRIO_4, \ FRONTIER_MON_MEDICHAM_4, \ @@ -3219,7 +3219,7 @@ -1 // Identical to FRONTIER_MONS_GENERAL_A but _3 -// Used by Pkmn Ranger, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_B \ FRONTIER_MON_DUGTRIO_3, \ FRONTIER_MON_MEDICHAM_3, \ @@ -3320,7 +3320,7 @@ -1 // Similar to FRONTIER_MONS_GENERAL_A/B but _2 -// Used by Pkmn Ranger, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_C \ FRONTIER_MON_DUGTRIO_2, \ FRONTIER_MON_MEDICHAM_2, \ @@ -3421,7 +3421,7 @@ -1 // Similar to FRONTIER_MONS_GENERAL_C but _1 (would be identical if not for re-ordering) -// Used by Pkmn Ranger, Running Triathlete, Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, Cycling Triathlete #define FRONTIER_MONS_GENERAL_D \ FRONTIER_MON_DUGTRIO_1, \ FRONTIER_MON_MEDICHAM_1, \ @@ -4245,6 +4245,16 @@ FRONTIER_MON_##legend2##_4, \ FRONTIER_MON_##legend3##_4, \ FRONTIER_MON_##lati##_4, \ + FRONTIER_MON_##legend1##_5, \ + FRONTIER_MON_##legend2##_5, \ + FRONTIER_MON_##legend3##_5, \ + FRONTIER_MON_##lati##_5, \ + FRONTIER_MON_##legend1##_6, \ + FRONTIER_MON_##legend2##_6, \ + FRONTIER_MON_##legend3##_6, \ + FRONTIER_MON_##lati##_6, \ + FRONTIER_MON_##lati##_7, \ + FRONTIER_MON_##lati##_8, \ FRONTIER_MON_GARDEVOIR_5, \ FRONTIER_MON_GARDEVOIR_6, \ FRONTIER_MON_GARDEVOIR_7, \ @@ -4256,49 +4266,7 @@ FRONTIER_MON_METAGROSS_5, \ FRONTIER_MON_METAGROSS_6, \ FRONTIER_MON_METAGROSS_7, \ - FRONTIER_MON_METAGROSS_8, - -#define FRONTIER_MONS_PSYCHIC_2A(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, ARTICUNO, ZAPDOS, MOLTRES) \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ - FRONTIER_MON_ARTICUNO_5, \ - FRONTIER_MON_ARTICUNO_6, \ - FRONTIER_MON_ZAPDOS_5, \ - FRONTIER_MON_ZAPDOS_6, \ - FRONTIER_MON_MOLTRES_5, \ - FRONTIER_MON_MOLTRES_6, \ - -1 - -#define FRONTIER_MONS_PSYCHIC_2B(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, RAIKOU, ENTEI, SUICUNE) \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ - FRONTIER_MON_RAIKOU_5, \ - FRONTIER_MON_RAIKOU_6, \ - FRONTIER_MON_ENTEI_5, \ - FRONTIER_MON_ENTEI_6, \ - FRONTIER_MON_SUICUNE_5, \ - FRONTIER_MON_SUICUNE_6, \ - -1 - -// Because the regis/latis are swapped here they cant all be merged into the same macro and match -#define FRONTIER_MONS_PSYCHIC_2C(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, REGIROCK, REGICE, REGISTEEL) \ - FRONTIER_MON_REGIROCK_5, \ - FRONTIER_MON_REGIROCK_6, \ - FRONTIER_MON_REGICE_5, \ - FRONTIER_MON_REGICE_6, \ - FRONTIER_MON_REGISTEEL_5, \ - FRONTIER_MON_REGISTEEL_6, \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ + FRONTIER_MON_METAGROSS_8, \ -1 #define FRONTIER_MONS_HEX_MANIAC_2A \ @@ -4453,7 +4421,7 @@ -1 // For whatever reason FRONTIER_MON_MAROWAK_2 is in a different order than _1 _3 and _4 -// This order change is the only difference btween FRONITER_MONS_POKEMANIAC_2A and FRONTIER_MONS_POKEMANIAC_2B other than the numbered suffixes +// This order change is the only difference between FRONITER_MONS_POKEMANIAC_2A and FRONTIER_MONS_POKEMANIAC_2B other than the numbered suffixes #define FRONTIER_MONS_POKEMANIAC_2A \ FRONTIER_MON_ZANGOOSE_2, \ FRONTIER_MON_GRANBULL_1, \ @@ -4726,7 +4694,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Identical to FRONTIER_MONS_COOLTRAINER_2C but with both latias and latios +// Identical to FRONTIER_MONS_COOLTRAINER_2C but with both Latias and Latios #define FRONTIER_MONS_GENTLEMAN_3A \ FRONTIER_MON_GENGAR_1, \ FRONTIER_MON_URSARING_1, \ @@ -4830,7 +4798,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Identical to FRONTIER_MONS_COOLTRAINER_2D but with both latias and latios +// Identical to FRONTIER_MONS_COOLTRAINER_2D but with both Latias and Latios #define FRONTIER_MONS_GENTLEMAN_3B \ FRONTIER_MON_ARTICUNO_1, \ FRONTIER_MON_ZAPDOS_1, \ @@ -5864,1506 +5832,3 @@ FRONTIER_MON_STARMIE_7, \ FRONTIER_MON_STARMIE_8, \ -1 - -const u16 gBattleFrontierTrainerMons_Brady[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Conner[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Bradley[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Cybil[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Rodette[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Peggy[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Keith[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Grayson[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Glenn[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Liliana[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Elise[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Zoey[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Manuel[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Russ[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Dustin[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Tina[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Gillian[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Zoe[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Chen[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Al[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Mitch[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Anne[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Alize[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Lauren[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Kipp[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Jason[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_John[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Ann[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Eileen[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Carlie[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Gordon[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Ayden[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Marco[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Cierra[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Marcy[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Kathy[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Peyton[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Julian[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Quinn[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Haylee[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Amanda[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Stacy[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -// The below 6 are the early Pkmn Breeder class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Rafael[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Oliver[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Payton[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Pamela[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Eliza[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Marisa[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Lewis[] = -{ - FRONTIER_MONS_BUG_CATCHER_1_EXTRA(METAPOD, KAKUNA) -}; - -const u16 gBattleFrontierTrainerMons_Yoshi[] = -{ - FRONTIER_MONS_BUG_CATCHER_1_EXTRA(SILCOON, CASCOON) -}; - -const u16 gBattleFrontierTrainerMons_Destin[] = -{ - FRONTIER_MONS_BUG_CATCHER_1 -}; - -const u16 gBattleFrontierTrainerMons_Keon[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Stuart[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Nestor[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Derrick[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Bryson[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Clayton[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Trenton[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Jenson[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Wesley[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Anton[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Lawson[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Sammy[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -// The below 3 are the early Collector class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Arnie[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Adrian[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Tristan[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Juliana[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Rylee[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Chelsea[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -// The below 3 are the early Beauty class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Danela[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Lizbeth[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Amelia[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Jillian[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Abbie[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Briana[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Antonio[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Jaden[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Dakota[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Brayden[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Corson[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Trevin[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Patrick[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Kaden[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Maxwell[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Daryl[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Kenneth[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Rich[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Caden[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Marlon[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Nash[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Robby[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Reece[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Kathryn[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Ellen[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Ramon[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Arthur[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Alondra[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Adriana[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Malik[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Jill[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Erik[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Yazmin[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Jamal[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Leslie[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Dave[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Carlo[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Emilia[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Dalia[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Hitomi[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Ricardo[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Shizuka[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Joana[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Kelly[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Rayna[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Evan[] = -{ - FRONTIER_MONS_EXPERT_1A -}; - -const u16 gBattleFrontierTrainerMons_Jordan[] = -{ - FRONTIER_MONS_EXPERT_1B -}; - -const u16 gBattleFrontierTrainerMons_Joel[] = -{ - FRONTIER_MONS_EXPERT_1C -}; - -const u16 gBattleFrontierTrainerMons_Kristen[] = -{ - FRONTIER_MONS_EXPERT_1A -}; - -const u16 gBattleFrontierTrainerMons_Selphy[] = -{ - FRONTIER_MONS_EXPERT_1B -}; - -const u16 gBattleFrontierTrainerMons_Chloe[] = -{ - FRONTIER_MONS_EXPERT_1C -}; - -const u16 gBattleFrontierTrainerMons_Norton[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Lukas[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Zach[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kaitlyn[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Breanna[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kendra[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Molly[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Jazmin[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kelsey[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Jalen[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Griffen[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Xander[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Marvin[] = -{ - FRONTIER_MONS_GENTLEMAN_1A -}; - -const u16 gBattleFrontierTrainerMons_Brennan[] = -{ - FRONTIER_MONS_GENTLEMAN_1B -}; - -const u16 gBattleFrontierTrainerMons_Baley[] = -{ - FRONTIER_MONS_BUG_MANIAC_2 -}; - -const u16 gBattleFrontierTrainerMons_Zackary[] = -{ - FRONTIER_MONS_RUIN_MANIAC_2 -}; - -const u16 gBattleFrontierTrainerMons_Gabriel[] = -{ - FRONTIER_MONS_COLLECTOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Emily[] = -{ - FRONTIER_MONS_PARASOL_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Jordyn[] = -{ - FRONTIER_MONS_BEAUTY_1 -}; - -const u16 gBattleFrontierTrainerMons_Sofia[] = -{ - FRONTIER_MONS_AROMA_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Braden[] = -{ - FRONTIER_MONS_COOLTRAINER_1A -}; - -const u16 gBattleFrontierTrainerMons_Kayden[] = -{ - FRONTIER_MONS_COOLTRAINER_1B -}; - -const u16 gBattleFrontierTrainerMons_Cooper[] = -{ - FRONTIER_MONS_COOLTRAINER_1C -}; - -const u16 gBattleFrontierTrainerMons_Julia[] = -{ - FRONTIER_MONS_COOLTRAINER_1A -}; - -const u16 gBattleFrontierTrainerMons_Amara[] = -{ - FRONTIER_MONS_COOLTRAINER_1B -}; - -const u16 gBattleFrontierTrainerMons_Lynn[] = -{ - FRONTIER_MONS_COOLTRAINER_1C -}; - -const u16 gBattleFrontierTrainerMons_Jovan[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Dominic[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Nikolas[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Valeria[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Delaney[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Meghan[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Roberto[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Damian[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Brody[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Graham[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Tylor[] = -{ - FRONTIER_MONS_POKEFAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Jaren[] = -{ - FRONTIER_MONS_POKEFAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Cordell[] = -{ - FRONTIER_MONS_PKMN_BREEDER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Jazlyn[] = -{ - FRONTIER_MONS_PKMN_BREEDER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Zachery[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Johan[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2_NO_DUGTRIO -}; - -const u16 gBattleFrontierTrainerMons_Shea[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Kaila[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Isiah[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Garrett[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Haylie[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Megan[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Issac[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Quinton[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Salma[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Ansley[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Holden[] = -{ - FRONTIER_MONS_BUG_CATCHER_2 -}; - -const u16 gBattleFrontierTrainerMons_Luca[] = -{ - FRONTIER_MONS_BUG_CATCHER_2 -}; - -const u16 gBattleFrontierTrainerMons_Jamison[] = -{ - FRONTIER_MONS_NINJA_BOY_2 -}; - -const u16 gBattleFrontierTrainerMons_Gunnar[] = -{ - FRONTIER_MONS_NINJA_BOY_2 -}; - -const u16 gBattleFrontierTrainerMons_Craig[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Pierce[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Regina[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Alison[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Hank[] = -{ - FRONTIER_MONS_BUG_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Earl[] = -{ - FRONTIER_MONS_BUG_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Ramiro[] = -{ - FRONTIER_MONS_FISHERMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Hunter[] = -{ - FRONTIER_MONS_FISHERMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Aiden[] = -{ - FRONTIER_MONS_RUIN_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Xavier[] = -{ - FRONTIER_MONS_RUIN_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Clinton[] = -{ - FRONTIER_MONS_COLLECTOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Jesse[] = -{ - FRONTIER_MONS_COLLECTOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Eduardo[] = -{ - FRONTIER_MONS_GUITARIST_2 -}; - -const u16 gBattleFrontierTrainerMons_Hal[] = -{ - FRONTIER_MONS_GUITARIST_2 -}; - -const u16 gBattleFrontierTrainerMons_Gage[] = -{ - FRONTIER_MONS_BIRD_KEEPER_2 -}; - -const u16 gBattleFrontierTrainerMons_Arnold[] = -{ - FRONTIER_MONS_BIRD_KEEPER_2 -}; - -const u16 gBattleFrontierTrainerMons_Jarrett[] = -{ - FRONTIER_MONS_SAILOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Garett[] = -{ - FRONTIER_MONS_SAILOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Emanuel[] = -{ - FRONTIER_MONS_HIKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Gustavo[] = -{ - FRONTIER_MONS_HIKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Kameron[] = -{ - FRONTIER_MONS_KINDLER_2 -}; - -const u16 gBattleFrontierTrainerMons_Alfredo[] = -{ - FRONTIER_MONS_KINDLER_2 -}; - -const u16 gBattleFrontierTrainerMons_Ruben[] = -{ - FRONTIER_MONS_GENTLEMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Lamar[] = -{ - FRONTIER_MONS_GENTLEMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Jaxon[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Logan[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Emilee[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Josie[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Armando[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Skyler[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Ruth[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Melody[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Pedro[] = -{ - FRONTIER_MONS_SWIMMER_M_2 -}; - -const u16 gBattleFrontierTrainerMons_Erick[] = -{ - FRONTIER_MONS_SWIMMER_M_2 -}; - -const u16 gBattleFrontierTrainerMons_Elaine[] = -{ - FRONTIER_MONS_SWIMMER_F_2 -}; - -const u16 gBattleFrontierTrainerMons_Joyce[] = -{ - FRONTIER_MONS_SWIMMER_F_2 -}; - -const u16 gBattleFrontierTrainerMons_Todd[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Gavin[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Malory[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Esther[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Oscar[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Wilson[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Clare[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Tess[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Leon[] = -{ - FRONTIER_MONS_COOLTRAINER_M_2A -}; - -const u16 gBattleFrontierTrainerMons_Alonzo[] = -{ - FRONTIER_MONS_COOLTRAINER_M_2B -}; - -const u16 gBattleFrontierTrainerMons_Vince[] = -{ - FRONTIER_MONS_COOLTRAINER_2C(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Bryon[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Ava[] = -{ - FRONTIER_MONS_COOLTRAINER_F_2A -}; - -const u16 gBattleFrontierTrainerMons_Miriam[] = -{ - FRONTIER_MONS_COOLTRAINER_F_2B -}; - -const u16 gBattleFrontierTrainerMons_Carrie[] = -{ - FRONTIER_MONS_COOLTRAINER_2C(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Gillian2[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Tyler[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Chaz[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Nelson[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Shania[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Stella[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Dorine[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Maddox[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Davin[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Trevon[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Mateo[] = -{ - FRONTIER_MONS_BLACK_BELT_2A -}; - -const u16 gBattleFrontierTrainerMons_Bret[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B -}; - -const u16 gBattleFrontierTrainerMons_Raul[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C -}; - -const u16 gBattleFrontierTrainerMons_Kay[] = -{ - FRONTIER_MONS_BATTLE_GIRL_2A -}; - -const u16 gBattleFrontierTrainerMons_Elena[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B -}; - -const u16 gBattleFrontierTrainerMons_Alana[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C -}; - -const u16 gBattleFrontierTrainerMons_Alexas[] = -{ - FRONTIER_MONS_EXPERT_2A(TYRANITAR) -}; - -const u16 gBattleFrontierTrainerMons_Weston[] = -{ - FRONTIER_MONS_EXPERT_2B(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Jasper[] = -{ - FRONTIER_MONS_EXPERT_2C(TYRANITAR) -}; - -const u16 gBattleFrontierTrainerMons_Nadia[] = -{ - FRONTIER_MONS_EXPERT_2A(DRAGONITE) -}; - -const u16 gBattleFrontierTrainerMons_Miranda[] = -{ - FRONTIER_MONS_EXPERT_2B(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Emma[] = -{ - FRONTIER_MONS_EXPERT_2C(DRAGONITE) -}; - -const u16 gBattleFrontierTrainerMons_Rolando[] = -{ - FRONTIER_MONS_PSYCHIC_2A(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Stanly[] = -{ - FRONTIER_MONS_PSYCHIC_2B(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Dario[] = -{ - FRONTIER_MONS_PSYCHIC_2C(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Karlee[] = -{ - FRONTIER_MONS_PSYCHIC_2A(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Jaylin[] = -{ - FRONTIER_MONS_PSYCHIC_2B(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Ingrid[] = -{ - FRONTIER_MONS_PSYCHIC_2C(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Delilah[] = -{ - FRONTIER_MONS_HEX_MANIAC_2A -}; - -const u16 gBattleFrontierTrainerMons_Carly[] = -{ - FRONTIER_MONS_HEX_MANIAC_2B -}; - -const u16 gBattleFrontierTrainerMons_Lexie[] = -{ - FRONTIER_MONS_HEX_MANIAC_2C -}; - -const u16 gBattleFrontierTrainerMons_Miller[] = -{ - FRONTIER_MONS_POKEMANIAC_2A -}; - -const u16 gBattleFrontierTrainerMons_Marv[] = -{ - FRONTIER_MONS_POKEMANIAC_2B -}; - -const u16 gBattleFrontierTrainerMons_Layton[] = -{ - FRONTIER_MONS_POKEMANIAC_2C -}; - -const u16 gBattleFrontierTrainerMons_Brooks[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Gregory[] = -{ - FRONTIER_MONS_GENTLEMAN_3A -}; - -const u16 gBattleFrontierTrainerMons_Reese[] = -{ - FRONTIER_MONS_GENTLEMAN_3B -}; - -const u16 gBattleFrontierTrainerMons_Mason[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Toby[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Dorothy[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Piper[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Finn[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3 -}; - -const u16 gBattleFrontierTrainerMons_Samir[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3 -}; - -const u16 gBattleFrontierTrainerMons_Fiona[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3 -}; - -const u16 gBattleFrontierTrainerMons_Gloria[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3 -}; - -const u16 gBattleFrontierTrainerMons_Nico[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Jeremy[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Caitlin[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Reena[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Avery[] = -{ - FRONTIER_MONS_BUG_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Liam[] = -{ - FRONTIER_MONS_BUG_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Theo[] = -{ - FRONTIER_MONS_FISHERMAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Bailey[] = -{ - FRONTIER_MONS_FISHERMAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Hugo[] = -{ - FRONTIER_MONS_RUIN_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Bryce[] = -{ - FRONTIER_MONS_RUIN_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Gideon[] = -{ - FRONTIER_MONS_COLLECTOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Triston[] = -{ - FRONTIER_MONS_COLLECTOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Charles[] = -{ - FRONTIER_MONS_GUITARIST_3A -}; - -const u16 gBattleFrontierTrainerMons_Raymond[] = -{ - FRONTIER_MONS_GUITARIST_3B -}; - -const u16 gBattleFrontierTrainerMons_Dirk[] = -{ - FRONTIER_MONS_BIRD_KEEPER_3 -}; - -const u16 gBattleFrontierTrainerMons_Harold[] = -{ - FRONTIER_MONS_BIRD_KEEPER_3 -}; - -const u16 gBattleFrontierTrainerMons_Omar[] = -{ - FRONTIER_MONS_SAILOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Peter[] = -{ - FRONTIER_MONS_SAILOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Dev[] = -{ - FRONTIER_MONS_HIKER_3 -}; - -const u16 gBattleFrontierTrainerMons_Corey[] = -{ - FRONTIER_MONS_HIKER_3 -}; - -const u16 gBattleFrontierTrainerMons_Andre[] = -{ - FRONTIER_MONS_KINDLER_3 -}; - -const u16 gBattleFrontierTrainerMons_Ferris[] = -{ - FRONTIER_MONS_KINDLER_3 -}; - -const u16 gBattleFrontierTrainerMons_Alivia[] = -{ - FRONTIER_MONS_PARASOL_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Paige[] = -{ - FRONTIER_MONS_PARASOL_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Anya[] = -{ - FRONTIER_MONS_EEVEELUTIONS -}; - -const u16 gBattleFrontierTrainerMons_Dawn[] = -{ - FRONTIER_MONS_BEAUTY_2 -}; - -const u16 gBattleFrontierTrainerMons_Abby[] = -{ - FRONTIER_MONS_AROMA_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Gretel[] = -{ - FRONTIER_MONS_AROMA_LADY_3 -}; diff --git a/src/data/battle_frontier/battle_frontier_trainers.h b/src/data/battle_frontier/battle_frontier_trainers.h index 1cae890c25..1014ffaae2 100644 --- a/src/data/battle_frontier/battle_frontier_trainers.h +++ b/src/data/battle_frontier/battle_frontier_trainers.h @@ -6,7 +6,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NEVER, EC_WORD_GOING, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_EXCL}, .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Brady + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_CONNER] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -14,7 +14,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_BUG, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_IS, EC_WORD_JUST, EC_WORD_AWESOME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_DARN, EC_WORD_ELLIPSIS, EC_WORD_LOSING, EC_WORD_DOES, EC_WORD_BUG, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Conner + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_BRADLEY] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -22,7 +22,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_TODAY}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SEE_YA, EC_WORD_LATER, EC_WORD_EXCL}, .speechLose = {EC_WORD_TOMORROW, EC_WORD_IS, EC_WORD_WHEN, EC_WORD_WE, EC_WORD_REALLY, EC_WORD_BATTLE}, - .monSet = gBattleFrontierTrainerMons_Bradley + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_CYBIL] = { .facilityClass = FACILITY_CLASS_LASS, @@ -30,7 +30,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_NOT_VERY, EC_WORD_SCARY, EC_WORD_AT, EC_WORD_ALL}, .speechWin = {EC_WORD_IT_S, EC_WORD_SAD, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOU, EC_MOVE2(STRUGGLE)}, .speechLose = {EC_WORD_THIS, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_HAPPENING, EC_WORD_TO_ME, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Cybil + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_RODETTE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -38,7 +38,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_THIS, EC_WORD_IS, EC_WORD_SO, EC_WORD_EXCITING, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_INCREDIBLE, EC_WORD_HOW, EC_WORD_STRONG, EC_WORD_I_AM, EC_WORD_EXCL}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_NO, EC_WORD_GOOD}, - .monSet = gBattleFrontierTrainerMons_Rodette + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_PEGGY] = { .facilityClass = FACILITY_CLASS_LASS, @@ -46,7 +46,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_TO, EC_WORD_BE, EC_WORD_DESTROYED, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_LOLLING, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_SAD, EC_WORD_THANKS, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Peggy + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_KEITH] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -54,7 +54,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_JUST, EC_WORD_STUDY, EC_WORD_YOU, EC_WORD_KNOW}, .speechWin = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_STUDY, EC_WORD_ENOUGH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Keith + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_GRAYSON] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -62,7 +62,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_BATTLE, EC_WORD_ISN_T, EC_WORD_CHILD_S_PLAY, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_DONE, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WE, EC_WORD_WERE, EC_WORD_LIKE, EC_WORD_TOYS, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Grayson + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_GLENN] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -70,7 +70,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_COOL, EC_WORD_IF_I_WIN, EC_EMPTY_WORD}, .speechWin = {EC_WORD_COOL, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_COOL}, - .monSet = gBattleFrontierTrainerMons_Glenn + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_LILIANA] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -78,7 +78,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_GIVE_UP, EC_WORD_UNTIL, EC_WORD_I, EC_WORD_WIN}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NO, EC_WORD_SURRENDER, EC_WORD_IN, EC_WORD_ME}, .speechLose = {EC_WORD_THAT_S, EC_WORD_IT, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_GIVE_UP, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Liliana + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_ELISE] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -86,7 +86,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_STRATEGY, EC_WORD_IS, EC_WORD_FROM, EC_WORD_MY, EC_WORD_FATHER}, .speechWin = {EC_WORD_I, EC_WORD_WIN, EC_WORD_EXCL, EC_WORD_FATHER, EC_WORD_I_VE, EC_WORD_WON}, .speechLose = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_FATHER, EC_WORD_FOR, EC_WORD_I_VE, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Elise + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_ZOEY] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -94,7 +94,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PLEASE, EC_WORD_BATTLE, EC_WORD_LIKE, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_IT}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_WERE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_BEING, EC_WORD_SERIOUS, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Zoey + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_MANUEL] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -102,7 +102,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ME, EC_WORD_LOSE, EC_WORD_QUES, EC_WORD_THAT_S, EC_WORD_PREPOSTEROUS, EC_WORD_EXCL}, .speechWin = {EC_WORD_NATURALLY, EC_WORD_I, EC_WORD_WIN, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_MOTHER}, - .monSet = gBattleFrontierTrainerMons_Manuel + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_RUSS] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -110,7 +110,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THEY, EC_WORD_ALL, EC_WORD_WANT, EC_WORD_MY, EC_WORD_FABULOUS, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_HAVE, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_PARTY}, .speechLose = {EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_DO, EC_WORD_THAT, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Russ + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_DUSTIN] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -118,7 +118,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_COOL, EC_WORD_POKEMON, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_WHEN_I_WIN, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_IF_I_LOSE, EC_WORD_TOO, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Dustin + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_TINA] = { .facilityClass = FACILITY_CLASS_LADY, @@ -126,7 +126,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_WIN, EC_WORD_YOU, EC_WORD_CAN, EC_WORD_HAVE, EC_WORD_A, EC_MOVE2(SWEET_KISS)}, .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_YOUR, EC_MOVE2(SWEET_KISS), EC_WORD_FROM, EC_WORD_MY, EC_POKEMON_NATIONAL(JYNX)}, .speechLose = {EC_WORD_YOU, EC_WORD_WANT, EC_WORD_A, EC_MOVE(SWIFT), EC_MOVE2(MEGA_KICK), EC_WORD_INSTEAD}, - .monSet = gBattleFrontierTrainerMons_Tina + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_GILLIAN1] = { .facilityClass = FACILITY_CLASS_LADY, @@ -134,7 +134,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_IS, EC_WORD_SO, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_POKEMON, EC_WORD_NEVER, EC_WORD_GO, EC_WORD_OUT, EC_WORD_OF, EC_WORD_FASHION}, .speechLose = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_DISAPPOINT, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gillian + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_ZOE] = { .facilityClass = FACILITY_CLASS_LADY, @@ -142,7 +142,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_A, EC_WORD_WORRY, EC_WORD_AT, EC_WORD_ALL}, .speechWin = {EC_WORD_LIFE, EC_WORD_IS, EC_WORD_ALWAYS, EC_WORD_GOOD, EC_WORD_TO_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WORRY, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SKILL}, - .monSet = gBattleFrontierTrainerMons_Zoe + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_CHEN] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -150,7 +150,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_TOTALLY, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK, EC_WORD_TODAY}, .speechWin = {EC_WORD_I_AM, EC_WORD_READY, EC_WORD_TO, EC_WORD_GO, EC_WORD_ON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_MOVE(FOCUS_ENERGY), EC_WORD_AND, EC_WORD_TOUGHNESS}, - .monSet = gBattleFrontierTrainerMons_Chen + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_AL] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -158,7 +158,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_LOOK, EC_WORD_SAYS, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, .speechWin = {EC_WORD_IT_S, EC_WORD_ME, EC_WORD_WHO_IS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_RIGHT, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, - .monSet = gBattleFrontierTrainerMons_Al + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_MITCH] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -166,7 +166,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_IS, EC_WORD_MY, EC_WORD_ALLY, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAS, EC_WORD_THAT, EC_WORD_ENOUGH, EC_WORD_FOR, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_DIDN_T, EC_WORD_LET_ME_WIN, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Mitch + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_ANNE] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -174,7 +174,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_NOW}, .speechWin = {EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Anne + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_ALIZE] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -182,7 +182,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CUTE, EC_WORD_AND, EC_WORD_AWFULLY, EC_WORD_STRONG, EC_WORD_THAT_S, EC_WORD_ME}, .speechWin = {EC_WORD_YUP, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_AND, EC_WORD_AWFULLY, EC_WORD_STRONG}, .speechLose = {EC_WORD_I_AM, EC_WORD_WEAK, EC_WORD_ELLIPSIS, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_CUTE}, - .monSet = gBattleFrontierTrainerMons_Alize + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_LAUREN] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -190,7 +190,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_OLD, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_ALSO, EC_WORD_GOOD}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_I_WAS, EC_WORD_OLD, EC_WORD_BUT, EC_WORD_GOOD}, .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_WEIRD, EC_WORD_DREAM, EC_WORD_THAT_WAS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Lauren + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_KIPP] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -198,7 +198,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_WIN, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_GO, EC_MOVE2(SURF)}, .speechWin = {EC_WORD_YEAH, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_OFF, EC_WORD_TO, EC_MOVE2(SURF)}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Kipp + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_JASON] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -206,7 +206,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_TEACH, EC_WORD_ME, EC_WORD_A, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_YOUR, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WOW, EC_WORD_THAT, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWESOME, EC_WORD_STRATEGY}, - .monSet = gBattleFrontierTrainerMons_Jason + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_JOHN] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -214,7 +214,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_PRETTY, EC_WORD_NEW, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_BUT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_SO, EC_WORD_WHAT, EC_WORD_IF_I_LOSE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_John + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_ANN] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -222,7 +222,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_SO, EC_WORD_EXCITING, EC_WORD_IT, EC_WORD_REALLY, EC_WORD_IS}, .speechWin = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_HAPPY, EC_WORD_I, EC_WORD_CAN, EC_WORD_CRY}, .speechLose = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SAD, EC_WORD_I, EC_WORD_WILL, EC_WORD_CRY}, - .monSet = gBattleFrontierTrainerMons_Ann + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_EILEEN] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -230,7 +230,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_SO, EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_FEELING}, .speechLose = {EC_WORD_AN, EC_WORD_ADULT, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Eileen + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_CARLIE] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -238,7 +238,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_IS, EC_WORD_FOR, EC_WORD_POKEMON}, .speechWin = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_WILL, EC_WORD_BE, EC_WORD_AWESOME}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Carlie + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_GORDON] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -246,7 +246,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_COME, EC_WORD_TO_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_REALLY, EC_WORD_WON}, .speechLose = {EC_WORD_NOTHING, EC_WORD_IS, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Gordon + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_AYDEN] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -254,7 +254,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_HOT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_NEED, EC_WORD_WATER, EC_WORD_TO, EC_WORD_COOL, EC_WORD_DOWN}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_ICE, EC_WORD_COLD}, - .monSet = gBattleFrontierTrainerMons_Ayden + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_MARCO] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -262,7 +262,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(SURF), EC_WORD_IN, EC_WORD_THE, EC_WORD_WINTER, EC_WORD_TOO}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_MOVE2(SURF), EC_WORD_RIGHT, EC_WORD_NOW}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(BEAT_UP), EC_WORD_MY, EC_MOVE2(SURF), EC_WORD_BOARD}, - .monSet = gBattleFrontierTrainerMons_Marco + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_CIERRA] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -270,7 +270,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_MY, EC_WORD_SWIFT_SWIM}, .speechWin = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SYNCHRONIZE, EC_WORD_WITH, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_BETTER, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Cierra + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_MARCY] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -278,7 +278,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_KNOCKOUT, EC_WORD_YOU, EC_WORD_CAN_T_WIN, EC_WORD_EXCL}, .speechWin = {EC_WORD_AFTER, EC_WORD_ALL, EC_WORD_I_AM, EC_WORD_A, EC_WORD_KNOCKOUT, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_S, EC_WORD_NOT, EC_WORD_THE, EC_WORD_KNOCKOUT, EC_WORD_I, EC_WORD_MEAN}, - .monSet = gBattleFrontierTrainerMons_Marcy + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_KATHY] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -286,7 +286,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_WON, EC_WORD_EVERY, EC_WORD_MATCH, EC_WORD_TODAY, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_SO, EC_WORD_GREAT, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, .speechLose = {EC_WORD_HUH_QUES, EC_WORD_I, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_HAVE, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Kathy + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_PEYTON] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -294,7 +294,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NEVER, EC_WORD_DISAPPOINTED, EC_WORD_WITH, EC_WORD_MY, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_IF, EC_WORD_WE, EC_WORD_WIN, EC_WORD_TOGETHER}, .speechLose = {EC_WORD_I, EC_WORD_ADORE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_MORE, EC_WORD_IF_I_LOSE}, - .monSet = gBattleFrontierTrainerMons_Peyton + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_JULIAN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -302,7 +302,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_ADORE, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_RIGHT, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOTALLY, EC_WORD_OUT, EC_WORD_OF, EC_WORD_THE, EC_WORD_QUESTION}, .speechLose = {EC_WORD_YOU, EC_WORD_DO, EC_WORD_ADORE, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Julian + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_QUINN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -310,7 +310,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_BUT, EC_WORD_A, EC_WORD_DREAM}, .speechWin = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_BEAUTIFUL, EC_WORD_DREAM, EC_WORD_EXCL}, .speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWFUL, EC_MOVE(NIGHTMARE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Quinn + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_HAYLEE] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -318,7 +318,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_I_AM, EC_WORD_FEELING}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_OVERWHELMING, EC_WORD_JOY, EC_WORD_OVER, EC_WORD_THIS}, .speechLose = {EC_WORD_DESTROYED, EC_WORD_IS, EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_FEELING}, - .monSet = gBattleFrontierTrainerMons_Haylee + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, [FRONTIER_TRAINER_AMANDA] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -326,7 +326,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_COME, EC_WORD_FROM, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_FAMILY}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TREASURE, EC_WORD_THIS, EC_WORD_WIN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO_HOME, EC_WORD_RIGHT, EC_WORD_NOW}, - .monSet = gBattleFrontierTrainerMons_Amanda + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, [FRONTIER_TRAINER_STACY] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -334,15 +334,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_THEIR, EC_WORD_OWN, EC_WORD_CUTE_CHARM}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_WHAT, EC_WORD_I, EC_WORD_MEAN, EC_WORD_QUES}, .speechLose = {EC_WORD_SHOULD, EC_WORD_I, EC_WORD_NOT, EC_WORD_ADORE, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Stacy + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, + // The below 6 are the early Pkmn Breeder class trainers, which use groups from other general classes [FRONTIER_TRAINER_RAFAEL] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, .trainerName = _("RAFAEL"), .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_SOME, EC_WORD_SPIRIT}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_SPIRIT, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WELL, EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_OUR, EC_WORD_SPIRIT}, - .monSet = gBattleFrontierTrainerMons_Rafael + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_OLIVER] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -350,7 +351,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_GENIUS, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_WORKS, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_THAN, EC_WORD_I_AM}, - .monSet = gBattleFrontierTrainerMons_Oliver + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_PAYTON] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -358,7 +359,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_TRAIN, EC_WORD_FROM, EC_WORD_THE, EC_WORD_EGG, EC_WORD_UP}, .speechWin = {EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A, EC_MOVE2(SOFT_BOILED), EC_WORD_LOSS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Payton + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_PAMELA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -366,7 +367,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_POKEMON, EC_WORD_ADORE, EC_WORD_A, EC_WORD_KIND, EC_WORD_TRAINER}, .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_YOU, EC_WORD_LOST, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_KIND, EC_WORD_AND, EC_WORD_YOU_RE, EC_WORD_ALSO, EC_WORD_STRONG}, - .monSet = gBattleFrontierTrainerMons_Pamela + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_ELIZA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -374,7 +375,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ADORE, EC_WORD_POKEMON, EC_WORD_LIKE, EC_WORD_MY, EC_WORD_CHILDREN}, .speechWin = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_MY, EC_WORD_POKEMON}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, EC_WORD_ABOUT, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Eliza + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_MARISA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -382,7 +383,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_BATTLE, EC_WORD_SERIOUSLY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_YOU, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BETTER}, .speechLose = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_PLEASE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Marisa + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_LEWIS] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -390,7 +391,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A_LITTLE, EC_WORD_BUG, EC_WORD_IS, EC_WORD_SCARY, EC_WORD_QUES, EC_WORD_HAHAHA}, .speechWin = {EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL, EC_WORD_A, EC_WORD_SCARY, EC_WORD_BUG}, .speechLose = {EC_WORD_OH, EC_WORD_A, EC_WORD_BUG, EC_WORD_ISN_T, EC_WORD_SCARY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Lewis + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1_EXTRA(METAPOD, KAKUNA)} }, [FRONTIER_TRAINER_YOSHI] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -398,7 +399,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_LOVEY_DOVEY}, .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_THE, EC_WORD_BEST, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_IGNORANT, EC_WORD_ABOUT, EC_WORD_BUG, EC_WORD_POKEMON, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Yoshi + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1_EXTRA(SILCOON, CASCOON)} }, [FRONTIER_TRAINER_DESTIN] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -406,7 +407,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_WAY, EC_WORD_TOO, EC_WORD_HOT, EC_WORD_HERE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_ABOUT, EC_WORD_TO, EC_MOVE(OVERHEAT), EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOME, EC_WORD_WATER, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Destin + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1} }, [FRONTIER_TRAINER_KEON] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -414,7 +415,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_BUT, EC_WORD_HERE_I_COME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_FOR, EC_WORD_MY, EC_WORD_OVERWHELMING, EC_WORD_POWER}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Keon + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_STUART] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -422,7 +423,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_YOU, EC_WORD_A, EC_WORD_HOT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THE, EC_WORD_MASTER, EC_WORD_OF, EC_WORD_COOL, EC_WORD_THAT_S, EC_WORD_ME}, .speechLose = {EC_WORD_I, EC_WORD_SEE, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_SO, EC_WORD_COOL}, - .monSet = gBattleFrontierTrainerMons_Stuart + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_NESTOR] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -430,7 +431,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_REALLY, EC_WORD_SMOOTH, EC_WORD_MOVE}, .speechWin = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_NOTHING, EC_WORD_SMOOTH, EC_WORD_ABOUT, EC_WORD_THAT}, .speechLose = {EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SMOOTH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Nestor + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_DERRICK] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -438,7 +439,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_YOU, EC_MOVE2(MEDITATE), EC_WORD_LIKE, EC_WORD_ME}, .speechWin = {EC_WORD_HOW, EC_WORD_I, EC_MOVE2(MEDITATE), EC_WORD_IS, EC_WORD_JUST, EC_WORD_BEAUTIFUL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(MEDITATE), EC_WORD_FOR, EC_WORD_A, EC_MOVE2(CALM_MIND)}, - .monSet = gBattleFrontierTrainerMons_Derrick + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_BRYSON] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -446,7 +447,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(POISON_POWDER), EC_WORD_IS, EC_WORD_IN, EC_WORD_OUR, EC_MOVE2(COTTON_SPORE), EC_WORD_MOVE}, .speechWin = {EC_WORD_HOW_DO, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_OUR, EC_MOVE2(POISON_POWDER), EC_WORD_QUES}, .speechLose = {EC_WORD_MY, EC_MOVE2(COTTON_SPORE), EC_WORD_WAS, EC_WORD_USELESS, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Bryson + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_CLAYTON] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -454,7 +455,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_POKENAV}, .speechLose = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Clayton + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_TRENTON] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -462,7 +463,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_OVER, EC_WORD_FOR, EC_WORD_SOME, EC_WORD_TASTY, EC_WORD_WATER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_DO, EC_WORD_YOU, EC_WORD_WANT, EC_WORD_SOME, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_GOT, EC_WORD_THIS, EC_WORD_TASTY, EC_WORD_WATER, EC_WORD_SHOPPING}, - .monSet = gBattleFrontierTrainerMons_Trenton + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_JENSON] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -470,7 +471,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_DOWNCAST}, .speechWin = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THE, EC_MOVE(CUT)}, .speechLose = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_TRAINER, EC_WORD_WHO_IS, EC_WORD_FEELING, EC_WORD_DOWNCAST}, - .monSet = gBattleFrontierTrainerMons_Jenson + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_WESLEY] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -478,7 +479,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_IS, EC_WORD_HOW, EC_WORD_I, EC_WORD_CRY}, .speechWin = {EC_WORD_YES, EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_EXCL}, .speechLose = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL, EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Wesley + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_ANTON] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -486,7 +487,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_FOR, EC_WORD_ME, EC_WORD_TO, EC_MOVE(THRASH)}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_WORD_SORRY, EC_WORD_ABOUT, EC_WORD_THAT, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_LOSS, EC_WORD_TO, EC_MOVE2(SWALLOW)}, - .monSet = gBattleFrontierTrainerMons_Anton + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, [FRONTIER_TRAINER_LAWSON] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -494,7 +495,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AT, EC_WORD_HEART, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_NOT, EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_NOT, EC_WORD_AT, EC_WORD_ALL}, .speechLose = {EC_WORD_I_AM, EC_WORD_OLD, EC_WORD_AND, EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Lawson + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, [FRONTIER_TRAINER_SAMMY] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -502,15 +503,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_PARTY, EC_WORD_IS, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK}, .speechWin = {EC_WORD_MY, EC_WORD_PARTY, EC_WORD_IS, EC_WORD_JUST, EC_WORD_INCREDIBLE, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_CRY, EC_WORD_FOR, EC_WORD_MY, EC_WORD_PARTY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Sammy + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, + // The below 3 are the early Collector class trainers, which use groups from other general classes [FRONTIER_TRAINER_ARNIE] = { .facilityClass = FACILITY_CLASS_COLLECTOR, .trainerName = _("ARNIE"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_I, EC_WORD_HAVE, EC_WORD_NO, EC_WORD_RIVAL}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE}, .speechLose = {EC_WORD_NO, EC_WORD_EXCL, EC_WORD_I, EC_WORD_WON_T, EC_WORD_ACCEPT, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Arnie + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_ADRIAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -518,7 +520,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YAHOO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_GOOD_BYE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Adrian + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_TRISTAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -526,7 +528,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CONFUSED, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_IN, EC_WORD_BATTLE}, - .monSet = gBattleFrontierTrainerMons_Tristan + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_JULIANA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -534,7 +536,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_SHOPPING, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_BUT, EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_PLUSH_DOLL}, .speechLose = {EC_WORD_I, EC_WORD_SO, EC_WORD_WANT, EC_WORD_ANOTHER, EC_WORD_POKEMON, EC_WORD_PLUSH_DOLL}, - .monSet = gBattleFrontierTrainerMons_Juliana + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, [FRONTIER_TRAINER_RYLEE] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -542,7 +544,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THAT, EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS}, .speechWin = {EC_WORD_BYE_BYE, EC_WORD_EXCL, EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_NO, EC_WORD_GUTS}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_GUTSY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_QUITE, EC_WORD_SUPER}, - .monSet = gBattleFrontierTrainerMons_Rylee + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, [FRONTIER_TRAINER_CHELSEA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -550,15 +552,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_SERIOUSLY, EC_WORD_MEAN, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_WORD_WILL, EC_WORD_TO, EC_WORD_WIN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Chelsea + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, + // The below 3 are the early Beauty class trainers, which use groups from other general classes [FRONTIER_TRAINER_DANELA] = { .facilityClass = FACILITY_CLASS_BEAUTY, .trainerName = _("DANELA"), .speechBefore = {EC_WORD_YOU, EC_WORD_MUST_BE, EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_NOW, EC_WORD_EXCL}, .speechWin = {EC_WORD_OH_DEAR, EC_WORD_TOO_WEAK, EC_WORD_EXCL, EC_WORD_DON_T, EC_WORD_GIVE_UP, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_GOOD, EC_WORD_AND, EC_WORD_THIS, EC_WORD_IS, EC_WORD_GOOD_BYE}, - .monSet = gBattleFrontierTrainerMons_Danela + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_LIZBETH] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -566,7 +569,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_LOSE, EC_WORD_YOU, EC_WORD_CAN, EC_WORD_HAVE, EC_WORD_A, EC_MOVE2(PRESENT)}, .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_A_LITTLE, EC_WORD_PRAISE, EC_WORD_AS, EC_WORD_YOUR, EC_MOVE2(PRESENT)}, .speechLose = {EC_WORD_YOUR, EC_MOVE2(PRESENT), EC_WORD_QUES_EXCL, EC_WORD_HERE_IT_IS, EC_WORD_A, EC_MOVE(DOUBLE_SLAP)}, - .monSet = gBattleFrontierTrainerMons_Lizbeth + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_AMELIA] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -574,7 +577,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_CUTE, EC_WORD_FASHION, EC_WORD_APPEAL}, .speechWin = {EC_WORD_YOUR, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_A, EC_WORD_DISASTER}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_AWFUL, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_HOME}, - .monSet = gBattleFrontierTrainerMons_Amelia + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_JILLIAN] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -582,7 +585,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_IS, EC_WORD_THAT, EC_WORD_I, EC_WORD_SMELL, EC_WORD_QUES}, .speechWin = {EC_WORD_IT_S, EC_WORD_THE, EC_MOVE(SWEET_SCENT), EC_WORD_OF, EC_WORD_TASTY, EC_WORD_WATER}, .speechLose = {EC_WORD_IT_S, EC_WORD_YOUR, EC_WORD_OFFENSIVE, EC_WORD_STENCH, EC_WORD_THAT_S, EC_WORD_WHAT}, - .monSet = gBattleFrontierTrainerMons_Jillian + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_ABBIE] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -590,7 +593,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_TRY, EC_WORD_MY, EC_WORD_SECRET, EC_MOVE(AROMATHERAPY), EC_WORD_OK_QUES}, .speechWin = {EC_WORD_MY, EC_MOVE(AROMATHERAPY), EC_WORD_IS, EC_WORD_TERRIBLE, EC_WORD_FOR, EC_WORD_YOU}, .speechLose = {EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_SMELL, EC_WORD_A, EC_WORD_THING, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Abbie + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_BRIANA] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -598,7 +601,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_WORKS, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_MISS, EC_WORD_HIM, EC_WORD_MORE, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_LONESOME, EC_WORD_WITHOUT, EC_WORD_HIM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Briana + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_ANTONIO] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -606,7 +609,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_TO, EC_WORD_GO, EC_WORD_GO}, .speechWin = {EC_WORD_BUT, EC_WORD_I, EC_WORD_DON_T, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_DANCE}, .speechLose = {EC_WORD_GO, EC_WORD_GO, EC_WORD_ELLIPSIS, EC_WORD_JUST, EC_MOVE(FLAIL), EC_WORD_ABOUT}, - .monSet = gBattleFrontierTrainerMons_Antonio + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_JADEN] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -614,7 +617,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HELLO, EC_WORD_I, EC_WORD_THINK, EC_WORD_I, EC_WORD_ADORE, EC_WORD_YOU}, .speechWin = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_MOVE(THRASH), EC_WORD_IN, EC_MOVE2(FRUSTRATION)}, .speechLose = {EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_FOREVER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jaden + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_DAKOTA] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -622,7 +625,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, .speechWin = {EC_WORD_GOT, EC_WORD_IT, EC_WORD_QUES, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, .speechLose = {EC_WORD_OKAY, EC_WORD_YOU, EC_WORD_UNDERSTAND, EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Dakota + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_BRAYDEN] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -630,7 +633,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COLOR_CHANGE, EC_WORD_VERSION, EC_WORD_TOYS, EC_WORD_ARE, EC_WORD_USELESS, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_COLLECT, EC_WORD_NORMAL, EC_WORD_VERSION, EC_WORD_TOYS}, .speechLose = {EC_WORD_I, EC_MOVE2(ATTRACT), EC_WORD_COLOR_CHANGE, EC_WORD_VERSION, EC_WORD_TOYS, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Brayden + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_CORSON] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -638,7 +641,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_YOU}, .speechWin = {EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_COOL}, .speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_MOVE2(CURSE), EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Corson + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_TREVIN] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -646,7 +649,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NONE, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_ME}, .speechWin = {EC_WORD_YES_SIR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_THE, EC_WORD_BEST}, .speechLose = {EC_WORD_SERIOUS, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Trevin + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_PATRICK] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -654,7 +657,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_GIVE_UP, EC_WORD_NOW, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_DISAPPOINTED, EC_WORD_I_AM, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Patrick + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_KADEN] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -662,7 +665,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_UP, EC_WORD_TO, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_WERE, EC_WORD_A, EC_WORD_SURPRISE, EC_WORD_TO_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_WHO, EC_WORD_I_AM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kaden + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_MAXWELL] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -670,7 +673,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_WHO_IS, EC_WORD_YOUR, EC_WORD_RIVAL, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_RIVAL, EC_WORD_IS, EC_WORD_MY, EC_WORD_GIRL, EC_WORD_FRIEND}, .speechLose = {EC_WORD_I_AM, EC_WORD_MAKING, EC_WORD_YOU, EC_WORD_MY, EC_WORD_RIVAL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Maxwell + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_DARYL] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -678,7 +681,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_TO, EC_MOVE(CHARGE)}, .speechWin = {EC_WORD_AM, EC_WORD_I, EC_WORD_OVERWHELMING, EC_WORD_OR, EC_WORD_WHAT, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_A, EC_WORD_LEGEND, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Daryl + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_KENNETH] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -686,7 +689,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_BETTER, EC_WORD_NOT, EC_MOVE2(SLACK_OFF), EC_WORD_WITH, EC_WORD_ME}, .speechWin = {EC_WORD_DID, EC_WORD_MY, EC_MOVE2(TAUNT), EC_WORD_INTIMIDATE, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kenneth + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_RICH] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -694,7 +697,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_MOVE(FACADE), EC_WORD_DOESN_T, EC_MOVE2(TRICK), EC_WORD_ME, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_OK_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_WORD_ON, EC_WORD_ME, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Rich + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_CADEN] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -702,7 +705,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_DEFEATED, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_FIRE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_SO, EC_WORD_HOT}, - .monSet = gBattleFrontierTrainerMons_Caden + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_MARLON] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -710,7 +713,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEDEX, EC_WORD_IS, EC_WORD_A_LITTLE, EC_WORD_RADIO, EC_WORD_QUES}, .speechWin = {EC_WORD_A_LITTLE, EC_WORD_RADIO, EC_WORD_HUH_QUES, EC_WORD_THAT_S, EC_WORD_TOTALLY, EC_WORD_COOL}, .speechLose = {EC_WORD_IT_S, EC_WORD_NOT, EC_WORD_QUES, EC_WORD_IS, EC_WORD_POKENAV, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Marlon + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_NASH] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -718,7 +721,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LEFT, EC_WORD_YOU, EC_WORD_JUST, EC_WORD_AN, EC_MOVE2(EMBER)}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_WATER, EC_WORD_PLEASE}, - .monSet = gBattleFrontierTrainerMons_Nash + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_ROBBY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -726,7 +729,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_WORD_HAPPY, EC_WORD_TO, EC_WORD_MEET_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_LEADER, EC_WORD_WITH, EC_WORD_REFRESHING, EC_WORD_SERENE_GRACE}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(THRASH), EC_WORD_MY, EC_WORD_TOYS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Robby + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_REECE] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -734,7 +737,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(QUICK_ATTACK), EC_WORD_CAN, EC_WORD_BEAT, EC_WORD_A, EC_MOVE2(TELEPORT)}, .speechWin = {EC_WORD_LIKE, EC_WORD_I, EC_WORD_SAID, EC_WORD_I_AM, EC_WORD_DARN, EC_WORD_FAST}, .speechLose = {EC_WORD_I_WAS, EC_WORD_KIDDING, EC_WORD_ABOUT, EC_WORD_THAT, EC_MOVE2(TELEPORT), EC_WORD_THING}, - .monSet = gBattleFrontierTrainerMons_Reece + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_KATHRYN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -742,7 +745,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_TRAIN, EC_WORD_GOOD, EC_WORD_ENOUGH, EC_WORD_QUES}, .speechWin = {EC_WORD_DON_T, EC_MOVE2(TAUNT), EC_WORD_ME, EC_WORD_LIKE, EC_WORD_THAT, EC_WORD_OK_QUES}, .speechLose = {EC_WORD_WHY, EC_WORD_COULDN_T, EC_WORD_I, EC_WORD_WIN, EC_WORD_THIS, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Kathryn + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ELLEN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -750,7 +753,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_AN, EC_WORD_EGG, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_A, EC_WORD_TASTY, EC_WORD_VICTORY, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_TOO, EC_WORD_TOUGH, EC_WORD_TO, EC_WORD_CRUSH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ellen + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_RAMON] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -758,7 +761,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OKAY, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PERFECTION}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_THAT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_SECRET, EC_WORD_WHY, EC_WORD_I_AM, EC_WORD_HAPPY}, - .monSet = gBattleFrontierTrainerMons_Ramon + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ARTHUR] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -766,7 +769,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HERE_I_COME, EC_WORD_FEELING, EC_WORD_READY, EC_WORD_FOR, EC_WORD_IT, EC_WORD_ALL}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THAT_WAS, EC_WORD_FABULOUS, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Arthur + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ALONDRA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -774,7 +777,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_DAY, EC_WORD_IS, EC_WORD_A, EC_WORD_GREAT, EC_WORD_DAY}, .speechWin = {EC_WORD_MY, EC_MOVE2(DIVE), EC_WORD_WILL, EC_WORD_BE, EC_WORD_A, EC_WORD_LEGEND}, .speechLose = {EC_WORD_MY, EC_MOVE2(DIVE), EC_WORD_LEFT, EC_WORD_ME, EC_WORD_COLD, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Alondra + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ADRIANA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -782,7 +785,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME, EC_WORD_SEE, EC_WORD_AN, EC_WORD_INCREDIBLE, EC_WORD_SWIFT_SWIM, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_MAKE, EC_WORD_IT, EC_WORD_LOOK, EC_WORD_SO, EC_WORD_EASY}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_TIRED, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Adriana + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_MALIK] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -790,7 +793,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_PLEASE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_WON, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_TIRED}, .speechLose = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_LOST, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_TIRED}, - .monSet = gBattleFrontierTrainerMons_Malik + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_1} }, [FRONTIER_TRAINER_JILL] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -798,7 +801,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_WINS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_GIVES, EC_WORD_UP, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jill + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ERIK] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -806,7 +809,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_FROM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Erik + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_2} }, [FRONTIER_TRAINER_YAZMIN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -814,7 +817,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_RATHER, EC_WORD_RUN, EC_WORD_THAN, EC_WORD_BIKE}, .speechWin = {EC_WORD_YES, EC_WORD_I, EC_WORD_WOULD, EC_WORD_MUCH, EC_WORD_RATHER, EC_WORD_RUN}, .speechLose = {EC_WORD_BYE_BYE, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_RUN_AWAY}, - .monSet = gBattleFrontierTrainerMons_Yazmin + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_2} }, [FRONTIER_TRAINER_JAMAL] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -822,7 +825,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_A, EC_WORD_FATHER}, .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_FOR, EC_WORD_MY, EC_WORD_BABY}, .speechLose = {EC_WORD_MY, EC_WORD_BABY, EC_WORD_WILL, EC_WORD_BE, EC_WORD_TOTALLY, EC_WORD_AWESOME}, - .monSet = gBattleFrontierTrainerMons_Jamal + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_2} }, [FRONTIER_TRAINER_LESLIE] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -830,7 +833,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_A, EC_WORD_MOTHER}, .speechWin = {EC_WORD_A, EC_WORD_BABY, EC_WORD_WILL, EC_WORD_BE, EC_WORD_A_LITTLE, EC_WORD_CHALLENGE}, .speechLose = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_HAPPY, EC_WORD_TO, EC_WORD_BE, EC_WORD_ANGRY}, - .monSet = gBattleFrontierTrainerMons_Leslie + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_2} }, [FRONTIER_TRAINER_DAVE] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -838,7 +841,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_SHOULD, EC_WORD_I, EC_WORD_DO, EC_WORD_TODAY, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_SHOULD, EC_WORD_ENJOY, EC_WORD_SOME, EC_WORD_SPORTS, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_WORD_PLAY, EC_WORD_A, EC_WORD_GAME}, - .monSet = gBattleFrontierTrainerMons_Dave + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_CARLO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -846,7 +849,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_DO, EC_WORD_THINGS, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Carlo + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_EMILIA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -854,7 +857,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ME, EC_WORD_WORRY, EC_WORD_QUES, EC_WORD_I, EC_WORD_HAVE, EC_WORD_NONE}, .speechWin = {EC_WORD_AHAHA, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_THAT_WAS, EC_WORD_FANTASTIC, EC_WORD_EXCL}, .speechLose = {EC_WORD_AHAHA, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_THAT_WAS, EC_WORD_ENTERTAINING, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Emilia + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_DALIA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -862,7 +865,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_VERY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_COME, EC_WORD_NEAR, EC_WORD_MY, EC_WORD_BIKE, EC_WORD_EXCL}, .speechLose = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_MY, EC_WORD_BEST, EC_WORD_FRIEND}, - .monSet = gBattleFrontierTrainerMons_Dalia + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_HITOMI] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -870,7 +873,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Hitomi + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_RICARDO] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -878,7 +881,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_PLAY, EC_WORD_TIME, EC_WORD_IS, EC_WORD_OVER}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HERE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_HIT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ricardo + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_SHIZUKA] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -886,7 +889,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THAT, EC_WORD_YOU_RE, EC_WORD_SERIOUS, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_FORGET, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_PERFECT, EC_WORD_IN, EC_WORD_EVERY, EC_WORD_WAY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Shizuka + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_JOANA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -894,7 +897,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_RIGHT, EC_WORD_AWAY}, .speechWin = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_WINNER, EC_WORD_HEAR, EC_WORD_ME, EC_MOVE2(ROAR)}, .speechLose = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_ACCEPT, EC_WORD_THAT, EC_MOVE(OUTRAGE)}, - .monSet = gBattleFrontierTrainerMons_Joana + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_KELLY] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -902,7 +905,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_NIGHT, EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_SCARY}, .speechWin = {EC_WORD_A, EC_WORD_LADY, EC_WORD_GHOST, EC_WORD_APPEARS, EC_WORD_THERE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_WORD_HOME, EC_WORD_WORK, EC_WORD_IS, EC_WORD_AWFULLY, EC_WORD_SCARY}, - .monSet = gBattleFrontierTrainerMons_Kelly + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_RAYNA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -910,7 +913,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_WHEN, EC_WORD_IT_S, EC_WORD_ABOUT, EC_WORD_POWER}, .speechWin = {EC_WORD_UNDERSTAND, EC_WORD_MY, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Rayna + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_EVAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -918,7 +921,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_BATTLE, EC_WORD_HAS, EC_WORD_A, EC_WORD_SMELL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_EXCL, EC_WORD_THE, EC_MOVE(SWEET_SCENT), EC_WORD_OF, EC_WORD_VICTORY}, .speechLose = {EC_WORD_THE, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_OF, EC_WORD_A, EC_WORD_LOSS}, - .monSet = gBattleFrontierTrainerMons_Evan + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1A} }, [FRONTIER_TRAINER_JORDAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -926,7 +929,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GOOD, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_COME_ON, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jordan + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1B} }, [FRONTIER_TRAINER_JOEL] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -934,7 +937,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Joel + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1C} }, [FRONTIER_TRAINER_KRISTEN] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -942,7 +945,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_A, EC_WORD_KID, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_JUST, EC_WORD_A_LITTLE, EC_WORD_KID, EC_WORD_AFTER, EC_WORD_ALL, EC_WORD_EXCL}, .speechLose = {EC_WORD_A, EC_WORD_TOUGH, EC_WORD_KID, EC_WORD_HUH_QUES, EC_WORD_HUMPH, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Kristen + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1A} }, [FRONTIER_TRAINER_SELPHY] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -950,7 +953,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HUH_QUES, EC_WORD_WHAT, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_YES, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Selphy + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1B} }, [FRONTIER_TRAINER_CHLOE] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -958,7 +961,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME, EC_WORD_WE, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BATTLE, EC_WORD_NOW}, .speechWin = {EC_WORD_MORE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_EXCL}, .speechLose = {EC_WORD_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_STRONG, EC_WORD_YOU, EC_WORD_ARE}, - .monSet = gBattleFrontierTrainerMons_Chloe + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1C} }, [FRONTIER_TRAINER_NORTON] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -966,7 +969,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_ONLY, EC_WORD_YOU, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_PUSHOVER, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOME, EC_WORD_KIND, EC_WORD_OF, EC_WORD_AWESOME, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Norton + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_LUKAS] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -974,7 +977,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_JOKING, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_EXISTS, EC_WORD_TO, EC_WORD_SHINE, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_COME, EC_WORD_TO, EC_WORD_SHINE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Lukas + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_ZACH] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -982,7 +985,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_EXCELLENT, EC_MOVE2(MIMIC), EC_WORD_OF, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_LIKE, EC_WORD_A_LITTLE, EC_POKEMON_NATIONAL(TOGEPI), EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_ANGRY, EC_WORD_LIKE, EC_WORD_A, EC_POKEMON_NATIONAL(MANKEY), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Zach + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_KAITLYN] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -990,7 +993,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CRUSH, EC_WORD_THINGS, EC_WORD_WITH, EC_WORD_PSYCHIC, EC_WORD_POWER}, .speechWin = {EC_WORD_MY, EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_THE, EC_WORD_NEWS}, .speechLose = {EC_WORD_NO, EC_WORD_NO, EC_WORD_ELLIPSIS, EC_WORD_THIS, EC_WORD_WON_T, EC_WORD_DO}, - .monSet = gBattleFrontierTrainerMons_Kaitlyn + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_BREANNA] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -998,7 +1001,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_WILL, EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAVE, EC_WORD_SOME, EC_WORD_MORE, EC_WORD_OF, EC_WORD_THIS, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS, EC_WORD_AND, EC_WORD_SKILL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Breanna + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_KENDRA] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -1006,7 +1009,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF, EC_WORD_YOU_RE, EC_WORD_SMART, EC_WORD_STOP, EC_WORD_RIGHT, EC_WORD_NOW}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_STOP}, .speechLose = {EC_WORD_WHY, EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kendra + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_MOLLY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1014,7 +1017,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WILL, EC_WORD_MY, EC_WORD_CUTE_CHARM, EC_MOVE2(ATTRACT), EC_WORD_YOU, EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_MY, EC_WORD_TOYS, EC_WORD_NOW}, .speechLose = {EC_WORD_OH, EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Molly + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_JAZMIN] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1022,7 +1025,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_FORECAST, EC_WORD_TERRIBLE, EC_WORD_THINGS, EC_WORD_FOR, EC_WORD_YOU}, .speechWin = {EC_WORD_THERE, EC_WORD_WASN_T, EC_WORD_MY, EC_WORD_FORECAST, EC_WORD_RIGHT, EC_WORD_QUES}, .speechLose = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_DIDN_T, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Jazmin + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_KELSEY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1030,7 +1033,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_SLEPT, EC_WORD_IN, EC_WORD_DAYS, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_MY, EC_WORD_SLEEP, EC_WORD_WILL, EC_WORD_BE, EC_WORD_EXCELLENT, EC_WORD_NOW}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_SLEEP, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kelsey + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_JALEN] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1038,7 +1041,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_ALLOW, EC_WORD_POKEMON, EC_WORD_TO, EC_MOVE(THRASH)}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_ANGRY, EC_WORD_QUES}, .speechLose = {EC_WORD_WHY, EC_WORD_IS, EC_WORD_THIS, EC_WORD_SO, EC_WORD_HARD, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jalen + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_GRIFFEN] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1046,7 +1049,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(SWALLOW), EC_MOVE2(SLUDGE), EC_WORD_TO, EC_MOVE2(TRANSFORM), EC_WORD_MYSELF}, .speechWin = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GROWTH), EC_WORD_OF, EC_MOVE2(ACID_ARMOR)}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GROWTH), EC_WORD_OF, EC_WORD_SUCTION_CUPS}, - .monSet = gBattleFrontierTrainerMons_Griffen + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_XANDER] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1054,7 +1057,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GOT, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ON, EC_WORD_RENTAL}, .speechWin = {EC_WORD_IT_S, EC_WORD_INCREDIBLE, EC_WORD_MY, EC_WORD_RENTAL, EC_WORD_POKEMON, EC_WORD_WON}, .speechLose = {EC_WORD_RENTAL, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_UP, EC_WORD_TO, EC_MOVE2(SCRATCH)}, - .monSet = gBattleFrontierTrainerMons_Xander + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_MARVIN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1062,7 +1065,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_UP, EC_WORD_TO, EC_WORD_THE, EC_WORD_CHALLENGE, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_THINK, EC_WORD_YOU_RE, EC_WORD_GOOD, EC_WORD_ENOUGH}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_PERFECT, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, - .monSet = gBattleFrontierTrainerMons_Marvin + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_1A} }, [FRONTIER_TRAINER_BRENNAN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1070,7 +1073,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_TO, EC_WORD_SEE, EC_WORD_THE, EC_WORD_NEWS}, .speechWin = {EC_WORD_COMICS, EC_WORD_GET, EC_WORD_DAMP, EC_WORD_FROM, EC_WORD_DRIZZLE, EC_WORD_QUES}, .speechLose = {EC_WORD_THE, EC_WORD_TIGHT, EC_WORD_MONEY, EC_WORD_LIVING, EC_WORD_CHANNEL, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Brennan + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_1B} }, [FRONTIER_TRAINER_BALEY] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1078,7 +1081,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE(SCREECH), EC_WORD_IS, EC_WORD_LIKE, EC_WORD_MUSIC, EC_WORD_TO_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE(SCREECH), EC_WORD_STRATEGY, EC_WORD_IS, EC_WORD_THE, EC_WORD_BEST}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOUNDPROOF, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Baley + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_2} }, [FRONTIER_TRAINER_ZACKARY] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1086,7 +1089,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CAN, EC_WORD_YOU, EC_MOVE(DIG), EC_WORD_IT, EC_WORD_YO, EC_WORD_QUES}, .speechWin = {EC_MOVE2(TAKE_DOWN), EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(DIVE), EC_WORD_YO, EC_WORD_YO}, .speechLose = {EC_WORD_BREAK, EC_WORD_DOWN, EC_MOVE2(DIVE), EC_WORD_TIME, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Zackary + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_2} }, [FRONTIER_TRAINER_GABRIEL] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1094,7 +1097,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(POUND), EC_WORD_THE, EC_WORD_THICK_FAT, EC_WORD_ON, EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, .speechWin = {EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, .speechLose = {EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_WORD_WAS, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gabriel + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_1} }, [FRONTIER_TRAINER_EMILY] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -1102,7 +1105,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HOW, EC_WORD_ABOUT, EC_WORD_A_TINY_BIT, EC_WORD_OF, EC_MOVE(HYPNOSIS), EC_WORD_QUES}, .speechWin = {EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_STRATEGY, EC_WORD_WORKS, EC_WORD_TO, EC_WORD_PERFECTION}, .speechLose = {EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_STRATEGY, EC_WORD_WENT, EC_WORD_BADLY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Emily + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_2} }, [FRONTIER_TRAINER_JORDYN] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -1110,7 +1113,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_MY, EC_WORD_SECRET, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_AS, EC_WORD_I, EC_WORD_APPEAR, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_BUT, EC_WORD_HOW, EC_WORD_DID, EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jordyn + .monSet = (const u16[]){FRONTIER_MONS_BEAUTY_1} }, [FRONTIER_TRAINER_SOFIA] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -1118,7 +1121,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_POKEMON(LOUDRED), EC_WORD_PROBABLY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_FEELING, EC_WORD_THAT, EC_WORD_I, EC_WORD_GET}, .speechLose = {EC_WORD_I, EC_WORD_WORK, EC_WORD_AT, EC_WORD_THE, EC_WORD_DEPT_STORE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Sofia + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_2} }, [FRONTIER_TRAINER_BRADEN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1126,7 +1129,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_CHOOSE_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_PRETTY, EC_WORD_AWESOME, EC_WORD_ABOUT, EC_WORD_MYSELF}, .speechLose = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Braden + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1A} }, [FRONTIER_TRAINER_KAYDEN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1134,7 +1137,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THEY, EC_WORD_OVERDO, EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ISN_T, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_HEY, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TASTY, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kayden + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1B} }, [FRONTIER_TRAINER_COOPER] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1142,7 +1145,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_ABSOLUTELY, EC_WORD_BE, EC_WORD_A, EC_WORD_PUSHOVER}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_TOO, EC_WORD_EXCITING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_PLEASE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SORRY, EC_WORD_I_AM, EC_WORD_SORRY}, - .monSet = gBattleFrontierTrainerMons_Cooper + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1C} }, [FRONTIER_TRAINER_JULIA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1150,7 +1153,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SPIRIT, EC_WORD_ALONE, EC_WORD_WON_T, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_WIN}, .speechWin = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_ACCEPT, EC_WORD_THIS, EC_WORD_WITH, EC_WORD_SERENE_GRACE}, .speechLose = {EC_WORD_FOR_NOW, EC_WORD_GOOD_BYE, EC_WORD_BUT, EC_WORD_IT_S, EC_WORD_NOT, EC_WORD_OVER}, - .monSet = gBattleFrontierTrainerMons_Julia + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1A} }, [FRONTIER_TRAINER_AMARA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1158,7 +1161,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WROOOAAR_EXCL, EC_WORD_EXCL_EXCL, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_READY, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_LOSE, EC_WORD_MYSELF, EC_WORD_IF, EC_WORD_IT_S, EC_WORD_EXCITING}, .speechLose = {EC_WORD_THAT_S, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_MOVE2(TACKLE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Amara + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1B} }, [FRONTIER_TRAINER_LYNN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1166,7 +1169,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_SECRET, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_HIDDEN, EC_WORD_FOREVER}, .speechWin = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_YOUR, EC_WORD_SECRET, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_MOVE(SAFEGUARD), EC_WORD_YOUR, EC_WORD_OWN, EC_WORD_SECRET}, - .monSet = gBattleFrontierTrainerMons_Lynn + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1C} }, [FRONTIER_TRAINER_JOVAN] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1174,7 +1177,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_SADLY, EC_WORD_LACKING}, .speechWin = {EC_WORD_MY, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_COOL, EC_WORD_ISN_T_IT_QUES}, .speechLose = {EC_WORD_I_WAS, EC_WORD_MINUS, EC_WORD_MY, EC_WORD_NORMAL, EC_WORD_POWER, EC_WORD_TODAY}, - .monSet = gBattleFrontierTrainerMons_Jovan + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_DOMINIC] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1182,7 +1185,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_THIS, EC_WORD_EXCELLENT, EC_WORD_CAMERA, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_WAS, EC_WORD_AWFULLY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_DOESN_T, EC_WORD_MISS, EC_WORD_A, EC_WORD_THING}, - .monSet = gBattleFrontierTrainerMons_Dominic + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_NIKOLAS] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1190,7 +1193,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(MIMIC), EC_WORD_POKEMON, EC_WORD_AFTER, EC_WORD_EVERY, EC_WORD_BATTLE}, .speechWin = {EC_WORD_IF_I_WIN, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(TAUROS)}, .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(MILTANK)}, - .monSet = gBattleFrontierTrainerMons_Nikolas + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_VALERIA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1198,7 +1201,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_YOU, EC_WORD_WOULD, EC_WORD_NOT, EC_MOVE2(GLARE)}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_MEAN, EC_WORD_EXCL, EC_WORD_I, EC_WORD_MEAN, EC_WORD_REALLY}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_A, EC_WORD_REALLY, EC_MOVE(SCARY_FACE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Valeria + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_DELANEY] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1206,7 +1209,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_OVER, EC_WORD_TIME, EC_WORD_TO, EC_WORD_PLAY}, .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_IS, EC_WORD_FROM, EC_WORD_SCHOOL}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_NEXT, EC_WORD_WEEK}, - .monSet = gBattleFrontierTrainerMons_Delaney + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_MEGHAN] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1214,7 +1217,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_OUT, EC_WORD_TIME, EC_WORD_TO, EC_WORD_PLAY}, .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_LIKES, EC_WORD_COMICS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_IT_S, EC_WORD_BACK, EC_WORD_TO, EC_WORD_SCHOOL, EC_WORD_SOON, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Meghan + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_ROBERTO] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1222,7 +1225,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_INVINCIBLE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_WEREN_T, EC_WORD_BAD, EC_WORD_I_WAS, EC_WORD_JUST, EC_WORD_BETTER}, .speechLose = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_SATISFIED, EC_WORD_YET, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Roberto + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_DAMIAN] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1230,7 +1233,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_PURE_POWER, EC_WORD_IS, EC_WORD_MACHINE, EC_WORD_LIKE, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE2(MACH_PUNCH), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_A, EC_MOVE(BRICK_BREAK)}, .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Damian + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_BRODY] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1238,7 +1241,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_SEEMS, EC_POKEMON(ODDISH), EC_WORD_QUES}, .speechWin = {EC_WORD_IT_S, EC_WORD_MY, EC_WORD_FAMILY, EC_WORD_STAY_AT_HOME, EC_WORD_LOOK, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_QUESTION, EC_WORD_YOUR, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_SERIOUSLY}, - .monSet = gBattleFrontierTrainerMons_Brody + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_GRAHAM] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1246,7 +1249,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_MY, EC_WORD_BAD}, - .monSet = gBattleFrontierTrainerMons_Graham + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_TYLOR] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1254,7 +1257,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_MY, EC_MOVE2(HEAT_WAVE), EC_WORD_QUES}, .speechWin = {EC_WORD_YES, EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_I_WAS, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_FOR, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Tylor + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_2} }, [FRONTIER_TRAINER_JAREN] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1262,7 +1265,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FIGHTING, EC_WORD_SPIRIT, EC_WORD_QUES, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MORE, EC_WORD_CUTE, EC_WORD_POKEMON, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_LOOK, EC_WORD_QUITE, EC_WORD_CUTE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Jaren + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_2} }, [FRONTIER_TRAINER_CORDELL] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1270,7 +1273,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_DECIDED, EC_WORD_ON, EC_WORD_SPIRIT}, .speechWin = {EC_WORD_CAN_T, EC_WORD_YOU, EC_WORD_ACCEPT, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_BE, EC_WORD_ON, EC_WORD_MY, EC_WORD_WAY}, - .monSet = gBattleFrontierTrainerMons_Cordell + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_M_1} }, [FRONTIER_TRAINER_JAZLYN] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1278,7 +1281,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_POKEDEX, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_QUES}, .speechWin = {EC_WORD_OH_YEAH, EC_WORD_WOW, EC_WORD_YOUR, EC_WORD_POKEDEX, EC_WORD_IS, EC_WORD_SUPER}, .speechLose = {EC_WORD_AN, EC_WORD_AVANT_GARDE, EC_WORD_POKEDEX, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_AWESOME}, - .monSet = gBattleFrontierTrainerMons_Jazlyn + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_F_1} }, [FRONTIER_TRAINER_ZACHERY] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1286,7 +1289,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_MY, EC_WORD_OWN, EC_WORD_PLACE, EC_WORD_YEEHAW_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_AN, EC_WORD_EXCITING, EC_WORD_TIME, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_FLATTEN, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Zachery + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_JOHAN] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1294,7 +1297,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WINTER, EC_WORD_WILL, EC_WORD_SOON, EC_WORD_BE, EC_WORD_HERE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_COULD, EC_WORD_USE, EC_WORD_A, EC_MOVE2(HELPING_HAND)}, .speechLose = {EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_USE, EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_UP}, - .monSet = gBattleFrontierTrainerMons_Johan + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2_NO_DUGTRIO} }, [FRONTIER_TRAINER_SHEA] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1302,7 +1305,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DO, EC_WORD_YOU, EC_WORD_BATTLE, EC_WORD_WITH, EC_WORD_BEAUTY, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_BATTLE, EC_WORD_IN, EC_WORD_AN, EC_WORD_UGLY, EC_WORD_WAY}, .speechLose = {EC_WORD_WHAT, EC_WORD_IS, EC_WORD_BEAUTY, EC_WORD_TO, EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Shea + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_KAILA] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1310,7 +1313,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_THIRSTY, EC_WORD_RIGHT, EC_WORD_NOW, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I, EC_WORD_COULD, EC_WORD_USE, EC_WORD_A, EC_WORD_COLD, EC_WORD_DRINK}, .speechLose = {EC_WORD_THAT, EC_WORD_LOSS, EC_WORD_IS, EC_WORD_HARD, EC_WORD_TO, EC_MOVE2(SWALLOW)}, - .monSet = gBattleFrontierTrainerMons_Kaila + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_ISIAH] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -1318,7 +1321,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PRETEND, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_A_LOT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_MOVE2(TRICK), EC_WORD_MOTHER, EC_WORD_FOR, EC_WORD_MY, EC_WORD_ALLOWANCE}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_WANT, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE}, - .monSet = gBattleFrontierTrainerMons_Isiah + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_GARRETT] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -1326,7 +1329,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ENJOY, EC_WORD_COMICS, EC_WORD_AND, EC_WORD_THIS, EC_WORD_GAME}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_MUSIC, EC_WORD_IDOL, EC_WORD_TOO}, .speechLose = {EC_WORD_BUT, EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE}, - .monSet = gBattleFrontierTrainerMons_Garrett + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_HAYLIE] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -1334,7 +1337,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WORRY, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_SLEEP}, .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_GIVES, EC_WORD_ME, EC_WORD_A, EC_MOVE2(CALM_MIND)}, .speechLose = {EC_WORD_MY, EC_WORD_INSOMNIA, EC_WORD_WILL, EC_WORD_GET, EC_WORD_BAD, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Haylie + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_MEGAN] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -1342,7 +1345,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_AN, EC_MOVE(AROMATHERAPY), EC_WORD_BATH}, .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_HEALTHY, EC_WORD_CLEAR_BODY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_IF, EC_WORD_ONLY, EC_MOVE(AROMATHERAPY), EC_WORD_WERE, EC_WORD_LESS, EC_WORD_EXPENSIVE}, - .monSet = gBattleFrontierTrainerMons_Megan + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_ISSAC] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -1350,7 +1353,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_HOBBY, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(WATER_SPORT)}, .speechLose = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(MUD_SPORT)}, - .monSet = gBattleFrontierTrainerMons_Issac + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_QUINTON] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -1358,7 +1361,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_CAUSE, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_AREN_T, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HEY, EC_WORD_WHAT, EC_WORD_DID, EC_WORD_I, EC_WORD_DO, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Quinton + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_SALMA] = { .facilityClass = FACILITY_CLASS_LADY, @@ -1366,7 +1369,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_VE, EC_WORD_GOT, EC_WORD_YOUR, EC_WORD_HUSTLE, EC_WORD_ON, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_WIN, EC_WORD_YOU, EC_WORD_HUSTLE, EC_WORD_ON, EC_WORD_OUT}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_HOW, EC_WORD_I, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Salma + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_ANSLEY] = { .facilityClass = FACILITY_CLASS_LADY, @@ -1374,7 +1377,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_BORED, EC_WORD_ELLIPSIS, EC_WORD_DANCE, EC_WORD_FOR, EC_WORD_ME}, .speechWin = {EC_WORD_YOU_VE, EC_WORD_BORED, EC_WORD_ME, EC_WORD_SOME, EC_WORD_MORE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_TAKE, EC_WORD_YOUR, EC_MOVE2(FRUSTRATION), EC_WORD_SOME, EC_WORD_OTHER, EC_WORD_PLACE}, - .monSet = gBattleFrontierTrainerMons_Ansley + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_HOLDEN] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -1382,7 +1385,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_COMMEMORATE, EC_WORD_MY, EC_WORD_COOLNESS, EC_WORD_IN, EC_WORD_BATTLE}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_PRAISE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_AMUSING, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Holden + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_2} }, [FRONTIER_TRAINER_LUCA] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -1390,7 +1393,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WE, EC_WORD_WILL, EC_WORD_HAVE, EC_WORD_A, EC_WORD_COOL, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_IN, EC_WORD_A, EC_WORD_COOL, EC_WORD_WAY}, .speechLose = {EC_WORD_HELLO, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_A, EC_WORD_KID}, - .monSet = gBattleFrontierTrainerMons_Luca + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_2} }, [FRONTIER_TRAINER_JAMISON] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -1398,7 +1401,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(SECRET_POWER), EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_TO, EC_WORD_POKEMON}, .speechWin = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_USE, EC_MOVE(SMOKESCREEN), EC_WORD_TO, EC_WORD_ESCAPE}, - .monSet = gBattleFrontierTrainerMons_Jamison + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_2} }, [FRONTIER_TRAINER_GUNNAR] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -1406,7 +1409,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE(CUT), EC_WORD_DOWN, EC_WORD_EVERY, EC_WORD_OPPONENT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_FOR, EC_WORD_YOUR, EC_WORD_LOSS}, .speechLose = {EC_WORD_PLEASE, EC_WORD_LOSE, EC_WORD_THAT, EC_MOVE(SCARY_FACE), EC_WORD_OF, EC_WORD_YOURS}, - .monSet = gBattleFrontierTrainerMons_Gunnar + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_2} }, [FRONTIER_TRAINER_CRAIG] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -1414,7 +1417,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_FOR, EC_WORD_MY, EC_WORD_TRAIN}, .speechWin = {EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_ISN_T, EC_WORD_HERE, EC_WORD_YET, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_SEE_YA, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Craig + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_PIERCE] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -1422,7 +1425,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_WORD_LAST, EC_WORD_WEEK}, .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_EMPTY_WORD}, .speechLose = {EC_WORD_DIDN_T, EC_WORD_IT, EC_MOVE(HAIL), EC_WORD_TOO, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Pierce + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_REGINA] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -1430,7 +1433,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_PLAY, EC_WORD_IN, EC_WORD_WATER}, .speechWin = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_COME, EC_WORD_OUT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_MUCH, EC_WORD_GOOD, EC_WORD_IN, EC_WORD_WATER}, - .monSet = gBattleFrontierTrainerMons_Regina + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_ALISON] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -1438,7 +1441,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_KINDERGARTEN, EC_WORD_MAGAZINE, EC_WORD_IS, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_HOW, EC_WORD_TO, EC_WORD_BUG, EC_WORD_YOUR, EC_WORD_TEACHER, EC_WORD_QUES}, .speechLose = {EC_WORD_ENJOY, EC_WORD_A, EC_WORD_TASTY, EC_WORD_SCHOOL, EC_WORD_DIET, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Alison + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_HANK] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1446,7 +1449,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_A, EC_WORD_BUG, EC_WORD_EVENT, EC_WORD_SOON}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_BUG, EC_WORD_FASHION, EC_WORD_SHOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Hank + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_3} }, [FRONTIER_TRAINER_EARL] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1454,7 +1457,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_INVINCIBLE, EC_WORD_BUG, EC_WORD_TRAINER, EC_WORD_IS, EC_WORD_HERE}, .speechWin = {EC_WORD_THE, EC_WORD_INVINCIBLE, EC_WORD_BUG, EC_WORD_TRAINER, EC_WORD_AM, EC_WORD_I}, .speechLose = {EC_WORD_SEE, EC_WORD_HOW, EC_WORD_FAST, EC_WORD_I, EC_WORD_RUN_AWAY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Earl + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_3} }, [FRONTIER_TRAINER_RAMIRO] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -1462,7 +1465,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WENT, EC_WORD_TO, EC_WORD_A, EC_WORD_FISHING, EC_WORD_SCHOOL}, .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_I_AM, EC_WORD_IN, EC_WORD_THE, EC_WORD_FISHING, EC_WORD_HALL_OF_FAME}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO, EC_WORD_BACK, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ramiro + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_2} }, [FRONTIER_TRAINER_HUNTER] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -1470,7 +1473,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_TOTALLY, EC_WORD_COOL, EC_MOVE(CROSS_CHOP)}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_DO, EC_WORD_A, EC_MOVE(CROSS_CHOP)}, .speechLose = {EC_WORD_WAS, EC_WORD_IT, EC_WORD_A, EC_WORD_MISTAKE, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Hunter + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_2} }, [FRONTIER_TRAINER_AIDEN] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1478,7 +1481,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_WORK, EC_WORD_IS, EC_WORD_MAKING, EC_WORD_ME, EC_WORD_HEALTHY}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_HEALTHY, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_HEALTHY, EC_WORD_THAN, EC_WORD_I_AM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Aiden + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_3} }, [FRONTIER_TRAINER_XAVIER] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1486,7 +1489,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_GOOD_BYE, EC_WORD_AND, EC_WORD_THANK_YOU, EC_WORD_THAT_WAS, EC_WORD_FUNNY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WOWEE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Xavier + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_3} }, [FRONTIER_TRAINER_CLINTON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1494,7 +1497,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_MOVE2(FURY_SWIPES), EC_WORD_YOUR, EC_MOVE(STRENGTH), EC_WORD_YOUNG, EC_WORD_TRAINER}, .speechLose = {EC_WORD_TCH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Clinton + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_2} }, [FRONTIER_TRAINER_JESSE] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1502,7 +1505,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_FOR, EC_WORD_MY, EC_WORD_MOTHER}, .speechWin = {EC_WORD_MOTHER, EC_WORD_WILL, EC_WORD_BE, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MY, EC_WORD_MOTHER, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Jesse + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_2} }, [FRONTIER_TRAINER_EDUARDO] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -1510,7 +1513,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OUR, EC_WORD_MUSIC, EC_WORD_WILL, EC_WORD_PLAY, EC_WORD_ALL, EC_WORD_NIGHT}, .speechWin = {EC_WORD_NIGHTTIME, EC_WORD_IS, EC_WORD_WHEN, EC_WORD_I, EC_WORD_PLAY, EC_WORD_BEST}, .speechLose = {EC_WORD_LET_S, EC_WORD_PARTY, EC_WORD_UNTIL, EC_WORD_THE, EC_MOVE(MORNING_SUN), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Eduardo + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_2} }, [FRONTIER_TRAINER_HAL] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -1518,7 +1521,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_TRENDY, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_HIP_AND, EC_WORD_HAPPENING, EC_WORD_OH_YEAH, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_ALWAYS, EC_WORD_TRENDY, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, - .monSet = gBattleFrontierTrainerMons_Hal + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_2} }, [FRONTIER_TRAINER_GAGE] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -1526,7 +1529,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HERE_IT_IS, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_HIDDEN, EC_WORD_MOVE}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_VICTORY, EC_WORD_EXCL}, .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_JUST, EC_MOVE(FLY), EC_WORD_AWAY, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gage + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_2} }, [FRONTIER_TRAINER_ARNOLD] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -1534,7 +1537,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_WEIRD, EC_WORD_FROM, EC_WORD_A, EC_WORD_DREAM}, .speechWin = {EC_WORD_YOUR, EC_MOVE(SCARY_FACE), EC_WORD_WAS, EC_WORD_IN, EC_WORD_MY, EC_WORD_DREAM}, .speechLose = {EC_WORD_MY, EC_WORD_INCREDIBLE, EC_WORD_DREAM, EC_WORD_WAS, EC_WORD_SO, EC_WORD_WEIRD}, - .monSet = gBattleFrontierTrainerMons_Arnold + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_2} }, [FRONTIER_TRAINER_JARRETT] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -1542,7 +1545,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_LET_S, EC_WORD_DANCE, EC_WORD_LIKE, EC_WORD_IT_S, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_HOW, EC_WORD_I, EC_WORD_DANCE, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_APPRECIATE, EC_WORD_HOW, EC_WORD_I, EC_WORD_DANCE}, - .monSet = gBattleFrontierTrainerMons_Jarrett + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_2} }, [FRONTIER_TRAINER_GARETT] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -1550,7 +1553,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_GIVES, EC_WORD_ME, EC_WORD_A_LITTLE, EC_MOVE2(SWEET_KISS)}, .speechWin = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_FRIEND, EC_WORD_IS, EC_WORD_MY, EC_WORD_TREASURE}, .speechLose = {EC_WORD_A, EC_WORD_TREASURE, EC_WORD_ISN_T, EC_WORD_ALWAYS, EC_WORD_ABOUT, EC_WORD_MONEY}, - .monSet = gBattleFrontierTrainerMons_Garett + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_2} }, [FRONTIER_TRAINER_EMANUEL] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -1558,7 +1561,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SMARTNESS, EC_WORD_ALONE, EC_WORD_WON_T, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_WIN}, .speechWin = {EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_SMART, EC_WORD_BUT, EC_WORD_I, EC_WORD_WON}, .speechLose = {EC_WORD_HOW, EC_WORD_DID, EC_WORD_YOU, EC_MOVE2(FAKE_OUT), EC_WORD_ME, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Emanuel + .monSet = (const u16[]){FRONTIER_MONS_HIKER_2} }, [FRONTIER_TRAINER_GUSTAVO] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -1566,7 +1569,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE(CHARGE), EC_WORD_EXCL, EC_EMPTY_WORD, EC_MOVE(CHARGE), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SURRENDER, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_SURRENDER, EC_WORD_YET}, - .monSet = gBattleFrontierTrainerMons_Gustavo + .monSet = (const u16[]){FRONTIER_MONS_HIKER_2} }, [FRONTIER_TRAINER_KAMERON] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -1574,7 +1577,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_TAKE_THAT, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_MY, EC_WORD_FIERY, EC_MOVE2(TRICK)}, .speechWin = {EC_WORD_DID, EC_WORD_MY, EC_WORD_FIERY, EC_MOVE2(TRICK), EC_MOVE(ASTONISH), EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DIDN_T, EC_WORD_FALL, EC_WORD_FOR, EC_WORD_MY, EC_MOVE2(TRICK)}, - .monSet = gBattleFrontierTrainerMons_Kameron + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_2} }, [FRONTIER_TRAINER_ALFREDO] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -1582,7 +1585,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_FIERY, EC_WORD_GOURMET, EC_WORD_AM, EC_WORD_I, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_TASTY, EC_WORD_GOURMET, EC_WORD_VICTORY, EC_WORD_EXCL}, .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_DISASTER, EC_WORD_THAT_WAS, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Alfredo + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_2} }, [FRONTIER_TRAINER_RUBEN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1590,7 +1593,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING}, .speechWin = {EC_WORD_GET, EC_WORD_GOING, EC_WORD_EXCL, EC_WORD_THIS, EC_WORD_IS, EC_WORD_GOOD_BYE}, .speechLose = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ruben + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_2} }, [FRONTIER_TRAINER_LAMAR] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1598,7 +1601,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_MOVE2(PRESENT), EC_WORD_FOR, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_THIS, EC_WORD_IS, EC_WORD_QUITE, EC_WORD_TASTY, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_OH, EC_WORD_IT_S, EC_WORD_A, EC_WORD_GAME, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Lamar + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_2} }, [FRONTIER_TRAINER_JAXON] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1606,7 +1609,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_SHELL_ARMOR, EC_WORD_IS, EC_WORD_WHAT, EC_WORD_I, EC_WORD_WANT}, .speechWin = {EC_WORD_MY, EC_WORD_FATHER, EC_WORD_AND, EC_WORD_MOTHER, EC_WORD_WON_T, EC_WORD_ACCEPT}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_SHELL_ARMOR, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jaxon + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_LOGAN] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1614,7 +1617,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_WILL, EC_WORD_STUDY, EC_WORD_FOR, EC_WORD_SCHOOL}, .speechWin = {EC_WORD_ME, EC_WORD_STUDY, EC_WORD_QUES, EC_WORD_NOT_VERY, EC_WORD_LIKELY_TO, EC_WORD_SEE}, .speechLose = {EC_WORD_NO, EC_WORD_THANKS, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SLEEP}, - .monSet = gBattleFrontierTrainerMons_Logan + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_EMILEE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1622,7 +1625,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IS, EC_WORD_THIS, EC_WORD_KIND, EC_WORD_OF, EC_WORD_BATTLE, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_LET_S, EC_WORD_GO, EC_WORD_FOR, EC_WORD_AN, EC_MOVE(ICY_WIND), EC_MOVE2(SURF)}, .speechLose = {EC_WORD_HOW, EC_WORD_ABOUT, EC_WORD_A, EC_MOVE(ROCK_SLIDE), EC_WORD_SHOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Emilee + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_JOSIE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1630,7 +1633,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_FASHION, EC_WORD_CONTEST, EC_WORD_IS, EC_WORD_PRETTY}, .speechWin = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_MODE, EC_WORD_FASHION, EC_WORD_THINGS}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_TOTALLY, EC_WORD_LACKING, EC_WORD_IN, EC_WORD_FASHION, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Josie + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_ARMANDO] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -1638,7 +1641,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_NEED, EC_WORD_MORE, EC_WORD_GRASS, EC_WORD_TYPE, EC_WORD_POKEMON}, .speechWin = {EC_WORD_TRADE, EC_WORD_ME, EC_WORD_A, EC_WORD_GRASS, EC_WORD_POKEMON, EC_WORD_PLEASE}, .speechLose = {EC_WORD_THERE, EC_WORD_AREN_T, EC_WORD_ENOUGH, EC_WORD_GRASS, EC_WORD_TYPE, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Armando + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_SKYLER] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -1646,7 +1649,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(INGRAIN), EC_WORD_IS, EC_WORD_MY, EC_WORD_CHOICE, EC_WORD_BATTLE, EC_WORD_MOVE}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MOVE, EC_WORD_ME, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_MOVE(CUT), EC_WORD_ME, EC_WORD_DOWN, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Skyler + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_RUTH] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -1654,7 +1657,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_ENJOY, EC_WORD_THIS, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MUCH, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_STOP, EC_WORD_I, EC_WORD_DON_T, EC_WORD_ENJOY, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Ruth + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_MELODY] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -1662,7 +1665,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_SUNDAY, EC_WORD_IS, EC_WORD_A, EC_MOVE2(SUNNY_DAY)}, .speechWin = {EC_WORD_SUNDAY, EC_WORD_SEEMS, EC_WORD_FOREVER, EC_WORD_TO, EC_WORD_COME, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THE, EC_WORD_FORECAST, EC_WORD_SAYS, EC_WORD_IT, EC_WORD_WILL, EC_MOVE(HAIL)}, - .monSet = gBattleFrontierTrainerMons_Melody + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_PEDRO] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -1670,7 +1673,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_SWIFT_SWIM, EC_WORD_WILL, EC_WORD_DO, EC_WORD_YOU, EC_WORD_GOOD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_I, EC_WORD_SINK, EC_WORD_AN, EC_WORD_OPPONENT}, .speechLose = {EC_WORD_UH_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Pedro + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_2} }, [FRONTIER_TRAINER_ERICK] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -1678,7 +1681,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(TACKLE), EC_WORD_YOU, EC_WORD_DOWN, EC_WORD_EXCL}, .speechWin = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_RUN_AWAY, EC_WORD_YOU, EC_WORD_LOSER, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_THINK, EC_WORD_YOU, EC_WORD_WOULD, EC_MOVE(COUNTER)}, - .monSet = gBattleFrontierTrainerMons_Erick + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_2} }, [FRONTIER_TRAINER_ELAINE] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -1686,7 +1689,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_HEROINE, EC_WORD_ADVENTURE, EC_WORD_ISN_T, EC_WORD_GOING, EC_WORD_WELL}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED}, .speechLose = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_HEROINE}, - .monSet = gBattleFrontierTrainerMons_Elaine + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_2} }, [FRONTIER_TRAINER_JOYCE] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -1694,7 +1697,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_GO, EC_WORD_AHAHA, EC_WORD_EXCL}, .speechWin = {EC_WORD_LALALA, EC_WORD_NO, EC_WORD_LOSING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_LALALA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Joyce + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_2} }, [FRONTIER_TRAINER_TODD] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1702,7 +1705,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_LIGHTNINGROD, EC_WORD_FOR, EC_WORD_MY, EC_WORD_POWER}, .speechWin = {EC_WORD_THAT_S, EC_WORD_ALL, EC_WORD_YOU, EC_WORD_COULD, EC_MOVE(ABSORB), EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_MOVE2(REFLECT), EC_WORD_MY, EC_WORD_POWER, EC_WORD_BACK, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Todd + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_GAVIN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1710,7 +1713,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(BIDE), EC_WORD_MY, EC_WORD_TIME, EC_EMPTY_WORD}, .speechWin = {EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_MISTAKE, EC_WORD_WAS, EC_WORD_TOO, EC_WORD_EXPENSIVE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Gavin + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_MALORY] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1718,7 +1721,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_CUTE, EC_WORD_POKEMON}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_TCH, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_VERY, EC_WORD_NICE}, - .monSet = gBattleFrontierTrainerMons_Malory + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_ESTHER] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1726,7 +1729,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_NICE, EC_MOVE2(PRESENT), EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_PLEASE, EC_WORD_GET, EC_WORD_ME, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_GAME}, .speechLose = {EC_WORD_MESSAGE, EC_WORD_CARDS, EC_WORD_MAKE, EC_WORD_A, EC_WORD_WEAK, EC_MOVE2(PRESENT)}, - .monSet = gBattleFrontierTrainerMons_Esther + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_OSCAR] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1734,7 +1737,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_YOUR, EC_WORD_POWER, EC_WORD_IN, EC_WORD_FULL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_YOUR, EC_WORD_FULL, EC_WORD_POWER, EC_WORD_EXCL}, .speechLose = {EC_WORD_NOT, EC_WORD_FUNNY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Oscar + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_WILSON] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1742,7 +1745,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WORK, EC_WORD_IS, EC_WORD_MAKING, EC_WORD_ME, EC_WORD_AN, EC_WORD_EARLY_BIRD}, .speechWin = {EC_WORD_ALL, EC_WORD_WORK, EC_WORD_AND, EC_WORD_NO, EC_WORD_PLAY, EC_WORD_ELLIPSIS}, .speechLose = {EC_MOVE(ENDURE), EC_WORD_IS, EC_WORD_ALL, EC_WORD_I, EC_WORD_CAN, EC_WORD_DO}, - .monSet = gBattleFrontierTrainerMons_Wilson + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_CLARE] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1750,7 +1753,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YAY, EC_WORD_EXCL, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechWin = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_A, EC_WORD_WIMPY, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechLose = {EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_TRAINER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Clare + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_TESS] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1758,7 +1761,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_SOME, EC_POKEMON(GULPIN), EC_WORD_DESIGN, EC_WORD_SWEETS, EC_WORD_QUES}, .speechWin = {EC_WORD_THEY_RE, EC_WORD_A, EC_WORD_SECRET, EC_WORD_POKEMON, EC_WORD_GOURMET, EC_WORD_ITEM}, .speechLose = {EC_WORD_THEY_RE, EC_WORD_TASTY, EC_WORD_EXCL, EC_WORD_REFRESHING, EC_WORD_TOO, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Tess + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_LEON] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1766,7 +1769,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_ANY, EC_WORD_OTHER, EC_WORD_TRAINER}, .speechWin = {EC_WORD_I, EC_WORD_DID, EC_WORD_IT, EC_MOVE2(JUMP_KICK), EC_WORD_FOR, EC_WORD_JOY}, .speechLose = {EC_WORD_BACK, EC_WORD_HOME, EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Leon + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_M_2A} }, [FRONTIER_TRAINER_ALONZO] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1774,7 +1777,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_NOT, EC_WORD_LOST, EC_WORD_ONCE, EC_WORD_YET, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOUR, EC_WORD_SAD, EC_WORD_LOOK, EC_WORD_BECOMES, EC_WORD_YOU, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_BELIEVE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Alonzo + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_M_2B} }, [FRONTIER_TRAINER_VINCE] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1782,7 +1785,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_TOP, EC_WORD_TRAINER, EC_WORD_THAT_S, EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_THE, EC_WORD_TOP, EC_WORD_RANK, EC_WORD_BELONGS_TO, EC_WORD_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_APPEAL, EC_WORD_THIS, EC_MOVE(OUTRAGE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Vince + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2C(LATIOS)} }, [FRONTIER_TRAINER_BRYON] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1790,7 +1793,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(BARRAGE), EC_WORD_WILL, EC_MOVE2(SLAM), EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_DIDN_T, EC_WORD_COUNT_ON, EC_WORD_ANY, EC_WORD_LESS, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_JUST, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_IT, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Bryon + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIOS)} }, [FRONTIER_TRAINER_AVA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1798,7 +1801,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_TREASURE, EC_WORD_OF, EC_WORD_THIS, EC_WORD_WORLD}, .speechWin = {EC_WORD_MY, EC_WORD_WORLD, EC_WORD_IS, EC_WORD_FULL, EC_WORD_OF, EC_WORD_WONDER}, .speechLose = {EC_WORD_WHY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_SO, EC_WORD_TERRIBLE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Ava + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_F_2A} }, [FRONTIER_TRAINER_MIRIAM] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1806,7 +1809,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_WITH, EC_WORD_A, EC_MOVE(SCARY_FACE)}, .speechWin = {EC_WORD_AHAHA, EC_WORD_YOU, EC_WORD_ONLY, EC_WORD_LOOK, EC_WORD_SCARY, EC_WORD_EXCL}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SCARY}, - .monSet = gBattleFrontierTrainerMons_Miriam + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_F_2B} }, [FRONTIER_TRAINER_CARRIE] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1814,7 +1817,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_SHOW, EC_WORD_YOU, EC_WORD_GUTSY, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_ABOUT, EC_WORD_GUTS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_ELLIPSIS, EC_MOVE(SELF_DESTRUCT), EC_WORD_MODE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Carrie + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2C(LATIAS)} }, [FRONTIER_TRAINER_GILLIAN2] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1822,7 +1825,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_SEEK, EC_WORD_A, EC_WORD_TRULY, EC_WORD_GREAT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_NEED, EC_WORD_A_LOT, EC_WORD_BETTER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A_LITTLE, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_TAKE}, - .monSet = gBattleFrontierTrainerMons_Gillian2 + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIAS)} }, [FRONTIER_TRAINER_TYLER] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1830,7 +1833,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_GO, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_YO}, .speechLose = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_YO}, - .monSet = gBattleFrontierTrainerMons_Tyler + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_CHAZ] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1838,7 +1841,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_POWER}, .speechWin = {EC_WORD_THEY, EC_WORD_HAVE, EC_WORD_MORE, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YEAH, EC_MOVE2(TAKE_DOWN), EC_WORD_THEIR, EC_WORD_POWER, EC_WORD_A_TINY_BIT, EC_WORD_PLEASE}, - .monSet = gBattleFrontierTrainerMons_Chaz + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_NELSON] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1846,7 +1849,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WELL_THEN, EC_WORD_WILL, EC_WORD_THIS, EC_WORD_POKEMON, EC_WORD_WORK, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_IT, EC_WORD_WAS, EC_WORD_TOO_STRONG}, .speechLose = {EC_WORD_IT, EC_WORD_DIDN_T, EC_WORD_MATCH_UP, EC_WORD_WELL, EC_WORD_I, EC_WORD_THINK}, - .monSet = gBattleFrontierTrainerMons_Nelson + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIOS)} }, [FRONTIER_TRAINER_SHANIA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1854,7 +1857,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ABSOLUTELY, EC_WORD_ADORE, EC_WORD_ME}, .speechWin = {EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_WITH, EC_WORD_CUTE_CHARM}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SO, EC_WORD_MEAN, EC_WORD_TO, EC_WORD_CUTE, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Shania + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_STELLA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1862,7 +1865,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOUR, EC_WORD_POKEMON}, .speechWin = {EC_WORD_WELL, EC_WORD_AREN_T, EC_WORD_THEY, EC_WORD_BORING, EC_WORD_QUES, EC_WORD_AHAHA}, .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_SOMETHING, EC_WORD_ELSE, EC_WORD_ALL_RIGHT}, - .monSet = gBattleFrontierTrainerMons_Stella + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_DORINE] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1870,7 +1873,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AND, EC_WORD_STRONG, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_GOOD, EC_WORD_QUES}, .speechLose = {EC_WORD_THIS, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_AT, EC_WORD_ALL}, - .monSet = gBattleFrontierTrainerMons_Dorine + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIAS)} }, [FRONTIER_TRAINER_MADDOX] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1878,7 +1881,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_MY, EC_WORD_NO_1, EC_WORD_CHOICE}, .speechWin = {EC_WORD_IT_S, EC_WORD_NO, EC_WORD_SECRET, EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_WIN}, .speechLose = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_LOSE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Maddox + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_DAVIN] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1886,7 +1889,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_HEAR, EC_WORD_YOU, EC_MOVE2(ROAR), EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_VICTORY, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Davin + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_TREVON] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1894,7 +1897,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_LIVING, EC_WORD_ONLY, EC_WORD_WITH, EC_WORD_DRAGON, EC_WORD_POKEMON}, .speechWin = {EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_LIVING, EC_WORD_IS, EC_WORD_PERFECT}, .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_LIVING}, - .monSet = gBattleFrontierTrainerMons_Trevon + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_MATEO] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1902,7 +1905,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_BE, EC_WORD_OVER, EC_WORD_SOON, EC_WORD_ENOUGH}, .speechWin = {EC_WORD_WELL, EC_WORD_THAT, EC_WORD_DIDN_T, EC_WORD_TAKE, EC_WORD_VERY, EC_WORD_MUCH}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_SO, EC_WORD_SOON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Mateo + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_2A} }, [FRONTIER_TRAINER_BRET] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1910,7 +1913,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_ROCK_SOLID, EC_WORD_POKEMON, EC_WORD_THE, EC_WORD_BEST}, .speechWin = {EC_WORD_TOUGHNESS, EC_WORD_IS, EC_WORD_THE, EC_WORD_WAY, EC_WORD_TO, EC_WORD_GO}, .speechLose = {EC_WORD_I, EC_WORD_ALSO, EC_WORD_HAVE, EC_WORD_A, EC_WORD_PLUSH_DOLL, EC_WORD_COLLECTION}, - .monSet = gBattleFrontierTrainerMons_Bret + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B} }, [FRONTIER_TRAINER_RAUL] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1918,7 +1921,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_REJECT, EC_WORD_EVERY, EC_WORD_WEAK, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HUMPH, EC_WORD_EXCL, EC_WORD_ANOTHER, EC_WORD_WEAK, EC_WORD_TRAINER, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NOTHING, EC_WORD_WEAK, EC_WORD_ABOUT, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Raul + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C} }, [FRONTIER_TRAINER_KAY] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1926,7 +1929,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_AND, EC_WORD_YET, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_GOOD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_AT, EC_WORD_LAST, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kay + .monSet = (const u16[]){FRONTIER_MONS_BATTLE_GIRL_2A} }, [FRONTIER_TRAINER_ELENA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1934,7 +1937,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_THAT_S, EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_ISN_T, EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_AWESOME, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DISLIKE, EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Elena + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B} }, [FRONTIER_TRAINER_ALANA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1942,7 +1945,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EAT, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK, EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_LEARN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK}, - .monSet = gBattleFrontierTrainerMons_Alana + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C} }, [FRONTIER_TRAINER_ALEXAS] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1950,7 +1953,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GOOD, EC_WORD_TO, EC_WORD_MEET_YOU, EC_WORD_YOUNG, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GIVE, EC_WORD_IT, EC_WORD_UP}, .speechLose = {EC_WORD_YOU, EC_WORD_ARE, EC_WORD_A, EC_WORD_STRONG, EC_WORD_TRAINER, EC_WORD_KID}, - .monSet = gBattleFrontierTrainerMons_Alexas + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2A(TYRANITAR)} }, [FRONTIER_TRAINER_WESTON] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1958,7 +1961,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_PLAY, EC_WORD_DOWN, EC_WORD_ALL_RIGHT, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_TO, EC_WORD_ATTACK}, .speechLose = {EC_WORD_WELL, EC_WORD_WELL, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Weston + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2B(LATIOS)} }, [FRONTIER_TRAINER_JASPER] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1966,7 +1969,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_OLD, EC_WORD_I_AM, EC_WORD_SKILLED, EC_WORD_EXCL}, .speechWin = {EC_WORD_SKILLED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_SHOCKED, EC_WORD_EXCL, EC_WORD_DOWN, EC_WORD_I, EC_WORD_GO}, - .monSet = gBattleFrontierTrainerMons_Jasper + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2C(TYRANITAR)} }, [FRONTIER_TRAINER_NADIA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1974,7 +1977,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_DOWN, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU}, .speechLose = {EC_WORD_I_AM, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_DOWNCAST, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Nadia + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2A(DRAGONITE)} }, [FRONTIER_TRAINER_MIRANDA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1982,7 +1985,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WELL, EC_WORD_WELL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_START, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_QUES, EC_WORD_DONE, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_WELL, EC_WORD_I, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_I_AM, EC_WORD_TOO_WEAK}, - .monSet = gBattleFrontierTrainerMons_Miranda + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2B(LATIAS)} }, [FRONTIER_TRAINER_EMMA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1990,7 +1993,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_VE, EC_WORD_MISHEARD, EC_WORD_THINGS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_IS, EC_WORD_RIGHT}, - .monSet = gBattleFrontierTrainerMons_Emma + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2C(DRAGONITE)} }, [FRONTIER_TRAINER_ROLANDO] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -1998,7 +2001,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_SUPER, EC_WORD_POKEMON, EC_WORD_HERO, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAS, EC_WORD_THAT, EC_WORD_ENOUGH, EC_WORD_FOR, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_BEAT, EC_WORD_A, EC_WORD_HERO}, - .monSet = gBattleFrontierTrainerMons_Rolando + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, ARTICUNO, ZAPDOS, MOLTRES)} }, [FRONTIER_TRAINER_STANLY] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -2006,7 +2009,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_BE, EC_WORD_AN, EC_WORD_EASY, EC_WORD_MATCH}, .speechWin = {EC_WORD_IT, EC_WORD_REALLY, EC_WORD_WAS, EC_WORD_EASY, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_HAPPY, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Stanly + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, RAIKOU, ENTEI, SUICUNE)} }, [FRONTIER_TRAINER_DARIO] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -2014,7 +2017,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_SAYS, EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN}, .speechWin = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_SEE, EC_WORD_THIS, EC_MOVE(REVERSAL), EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Dario + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, REGIROCK, REGICE, REGISTEEL)} }, [FRONTIER_TRAINER_KARLEE] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2022,7 +2025,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WILL, EC_WORD_COME, EC_WORD_OF, EC_WORD_THIS}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_FANTASTIC, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT, EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WENT, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Karlee + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, ARTICUNO, ZAPDOS, MOLTRES)} }, [FRONTIER_TRAINER_JAYLIN] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2030,7 +2033,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_TRAINER, EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_IT_S, EC_WORD_MAKING, EC_WORD_ME, EC_MOVE(YAWN), EC_WORD_THAT, EC_WORD_BATTLE}, .speechLose = {EC_WORD_I, EC_WORD_SLEPT, EC_WORD_AND, EC_WORD_SO, EC_WORD_I, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Jaylin + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, RAIKOU, ENTEI, SUICUNE)} }, [FRONTIER_TRAINER_INGRID] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2038,7 +2041,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_VERY, EC_WORD_MEAN, EC_WORD_TRAINER}, .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_A, EC_WORD_GOOD, EC_WORD_MATCH, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_CAUSE, EC_WORD_YOU_RE, EC_WORD_MEAN, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ingrid + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, REGIROCK, REGICE, REGISTEEL)} }, [FRONTIER_TRAINER_DELILAH] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2046,7 +2049,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_IF_I_WIN, EC_WORD_OK_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOU, EC_WORD_ANGRY}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GRUDGE), EC_WORD_WITH, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Delilah + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2A} }, [FRONTIER_TRAINER_CARLY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2054,7 +2057,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_SCATTER, EC_WORD_SOME, EC_MOVE2(POISON_POWDER), EC_WORD_ABOUT}, .speechWin = {EC_WORD_IT_S, EC_WORD_SCARY, EC_WORD_HOW, EC_WORD_MY, EC_WORD_STRATEGY, EC_WORD_WORKS}, .speechLose = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_YOU, EC_WORD_AND, EC_WORD_YOUR, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Carly + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2B} }, [FRONTIER_TRAINER_LEXIE] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2062,7 +2065,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_SCARY, EC_WORD_POKEMON, EC_WORD_QUES}, .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_SCARY, EC_WORD_EH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_SCARY, EC_WORD_THAN, EC_WORD_MY, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Lexie + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2C} }, [FRONTIER_TRAINER_MILLER] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2070,7 +2073,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HELLO, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_HELLO, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HELLO, EC_WORD_MOTHER, EC_WORD_EXCL, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_MY, EC_WORD_PHONE, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Miller + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2A} }, [FRONTIER_TRAINER_MARV] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2078,7 +2081,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_CAN, EC_WORD_LOSE, EC_WORD_YOUR, EC_MOVE(SWAGGER), EC_WORD_NOW}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NO, EC_MOVE(SWAGGER), EC_WORD_LEFT, EC_WORD_EH_QUES}, .speechLose = {EC_WORD_GO, EC_WORD_ON, EC_MOVE(SWAGGER), EC_WORD_ALL, EC_WORD_YOU, EC_WORD_WANT}, - .monSet = gBattleFrontierTrainerMons_Marv + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2B} }, [FRONTIER_TRAINER_LAYTON] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2086,7 +2089,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_TOTALLY, EC_WORD_COOL, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN, EC_WORD_LOOK, EC_WORD_UP, EC_WORD_TO, EC_WORD_ME}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_NO, EC_WORD_REALLY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Layton + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2C} }, [FRONTIER_TRAINER_BROOKS] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2094,7 +2097,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_HIGH, EC_WORD_LEVEL, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_HIGH, EC_WORD_LEVEL, EC_WORD_AND, EC_WORD_EXCITING, EC_WORD_TOO}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_TOO, EC_WORD_HIGH, EC_WORD_IN, EC_WORD_LEVEL, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Brooks + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_GREGORY] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2102,7 +2105,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD, EC_WORD_YET, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHO, EC_WORD_SAYS, EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_OLD, EC_WORD_QUES}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD}, - .monSet = gBattleFrontierTrainerMons_Gregory + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_3A} }, [FRONTIER_TRAINER_REESE] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2110,7 +2113,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_A, EC_WORD_COUPLE, EC_WORD_THINGS, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_DIET, EC_WORD_PLAY, EC_WORD_SPORTS, EC_WORD_INSTEAD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_INSTEAD, EC_WORD_OF, EC_WORD_TELEVISION, EC_WORD_GET, EC_WORD_A, EC_WORD_BOOK}, - .monSet = gBattleFrontierTrainerMons_Reese + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_3B} }, [FRONTIER_TRAINER_MASON] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -2118,7 +2121,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THIS, EC_WORD_SCARY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_NOW}, .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Mason + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_TOBY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -2126,7 +2129,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LISTEN, EC_WORD_UP, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_WIN}, .speechWin = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_OR, EC_WORD_WHAT, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_CAN, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_AT, EC_WORD_SMARTNESS}, - .monSet = gBattleFrontierTrainerMons_Toby + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_DOROTHY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -2134,7 +2137,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_SPORTS, EC_WORD_WORLD, EC_WORD_SHOULD, EC_WORD_ACCEPT, EC_WORD_POKEMON}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT, EC_WORD_WIN, EC_WORD_WAS, EC_WORD_REFRESHING}, .speechLose = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT, EC_WORD_LOSS, EC_WORD_WAS, EC_WORD_REFRESHING}, - .monSet = gBattleFrontierTrainerMons_Dorothy + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_PIPER] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -2142,7 +2145,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_YOU, EC_WORD_NEED, EC_WORD_A, EC_WORD_SPEED_BOOST, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_MORE, EC_WORD_GUTS}, .speechLose = {EC_WORD_OH, EC_WORD_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Piper + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_FINN] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -2150,7 +2153,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_TRAINER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WON_T, EC_WORD_THIS, EC_WORD_EVER, EC_WORD_END, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(REST), EC_WORD_A_LITTLE}, - .monSet = gBattleFrontierTrainerMons_Finn + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3} }, [FRONTIER_TRAINER_SAMIR] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -2158,7 +2161,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(DIVE), EC_WORD_BELOW, EC_WORD_THE, EC_MOVE2(SURF), EC_WORD_EXCL}, .speechWin = {EC_WORD_YAHOO, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(DIVE), EC_WORD_YOU, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SINK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Samir + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3} }, [FRONTIER_TRAINER_FIONA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -2166,7 +2169,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_LIMBER, EC_WORD_UP, EC_WORD_BEFORE, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_NEED, EC_WORD_TO, EC_WORD_BE, EC_WORD_MORE, EC_WORD_READY}, .speechLose = {EC_WORD_BEING, EC_WORD_LIMBER, EC_WORD_DIDN_T, EC_WORD_WORK, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Fiona + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3} }, [FRONTIER_TRAINER_GLORIA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -2174,7 +2177,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_ATTACK, EC_WORD_WITH, EC_WORD_SUCTION_CUPS}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_FOR, EC_WORD_YOU}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_HOW, EC_WORD_SUCTION_CUPS, EC_WORD_WORK}, - .monSet = gBattleFrontierTrainerMons_Gloria + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3} }, [FRONTIER_TRAINER_NICO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -2182,7 +2185,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LIKE, EC_WORD_A, EC_MOVE(SONIC_BOOM), EC_WORD_I_VE_ARRIVED, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SORRY, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SO, EC_WORD_DOWNCAST}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_WITH, EC_WORD_A, EC_MOVE2(SUPERSONIC), EC_WORD_SPEED_BOOST}, - .monSet = gBattleFrontierTrainerMons_Nico + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_JEREMY] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -2190,7 +2193,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_MASTER, EC_WORD_THAT_S, EC_WORD_MY, EC_WORD_DREAM}, .speechWin = {EC_WORD_MY, EC_WORD_DREAM, EC_WORD_ISN_T, EC_WORD_FAR, EC_WORD_OFF, EC_WORD_EXCL}, .speechLose = {EC_WORD_WHAT, EC_WORD_I, EC_WORD_DREAM, EC_WORD_ISN_T, EC_WORD_HAPPENING, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Jeremy + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_CAITLIN] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -2198,7 +2201,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_QUES}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_MORE, EC_WORD_TO_ME, EC_WORD_THAN, EC_WORD_CUTENESS}, .speechLose = {EC_WORD_MY, EC_WORD_CUTE_CHARM, EC_WORD_DOESN_T, EC_MOVE2(ATTRACT), EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Caitlin + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_REENA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -2206,7 +2209,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_ALWAYS, EC_WORD_HAPPY, EC_WORD_HAPPY, EC_WORD_HAPPY, EC_WORD_EXCL}, .speechWin = {EC_WORD_OH, EC_WORD_YAY, EC_WORD_EXCL, EC_WORD_YAHOO, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Reena + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_AVERY] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -2214,7 +2217,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_A_LOT, EC_WORD_OF, EC_WORD_BUG, EC_WORD_POKEMON}, .speechWin = {EC_WORD_MY, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ALL, EC_WORD_UNBELIEVABLE}, .speechLose = {EC_WORD_MY, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ALL, EC_WORD_UPSIDE_DOWN}, - .monSet = gBattleFrontierTrainerMons_Avery + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_4} }, [FRONTIER_TRAINER_LIAM] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -2222,7 +2225,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WE, EC_WORD_REALLY, EC_WORD_DISLIKE, EC_WORD_FIRE, EC_WORD_AND, EC_WORD_FLYING}, .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_BAD, EC_WORD_HEY_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_WHAT, EC_WORD_WE, EC_WORD_DISLIKE, EC_WORD_HEY_QUES}, - .monSet = gBattleFrontierTrainerMons_Liam + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_4} }, [FRONTIER_TRAINER_THEO] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -2230,7 +2233,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FISHING, EC_WORD_IS, EC_WORD_MY, EC_WORD_CHOICE, EC_WORD_IN, EC_WORD_LIFE}, .speechWin = {EC_WORD_WATER, EC_WORD_POKEMON, EC_MOVE2(ATTRACT), EC_WORD_ME, EC_WORD_WITHOUT, EC_WORD_END}, .speechLose = {EC_WORD_DON_T, EC_WORD_COUNT_ON, EC_WORD_THAT, EC_WORD_HAPPENING, EC_WORD_ANOTHER, EC_WORD_TIME}, - .monSet = gBattleFrontierTrainerMons_Theo + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_3} }, [FRONTIER_TRAINER_BAILEY] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -2238,7 +2241,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_WORD_BATTLE, EC_WORD_EASY}, .speechWin = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_MOVE2(SWALLOW), EC_WORD_JOY}, .speechLose = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_MOVE2(SWALLOW), EC_MOVE2(FRUSTRATION)}, - .monSet = gBattleFrontierTrainerMons_Bailey + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_3} }, [FRONTIER_TRAINER_HUGO] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -2246,7 +2249,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_TRY, EC_WORD_THE, EC_WORD_BEST, EC_WORD_I, EC_WORD_CAN}, .speechWin = {EC_WORD_I, EC_WORD_CAN_WIN, EC_WORD_IF, EC_WORD_I, EC_WORD_TRY, EC_WORD_ENOUGH}, .speechLose = {EC_WORD_I, EC_WORD_DID, EC_WORD_TRY, EC_WORD_DIDN_T, EC_WORD_I, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Hugo + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_4} }, [FRONTIER_TRAINER_BRYCE] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -2254,7 +2257,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_WAS, EC_WORD_ON, EC_WORD_VACATION, EC_WORD_UNTIL, EC_WORD_ONLY, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_LOST, EC_WORD_MY, EC_WORD_SKILL, EC_WORD_YET}, .speechLose = {EC_WORD_THAT_S, EC_WORD_IT, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_NEED, EC_WORD_SLEEP}, - .monSet = gBattleFrontierTrainerMons_Bryce + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_4} }, [FRONTIER_TRAINER_GIDEON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -2262,7 +2265,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT_S_UP_QUES, EC_WORD_YOU, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_SCARY, EC_WORD_QUES}, .speechWin = {EC_WORD_I_AM, EC_WORD_COOL, EC_WORD_BUT, EC_WORD_NOT, EC_WORD_SCARY, EC_WORD_EXCL}, .speechLose = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_FABULOUS, EC_WORD_FASHION, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Gideon + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_3} }, [FRONTIER_TRAINER_TRISTON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -2270,7 +2273,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_RATHER, EC_WORD_LOOK, EC_WORD_AT, EC_WORD_POKEMON}, .speechWin = {EC_WORD_HUH_QUES, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, .speechLose = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_LOSE}, - .monSet = gBattleFrontierTrainerMons_Triston + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_3} }, [FRONTIER_TRAINER_CHARLES] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -2278,7 +2281,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_HOPELESS, EC_WORD_TO, EC_MOVE2(STRUGGLE), EC_WORD_WITH, EC_WORD_ME}, .speechWin = {EC_MOVE(SUBMISSION), EC_WORD_WAS, EC_WORD_YOUR, EC_WORD_ONLY, EC_WORD_CHOICE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Charles + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_3A} }, [FRONTIER_TRAINER_RAYMOND] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -2286,7 +2289,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_HEAR, EC_WORD_MY, EC_WORD_SONG, EC_WORD_QUES}, .speechWin = {EC_WORD_SATISFIED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SATISFIED, EC_WORD_IS, EC_WORD_WHAT, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE}, - .monSet = gBattleFrontierTrainerMons_Raymond + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_3B} }, [FRONTIER_TRAINER_DIRK] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -2294,7 +2297,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ABOVE, EC_WORD_THE, EC_MOVE2(REST)}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T_WIN, EC_WORD_EXCL, EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_RULE}, .speechLose = {EC_WORD_AREN_T, EC_WORD_THERE, EC_WORD_MORE, EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Dirk + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_3} }, [FRONTIER_TRAINER_HAROLD] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -2302,7 +2305,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_APPEAL, EC_WORD_TO, EC_WORD_YOU, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_DO, EC_WORD_LIKE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_QUES}, .speechLose = {EC_WORD_SO, EC_WORD_YOU, EC_WORD_DISLIKE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Harold + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_3} }, [FRONTIER_TRAINER_OMAR] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -2310,7 +2313,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_ME_WIN, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_FOR, EC_WORD_A, EC_MOVE2(PRESENT)}, .speechWin = {EC_WORD_HERE, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_SOME, EC_MOVE2(TOXIC), EC_WORD_SWEETS}, .speechLose = {EC_WORD_YOUR, EC_MOVE2(PRESENT), EC_WORD_QUES, EC_WORD_WHAT, EC_WORD_FOR, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Omar + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_3} }, [FRONTIER_TRAINER_PETER] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -2318,7 +2321,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BRAG, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_LISTEN, EC_WORD_TO_ME, EC_WORD_BRAG}, .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_YOU, EC_WORD_WON_T, EC_WORD_LISTEN, EC_WORD_TO_ME}, - .monSet = gBattleFrontierTrainerMons_Peter + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_3} }, [FRONTIER_TRAINER_DEV] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -2326,7 +2329,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_LET_S, EC_WORD_GET, EC_WORD_A, EC_WORD_MOVE, EC_WORD_ON}, .speechWin = {EC_WORD_I, EC_WORD_GET, EC_WORD_TO, EC_WORD_NAP, EC_WORD_AFTER, EC_WORD_THAT}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_NAP, EC_WORD_AFTER, EC_WORD_THAT}, - .monSet = gBattleFrontierTrainerMons_Dev + .monSet = (const u16[]){FRONTIER_MONS_HIKER_3} }, [FRONTIER_TRAINER_COREY] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -2334,7 +2337,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_TEACH, EC_WORD_YOU, EC_WORD_HOW, EC_WORD_TOUGH, EC_WORD_I_AM}, .speechWin = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_ME, EC_WORD_MAKE, EC_WORD_A, EC_MOVE(BRICK_BREAK)}, .speechLose = {EC_WORD_MY, EC_MOVE2(FRUSTRATION), EC_WORD_IS, EC_WORD_CLOSE, EC_WORD_TO, EC_MOVE2(ERUPTION)}, - .monSet = gBattleFrontierTrainerMons_Corey + .monSet = (const u16[]){FRONTIER_MONS_HIKER_3} }, [FRONTIER_TRAINER_ANDRE] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -2342,7 +2345,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_NOW, EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_PERFECT, EC_WORD_FLAME_BODY}, .speechWin = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_FIERY, EC_WORD_DANCE, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_WANT, EC_WORD_AN, EC_MOVE2(EXPLOSION), EC_WORD_HERE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Andre + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_3} }, [FRONTIER_TRAINER_FERRIS] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -2350,7 +2353,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_IN, EC_WORD_THE, EC_WORD_OLD, EC_WORD_CLASS}, .speechWin = {EC_WORD_NO_1, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_NO_1, EC_WORD_ANY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ferris + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_3} }, [FRONTIER_TRAINER_ALIVIA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -2358,7 +2361,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_GIDDY, EC_WORD_SO, EC_WORD_SHOULD, EC_WORD_YOU}, .speechWin = {EC_WORD_IT, EC_WORD_WAS, EC_WORD_ALL, EC_WORD_TOGETHER, EC_WORD_TOO, EC_WORD_EASY}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GIDDY, EC_WORD_UP, EC_WORD_AND, EC_WORD_AWAY}, - .monSet = gBattleFrontierTrainerMons_Alivia + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_3} }, [FRONTIER_TRAINER_PAIGE] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -2366,7 +2369,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_ENJOY, EC_WORD_OUR, EC_WORD_BATTLE, EC_WORD_TOGETHER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, .speechLose = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_DO, EC_WORD_GO, EC_WORD_ON}, - .monSet = gBattleFrontierTrainerMons_Paige + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_3} }, [FRONTIER_TRAINER_ANYA] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -2374,7 +2377,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_OH, EC_WORD_SO, EC_WORD_PRETTY, EC_WORD_FASHION}, .speechWin = {EC_WORD_FASHION, EC_WORD_SHOULD, EC_WORD_MATCH, EC_WORD_THE, EC_WORD_PERSON, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PRETTY, EC_WORD_COULD, EC_WORD_BE, EC_WORD_GOOD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Anya + .monSet = (const u16[]){FRONTIER_MONS_EEVEELUTIONS} }, [FRONTIER_TRAINER_DAWN] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -2382,7 +2385,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GO, EC_WORD_ALL, EC_WORD_OUT, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_A, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_WON, EC_WORD_EXCL, EC_WORD_MOVE, EC_WORD_ON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Dawn + .monSet = (const u16[]){FRONTIER_MONS_BEAUTY_2} }, [FRONTIER_TRAINER_ABBY] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -2390,7 +2393,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_THAT_S, EC_WORD_REFRESHING}, .speechWin = {EC_WORD_VICTORY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_AN, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Abby + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_3} }, [FRONTIER_TRAINER_GRETEL] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -2398,6 +2401,6 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAUSE, EC_MOVE(OUTRAGE), EC_WORD_AS, EC_WORD_A, EC_WORD_TRAINER}, .speechWin = {EC_WORD_IT_S, EC_WORD_ONLY, EC_WORD_NATURAL, EC_WORD_SEE_YA, EC_WORD_BYE_BYE, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_HARD, EC_WORD_TO, EC_WORD_BELIEVE, EC_WORD_BUT, EC_WORD_CONGRATS}, - .monSet = gBattleFrontierTrainerMons_Gretel + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_3} } }; From bd50fe601492e785bec900bc3d649e92425cb80b Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 9 Feb 2025 16:28:06 -0500 Subject: [PATCH 094/125] Fix AI switching in absorbing mon incorrectly (#6227) --- include/battle.h | 1 + src/battle_ai_switch_items.c | 3 +++ src/battle_main.c | 2 ++ test/battle/ai/ai_switching.c | 14 ++++++++++++++ 4 files changed, 20 insertions(+) diff --git a/include/battle.h b/include/battle.h index c78101b1a2..8a5fd34c04 100644 --- a/include/battle.h +++ b/include/battle.h @@ -819,6 +819,7 @@ struct BattleStruct u8 pursuitSwitchByMove:1; u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch s32 battlerExpReward; + u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn // Simultaneous hp reduction for spread moves s32 moveDamage[MAX_BATTLERS_COUNT]; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a10ed1f550..df865cb6cb 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -348,6 +348,9 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; + if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE + return FALSE; + if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING, 66) || AI_DATA->aiSwitchPredictionInProgress)) return FALSE; diff --git a/src/battle_main.c b/src/battle_main.c index 5d16f5c3bc..3000005917 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4157,6 +4157,7 @@ void SetupAISwitchingData(u32 battler, enum SwitchType switchType) if (ShouldSwitch(opposingBattler)) AI_DATA->shouldSwitch |= (1u << opposingBattler); AI_DATA->aiSwitchPredictionInProgress = FALSE; + gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; // Determine whether AI will use predictions this turn AI_DATA->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, 50); @@ -4166,6 +4167,7 @@ void SetupAISwitchingData(u32 battler, enum SwitchType switchType) AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); if (ShouldSwitch(battler)) AI_DATA->shouldSwitch |= (1u << battler); + gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; } static void HandleTurnActionSelectionState(void) diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 4f42fa9233..82ad5440aa 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1026,3 +1026,17 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI won't switch in ace mon after U-Turn if oth TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 2); MOVE(player, MOVE_SURF); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch in absorbing mon immediately after sending out new mon") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_BLAZIKEN) { Moves(MOVE_FLAMETHROWER, MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_FERROTHORN) { Moves(MOVE_GYRO_BALL); } + OPPONENT(SPECIES_DIALGA) { Moves(MOVE_DRACO_METEOR); } + OPPONENT(SPECIES_HEATRAN) { Moves(MOVE_EARTH_POWER, MOVE_FLAMETHROWER); } + } WHEN { + TURN { MOVE(player, MOVE_FLAMETHROWER); EXPECT_SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_CLOSE_COMBAT); EXPECT_MOVE(opponent, MOVE_DRACO_METEOR); } + } +} From 99cb40d89690eb37dc37641c4da409f141a5c255 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 9 Feb 2025 18:29:23 -0300 Subject: [PATCH 095/125] Added test support for 5 battle configs (#5914) Co-authored-by: sbird Co-authored-by: Bassoonian --- include/battle_script_commands.h | 3 +- include/config/battle.h | 1 + include/constants/generational_changes.h | 6 + include/generational_changes.h | 8 +- src/battle_ai_util.c | 2 +- src/battle_main.c | 2 +- src/battle_script_commands.c | 98 +++---- src/battle_util.c | 7 +- test/battle/ability/battle_armor.c | 49 ++++ test/battle/ability/inner_focus.c | 2 +- test/battle/ability/merciless.c | 16 ++ test/battle/ability/own_tempo.c | 4 +- test/battle/ability/parental_bond.c | 36 ++- test/battle/ability/shell_armor.c | 4 + test/battle/ability/super_luck.c | 25 ++ test/battle/crit_chance.c | 270 ++---------------- test/battle/gimmick/dynamax.c | 2 +- test/battle/gimmick/zmove.c | 11 +- test/battle/hold_effect/critical_hit_up.c | 11 +- test/battle/hold_effect/leek.c | 36 +++ test/battle/hold_effect/luck_punch.c | 25 ++ test/battle/hold_effect/scope_lens.c | 23 ++ test/battle/item_effect/dire_hit.c | 26 ++ test/battle/move.c | 42 +-- test/battle/move_effect/dragon_cheer.c | 62 ++-- test/battle/move_effect/focus_energy.c | 41 +++ test/battle/move_effect/laser_focus.c | 23 ++ test/battle/move_effect/lucky_chant.c | 16 ++ test/battle/move_effect/multi_hit.c | 36 ++- .../move_effects_combined/triple_arrows.c | 12 +- test/battle/move_flags/critical_hit_stage.c | 24 ++ .../move_flags/ignores_target_ability.c | 20 ++ test/battle/status1/paralysis.c | 12 +- test/battle/status2/confusion.c | 16 +- 34 files changed, 562 insertions(+), 409 deletions(-) create mode 100644 test/battle/ability/battle_armor.c create mode 100644 test/battle/ability/merciless.c create mode 100644 test/battle/ability/shell_armor.c create mode 100644 test/battle/ability/super_luck.c create mode 100644 test/battle/hold_effect/leek.c create mode 100644 test/battle/hold_effect/luck_punch.c create mode 100644 test/battle/hold_effect/scope_lens.c create mode 100644 test/battle/item_effect/dire_hit.c create mode 100644 test/battle/move_effect/focus_energy.c create mode 100644 test/battle/move_effect/laser_focus.c create mode 100644 test/battle/move_effect/lucky_chant.c create mode 100644 test/battle/move_flags/critical_hit_stage.c diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 7326647d41..32d8fc0238 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -22,8 +22,7 @@ struct PickupItem u8 percentage[10]; }; -s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk); -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility); +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); u8 GetBattlerTurnOrderNum(u8 battlerId); diff --git a/include/config/battle.h b/include/config/battle.h index 226f649a33..34e022f5eb 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -89,6 +89,7 @@ #define B_CHARGE_SPDEF_RAISE GEN_LATEST // In Gen5+, Charge raises the user's Special Defense by 1 stage. #define B_MINIMIZE_EVASION GEN_LATEST // In Gen5+, Minimize raises evasion by 2 stages instead of 1. #define B_GROWTH_STAT_RAISE GEN_LATEST // In Gen5+, Growth raises Attack in addition to Special Attack by 1 stage each. Under the effects of the sun, it raises them by 2 stages each instead. +#define B_FOCUS_ENERGY_CRIT_RATIO GEN_LATEST // In Gen3+, Focus Energy increases critical hit ratio by 2 instead of 1. // Other move settings #define B_INCINERATE_GEMS GEN_LATEST // In Gen6+, Incinerate can destroy Gems. diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 557b34b653..b4c5db43b7 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -3,6 +3,12 @@ enum GenConfigTag { + GEN_CONFIG_CRIT_CHANCE, + GEN_CONFIG_CRIT_MULTIPLIER, + GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, + GEN_CONFIG_PARALYSIS_SPEED, + GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, + GEN_CONFIG_MULTI_HIT_CHANCE, GEN_CONFIG_GALE_WINGS, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 5a726007c3..fa404845b0 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -6,7 +6,13 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = { - [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, + [GEN_CONFIG_CRIT_CHANCE] = B_CRIT_CHANCE, + [GEN_CONFIG_CRIT_MULTIPLIER] = B_CRIT_MULTIPLIER, + [GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO] = B_FOCUS_ENERGY_CRIT_RATIO, + [GEN_CONFIG_PARALYSIS_SPEED] = B_PARALYSIS_SPEED, + [GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE] = B_CONFUSION_SELF_DMG_CHANCE, + [GEN_CONFIG_MULTI_HIT_CHANCE] = B_MULTI_HIT_CHANCE, + [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, }; #if TESTING diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ac6f214134..e440091183 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -676,7 +676,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u damageCalcData.randomFactor = FALSE; damageCalcData.updateFlags = FALSE; - critChanceIndex = CalcCritChanceStageArgs(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); + critChanceIndex = CalcCritChanceStage(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); if (critChanceIndex > 1) // Consider crit damage only if a move has at least +2 crit chance { damageCalcData.isCrit = FALSE; diff --git a/src/battle_main.c b/src/battle_main.c index 606f293454..b6132a9a04 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4827,7 +4827,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) // paralysis drop if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) - speed /= B_PARALYSIS_SPEED >= GEN_7 ? 2 : 4; + speed /= GetGenConfig(GEN_CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SWAMP) speed /= 4; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bdf1f8ee53..bc8e5c8e35 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6,8 +6,6 @@ #include "battle_ai_util.h" #include "battle_scripts.h" #include "battle_z_move.h" -#include "constants/moves.h" -#include "constants/abilities.h" #include "item.h" #include "util.h" #include "pokemon.h" @@ -47,6 +45,7 @@ #include "pokenav.h" #include "menu_specialized.h" #include "data.h" +#include "generational_changes.h" #include "constants/abilities.h" #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" @@ -1819,16 +1818,19 @@ static void Cmd_ppreduce(void) } // The chance is 1/N for each stage. -static const u32 sGen7CriticalHitOdds[] = {24, 8, 2, 1, 1}; -static const u32 sGen6CriticalHitOdds[] = {16, 8, 2, 1, 1}; -static const u32 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5 +static const u32 sGen7CriticalHitOdds[] = {24, 8, 2, 1, 1}; // 1/X +static const u32 sGen6CriticalHitOdds[] = {16, 8, 2, 1, 1}; // 1/X +static const u32 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // 1/X, Gens 3,4,5 +static const u32 sGen2CriticalHitOdds[] = {17, 32, 64, 85, 128}; // X/256 static inline u32 GetCriticalHitOdds(u32 critChance) { - if (B_CRIT_CHANCE >= GEN_7) + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) >= GEN_7) return sGen7CriticalHitOdds[critChance]; - if (B_CRIT_CHANCE == GEN_6) + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_6) return sGen6CriticalHitOdds[critChance]; + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) + return sGen2CriticalHitOdds[critChance]; return sCriticalHitOdds[critChance]; } @@ -1870,7 +1872,7 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect) #define CRITICAL_HIT_BLOCKED -1 #define CRITICAL_HIT_ALWAYS -2 -s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) { s32 critChance = 0; @@ -1913,75 +1915,51 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec return critChance; } -#undef CRITICAL_HIT_BLOCKED -#undef CRITICAL_HIT_ALWAYS - -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility) -{ - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); - u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - return CalcCritChanceStageArgs(battlerAtk, battlerDef, move, recordAbility, abilityAtk, abilityDef, holdEffectAtk); -} // Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Critical_hit#Generation_I // Crit chance = Threshold / 256, Threshold maximum of 255 // Threshold = Base Speed / 2 // High crit move = 8 * (Base Speed / 2) // Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility) +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) { - // Vanilla - u32 focusEnergyScaler = 4; - u32 highCritRatioScaler = 8; - - // Not vanilla - u32 superLuckScaler = 4; - u32 scopeLensScaler = 4; - u32 luckyPunchScaler = 8; - u32 farfetchdLeekScaler = 8; - s32 critChance = 0; s32 moveCritStage = gMovesInfo[gCurrentMove].criticalHitStage; s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike - u32 abilityAtk = GetBattlerAbility(battlerAtk); - u32 abilityDef = GetBattlerAbility(battlerDef); - u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk); u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed; critChance = baseSpeed / 2; // Crit scaling if (moveCritStage > 0) - critChance = critChance * highCritRatioScaler * moveCritStage; + critChance *= 8 * moveCritStage; if (bonusCritStage > 0) - critChance = critChance * bonusCritStage; + critChance *= bonusCritStage; - if ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY_ANY) != 0) - critChance = critChance * focusEnergyScaler; + if (gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) + critChance *= 4; + else if (gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) + critChance *= 2; - if (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS) - critChance = critChance * scopeLensScaler; - else if (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY) - critChance = critChance * luckyPunchScaler; - else if (IsBattlerLeekAffected(battlerAtk, holdEffectAtk)) - critChance = critChance * farfetchdLeekScaler; + if (holdEffectCritStage > 0) + critChance *= 4 * holdEffectCritStage; if (abilityAtk == ABILITY_SUPER_LUCK) - critChance = critChance * superLuckScaler; + critChance *= 4; if (critChance > 255) critChance = 255; // Prevented crits if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) - critChance = -1; + critChance = CRITICAL_HIT_BLOCKED; else if (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR) { if (recordAbility) RecordAbilityBattle(battlerDef, abilityDef); - critChance = -1; + critChance = CRITICAL_HIT_BLOCKED; } // Guaranteed crits @@ -1989,7 +1967,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec || gMovesInfo[move].alwaysCriticalHit == TRUE || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { - critChance = -2; + critChance = CRITICAL_HIT_ALWAYS; } return critChance; @@ -2002,6 +1980,8 @@ s32 GetCritHitOdds(s32 critChanceIndex) else return GetCriticalHitOdds(critChanceIndex); } +#undef CRITICAL_HIT_BLOCKED +#undef CRITICAL_HIT_ALWAYS static void Cmd_critcalc(void) { @@ -2009,11 +1989,14 @@ static void Cmd_critcalc(void) u16 partySlot; s32 critChance; + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 abilityDef = GetBattlerAbility(gBattlerTarget); + u32 holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - if (B_CRIT_CHANCE == GEN_1) - critChance = CalcCritChanceStageGen1(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + critChance = CalcCritChanceStageGen1(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); else - critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); gPotentialItemEffectBattler = gBattlerAttacker; @@ -2025,14 +2008,10 @@ static void Cmd_critcalc(void) gIsCriticalHit = TRUE; else { - if (B_CRIT_CHANCE == GEN_1) - { - u8 critRoll = RandomUniform(RNG_CRITICAL_HIT, 1, 256); - if (critRoll <= critChance) - gIsCriticalHit = 1; - else - gIsCriticalHit = 0; - } + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, critChance, 256); + else if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) + gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(critChance), 256); else gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(critChance)); } @@ -12604,7 +12583,10 @@ static void Cmd_setfocusenergy(void) } else { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + if (GetGenConfig(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3) + gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + else + gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 2d4798b0dd..6419b5017d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9,6 +9,7 @@ #include "battle_setup.h" #include "battle_z_move.h" #include "battle_gimmick.h" +#include "generational_changes.h" #include "party_menu.h" #include "pokemon.h" #include "international_string_util.h" @@ -3468,7 +3469,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { // confusion dmg - if (RandomPercentage(RNG_CONFUSION, (B_CONFUSION_SELF_DMG_CHANCE >= GEN_7 ? 33 : 50))) + if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; @@ -10086,7 +10087,7 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageCalculationData * static inline uq4_12_t GetCriticalModifier(bool32 isCrit) { if (isCrit) - return B_CRIT_MULTIPLIER >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); + return GetGenConfig(GEN_CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -11672,7 +11673,7 @@ static void SetRandomMultiHitCounter() { if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); - else if (B_MULTI_HIT_CHANCE >= GEN_5) + else if (GetGenConfig(GEN_CONFIG_MULTI_HIT_CHANCE) >= GEN_5) gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. else gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. diff --git a/test/battle/ability/battle_armor.c b/test/battle/ability/battle_armor.c new file mode 100644 index 0000000000..9424d57e59 --- /dev/null +++ b/test/battle/ability/battle_armor.c @@ -0,0 +1,49 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Battle Armor and Shell Armor block critical hits") +{ + u32 species; + u32 ability; + + PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } + PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + NOT MESSAGE("A critical hit!"); + } +} + +SINGLE_BATTLE_TEST("Mold Breaker, Teravolt and Turboblaze ignore Battle Armor and Shell Armor") +{ + u32 j; + u32 species1, species2, ability1, ability2; + static const u32 breakerData[][2] = + { + {SPECIES_PINSIR, ABILITY_MOLD_BREAKER}, + {SPECIES_ZEKROM, ABILITY_TERAVOLT}, + {SPECIES_RESHIRAM, ABILITY_TURBOBLAZE}, + }; + + for (j = 0; j < ARRAY_COUNT(breakerData); j++) + { + PARAMETRIZE { species1 = breakerData[j][0]; ability1 = breakerData[j][1]; species2 = SPECIES_KINGLER; ability2 = ABILITY_SHELL_ARMOR; } + PARAMETRIZE { species1 = breakerData[j][0]; ability1 = breakerData[j][1]; species2 = SPECIES_ARMALDO; ability2 = ABILITY_BATTLE_ARMOR; } + } + + GIVEN { + PLAYER(species1) { Ability(ability1); } + OPPONENT(species2) { Ability(ability2); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/ability/inner_focus.c b/test/battle/ability/inner_focus.c index 5a470b742f..509b46d176 100644 --- a/test/battle/ability/inner_focus.c +++ b/test/battle/ability/inner_focus.c @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Inner Focus prevents flinching") } } -SINGLE_BATTLE_TEST("Inner Focus is ignored by Mold Breaker") +SINGLE_BATTLE_TEST("Mold Breaker ignores Inner Focus") { GIVEN { PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }; diff --git a/test/battle/ability/merciless.c b/test/battle/ability/merciless.c new file mode 100644 index 0000000000..fc73842dcf --- /dev/null +++ b/test/battle/ability/merciless.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Merciless causes a move to result in a critical hit if the target is poisoned") +{ + PASSES_RANDOMLY(1, 1, RNG_CRITICAL_HIT); + GIVEN { + PLAYER(SPECIES_MAREANIE) { Ability(ABILITY_MERCILESS); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 4b3c42053b..1f3f49c006 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the user") } } -SINGLE_BATTLE_TEST("Own Tempo is ignored by Mold Breaker") +SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") { KNOWN_FAILING; // Ideally the func CanBeConfused should be split into AttackerCanBeConfused and TargetCanBeConfused or we do it in the same func but have a check for when battlerAtk == battlerDef GIVEN { @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Own Tempo is ignored by Mold Breaker") } } -SINGLE_BATTLE_TEST("Own Tempo cures confusion obtained from an opponent with Mold Breaker") +SINGLE_BATTLE_TEST("Mold Breaker does not prevent Own Tempo from curing confusion right after") { KNOWN_FAILING; GIVEN { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index a1614a8ffc..e84977c91e 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -131,12 +131,15 @@ SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod } } -SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit twice 35% of the time") +SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit twice 37.5/35% of the time") { - PASSES_RANDOMLY(35, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 3; trials = 8; } // 37.5% + PARAMETRIZE { genConfig = GEN_5; passes = 7; trials = 20; } // 35% + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -157,12 +160,15 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil } } -SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit thrice 35% of the time") +SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit thrice 37.5/35% of the time") { - PASSES_RANDOMLY(35, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 3; trials = 8; } // 37.5% + PARAMETRIZE { genConfig = GEN_5; passes = 7; trials = 20; } // 35% + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -184,12 +190,15 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil } } -SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit four times 15% of the time") +SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit four times 12.5/15% of the time") { - PASSES_RANDOMLY(15, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 1; trials = 8; } // 12.5% + PARAMETRIZE { genConfig = GEN_5; passes = 3; trials = 20; } // 15% + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -212,12 +221,15 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil } } -SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit five times 15% of the time") +SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they still hit five times 12.5/15% of the time") { - PASSES_RANDOMLY(15, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 1; trials = 8; } // 12.5% + PARAMETRIZE { genConfig = GEN_5; passes = 3; trials = 20; } // 15% + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } diff --git a/test/battle/ability/shell_armor.c b/test/battle/ability/shell_armor.c new file mode 100644 index 0000000000..7d97b0a069 --- /dev/null +++ b/test/battle/ability/shell_armor.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Shell Armor are handled in test/battle/ability/battle_armor.c diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c new file mode 100644 index 0000000000..39fd20ce16 --- /dev/null +++ b/test/battle/ability/super_luck.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage") +{ + u32 j, genConfig = 0, passes = 0, trials = 0; + + PARAMETRIZE { genConfig = GEN_1; passes = 5; trials = 32; } // ~15.6% with Togepi's base speed + for (j = GEN_2; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_TOGEPI].baseSpeed == 20); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} + +TO_DO_BATTLE_TEST("Super Luck increases the chances of wild Pokémon holding items (Gen8+)"); diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 7287266e98..0ff0634539 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -1,200 +1,41 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Crit Chance: Side effected by Lucky Chant blocks critical hits") +SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by generation") { + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 16; } // 6.25% with Wobbuffet's base speed + PARAMETRIZE { genConfig = GEN_2; passes = 17; trials = 256; } // ~6.64% + for (u32 j = GEN_3; j <= GEN_6; j++) + PARAMETRIZE { genConfig = j; passes = 1, trials = 16; } // 6.25% + for (u32 j = GEN_7; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1, trials = 24; } // ~4.17% + + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - ASSUME(gMovesInfo[MOVE_LUCKY_CHANT].effect == EFFECT_LUCKY_CHANT); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_LUCKY_CHANT); MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } + TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - NOT MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Battle Armor and Shell Armor block critical hits") -{ - u32 species; - u32 ability; - - PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } - PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - NOT MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Flag ignoresTargetAbility ignores Battle Armor and Shell Armor") -{ - u32 species; - u32 ability; - - PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } - PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } - - GIVEN { - ASSUME(gMovesInfo[MOVE_SUNSTEEL_STRIKE].ignoresTargetAbility == TRUE); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_SUNSTEEL_STRIKE, criticalHit: TRUE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNSTEEL_STRIKE, player); MESSAGE("A critical hit!"); } } -SINGLE_BATTLE_TEST("Crit Chance: Mold Breaker, Teravolt and Turboblaze ignore Battle Armor and Shell Armor") +SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a critical hit (Gen 6+)") { - u32 j; - static const u32 pokemonPlayer[][2] = - { - {SPECIES_PINSIR, ABILITY_MOLD_BREAKER}, - {SPECIES_ZEKROM, ABILITY_TERAVOLT}, - {SPECIES_KYUREM_WHITE, ABILITY_TURBOBLAZE}, - }; - - u32 speciesPlayer; - u32 abilityPlayer; - u32 speciesOpponent; - u32 abilityOpponent; - - for (j = 0; j < ARRAY_COUNT(pokemonPlayer); j++) - { - PARAMETRIZE { - speciesPlayer = pokemonPlayer[j][0]; - abilityPlayer = pokemonPlayer[j][1]; - speciesOpponent = SPECIES_KINGLER; - abilityOpponent = ABILITY_SHELL_ARMOR; - } - - PARAMETRIZE { - speciesPlayer = pokemonPlayer[j][0]; - abilityPlayer = pokemonPlayer[j][1]; - speciesOpponent = SPECIES_ARMALDO; - abilityOpponent = ABILITY_BATTLE_ARMOR; - } - } - + u32 genConfig = 0, passes, trials; + PARAMETRIZE { genConfig = GEN_1; passes = 255; trials = 256; } // ~99.6% + PARAMETRIZE { genConfig = GEN_2; passes = 85; trials = 256; } // ~33.2% + for (u32 j = GEN_3; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; passes = 1, trials = 3; } // ~33.3% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1, trials = 1; } // 100% + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - PLAYER(speciesPlayer) { Ability(abilityPlayer); } - OPPONENT(speciesOpponent) { Ability(abilityOpponent); } - } WHEN { - TURN { MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: User effected by Laser Focus causes moves to result in a critical hit") -{ - GIVEN { - ASSUME(gMovesInfo[MOVE_LASER_FOCUS].effect == EFFECT_LASER_FOCUS); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_LASER_FOCUS); } - TURN { MOVE(player, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: If the target is poisoned the ability Merciless causes a move to result in a critical hit") -{ - GIVEN { - PLAYER(SPECIES_MAREANIE) { Ability(ABILITY_MERCILESS); } - OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Focus Energy increases the user's critical hit ratio by two stage") -{ - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_FOCUS_ENERGY); } - TURN { MOVE(player, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: High crit rate increases the critical hit ratio by one stage") -{ - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_SLASH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SLASH, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Super Luck increases the critical hit ratio by one stage") -{ - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Scope Lens increases the critical hit ratio by one stage") -{ - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: High crit rate, Super Luck and Scope Lens cause the move to result in a critical hit") -{ - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; @@ -206,68 +47,3 @@ SINGLE_BATTLE_TEST("Crit Chance: High crit rate, Super Luck and Scope Lens cause MESSAGE("A critical hit!"); } } - -SINGLE_BATTLE_TEST("Crit Chance: Signature items Leek and Lucky Punch increase the critical hit ratio by 2 stages") -{ - u32 species; - u32 item; - - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); - - PARAMETRIZE { species = SPECIES_FARFETCHD; item = ITEM_LEEK; } - PARAMETRIZE { species = SPECIES_FARFETCHD_GALAR; item = ITEM_LEEK; } - PARAMETRIZE { species = SPECIES_SIRFETCHD; item = ITEM_LEEK; } - PARAMETRIZE { species = SPECIES_CHANSEY; item = ITEM_LUCKY_PUNCH; } - - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK); - ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(species) { Item(item); } - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Dire Hit increases a battler's critical hit chance by 2 stages") -{ - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { USE_ITEM(player, ITEM_DIRE_HIT, partyIndex: 0); } - TURN { MOVE(player, MOVE_SCRATCH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); - MESSAGE("Wobbuffet used the Dire Hit to get pumped!"); - MESSAGE("Wobbuffet used Scratch!"); - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Crit Chance: Focus Energy increases critical hit ratio by two") -{ - PASSES_RANDOMLY(8, 8, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); - ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_FOCUS_ENERGY); } - TURN { MOVE(player, MOVE_SLASH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); - MESSAGE("Wobbuffet is getting pumped!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SLASH, player); - MESSAGE("A critical hit!"); - } -} diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 089587c71d..6a753a92af 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1421,7 +1421,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance") +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance by 1 stage") { u32 j; GIVEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index eb44184e5a..e0716f9495 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -518,10 +518,17 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Light That Burns the Sky uses the battler's highest SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critical hit ratio") { - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + u32 genConfig, chance; + PARAMETRIZE { genConfig = GEN_1; chance = 1; } + for (u32 j = GEN_2; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_6); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_10_000_000_VOLT_THUNDERBOLT].criticalHitStage == 2); + ASSUME(gSpeciesInfo[SPECIES_PIKACHU_PARTNER].baseSpeed == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_hit_up.c index c23f29773a..7689d183f0 100644 --- a/test/battle/hold_effect/critical_hit_up.c +++ b/test/battle/hold_effect/critical_hit_up.c @@ -48,12 +48,17 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two s } } -SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages") +SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 stages") { - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + u32 genConfig = 0, chance; + for (u32 j = GEN_1; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } // 50% + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); - ASSUME(B_CRIT_CHANCE >= GEN_6); PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c new file mode 100644 index 0000000000..57cc9f1697 --- /dev/null +++ b/test/battle/hold_effect/leek.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfetch'd Family") +{ + u32 species, genConfig, passes, trials; + + PARAMETRIZE { genConfig = GEN_1; passes = 15; trials = 16; species = SPECIES_FARFETCHD; } // ~93.8% with Farfetch'd's base speed + PARAMETRIZE { genConfig = GEN_1; passes = 27; trials = 32; species = SPECIES_FARFETCHD_GALAR; } // ~84.4% with Galarian Farfetch'd's base speed + PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 1; species = SPECIES_SIRFETCHD; } // 100% with Sirfetch'd's base speed + for (u32 j = GEN_2; j <= GEN_5; j++) { + PARAMETRIZE { genConfig = j; passes = 1; trials = 4; species = SPECIES_FARFETCHD; } // 25% + PARAMETRIZE { genConfig = j; passes = 1; trials = 4; species = SPECIES_FARFETCHD_GALAR; } // 25% + PARAMETRIZE { genConfig = j; passes = 1; trials = 4; species = SPECIES_SIRFETCHD; } // 25% + } + for (u32 j = GEN_6; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = j; passes = 1; trials = 2; species = SPECIES_FARFETCHD; } // 50% + PARAMETRIZE { genConfig = j; passes = 1; trials = 2; species = SPECIES_FARFETCHD_GALAR; } // 50% + PARAMETRIZE { genConfig = j; passes = 1; trials = 2; species = SPECIES_SIRFETCHD; } // 50% + } + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gSpeciesInfo[SPECIES_FARFETCHD].baseSpeed == 60); + ASSUME(gSpeciesInfo[SPECIES_FARFETCHD_GALAR].baseSpeed == 55); + ASSUME(gSpeciesInfo[SPECIES_SIRFETCHD].baseSpeed == 65); + ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Item(ITEM_LEEK); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/hold_effect/luck_punch.c b/test/battle/hold_effect/luck_punch.c new file mode 100644 index 0000000000..056723eb36 --- /dev/null +++ b/test/battle/hold_effect/luck_punch.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Chansey") +{ + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_1; passes = 25; trials = 32; } // ~78.1% with Chansey's base speed + for (u32 j = GEN_2; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 2; } // 50% + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); + ASSUME(gSpeciesInfo[SPECIES_CHANSEY].baseSpeed == 50); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHANSEY) { Item(ITEM_LUCKY_PUNCH); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c new file mode 100644 index 0000000000..6914025ce7 --- /dev/null +++ b/test/battle/hold_effect/scope_lens.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage") +{ + u32 genConfig = 0, passes, trials; + PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 4; } // 25% with Wobbuffet's base speed + for (u32 j = GEN_2; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/item_effect/dire_hit.c b/test/battle/item_effect/dire_hit.c new file mode 100644 index 0000000000..10b9a28a60 --- /dev/null +++ b/test/battle/item_effect/dire_hit.c @@ -0,0 +1,26 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Dire Hit increases a battler's critical hit chance by 2 stages") +{ + u32 genConfig = 0, chance; + for (u32 j = GEN_1; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } // 50% + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_DIRE_HIT, partyIndex: 0); } + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); + MESSAGE("Wobbuffet used the Dire Hit to get pumped!"); + MESSAGE("Wobbuffet used Scratch!"); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/move.c b/test/battle/move.c index 9ee37391ec..ab2f5157bc 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -134,42 +134,15 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie } } -SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate") -{ - PASSES_RANDOMLY(1, 24, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_SCRATCH); } - } SCENE { - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Slash's critical hits occur at a 1/8 rate") -{ - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); - GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_SLASH); } - } SCENE { - MESSAGE("A critical hit!"); - } -} - -SINGLE_BATTLE_TEST("Critical hits deal 50% more damage", s16 damage) +SINGLE_BATTLE_TEST("Critical hits deal 100% (Gen 1-5) or 50% (Gen 6+) more damage", s16 damage) { bool32 criticalHit; - PARAMETRIZE { criticalHit = FALSE; } - PARAMETRIZE { criticalHit = TRUE; } + u32 genConfig; + PARAMETRIZE { criticalHit = FALSE; genConfig = GEN_5; } + PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_5; } + PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_6; } GIVEN { - ASSUME(B_CRIT_MULTIPLIER >= GEN_6); + WITH_CONFIG(GEN_CONFIG_CRIT_MULTIPLIER, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -177,7 +150,8 @@ SINGLE_BATTLE_TEST("Critical hits deal 50% more damage", s16 damage) } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[2].damage); } } diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index e02dd84dd2..34a7f0b05e 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -1,10 +1,14 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); +} + SINGLE_BATTLE_TEST("Dragon Cheer fails in a single battle") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -14,43 +18,68 @@ SINGLE_BATTLE_TEST("Dragon Cheer fails in a single battle") } } -DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by one on non-Dragon types") +DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 1 on non-Dragon types") { - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + bool32 useDragonCheer = 0; + u32 genConfig = 0, chance = 0; + for (u32 j = GEN_1; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = j; useDragonCheer = FALSE; chance = j >= GEN_7 ? 24 : 16; } // 6.25% with Wobbuffet's base speed + PARAMETRIZE { genConfig = j; useDragonCheer = TRUE; chance = 8; } // 12.5% with Wobbuffet's base speed + } + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); - ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DRAGON_CHEER, target: playerRight); MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + TURN { + if (useDragonCheer) + MOVE(playerLeft, MOVE_DRAGON_CHEER, target: playerRight); + MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); + } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerLeft); - MESSAGE("Wynaut is getting pumped!"); + if (useDragonCheer) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerLeft); + MESSAGE("Wobbuffet is getting pumped!"); + } ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); MESSAGE("A critical hit!"); } } -DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by two on Dragon types") +DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon types") { - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + bool32 useDragonCheer; + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_1; useDragonCheer = FALSE; passes = 25; trials = 256; } // ~9.77% with Dratini's base speed + PARAMETRIZE { genConfig = GEN_1; useDragonCheer = TRUE; passes = 25; trials = 64; } // ~39.06% with Dratini's base speed + for (u32 j = GEN_2; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = j; useDragonCheer = FALSE; passes = 1; trials = j >= GEN_7 ? 24 : 16; } // ~4.16%/6.25% + PARAMETRIZE { genConfig = j; useDragonCheer = TRUE; passes = 1; trials = j >= GEN_6 ? 2 : 4; } // 50%/25% + } + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); - ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(gSpeciesInfo[SPECIES_DRATINI].baseSpeed == 50); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DRATINI); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DRAGON_CHEER, target: playerRight); MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + TURN { + if (useDragonCheer) + MOVE(playerLeft, MOVE_DRAGON_CHEER, target: playerRight); + MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); + } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerLeft); - MESSAGE("Dratini is getting pumped!"); + if (useDragonCheer) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerLeft); + MESSAGE("Dratini is getting pumped!"); + } ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); MESSAGE("A critical hit!"); } @@ -61,7 +90,6 @@ DOUBLE_BATTLE_TEST("Dragon Cheer fails if critical hit stage was already increas GIVEN { ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); - ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c new file mode 100644 index 0000000000..151a259cfd --- /dev/null +++ b/test/battle/move_effect/focus_energy.c @@ -0,0 +1,41 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); +} + +SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 stage (Gen 1-2) or 2 stages (Gen 3+)") +{ + bool32 useFocusEnergy = 0; + u32 genConfig = 0, chance = 0; + for (u32 j = GEN_1; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = j; useFocusEnergy = FALSE; chance = j >= GEN_7 ? 24 : 16; } // ~4.16%/6.25% with Wobbuffet's base speed + PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; + if (j >= GEN_6) + chance = 2; // 50% / 25% + else if (j >= GEN_3) + chance = 4; // 25% + else + chance = 8; // 12.5% with Wobbuffet's base speed + } + } + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useFocusEnergy) + TURN { MOVE(player, MOVE_FOCUS_ENERGY); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + if (useFocusEnergy) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/move_effect/laser_focus.c b/test/battle/move_effect/laser_focus.c new file mode 100644 index 0000000000..2f61c99ef8 --- /dev/null +++ b/test/battle/move_effect/laser_focus.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_LASER_FOCUS].effect == EFFECT_LASER_FOCUS); +} + +SINGLE_BATTLE_TEST("Laser Focus causes the user's move used on the next turn to result in a Critical Hit") +{ + PASSES_RANDOMLY(1, 1, RNG_CRITICAL_HIT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LASER_FOCUS); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/move_effect/lucky_chant.c b/test/battle/move_effect/lucky_chant.c new file mode 100644 index 0000000000..31e9dce254 --- /dev/null +++ b/test/battle/move_effect/lucky_chant.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Lucky Chant prevents critical hits on the user's side") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_LUCKY_CHANT].effect == EFFECT_LUCKY_CHANT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_LUCKY_CHANT); MOVE(player, MOVE_TACKLE, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + NOT MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index 802c4f455e..9309f97ed9 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -25,12 +25,15 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") } } -SINGLE_BATTLE_TEST("Multi hit Moves hit twice 35% of the time") +SINGLE_BATTLE_TEST("Multi hit Moves hit twice 37.5/35% of the time") { - PASSES_RANDOMLY(35, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 3; trials = 8; } + PARAMETRIZE { genConfig = GEN_5; passes = 7; trials = 20; } + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -42,12 +45,15 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit twice 35% of the time") } } -SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 35% of the time") +SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 37.5/35% of the time") { - PASSES_RANDOMLY(35, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 3; trials = 8; } + PARAMETRIZE { genConfig = GEN_5; passes = 7; trials = 20; } + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -60,12 +66,15 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 35% of the time") } } -SINGLE_BATTLE_TEST("Multi hit Moves hit four times 15% of the time") +SINGLE_BATTLE_TEST("Multi hit Moves hit four times 12.5/15% of the time") { - PASSES_RANDOMLY(15, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 1; trials = 8; } + PARAMETRIZE { genConfig = GEN_5; passes = 3; trials = 20; } + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -79,12 +88,15 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit four times 15% of the time") } } -SINGLE_BATTLE_TEST("Multi hit Moves hit five times 15% of the time") +SINGLE_BATTLE_TEST("Multi hit Moves hit five times 12.5/15% of the time") { - PASSES_RANDOMLY(15, 100, RNG_HITS); + u32 genConfig, passes, trials; + PARAMETRIZE { genConfig = GEN_4; passes = 1; trials = 8; } + PARAMETRIZE { genConfig = GEN_5; passes = 3; trials = 20; } + PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - ASSUME(B_MULTI_HIT_CHANCE >= GEN_5); + WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index ad7878fdc9..d0b514fd19 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -44,11 +44,17 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time") } } -SINGLE_BATTLE_TEST("Triple Arrows lands a critical hit") +SINGLE_BATTLE_TEST("Triple Arrows has an increased critical hit ratio") { - PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + u32 j, genConfig = 0, passes = 0, trials = 0; + + PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 2; } // 50% with Wobbuffet's base speed + for (j = GEN_2; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = GEN_2; passes = 1; trials = 8; } + } + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - ASSUME(B_CRIT_CHANCE >= GEN_7); + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c new file mode 100644 index 0000000000..8660da3714 --- /dev/null +++ b/test/battle/move_flags/critical_hit_stage.c @@ -0,0 +1,24 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a 1/8 rate (Gen 2+) or x8 times more likely (Gen 1)") +{ + u32 j, genConfig = 0, passes = 0, trials = 0; + + PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 2; } // 50% with Wobbuffet's base speed + for (j = GEN_2; j <= GEN_9; j++) { + PARAMETRIZE { genConfig = GEN_2; passes = 1; trials = 8; } + } + PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); + GIVEN { + WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SLASH); } + } SCENE { + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/move_flags/ignores_target_ability.c b/test/battle/move_flags/ignores_target_ability.c index 2836f4838e..e5cd476641 100644 --- a/test/battle/move_flags/ignores_target_ability.c +++ b/test/battle/move_flags/ignores_target_ability.c @@ -72,3 +72,23 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s1 EXPECT_EQ(results[4].damage, results[5].damage); } } + +SINGLE_BATTLE_TEST("ignoresTargetAbility allows Pokémon with Battle Armor and Shell Armor to receive critical hits") +{ + u32 species; + u32 ability; + + PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } + PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_SUNSTEEL_STRIKE].ignoresTargetAbility == TRUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNSTEEL_STRIKE, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNSTEEL_STRIKE, player); + MESSAGE("A critical hit!"); + } +} diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 85a784764e..4caeb3c509 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -1,14 +1,16 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Paralysis reduces Speed by 50%") +SINGLE_BATTLE_TEST("Paralysis reduces Speed by 50% (Gen 7+) or 75% (Gen 1-6)") { - u16 playerSpeed; + u32 playerSpeed, genConfig; bool32 playerFirst; - PARAMETRIZE { playerSpeed = 98; playerFirst = FALSE; } - PARAMETRIZE { playerSpeed = 102; playerFirst = TRUE; } + PARAMETRIZE { playerSpeed = 196; playerFirst = FALSE; genConfig = GEN_6; } + PARAMETRIZE { playerSpeed = 204; playerFirst = TRUE; genConfig = GEN_6; } + PARAMETRIZE { playerSpeed = 98; playerFirst = FALSE; genConfig = GEN_7; } + PARAMETRIZE { playerSpeed = 102; playerFirst = TRUE; genConfig = GEN_7; } GIVEN { - ASSUME(B_PARALYSIS_SPEED >= GEN_7); + WITH_CONFIG(GEN_CONFIG_PARALYSIS_SPEED, genConfig); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); Speed(playerSpeed); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { diff --git a/test/battle/status2/confusion.c b/test/battle/status2/confusion.c index 4115123b3c..9c7524cdec 100644 --- a/test/battle/status2/confusion.c +++ b/test/battle/status2/confusion.c @@ -4,11 +4,14 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") { s16 damage[2]; + u32 genConfig, pctChance; - ASSUME(gMovesInfo[MOVE_TACKLE].power == 40); - - PASSES_RANDOMLY(B_CONFUSION_SELF_DMG_CHANCE >= GEN_7 ? 33 : 50, 100, RNG_CONFUSION); + PARAMETRIZE { genConfig = GEN_6; pctChance = 50; } + PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } + PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { + WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + ASSUME(gMovesInfo[MOVE_TACKLE].power == 40); PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }; } WHEN { @@ -29,8 +32,13 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") SINGLE_BATTLE_TEST("Confusion self hit does not consume Gems") { - PASSES_RANDOMLY(B_CONFUSION_SELF_DMG_CHANCE >= GEN_7 ? 33 : 50, 100, RNG_CONFUSION); + u32 genConfig, pctChance; + + PARAMETRIZE { genConfig = GEN_6; pctChance = 50; } + PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } + PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { + WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { From cf5b95cee8d21e0a098938483fe9fe5af2203774 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:34:48 +0000 Subject: [PATCH 096/125] Fixes Expanding Force and Spectral Thief move animations (#6185) --- data/battle_anim_scripts.s | 30 +++++++++++++++--------------- data/battle_scripts_1.s | 5 +++++ src/battle_script_commands.c | 5 +++++ 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 151ab6400a..3db049255b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2228,7 +2228,7 @@ gBattleAnimMove_ZenHeadbutt:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 1, 2 - createsprite gAquaTailHitSpriteTemplate, ANIM_TARGER, 131, 0, 0, 1, 1 + createsprite gAquaTailHitSpriteTemplate, ANIM_TARGET, 131, 0, 0, 1, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 4, 4, 0, 0 @@ -2246,22 +2246,22 @@ gBattleAnimMove_MirrorShot:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 10, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21) waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA @@ -11974,7 +11974,7 @@ PrismaticLaserRain: return gBattleAnimMove_SpectralThief:: - choosetwoturnanim SpectralThiefSteal SpectralThiefUnleash + choosetwoturnanim SpectralThiefUnleash SpectralThiefSteal SpectralThiefUnleash: loadspritegfx ANIM_TAG_HANDS_AND_FEET @Black Colour loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour @@ -13242,7 +13242,7 @@ gBattleAnimMove_MagicPowder:: gBattleAnimMove_DragonDarts:: loadspritegfx ANIM_TAG_DREEPY_SHINY loadspritegfx ANIM_TAG_DREEPY - loadspritegfx ANIM_TAG_AIR_WAVE + loadspritegfx ANIM_TAG_AIR_WAVE loadspritegfx ANIM_TAG_EXPLOSION playsewithpan SE_FALL, SOUND_PAN_ATTACKER createdragondartsprite ANIM_TARGET, 2, 0x0, 0x0, 0x19 @@ -14038,9 +14038,9 @@ gBattleAnimMove_ExpandingForce:: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, F_PAL_ATTACKER, 2, 0, 8, RGB(31, 23, 0) waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET - choosetwoturnanim EXPANDING_FORCE_SINGLE_TARGET EXPANDING_FORCE_BOTH_TARGETS + choosetwoturnanim ExpandingForceSingleTarget ExpandingForceBothTargets -EXPANDING_FORCE_SINGLE_TARGET: +ExpandingForceSingleTarget: createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x18, 0x1, 0x0 @@ -14050,7 +14050,7 @@ EXPANDING_FORCE_SINGLE_TARGET: clearmonbg ANIM_DEF_PARTNER end -EXPANDING_FORCE_BOTH_TARGETS: +ExpandingForceBothTargets: createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_DEF_PARTNER waitforvisualfinish @@ -14182,9 +14182,9 @@ gBattleAnimMove_MeteorBeam:: loadspritegfx ANIM_TAG_ROCKS fadetobg BG_COSMIC waitbgfadeout - choosetwoturnanim METEOR_BEAM_CHARGE METEOR_BEAM_BLAST + choosetwoturnanim MeteorBeamCharge MeteorBeamBlast -METEOR_BEAM_CHARGE: +MeteorBeamCharge: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFC00, FALSE, 0xffff waitbgfadein monbg ANIM_ATK_PARTNER @@ -14197,7 +14197,7 @@ METEOR_BEAM_CHARGE: call UnsetPsychicBg end -METEOR_BEAM_BLAST: +MeteorBeamBlast: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xf700, 0x0, TRUE, 0xffff @;Scroll right/left waitbgfadein monbg ANIM_TARGET diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e56cf1eeaf..2b0ca93a9d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1291,11 +1291,16 @@ BattleScript_VCreateStatLossRet: return BattleScript_SpectralThiefSteal:: + setbyte sB_ANIM_TURN, 1 + playmoveanimation BS_ATTACKER, MOVE_SPECTRAL_THIEF + waitanimation + setbyte sB_ANIM_TURN, 0 printstring STRINGID_SPECTRALTHIEFSTEAL waitmessage B_WAIT_TIME_LONG setbyte sB_ANIM_ARG2, 0 playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 spectralthiefprintstats + flushtextbox goto BattleScript_EffectSpectralThiefFromDamage BattleScript_EffectSpectralThief:: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bc8e5c8e35..d962390fd8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2270,6 +2270,11 @@ static void Cmd_attackanimation(void) gBattlescriptCurrInstr = cmd->nextInstr; return; } + + // handle special move animations + if (gMovesInfo[gCurrentMove].effect == EFFECT_EXPANDING_FORCE && moveTarget & MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, BATTLE_OPPOSITE(gBattlerAttacker) > 1)) + gBattleScripting.animTurn = 1; + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { u8 multihit; From 174bc2f29f2bcfcf593bf339537b271ada910236 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 9 Feb 2025 22:59:31 +0100 Subject: [PATCH 097/125] Fixed typo in requests_effects (#6215) Co-authored-by: Hedara --- asm/macros/event.inc | 22 +++++++++++----------- include/script.h | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 01522ab048..c60555f67d 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2339,7 +2339,7 @@ @ Stores the position of the given object in destX and destY. Mode CURRENT_POSITION will take the object's current position. Mode TEMPLATE_POSITION will take the object's template position. .macro getobjectxy localId:req, posType:req, destX:req, destY:req - callnative ScrCmd_getobjectxy, request_effects=1 + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2347,7 +2347,7 @@ .endm .macro getobjecttemplatexy localId:req, posType = TEMPLATE_POSITION, destX:req, destY:req - callnative ScrCmd_getobjectxy, request_effects=1 + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2355,7 +2355,7 @@ .endm .macro getobjectcurrentxy localId:req, posType = CURRENT_POSITION, destX:req, destY:req - callnative ScrCmd_getobjectxy, request_effects=1 + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2364,7 +2364,7 @@ @ Return TRUE to dest if there is an object at the position x and y. .macro checkobjectat x:req, y:req, dest = VAR_RESULT - callnative ScrCmd_checkobjectat, request_effects=1 + callnative ScrCmd_checkobjectat, requests_effects=1 .2byte \x .2byte \y .2byte \dest @@ -2372,28 +2372,28 @@ @ Returns the state of the Pokedex Seen Flag to VAR_RESULT for the Pokemon with speciesId .macro getseenmon species:req - callnative Scrcmd_getsetpokedexflag, request_effects=1 + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_GET_SEEN .endm @ Returns the state of the Pokedex Caught Flag to VAR_RESULT for the Pokemon with speciesId .macro getcaughtmon species:req - callnative Scrcmd_getsetpokedexflag, request_effects=1 + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_GET_CAUGHT .endm @ Sets the Pokedex Seen Flag for the Pokemon with speciesId .macro setseenmon species:req - callnative Scrcmd_getsetpokedexflag, request_effects=1 + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_SET_SEEN .endm @ Sets the Pokedex Caught Flag for the Pokemon with speciesId .macro setcaughtmon species:req - callnative Scrcmd_getsetpokedexflag, request_effects=1 + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_SET_CAUGHT .endm @@ -2403,10 +2403,10 @@ .if \mode == OPEN_PARTY_SCREEN special ChoosePartyMon waitstate - callnative Scrcmd_checkspecies_choose, request_effects=1 + callnative Scrcmd_checkspecies_choose, requests_effects=1 .2byte \speciesId .else - callnative Scrcmd_checkspecies, request_effects=1 + callnative Scrcmd_checkspecies, requests_effects=1 .2byte \speciesId .endif .endm @@ -2417,7 +2417,7 @@ @ Gets the facing direction of a given event object and stores it in the variable dest. .macro getobjectfacingdirection localId:req, dest:req - callnative Scrcmd_getobjectfacingdirection, request_effects=1 + callnative Scrcmd_getobjectfacingdirection, requests_effects=1 .2byte \localId .2byte \dest .endm diff --git a/include/script.h b/include/script.h index 1546d15dd4..4fc2189035 100644 --- a/include/script.h +++ b/include/script.h @@ -133,7 +133,7 @@ static inline bool32 Script_IsAnalyzingEffects(void) /* Optimize 'Script_RequestEffects' to a no-op if it would have no * effect. 'Script_RequestEffects' must be called in all commands and - * natives/specials with 'request_effects=TRUE' even if it would have + * natives/specials with 'requests_effects=TRUE' even if it would have * no effect to future-proof against new effects. */ #define Script_RequestEffects(effects) \ ({ \ From 579fa6410d82dabfaa4d21725e00c70d367192da Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 9 Feb 2025 18:30:54 -0500 Subject: [PATCH 098/125] Switch chance config support (#6187) --- include/battle_ai_switch_items.h | 33 ++++++ include/config/ai.h | 49 ++++++++ include/constants/global.h | 1 + include/random.h | 10 ++ src/battle_ai_switch_items.c | 146 ++++++++++++++++++------ src/battle_main.c | 2 +- test/battle/ai/ai_choice.c | 2 + test/battle/ai/ai_flag_predict_switch.c | 14 +-- test/battle/ai/ai_switching.c | 54 ++++++--- 9 files changed, 248 insertions(+), 63 deletions(-) create mode 100644 include/config/ai.h diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index d5fbc701a5..f6cabcc684 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -1,6 +1,39 @@ #ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H #define GUARD_BATTLE_AI_SWITCH_ITEMS_H +enum ShouldSwitchScenario +{ + SHOULD_SWITCH_WONDER_GUARD, + SHOULD_SWITCH_ABSORBS_MOVE, + SHOULD_SWITCH_TRAPPER, + SHOULD_SWITCH_FREE_TURN, + SHOULD_SWITCH_TRUANT, + SHOULD_SWITCH_ALL_MOVES_BAD, + SHOULD_SWITCH_PERISH_SONG, + SHOULD_SWITCH_YAWN, + SHOULD_SWITCH_BADLY_POISONED, + SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED, + SHOULD_SWITCH_CURSED, + SHOULD_SWITCH_CURSED_STATS_RAISED, + SHOULD_SWITCH_NIGHTMARE, + SHOULD_SWITCH_NIGHTMARE_STATS_RAISED, + SHOULD_SWITCH_SEEDED, + SHOULD_SWITCH_SEEDED_STATS_RAISED, + SHOULD_SWITCH_INFATUATION, + SHOULD_SWITCH_HASBADODDS, + SHOULD_SWITCH_NATURAL_CURE_STRONG, + SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED, + SHOULD_SWITCH_NATURAL_CURE_WEAK, + SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED, + SHOULD_SWITCH_REGENERATOR, + SHOULD_SWITCH_REGENERATOR_STATS_RAISED, + SHOULD_SWITCH_ENCORE_STATUS, + SHOULD_SWITCH_ENCORE_DAMAGE, + SHOULD_SWITCH_CHOICE_LOCKED, + SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO, + SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS, +}; + enum SwitchType { SWITCH_AFTER_KO, diff --git a/include/config/ai.h b/include/config/ai.h new file mode 100644 index 0000000000..686ac14c22 --- /dev/null +++ b/include/config/ai.h @@ -0,0 +1,49 @@ +#ifndef GUARD_CONFIG_AI_H +#define GUARD_CONFIG_AI_H + +// For the details on what specific factors the switching functions are considering, go read the corresponding function inside ShouldSwitch in src/battle_ai_switch_items.c +// These configuration options control how likely the AI is to switch if it determines that a switch meets all of its criteria +// Think of them almost like success rates; if the AI has determined that it needs to switch out to hit Wonder Guard, how often do you want it to actually take that course of action? Etc. + +// AI switch chances; if you want more complex behaviour, modify GetSwitchChance +#define SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE 100 +#define SHOULD_SWITCH_TRUANT_PERCENTAGE 100 +#define SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE 100 + +// AI smart switching chances; if you want more complex behaviour, modify GetSwitchChance +#define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100 +#define SHOULD_SWITCH_TRAPPER_PERCENTAGE 100 +#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 100 +#define STAY_IN_ABSORBING_PERCENTAGE 66 // Chance to stay in if outgoing mon has super effective move against player, will prevent switching out for an absorber with this likelihood +#define SHOULD_SWITCH_HASBADODDS_PERCENTAGE 50 +#define SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE 100 +#define SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE 50 +#define SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE 100 // Only if locked into status move +#define SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE 50 +#define SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE 100 + +// AI smart switching chances for bad statuses +#define SHOULD_SWITCH_PERISH_SONG_PERCENTAGE 100 +#define SHOULD_SWITCH_YAWN_PERCENTAGE 100 +#define SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE 50 +#define SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED_PERCENTAGE 20 +#define SHOULD_SWITCH_CURSED_PERCENTAGE 50 +#define SHOULD_SWITCH_CURSED_STATS_RAISED_PERCENTAGE 20 +#define SHOULD_SWITCH_NIGHTMARE_PERCENTAGE 33 +#define SHOULD_SWITCH_NIGHTMARE_STATS_RAISED_PERCENTAGE 15 +#define SHOULD_SWITCH_SEEDED_PERCENTAGE 25 +#define SHOULD_SWITCH_SEEDED_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_INFATUATION_PERCENTAGE 100 + +// AI smart switching chances for beneficial abilities +#define SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE 66 +#define SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_NATURAL_CURE_WEAK_PERCENTAGE 25 +#define SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_REGENERATOR_PERCENTAGE 50 +#define SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE 20 + +// AI prediction chances +#define PREDICT_SWITCH_CHANCE 50 + +#endif // GUARD_CONFIG_AI_H diff --git a/include/constants/global.h b/include/constants/global.h index f8c70bd736..8ca3861709 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -10,6 +10,7 @@ #include "config/overworld.h" #include "config/dexnav.h" #include "config/summary_screen.h" +#include "config/ai.h" // Invalid Versions show as "----------" in Gen 4 and Gen 5's summary screen. // In Gens 6 and 7, invalid versions instead show "a distant land" in the summary screen. diff --git a/include/random.h b/include/random.h index 80e4ea8a24..c8b4a039b5 100644 --- a/include/random.h +++ b/include/random.h @@ -171,12 +171,22 @@ enum RandomTag RNG_AI_SWITCH_CURSED, RNG_AI_SWITCH_NIGHTMARE, RNG_AI_SWITCH_SEEDED, + RNG_AI_SWITCH_YAWN, + RNG_AI_SWITCH_PERISH_SONG, + RNG_AI_SWITCH_INFATUATION, RNG_AI_SWITCH_ABSORBING, + RNG_AI_SWITCH_ABSORBING_STAY_IN, RNG_AI_SWITCH_NATURAL_CURE, RNG_AI_SWITCH_REGENERATOR, RNG_AI_SWITCH_ENCORE, + RNG_AI_SWITCH_CHOICE_LOCKED, RNG_AI_SWITCH_STATS_LOWERED, RNG_AI_SWITCH_SE_DEFENSIVE, + RNG_AI_SWITCH_TRUANT, + RNG_AI_SWITCH_WONDER_GUARD, + RNG_AI_SWITCH_TRAPPER, + RNG_AI_SWITCH_FREE_TURN, + RNG_AI_SWITCH_ALL_MOVES_BAD, RNG_SHELL_SIDE_ARM, RNG_RANDOM_TARGET, RNG_AI_PREDICT_ABILITY, diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index df865cb6cb..59baf4362e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -37,6 +37,74 @@ static void InitializeSwitchinCandidate(struct Pokemon *mon) AI_DATA->switchinCandidate.hypotheticalStatus = FALSE; } +u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) +{ + // Modify these cases if you want unique behaviour based on other data (trainer class, difficulty, etc.) + switch(shouldSwitchScenario) + { + case SHOULD_SWITCH_WONDER_GUARD: + return SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE; + case SHOULD_SWITCH_ABSORBS_MOVE: + return SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE; + case SHOULD_SWITCH_TRAPPER: + return SHOULD_SWITCH_TRAPPER_PERCENTAGE; + case SHOULD_SWITCH_FREE_TURN: + return SHOULD_SWITCH_FREE_TURN_PERCENTAGE; + case SHOULD_SWITCH_TRUANT: + return SHOULD_SWITCH_TRUANT_PERCENTAGE; + case SHOULD_SWITCH_ALL_MOVES_BAD: + return SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE; + case SHOULD_SWITCH_PERISH_SONG: + return SHOULD_SWITCH_PERISH_SONG_PERCENTAGE; + case SHOULD_SWITCH_YAWN: + return SHOULD_SWITCH_YAWN_PERCENTAGE; + case SHOULD_SWITCH_BADLY_POISONED: + return SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE; + case SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED: + return SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_CURSED: + return SHOULD_SWITCH_CURSED_PERCENTAGE; + case SHOULD_SWITCH_CURSED_STATS_RAISED: + return SHOULD_SWITCH_CURSED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_NIGHTMARE: + return SHOULD_SWITCH_NIGHTMARE_PERCENTAGE; + case SHOULD_SWITCH_NIGHTMARE_STATS_RAISED: + return SHOULD_SWITCH_NIGHTMARE_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_SEEDED: + return SHOULD_SWITCH_SEEDED_PERCENTAGE; + case SHOULD_SWITCH_SEEDED_STATS_RAISED: + return SHOULD_SWITCH_SEEDED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_INFATUATION: + return SHOULD_SWITCH_INFATUATION_PERCENTAGE; + case SHOULD_SWITCH_HASBADODDS: + return SHOULD_SWITCH_HASBADODDS_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_STRONG: + return SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED: + return SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_WEAK: + return SHOULD_SWITCH_NATURAL_CURE_WEAK_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED: + return SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_REGENERATOR: + return SHOULD_SWITCH_REGENERATOR_PERCENTAGE; + case SHOULD_SWITCH_REGENERATOR_STATS_RAISED: + return SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_ENCORE_STATUS: + return SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE; + case SHOULD_SWITCH_ENCORE_DAMAGE: + return SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE; + case SHOULD_SWITCH_CHOICE_LOCKED: + return SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE; + case SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO: + return SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE; + case SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS: + return SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE; + default: + return 100; + } +} + u32 GetThinkingBattler(u32 battler) { if (AI_DATA->aiSwitchPredictionInProgress) @@ -198,7 +266,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50) && !AI_DATA->aiSwitchPredictionInProgress) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -218,7 +286,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) return FALSE; // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50) && !AI_DATA->aiSwitchPredictionInProgress) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -237,7 +305,8 @@ static bool32 ShouldSwitchIfTruant(u32 battler) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) { - return SetSwitchinAndSwitch(battler, PARTY_SIZE); + if (RandomPercentage(RNG_AI_SWITCH_TRUANT, GetSwitchChance(SHOULD_SWITCH_TRUANT))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } return FALSE; } @@ -271,7 +340,9 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) } } - return SetSwitchinAndSwitch(battler, PARTY_SIZE); + if (RandomPercentage(RNG_AI_SWITCH_ALL_MOVES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_MOVES_BAD))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); + return FALSE; } static bool32 FindMonThatHitsWonderGuard(u32 battler) @@ -320,7 +391,7 @@ static bool32 FindMonThatHitsWonderGuard(u32 battler) if (move != MOVE_NONE) { // Found a mon - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, GetSwitchChance(SHOULD_SWITCH_WONDER_GUARD))) return SetSwitchinAndSwitch(battler, i); } } @@ -351,7 +422,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE return FALSE; - if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING, 66) || AI_DATA->aiSwitchPredictionInProgress)) + if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || AI_DATA->aiSwitchPredictionInProgress)) return FALSE; if (IsDoubleBattle()) @@ -436,7 +507,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) for (j = 0; j < numAbsorbingAbilities; j++) { // Found a mon - if (absorbingTypeAbilities[j] == monAbility) + if (absorbingTypeAbilities[j] == monAbility && RandomPercentage(RNG_AI_SWITCH_ABSORBING, GetSwitchChance(SHOULD_SWITCH_ABSORBS_MOVE))) return SetSwitchinAndSwitch(battler, i); } } @@ -452,7 +523,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) if (IsDoubleBattle() || !(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; - if (isOpposingBattlerChargingOrInvulnerable && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + if (isOpposingBattlerChargingOrInvulnerable && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -489,7 +560,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == AI_DATA->mostSuitableMonId[battler]) + if (i == AI_DATA->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } @@ -508,15 +579,17 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) //Perish Song if (gStatuses3[battler] & STATUS3_PERISH_SONG && gDisableStructs[battler].perishSongTimer == 0 - && monAbility != ABILITY_SOUNDPROOF) - switchMon = TRUE; + && monAbility != ABILITY_SOUNDPROOF + && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) { //Yawn if (gStatuses3[battler] & STATUS3_YAWN && CanBeSlept(battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) - && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3) + && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3 + && RandomPercentage(RNG_AI_SWITCH_YAWN, GetSwitchChance(SHOULD_SWITCH_YAWN))) { switchMon = TRUE; @@ -546,6 +619,9 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && !(gBattleMons[battler].status2 & STATUS2_FORESIGHT) && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) switchMon = FALSE; + + if (switchMon) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // Secondary Damage @@ -556,35 +632,33 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2)) && gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / 3) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 20) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 50))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Cursed if (gBattleMons[battler].status2 & STATUS2_CURSED - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, 20) : RandomPercentage(RNG_AI_SWITCH_CURSED, 50))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Nightmare if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 15) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 33))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Leech Seed if (gStatuses3[battler] & STATUS3_LEECHSEED - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, 10) : RandomPercentage(RNG_AI_SWITCH_SEEDED, 25))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // Infatuation if (gBattleMons[battler].status2 & STATUS2_INFATUATION - && !AiExpectsToFaintPlayer(battler)) - switchMon = TRUE; + && !AiExpectsToFaintPlayer(battler) + && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } - if (switchMon) - return SetSwitchinAndSwitch(battler, PARTY_SIZE); - else - return FALSE; + return FALSE; } static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) @@ -602,13 +676,13 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) //Attempt to cure bad ailment if (gBattleMons[battler].status1 & (STATUS1_SLEEP | STATUS1_FREEZE | STATUS1_TOXIC_POISON) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 10) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 66))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG)))) break; //Attempt to cure lesser ailment if ((gBattleMons[battler].status1 & STATUS1_ANY) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 10) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 25))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK)))) break; return FALSE; @@ -619,7 +693,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) return FALSE; if ((gBattleMons[battler].hp <= ((gBattleMons[battler].maxHP * 2) / 3)) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_REGENERATOR, 20) : RandomPercentage(RNG_AI_SWITCH_REGENERATOR, 50))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR)))) break; return FALSE; @@ -858,7 +932,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return FALSE; // Switch out if status move - if (GetMoveCategory(encoredMove) == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(encoredMove) == DAMAGE_CATEGORY_STATUS && RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_STATUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move @@ -866,7 +940,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return FALSE; // Switch out 50% of the time otherwise - else if ((RandomPercentage(RNG_AI_SWITCH_ENCORE, 50) || AI_DATA->aiSwitchPredictionInProgress) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + else if ((RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_DAMAGE)) || AI_DATA->aiSwitchPredictionInProgress) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -878,7 +952,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) if (HOLD_EFFECT_CHOICE(holdEffect) && gBattleMons[battler].ability != ABILITY_KLUTZ) { - if (GetMoveCategory(AI_DATA->lastUsedMove[battler]) == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(AI_DATA->lastUsedMove[battler]) == DAMAGE_CATEGORY_STATUS && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -904,11 +978,11 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (attackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, 50) || AI_DATA->aiSwitchPredictionInProgress)) + if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless - else if (attackingStage < DEFAULT_STAT_STAGE - 2) + else if ((attackingStage < DEFAULT_STAT_STAGE - 2) && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -921,11 +995,11 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (spAttackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, 50) || AI_DATA->aiSwitchPredictionInProgress)) + if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless - else if (spAttackingStage < DEFAULT_STAT_STAGE - 2) + else if ((spAttackingStage < DEFAULT_STAT_STAGE - 2) && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } return FALSE; diff --git a/src/battle_main.c b/src/battle_main.c index 3000005917..5be19de6fc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4160,7 +4160,7 @@ void SetupAISwitchingData(u32 battler, enum SwitchType switchType) gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; // Determine whether AI will use predictions this turn - AI_DATA->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, 50); + AI_DATA->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); } // AI's data diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index c3d3e02c03..b19af6a073 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -24,6 +24,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc PARAMETRIZE { ability = ABILITY_KLUTZ; heldItem = choiceItems[j]; } } + PASSES_RANDOMLY(SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE, 100, RNG_AI_SWITCH_CHOICE_LOCKED); + GIVEN { ASSUME(GetMoveCategory(MOVE_YAWN) == DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c index a5e74ff2d7..132ddf4175 100644 --- a/test/battle/ai/ai_flag_predict_switch.c +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -27,18 +27,6 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in Pursuit sc } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in Wonder Guard scenario") -{ - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); - PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_PURSUIT, MOVE_CRUNCH); } - OPPONENT(SPECIES_GENGAR) { Moves(MOVE_PSYCHIC); } - OPPONENT(SPECIES_SWELLOW) { Moves(MOVE_PECK); } - } WHEN { - TURN { MOVE(player, MOVE_PURSUIT); EXPECT_SWITCH(opponent, 1); } - } -} - AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI will use hit escape moves on predicted switches") { PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); @@ -137,7 +125,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON: AI AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in predicted-incoming-mon scenario") { - PASSES_RANDOMLY(5, 10, RNG_AI_SWITCH_HASBADODDS); + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_CRUNCH, MOVE_SPORE); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 82ad5440aa..227909e400 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -24,6 +24,7 @@ AI_SINGLE_BATTLE_TEST("AI gets baited by Protect Switch tactics") // This behavi // General switching behaviour AI_SINGLE_BATTLE_TEST("AI switches if Perish Song is about to kill") { + PASSES_RANDOMLY(SHOULD_SWITCH_PERISH_SONG_PERCENTAGE, 100, RNG_AI_SWITCH_PERISH_SONG); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); @@ -46,6 +47,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } PARAMETRIZE {flags = 0; } + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); PLAYER(SPECIES_RATTATA); @@ -67,8 +69,22 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot } } +AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the player") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_RATTATA); + OPPONENT(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_SWITCH(opponent, 1); } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a double battle (Wonder Guard)") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SHEDINJA); @@ -430,7 +446,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m u32 aiSmartSwitchingFlag = 0; PARAMETRIZE { aiSmartSwitchingFlag = 0; } PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; } - + PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[1] == TYPE_GHOST); @@ -488,6 +504,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon AI_SINGLE_BATTLE_TEST("AI will trap player using Trace if player has a trapper") { + PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ROCK_TOMB); } @@ -501,7 +518,7 @@ AI_SINGLE_BATTLE_TEST("AI will trap player using Trace if player has a trapper") AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would be OKHO'd and they have a good switchin 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_HASBADODDS); + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); @@ -520,6 +537,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to a mon with Wonder Guard") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); @@ -539,6 +557,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't deal damage to a mon with Wonder Guard") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); @@ -560,7 +579,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee { u32 species = SPECIES_NONE, odds = 0; PARAMETRIZE { species = SPECIES_ZIGZAGOON, odds = 0; } - PARAMETRIZE { species = SPECIES_HARIYAMA, odds = 50; } + PARAMETRIZE { species = SPECIES_HARIYAMA, odds = SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE; } PASSES_RANDOMLY(odds, 100, RNG_AI_SWITCH_BADLY_POISONED); GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); @@ -577,7 +596,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Curse'd 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_CURSED); + PASSES_RANDOMLY(SHOULD_SWITCH_CURSED_PERCENTAGE, 100, RNG_AI_SWITCH_CURSED); GIVEN { ASSUME(GetMoveEffect(MOVE_CURSE) == EFFECT_CURSE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -593,7 +612,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Nightmare'd 33% of the time") { - PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_NIGHTMARE); + PASSES_RANDOMLY(SHOULD_SWITCH_NIGHTMARE_PERCENTAGE, 100, RNG_AI_SWITCH_NIGHTMARE); GIVEN { ASSUME(GetMoveEffect(MOVE_NIGHTMARE) == EFFECT_NIGHTMARE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -608,7 +627,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Leech Seed'd 25% of the time") { - PASSES_RANDOMLY(25, 100, RNG_AI_SWITCH_SEEDED); + PASSES_RANDOMLY(SHOULD_SWITCH_SEEDED_PERCENTAGE, 100, RNG_AI_SWITCH_SEEDED); GIVEN { ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -623,6 +642,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been infatuated") { + PASSES_RANDOMLY(SHOULD_SWITCH_INFATUATION_PERCENTAGE, 100, RNG_AI_SWITCH_INFATUATION); GIVEN { ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -640,6 +660,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee u32 hp; PARAMETRIZE { hp = 30; } PARAMETRIZE { hp = 10; } + PASSES_RANDOMLY(SHOULD_SWITCH_YAWN_PERCENTAGE, 100, RNG_AI_SWITCH_YAWN); GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -660,6 +681,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee u32 hp; PARAMETRIZE { hp = 30; } PARAMETRIZE { hp = 10; } + PASSES_RANDOMLY(SHOULD_SWITCH_YAWN_PERCENTAGE, 100, RNG_AI_SWITCH_YAWN); GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -680,6 +702,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has an absorber") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { ASSUME(GetMoveType(MOVE_DIVE) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -694,7 +717,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber but current mon has SE move 33% of the time") { - PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_ABSORBING); + PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_ABSORBING_STAY_IN); GIVEN { ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -709,7 +732,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has an absorber") { - PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_ABSORBING); + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { ASSUME(GetMoveType(MOVE_SOLAR_BEAM) == TYPE_GRASS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -724,6 +747,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (type)") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -738,6 +762,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (ability)") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -799,7 +824,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if opponent u AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if badly statused with >= 50% HP remaining and has Natural Cure and a good switchin 66% of the time") { - PASSES_RANDOMLY(66, 100, RNG_AI_SWITCH_NATURAL_CURE); + PASSES_RANDOMLY(SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE, 100, RNG_AI_SWITCH_NATURAL_CURE); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_ODDISH) { Moves(MOVE_TOXIC, MOVE_TACKLE); } @@ -813,7 +838,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if badly statused with >= 5 AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it has <= 66% HP remaining and has Regenerator and a good switchin 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_REGENERATOR); + PASSES_RANDOMLY(SHOULD_SWITCH_REGENERATOR_PERCENTAGE, 100, RNG_AI_SWITCH_REGENERATOR); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -826,6 +851,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it has <= 66% HP remaini AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Encore'd into a status move") { + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -855,7 +881,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time") { KNOWN_FAILING; // AI still switches even if ShouldSwitch is set to immediately return FALSE, something external seems to be triggering this - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_ENCORE); + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -870,6 +896,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd i AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and opponent has Protect") { + PASSES_RANDOMLY(SHOULD_SWITCH_TRUANT_PERCENTAGE, 100, RNG_AI_SWITCH_TRUANT); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_ARON) { Moves(MOVE_TACKLE, MOVE_PROTECT); } @@ -883,6 +910,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and oppon AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and opponent has invulnerability move and is faster") { + PASSES_RANDOMLY(SHOULD_SWITCH_TRUANT_PERCENTAGE, 100, RNG_AI_SWITCH_TRUANT); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Speed(5); Moves(MOVE_FLY); } @@ -898,7 +926,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac { u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE; - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_STATS_LOWERED); + PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); PARAMETRIZE {move = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; PARAMETRIZE {move = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_CONFUSION; }; @@ -919,7 +947,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac { u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE, move2 = MOVE_NONE; - PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_STATS_LOWERED); + PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); PARAMETRIZE {move = MOVE_GROWL; move2 = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; PARAMETRIZE {move = MOVE_CONFIDE; move2 = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_STORED_POWER; }; From 846fe64789a6a2594225e0c501436eb72e791373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E9=9B=85?= <56014327+ExMingYan@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:55:57 +0800 Subject: [PATCH 099/125] Try a new solution to Fix Safari #6206 (#6228) --- src/battle_controllers.c | 4 ++++ src/battle_main.c | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index cb794abacf..15e90691f2 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2536,6 +2536,8 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is xPos, yPos, subpriority); + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) + gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; } @@ -2560,6 +2562,8 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) 80, (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80, 30); + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) + gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = -96; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = 2; diff --git a/src/battle_main.c b/src/battle_main.c index b6132a9a04..61e61aeb34 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -42,7 +42,6 @@ #include "pokemon.h" #include "random.h" #include "recorded_battle.h" -#include "reshow_battle_screen.h" #include "roamer.h" #include "safari_zone.h" #include "scanline_effect.h" @@ -3720,10 +3719,6 @@ static void DoBattleIntro(void) PrepareStringBattle(STRINGID_INTROSENDOUT, battler); } - else - { - CreateBattlerSprite(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); - } gBattleStruct->introState++; break; case BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT: From cc9ca81c29e1e3bcf81bbe4d7fa74f9faddbd623 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:32:34 +0100 Subject: [PATCH 100/125] Add abstraction layer for battler positions (#6212) --- include/battle.h | 26 ++++++++++++++++++++++++++ include/battle_anim.h | 1 - src/battle_ai_switch_items.c | 32 ++++++++++++++++---------------- src/battle_ai_util.c | 4 ++-- src/battle_anim_mons.c | 12 ------------ src/battle_controller_player.c | 2 +- src/battle_main.c | 30 +++++++++++++++--------------- src/battle_script_commands.c | 10 +++++++--- src/battle_util.c | 28 ++++++++++++++-------------- 9 files changed, 81 insertions(+), 64 deletions(-) diff --git a/include/battle.h b/include/battle.h index 8a5fd34c04..e0a6225f82 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1217,11 +1217,37 @@ static inline u32 GetBattlerPosition(u32 battler) return gBattlerPositions[battler]; } +static inline u32 GetBattlerAtPosition(u32 position) +{ + u32 battler; + for (battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerPosition(battler) == position) + break; + } + return battler; +} + +static inline u32 GetPartnerBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); +} + +static inline u32 GetOppositeBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); +} + static inline u32 GetBattlerSide(u32 battler) { return GetBattlerPosition(battler) & BIT_SIDE; } +static inline u32 GetOpposingSideBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); +} + static inline struct Pokemon* GetPartyBattlerData(u32 battler) { u32 index = gBattlerPartyIndexes[battler]; diff --git a/include/battle_anim.h b/include/battle_anim.h index 6605448249..ce94f667e3 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -165,7 +165,6 @@ void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void DestroyAnimVisualTaskAndDisableBlend(u8 taskId); void DestroySpriteAndFreeResources_(struct Sprite *sprite); void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId); -u8 GetBattlerAtPosition(u8 position); void ConvertPosDataToTranslateLinearData(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 59baf4362e..908568769e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -314,7 +314,7 @@ static bool32 ShouldSwitchIfTruant(u32 battler) static bool32 ShouldSwitchIfAllMovesBad(u32 battler) { u32 moveIndex; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 aiMove; // Switch if no moves affect opponents @@ -347,7 +347,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) static bool32 FindMonThatHitsWonderGuard(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); s32 i, j; s32 firstId; s32 lastId; // + 1 @@ -409,7 +409,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) s32 lastId; struct Pokemon *party; u16 monAbility; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; u32 incomingType = GetMoveType(incomingMove); u32 predictedMove = incomingMove; // Update for move prediction @@ -428,10 +428,10 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -516,7 +516,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); @@ -536,7 +536,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) struct Pokemon *party; s32 i; u16 monAbility; - s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -795,10 +795,10 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -870,10 +870,10 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -921,7 +921,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) static bool32 ShouldSwitchIfEncored(u32 battler) { u32 encoredMove = gDisableStructs[battler].encoredMove; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -1628,7 +1628,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u32 hitsToKO = 0, singleUseItemHeal = 0; u16 maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, item = AI_DATA->switchinCandidate.battleMon.item, heldItemEffect = ItemId_GetHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = ItemId_GetHoldEffectParam(item); - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = AI_DATA->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP; @@ -2073,10 +2073,10 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); opposingBattler = BATTLE_OPPOSITE(battlerIn1); if (gAbsentBattlerFlags & (1u << opposingBattler)) @@ -2084,7 +2084,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) } else { - opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + opposingBattler = GetOppositeBattler(battler); battlerIn1 = battler; battlerIn2 = battler; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 05c4f5dac3..6c4183786b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3158,7 +3158,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF @@ -3587,7 +3587,7 @@ s32 CountUsablePartyMons(u32 battlerId) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; } else // In singles there's only one battlerId by side. { diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 718ffb0a49..13b1cf834f 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -799,18 +799,6 @@ bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool return TRUE; } -u8 GetBattlerAtPosition(u8 position) -{ - u8 i; - - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerPosition(i) == position) - break; - } - return i; -} - bool8 IsBattlerSpritePresent(u8 battlerId) { if (IsContest()) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 78b7852374..fee5c963e2 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -688,7 +688,7 @@ void HandleInputChooseMove(u32 battler) if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = battler; else - gMultiUsePlayerCursor = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); + gMultiUsePlayerCursor = GetOpposingSideBattler(battler); if (!gBattleResources->bufferA[battler][1]) // not a double battle { diff --git a/src/battle_main.c b/src/battle_main.c index 5be19de6fc..33ab6ca1c2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4146,7 +4146,7 @@ enum void SetupAISwitchingData(u32 battler, enum SwitchType switchType) { - s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + s32 opposingBattler = GetOppositeBattler(battler); // AI's predicting data if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) @@ -4361,38 +4361,38 @@ static void HandleTurnActionSelectionState(void) break; case B_ACTION_CANCEL_PARTNER: gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; - gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] = STATE_BEFORE_ACTION_CHOSEN; + gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); - if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_RECHARGE) + if (gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_MULTIPLETURNS + || gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_RECHARGE) { BtlController_EmitEndBounceEffect(battler, BUFFER_A); MarkBattlerForControllerExec(battler); return; } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_SWITCH) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_SWITCH) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 2); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 2); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_RUN) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_RUN) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE - && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].noValidMoves - || gDisableStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].encoredMove)) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE + && (gProtectStructs[GetPartnerBattler(battler)].noValidMoves + || gDisableStructs[GetPartnerBattler(battler)].encoredMove)) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else if (gBattleTypeFlags & BATTLE_TYPE_PALACE - && gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE) + && gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE) { gRngValue = gBattlePalaceMoveSelectionRngValue; - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 3); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 3); } gBattleStruct->gimmick.toActivate &= ~((1u << BATTLE_PARTNER(GetBattlerPosition(battler)))); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f372df183b..a47146c6fe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13946,9 +13946,10 @@ static void Cmd_healpartystatus(void) { CMD_ARGS(); - u32 i, zero = 0; + u32 i = 0; + u32 zero = 0; + u32 toHeal = 0; u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - u8 toHeal = 0; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); bool32 isSoundMove = IsSoundMove(gCurrentMove); @@ -16270,6 +16271,8 @@ static void Cmd_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: + FREE_AND_SET_NULL(gBattleResources->aiData); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gBattleCommunication[0]++; break; @@ -16309,8 +16312,9 @@ static void Cmd_displaydexinfo(void) } break; case 5: - if (!gPaletteFade.active) + if (!gPaletteFade.active) { gBattlescriptCurrInstr = cmd->nextInstr; + } break; } } diff --git a/src/battle_util.c b/src/battle_util.c index e292c25493..35dd52c5e3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -382,7 +382,7 @@ void HandleAction_UseMove(void) if (!IsBattlerAlive(gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } else @@ -405,7 +405,7 @@ void HandleAction_UseMove(void) if (gAbsentBattlerFlags & (1u << gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } else if (moveTarget == MOVE_TARGET_ALLY) @@ -432,7 +432,7 @@ void HandleAction_UseMove(void) && moveTarget != MOVE_TARGET_OPPONENTS_FIELD && (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } @@ -4235,7 +4235,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability u32 atkPriority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); u32 battlerAbility = battlerDef; - + switch (abilityDef) { case ABILITY_SOUNDPROOF: @@ -4292,10 +4292,10 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability break; } } - + if (battleScriptBlocksMove == NULL) return FALSE; - + if (option == ABILITY_RUN_SCRIPT) { gBattleScripting.battler = gBattlerAbility = battlerAbility; @@ -4377,10 +4377,10 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 effect = MOVE_ABSORBED_BY_BOOST_FLASH_FIRE; break; } - + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option == ABILITY_CHECK_TRIGGER) return effect; - + switch (effect) { default: @@ -4828,7 +4828,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -4839,7 +4839,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); @@ -5595,7 +5595,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 return effect; case ABILITYEFFECT_MOVES_BLOCK: effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_RUN_SCRIPT); - + // prankster check if (effect == 0 && GetChosenMovePriority(gBattlerAttacker) > 0 @@ -8568,12 +8568,12 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_DEPENDS: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); if (!IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_OPPONENTS_FIELD: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_RANDOM: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); @@ -8582,7 +8582,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) targetBattler = SetRandomTarget(gBattlerAttacker); else - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: From 72de12609c02feaa174c91aa18aefcdd22b0a0db Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:18:00 +0100 Subject: [PATCH 101/125] Fixes BATTLER_TURN_DAMAGED battler id (#6236) --- include/battle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 56aad13594..0ca26cc8e6 100644 --- a/include/battle.h +++ b/include/battle.h @@ -852,7 +852,7 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << gBattlerTarget))) -#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << battler))) +#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << battlerId))) #define IS_BATTLER_OF_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, FALSE) == type || GetBattlerType(battlerId, 1, FALSE) == type || (GetBattlerType(battlerId, 2, FALSE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == type))) #define IS_BATTLER_OF_BASE_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, TRUE) == type || GetBattlerType(battlerId, 1, TRUE) == type || (GetBattlerType(battlerId, 2, TRUE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, TRUE) == type))) From 075cd4e924b1cf9e2022ce8d14c50169a4ceccdd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:27:00 +0100 Subject: [PATCH 102/125] Revert unintentional change (#6239) --- src/battle_script_commands.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a47146c6fe..74237ab3d1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16271,8 +16271,6 @@ static void Cmd_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: - FREE_AND_SET_NULL(gBattleResources->aiData); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gBattleCommunication[0]++; break; From 860c2f6cbcc566cbd9890cb775e28bfba24f5ff5 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 11 Feb 2025 20:27:33 -0300 Subject: [PATCH 103/125] Remove whitespace from trainers data file (#6234) --- src/data/trainers.h | 1710 +++++++++++++++++++++---------------------- 1 file changed, 855 insertions(+), 855 deletions(-) diff --git a/src/data/trainers.h b/src/data/trainers.h index ebc85e9cab..222c5e2269 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -15,7 +15,7 @@ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, #line 79 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 81 TRAINER_ENCOUNTER_MUSIC_MALE, #line 82 @@ -34,7 +34,7 @@ .trainerClass = TRAINER_CLASS_HIKER, #line 87 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 89 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 90 @@ -66,7 +66,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 100 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 102 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 103 @@ -98,7 +98,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 113 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 115 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 116 @@ -141,7 +141,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 130 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 132 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 133 @@ -173,7 +173,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 143 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 145 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 146 @@ -205,7 +205,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 156 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 158 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 159 @@ -237,7 +237,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 169 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 171 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 172 @@ -269,7 +269,7 @@ .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 182 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 184 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 185 @@ -301,7 +301,7 @@ .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 195 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 196 F_TRAINER_FEMALE | #line 197 @@ -390,7 +390,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 228 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 230 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 231 @@ -422,7 +422,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 241 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 243 TRAINER_ENCOUNTER_MUSIC_COOL, #line 244 @@ -467,7 +467,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 259 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 261 TRAINER_ENCOUNTER_MUSIC_COOL, #line 262 @@ -510,7 +510,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 276 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 278 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 279 @@ -553,7 +553,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 293 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 294 F_TRAINER_FEMALE | #line 295 @@ -587,7 +587,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 306 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 308 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 309 @@ -619,7 +619,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 319 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 321 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 322 @@ -651,7 +651,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 332 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 334 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 335 @@ -694,7 +694,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 349 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 351 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 352 @@ -737,7 +737,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 366 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 368 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 369 @@ -791,7 +791,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 387 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 389 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 390 @@ -823,7 +823,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 400 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 402 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 403 @@ -866,7 +866,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 417 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 419 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 420 @@ -898,7 +898,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 430 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 432 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 433 @@ -930,7 +930,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 443 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 445 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 446 @@ -962,7 +962,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 456 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 458 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 459 @@ -1005,7 +1005,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 473 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 474 F_TRAINER_FEMALE | #line 475 @@ -1039,7 +1039,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 486 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 487 F_TRAINER_FEMALE | #line 488 @@ -1073,7 +1073,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 499 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 500 F_TRAINER_FEMALE | #line 501 @@ -1107,7 +1107,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 512 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 514 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 515 @@ -1150,7 +1150,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AQUA_ADMIN, #line 529 .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 531 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 532 @@ -1195,7 +1195,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 547 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 549 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 550 @@ -1227,7 +1227,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AQUA_ADMIN, #line 560 .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 561 F_TRAINER_FEMALE | #line 562 @@ -1272,7 +1272,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AQUA_ADMIN, #line 577 .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 578 F_TRAINER_FEMALE | #line 579 @@ -1317,7 +1317,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AQUA_LEADER, #line 594 .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, - .encounterMusic_gender = + .encounterMusic_gender = #line 596 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 597 @@ -1373,7 +1373,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 616 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 617 F_TRAINER_FEMALE | #line 618 @@ -1407,7 +1407,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 629 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 630 F_TRAINER_FEMALE | #line 631 @@ -1452,7 +1452,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 646 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 647 F_TRAINER_FEMALE | #line 648 @@ -1508,7 +1508,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 667 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 669 TRAINER_ENCOUNTER_MUSIC_COOL, #line 670 @@ -1562,7 +1562,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 688 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 689 F_TRAINER_FEMALE | #line 690 @@ -1607,7 +1607,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 705 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 706 F_TRAINER_FEMALE | #line 707 @@ -1652,7 +1652,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 722 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 723 F_TRAINER_FEMALE | #line 724 @@ -1708,7 +1708,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 743 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 744 F_TRAINER_FEMALE | #line 745 @@ -1764,7 +1764,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 764 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 765 F_TRAINER_FEMALE | #line 766 @@ -1820,7 +1820,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 785 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 787 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 788 @@ -1859,7 +1859,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 802 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 804 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 805 @@ -1934,7 +1934,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 835 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 837 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 838 @@ -1991,7 +1991,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 860 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 862 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 863 @@ -2030,7 +2030,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 877 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 879 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 880 @@ -2069,7 +2069,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 894 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 896 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 897 @@ -2108,7 +2108,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 911 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 913 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 914 @@ -2147,7 +2147,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 928 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 930 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 931 @@ -2190,7 +2190,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 945 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 947 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 948 @@ -2233,7 +2233,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 962 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 964 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 965 @@ -2276,7 +2276,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 979 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 981 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 982 @@ -2319,7 +2319,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 996 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 998 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 999 @@ -2362,7 +2362,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_INTERVIEWER, #line 1013 .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = + .encounterMusic_gender = #line 1015 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 1016 @@ -2419,7 +2419,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1038 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1039 F_TRAINER_FEMALE | #line 1040 @@ -2464,7 +2464,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1055 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1056 F_TRAINER_FEMALE | #line 1057 @@ -2498,7 +2498,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1068 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1069 F_TRAINER_FEMALE | #line 1070 @@ -2532,7 +2532,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1081 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1082 F_TRAINER_FEMALE | #line 1083 @@ -2577,7 +2577,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1098 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1099 F_TRAINER_FEMALE | #line 1100 @@ -2622,7 +2622,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1115 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1116 F_TRAINER_FEMALE | #line 1117 @@ -2667,7 +2667,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 1132 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1133 F_TRAINER_FEMALE | #line 1134 @@ -2712,7 +2712,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1149 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1151 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1152 @@ -2751,7 +2751,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1166 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1168 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1169 @@ -2794,7 +2794,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1183 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1185 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1186 @@ -2826,7 +2826,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1196 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1198 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1199 @@ -2865,7 +2865,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1213 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1215 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1216 @@ -2904,7 +2904,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1230 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1232 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1233 @@ -2943,7 +2943,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 1247 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1249 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1250 @@ -2982,7 +2982,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1264 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1266 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1267 @@ -3022,7 +3022,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1281 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1283 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1284 @@ -3062,7 +3062,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1298 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1300 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1301 @@ -3104,7 +3104,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1315 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1317 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1318 @@ -3143,7 +3143,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1331 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1333 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1334 @@ -3256,7 +3256,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1381 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1383 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1384 @@ -3312,7 +3312,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1403 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1405 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1406 @@ -3357,7 +3357,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1421 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1423 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1424 @@ -3413,7 +3413,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1443 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1445 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1446 @@ -3458,7 +3458,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1461 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1463 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1464 @@ -3503,7 +3503,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1479 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1481 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1482 @@ -3559,7 +3559,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1501 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1503 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1504 @@ -3626,7 +3626,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1527 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1529 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1530 @@ -3682,7 +3682,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1549 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1551 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1552 @@ -3738,7 +3738,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1571 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1573 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1574 @@ -3794,7 +3794,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1593 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1595 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1596 @@ -3850,7 +3850,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1615 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1617 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1618 @@ -3906,7 +3906,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1637 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 1639 TRAINER_ENCOUNTER_MUSIC_COOL, #line 1640 @@ -3951,7 +3951,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1655 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1656 F_TRAINER_FEMALE | #line 1657 @@ -3992,7 +3992,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1671 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1672 F_TRAINER_FEMALE | #line 1673 @@ -4034,7 +4034,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1688 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1689 F_TRAINER_FEMALE | #line 1690 @@ -4075,7 +4075,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1704 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1705 F_TRAINER_FEMALE | #line 1706 @@ -4154,7 +4154,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1738 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1739 F_TRAINER_FEMALE | #line 1740 @@ -4201,7 +4201,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1756 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1757 F_TRAINER_FEMALE | #line 1758 @@ -4259,7 +4259,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1778 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1779 F_TRAINER_FEMALE | #line 1780 @@ -4295,7 +4295,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1792 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1793 F_TRAINER_FEMALE | #line 1794 @@ -4331,7 +4331,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1806 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1807 F_TRAINER_FEMALE | #line 1808 @@ -4367,7 +4367,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1820 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1821 F_TRAINER_FEMALE | #line 1822 @@ -4425,7 +4425,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1842 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1843 F_TRAINER_FEMALE | #line 1844 @@ -4472,7 +4472,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1860 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1861 F_TRAINER_FEMALE | #line 1862 @@ -4530,7 +4530,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1882 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1883 F_TRAINER_FEMALE | #line 1884 @@ -4588,7 +4588,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1904 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1905 F_TRAINER_FEMALE | #line 1906 @@ -4646,7 +4646,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1926 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1927 F_TRAINER_FEMALE | #line 1928 @@ -4704,7 +4704,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1948 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 1949 F_TRAINER_FEMALE | #line 1950 @@ -4762,7 +4762,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 1970 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 1971 F_TRAINER_FEMALE | #line 1972 @@ -4807,7 +4807,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 1987 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 1988 F_TRAINER_FEMALE | #line 1989 @@ -4852,7 +4852,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2004 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2005 F_TRAINER_FEMALE | #line 2006 @@ -4897,7 +4897,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2021 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2022 F_TRAINER_FEMALE | #line 2023 @@ -4931,7 +4931,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2034 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2035 F_TRAINER_FEMALE | #line 2036 @@ -4965,7 +4965,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2047 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2048 F_TRAINER_FEMALE | #line 2049 @@ -5010,7 +5010,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2064 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2065 F_TRAINER_FEMALE | #line 2066 @@ -5055,7 +5055,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2081 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2082 F_TRAINER_FEMALE | #line 2083 @@ -5100,7 +5100,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 2098 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2099 F_TRAINER_FEMALE | #line 2100 @@ -5156,7 +5156,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2119 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2120 F_TRAINER_FEMALE | #line 2121 @@ -5194,7 +5194,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2133 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2134 F_TRAINER_FEMALE | #line 2135 @@ -5259,7 +5259,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 2159 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2161 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 2162 @@ -5313,7 +5313,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2180 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2181 F_TRAINER_FEMALE | #line 2182 @@ -5356,7 +5356,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2196 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2197 F_TRAINER_FEMALE | #line 2198 @@ -5394,7 +5394,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2210 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2211 F_TRAINER_FEMALE | #line 2212 @@ -5432,7 +5432,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2224 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2225 F_TRAINER_FEMALE | #line 2226 @@ -5470,7 +5470,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2238 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2239 F_TRAINER_FEMALE | #line 2240 @@ -5508,7 +5508,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2252 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2253 F_TRAINER_FEMALE | #line 2254 @@ -5546,7 +5546,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 2266 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2267 F_TRAINER_FEMALE | #line 2268 @@ -5591,7 +5591,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2284 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2285 F_TRAINER_FEMALE | #line 2286 @@ -5625,7 +5625,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2297 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2298 F_TRAINER_FEMALE | #line 2299 @@ -5659,7 +5659,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2310 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2311 F_TRAINER_FEMALE | #line 2312 @@ -5693,7 +5693,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2323 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2324 F_TRAINER_FEMALE | #line 2325 @@ -5752,7 +5752,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2348 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2349 F_TRAINER_FEMALE | #line 2350 @@ -5786,7 +5786,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2361 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2362 F_TRAINER_FEMALE | #line 2363 @@ -5820,7 +5820,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2374 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2375 F_TRAINER_FEMALE | #line 2376 @@ -5896,7 +5896,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2406 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2407 F_TRAINER_FEMALE | #line 2408 @@ -5941,7 +5941,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2423 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2424 F_TRAINER_FEMALE | #line 2425 @@ -6000,7 +6000,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2448 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2449 F_TRAINER_FEMALE | #line 2450 @@ -6059,7 +6059,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2473 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2474 F_TRAINER_FEMALE | #line 2475 @@ -6118,7 +6118,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2498 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2499 F_TRAINER_FEMALE | #line 2500 @@ -6177,7 +6177,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2523 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2525 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2526 @@ -6213,7 +6213,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 2537 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 2538 F_TRAINER_FEMALE | #line 2539 @@ -6258,7 +6258,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2554 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2556 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2557 @@ -6294,7 +6294,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2568 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2570 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2571 @@ -6330,7 +6330,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2582 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2584 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2585 @@ -6366,7 +6366,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2596 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2598 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2599 @@ -6402,7 +6402,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 2610 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2612 TRAINER_ENCOUNTER_MUSIC_RICH, #line 2613 @@ -6445,7 +6445,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2628 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2630 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2631 @@ -6477,7 +6477,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 2641 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 2642 F_TRAINER_FEMALE | #line 2643 @@ -6522,7 +6522,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2658 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2660 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2661 @@ -6554,7 +6554,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 2671 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 2672 F_TRAINER_FEMALE | #line 2673 @@ -6588,7 +6588,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2684 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2686 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2687 @@ -6620,7 +6620,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2697 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2699 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2700 @@ -6663,7 +6663,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2714 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2716 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2717 @@ -6706,7 +6706,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 2731 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 2733 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2734 @@ -6749,7 +6749,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2748 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2750 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2751 @@ -6781,7 +6781,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2761 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2763 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2764 @@ -6813,7 +6813,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2774 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2776 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2777 @@ -6856,7 +6856,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2791 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2793 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2794 @@ -6910,7 +6910,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2812 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2814 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2815 @@ -6942,7 +6942,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2825 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2827 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2828 @@ -6974,7 +6974,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2838 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2840 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2841 @@ -7006,7 +7006,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2851 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2853 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2854 @@ -7049,7 +7049,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2868 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2870 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2871 @@ -7092,7 +7092,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2885 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2887 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2888 @@ -7124,7 +7124,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2898 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2900 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2901 @@ -7156,7 +7156,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2911 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2913 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2914 @@ -7188,7 +7188,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2924 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2926 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2927 @@ -7220,7 +7220,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2937 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2939 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2940 @@ -7274,7 +7274,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2958 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2960 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2961 @@ -7306,7 +7306,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2971 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2973 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2974 @@ -7338,7 +7338,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2984 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 2986 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2987 @@ -7381,7 +7381,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3001 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3003 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3004 @@ -7424,7 +7424,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3018 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3020 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3021 @@ -7456,7 +7456,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3031 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3033 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3034 @@ -7488,7 +7488,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3044 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3046 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3047 @@ -7520,7 +7520,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3057 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3059 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3060 @@ -7552,7 +7552,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3070 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3072 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3073 @@ -7606,7 +7606,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3091 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3093 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3094 @@ -7649,7 +7649,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3108 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3110 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3111 @@ -7681,7 +7681,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3121 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3123 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3124 @@ -7713,7 +7713,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3134 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3136 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3137 @@ -7756,7 +7756,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 3151 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3153 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3154 @@ -7799,7 +7799,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3168 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3170 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3171 @@ -7831,7 +7831,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3181 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3183 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3184 @@ -7874,7 +7874,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3198 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3200 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3201 @@ -7906,7 +7906,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3211 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3213 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3214 @@ -7949,7 +7949,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3228 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3230 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3231 @@ -7981,7 +7981,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3241 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3243 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3244 @@ -8013,7 +8013,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3254 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3256 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3257 @@ -8056,7 +8056,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3271 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3273 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3274 @@ -8110,7 +8110,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3292 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3294 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3295 @@ -8177,7 +8177,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3317 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3319 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3320 @@ -8220,7 +8220,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3334 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3336 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3337 @@ -8252,7 +8252,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 3347 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 3349 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3350 @@ -8284,7 +8284,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3360 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3362 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3363 @@ -8340,7 +8340,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 3384 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 3385 F_TRAINER_FEMALE | #line 3386 @@ -8385,7 +8385,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 3401 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 3403 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 3404 @@ -8417,7 +8417,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3414 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3416 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3417 @@ -8460,7 +8460,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3431 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3433 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3434 @@ -8503,7 +8503,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3448 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3450 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3451 @@ -8546,7 +8546,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3465 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3467 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3468 @@ -8600,7 +8600,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3486 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3488 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3489 @@ -8654,7 +8654,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3507 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3509 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3510 @@ -8708,7 +8708,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 3528 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 3530 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3531 @@ -8762,7 +8762,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3549 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3551 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3552 @@ -8794,7 +8794,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3562 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3564 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3565 @@ -8837,7 +8837,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3579 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3581 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3582 @@ -8869,7 +8869,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3592 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3594 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3595 @@ -8901,7 +8901,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3605 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3607 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3608 @@ -8933,7 +8933,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3618 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3620 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3621 @@ -8976,7 +8976,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3635 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3637 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3638 @@ -9019,7 +9019,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3652 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3654 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3655 @@ -9062,7 +9062,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3669 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3671 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3672 @@ -9105,7 +9105,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 3686 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3688 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3689 @@ -9148,7 +9148,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3703 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3705 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3706 @@ -9187,7 +9187,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3720 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3722 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3723 @@ -9262,7 +9262,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3753 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3755 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3756 @@ -9294,7 +9294,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3766 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3768 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3769 @@ -9337,7 +9337,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3783 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3785 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3786 @@ -9369,7 +9369,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3796 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3798 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3799 @@ -9412,7 +9412,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 3813 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3814 F_TRAINER_FEMALE | #line 3815 @@ -9446,7 +9446,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3826 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3828 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3829 @@ -9478,7 +9478,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3839 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3841 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3842 @@ -9521,7 +9521,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3856 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3858 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3859 @@ -9564,7 +9564,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3873 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3875 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3876 @@ -9618,7 +9618,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 3894 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 3896 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3897 @@ -9672,7 +9672,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 3915 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 3917 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3918 @@ -9704,7 +9704,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 3928 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 3930 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3931 @@ -9758,7 +9758,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 3949 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 3951 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3952 @@ -9812,7 +9812,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 3970 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 3972 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3973 @@ -9866,7 +9866,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 3991 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 3993 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3994 @@ -9909,7 +9909,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 4008 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 4010 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4011 @@ -9963,7 +9963,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 4029 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 4031 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4032 @@ -10017,7 +10017,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 4050 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 4052 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4053 @@ -10082,7 +10082,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 4075 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 4077 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4078 @@ -10160,7 +10160,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4104 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4106 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4107 @@ -10196,7 +10196,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4118 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4120 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4121 @@ -10228,7 +10228,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4131 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4133 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4134 @@ -10260,7 +10260,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4144 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4146 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4147 @@ -10292,7 +10292,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4157 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4159 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4160 @@ -10346,7 +10346,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4178 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4180 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4181 @@ -10389,7 +10389,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4195 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4197 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4198 @@ -10421,7 +10421,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4208 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4210 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4211 @@ -10464,7 +10464,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4225 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4227 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4228 @@ -10507,7 +10507,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4242 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4244 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4245 @@ -10550,7 +10550,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4259 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 4261 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4262 @@ -10593,7 +10593,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4276 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4277 F_TRAINER_FEMALE | #line 4278 @@ -10631,7 +10631,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4290 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4291 F_TRAINER_FEMALE | #line 4292 @@ -10665,7 +10665,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4303 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4304 F_TRAINER_FEMALE | #line 4305 @@ -10699,7 +10699,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4316 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4317 F_TRAINER_FEMALE | #line 4318 @@ -10733,7 +10733,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4329 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4330 F_TRAINER_FEMALE | #line 4331 @@ -10789,7 +10789,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4350 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4351 F_TRAINER_FEMALE | #line 4352 @@ -10834,7 +10834,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4367 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4368 F_TRAINER_FEMALE | #line 4369 @@ -10879,7 +10879,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4384 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4385 F_TRAINER_FEMALE | #line 4386 @@ -10924,7 +10924,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4401 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4402 F_TRAINER_FEMALE | #line 4403 @@ -10969,7 +10969,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4418 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4419 F_TRAINER_FEMALE | #line 4420 @@ -11014,7 +11014,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4435 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 4436 F_TRAINER_FEMALE | #line 4437 @@ -11059,7 +11059,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4452 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4454 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4455 @@ -11091,7 +11091,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4465 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4467 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4468 @@ -11134,7 +11134,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4482 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4484 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4485 @@ -11166,7 +11166,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4495 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4497 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4498 @@ -11198,7 +11198,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4508 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4510 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4511 @@ -11255,7 +11255,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4533 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4535 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4536 @@ -11311,7 +11311,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 4557 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4559 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4560 @@ -11386,7 +11386,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_ELITE_FOUR, #line 4590 .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, - .encounterMusic_gender = + .encounterMusic_gender = #line 4592 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, #line 4593 @@ -11504,7 +11504,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_ELITE_FOUR, #line 4641 .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, - .encounterMusic_gender = + .encounterMusic_gender = #line 4642 F_TRAINER_FEMALE | #line 4643 @@ -11624,7 +11624,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_ELITE_FOUR, #line 4692 .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, - .encounterMusic_gender = + .encounterMusic_gender = #line 4693 F_TRAINER_FEMALE | #line 4694 @@ -11744,7 +11744,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_ELITE_FOUR, #line 4743 .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, - .encounterMusic_gender = + .encounterMusic_gender = #line 4745 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, #line 4746 @@ -11862,7 +11862,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4794 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = + .encounterMusic_gender = #line 4795 F_TRAINER_FEMALE | #line 4796 @@ -11943,7 +11943,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4828 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 4830 TRAINER_ENCOUNTER_MUSIC_MALE, #line 4831 @@ -12022,7 +12022,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4862 .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = + .encounterMusic_gender = #line 4864 TRAINER_ENCOUNTER_MUSIC_MALE, #line 4865 @@ -12119,7 +12119,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4904 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = + .encounterMusic_gender = #line 4905 F_TRAINER_FEMALE | #line 4906 @@ -12218,7 +12218,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4946 .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 4948 TRAINER_ENCOUNTER_MUSIC_MALE, #line 4949 @@ -12315,7 +12315,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 4988 .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = + .encounterMusic_gender = #line 4989 F_TRAINER_FEMALE | #line 4990 @@ -12432,7 +12432,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 5038 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = + .encounterMusic_gender = #line 5040 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 5041 @@ -12531,7 +12531,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 5080 .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 5082 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5083 @@ -12646,7 +12646,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5130 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5132 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5133 @@ -12678,7 +12678,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5143 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5145 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5146 @@ -12710,7 +12710,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5156 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5158 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5159 @@ -12764,7 +12764,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5177 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5179 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5180 @@ -12807,7 +12807,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5194 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5196 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5197 @@ -12850,7 +12850,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5211 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5213 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5214 @@ -12893,7 +12893,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5228 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5230 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5231 @@ -12947,7 +12947,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5249 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5250 F_TRAINER_FEMALE | #line 5251 @@ -12981,7 +12981,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5262 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5263 F_TRAINER_FEMALE | #line 5264 @@ -13026,7 +13026,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5279 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5280 F_TRAINER_FEMALE | #line 5281 @@ -13071,7 +13071,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5296 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5297 F_TRAINER_FEMALE | #line 5298 @@ -13116,7 +13116,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5313 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5314 F_TRAINER_FEMALE | #line 5315 @@ -13161,7 +13161,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SCHOOL_KID, #line 5330 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5331 F_TRAINER_FEMALE | #line 5332 @@ -13206,7 +13206,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5347 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5349 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5350 @@ -13263,7 +13263,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5372 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5374 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5375 @@ -13319,7 +13319,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5396 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5398 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5399 @@ -13375,7 +13375,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5420 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5422 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5423 @@ -13431,7 +13431,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5444 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5446 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5447 @@ -13487,7 +13487,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5468 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 5470 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5471 @@ -13543,7 +13543,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_WINSTRATE, #line 5492 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5494 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5495 @@ -13590,7 +13590,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5509 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5511 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5512 @@ -13624,7 +13624,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5522 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5524 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5525 @@ -13765,7 +13765,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5579 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5581 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5582 @@ -13799,7 +13799,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5592 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5594 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5595 @@ -13833,7 +13833,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5605 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5607 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5608 @@ -13867,7 +13867,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5618 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5620 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5621 @@ -13901,7 +13901,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_WINSTRATE, #line 5631 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5632 F_TRAINER_FEMALE | #line 5633 @@ -13937,7 +13937,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5644 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5645 F_TRAINER_FEMALE | #line 5646 @@ -13973,7 +13973,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5657 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5658 F_TRAINER_FEMALE | #line 5659 @@ -14035,7 +14035,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5678 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5679 F_TRAINER_FEMALE | #line 5680 @@ -14084,7 +14084,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5695 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5696 F_TRAINER_FEMALE | #line 5697 @@ -14133,7 +14133,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5712 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5713 F_TRAINER_FEMALE | #line 5714 @@ -14182,7 +14182,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5729 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5730 F_TRAINER_FEMALE | #line 5731 @@ -14231,7 +14231,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 5746 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5747 F_TRAINER_FEMALE | #line 5748 @@ -14280,7 +14280,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5763 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5765 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5766 @@ -14312,7 +14312,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5776 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5778 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5779 @@ -14351,7 +14351,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5793 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5795 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5796 @@ -14390,7 +14390,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5810 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5812 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5813 @@ -14429,7 +14429,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5827 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 5829 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5830 @@ -14468,7 +14468,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_WINSTRATE, #line 5844 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5845 F_TRAINER_FEMALE | #line 5846 @@ -14509,7 +14509,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5861 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5862 F_TRAINER_FEMALE | #line 5863 @@ -14554,7 +14554,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5878 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5879 F_TRAINER_FEMALE | #line 5880 @@ -14599,7 +14599,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5895 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5896 F_TRAINER_FEMALE | #line 5897 @@ -14644,7 +14644,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5912 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5913 F_TRAINER_FEMALE | #line 5914 @@ -14689,7 +14689,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 5929 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 5930 F_TRAINER_FEMALE | #line 5931 @@ -14734,7 +14734,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 5946 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 5948 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5949 @@ -14766,7 +14766,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 5959 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 5961 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5962 @@ -14809,7 +14809,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 5976 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 5978 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5979 @@ -14845,7 +14845,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 5990 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 5992 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5993 @@ -14888,7 +14888,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6007 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6009 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6010 @@ -14920,7 +14920,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6020 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6022 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6023 @@ -14977,7 +14977,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 6045 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6047 TRAINER_ENCOUNTER_MUSIC_COOL, #line 6048 @@ -15036,7 +15036,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 6071 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6072 F_TRAINER_FEMALE | #line 6073 @@ -15097,7 +15097,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6097 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6099 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6100 @@ -15129,7 +15129,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6110 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6112 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6113 @@ -15161,7 +15161,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6123 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6125 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6126 @@ -15193,7 +15193,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6136 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6138 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6139 @@ -15236,7 +15236,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6153 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6155 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6156 @@ -15290,7 +15290,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6174 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6176 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6177 @@ -15344,7 +15344,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6195 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6197 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6198 @@ -15387,7 +15387,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6212 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6214 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6215 @@ -15430,7 +15430,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6229 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6231 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6232 @@ -15473,7 +15473,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CHAMPION, #line 6246 .trainerPic = TRAINER_PIC_CHAMPION_WALLACE, - .encounterMusic_gender = + .encounterMusic_gender = #line 6248 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6249 @@ -15609,7 +15609,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6305 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6307 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6308 @@ -15663,7 +15663,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6326 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6328 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6329 @@ -15717,7 +15717,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6347 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6349 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6350 @@ -15771,7 +15771,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6368 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6370 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6371 @@ -15825,7 +15825,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6389 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6391 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6392 @@ -15857,7 +15857,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6402 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6404 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6405 @@ -15922,7 +15922,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6427 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6429 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6430 @@ -15954,7 +15954,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6440 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6442 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6443 @@ -15997,7 +15997,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6457 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6459 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6460 @@ -16029,7 +16029,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6470 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6472 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6473 @@ -16072,7 +16072,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6487 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6489 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6490 @@ -16126,7 +16126,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6508 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6510 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6511 @@ -16191,7 +16191,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6533 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6535 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6536 @@ -16256,7 +16256,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6558 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6560 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6561 @@ -16321,7 +16321,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 6583 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 6585 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6586 @@ -16408,7 +16408,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6616 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6618 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6619 @@ -16462,7 +16462,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6637 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6639 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6640 @@ -16505,7 +16505,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6654 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6656 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6657 @@ -16537,7 +16537,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6667 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6669 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6670 @@ -16569,7 +16569,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6680 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6682 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6683 @@ -16601,7 +16601,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6693 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6695 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6696 @@ -16633,7 +16633,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6706 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6708 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6709 @@ -16665,7 +16665,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6719 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6720 F_TRAINER_FEMALE | #line 6721 @@ -16699,7 +16699,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6732 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6733 F_TRAINER_FEMALE | #line 6734 @@ -16755,7 +16755,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6753 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6754 F_TRAINER_FEMALE | #line 6755 @@ -16789,7 +16789,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6766 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6767 F_TRAINER_FEMALE | #line 6768 @@ -16823,7 +16823,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6779 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6780 F_TRAINER_FEMALE | #line 6781 @@ -16857,7 +16857,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6792 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6793 F_TRAINER_FEMALE | #line 6794 @@ -16891,7 +16891,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6805 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6807 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6808 @@ -16923,7 +16923,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6818 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6820 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6821 @@ -16955,7 +16955,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6831 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6833 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6834 @@ -16987,7 +16987,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6844 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6846 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6847 @@ -17019,7 +17019,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6857 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6859 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6860 @@ -17051,7 +17051,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6870 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6871 F_TRAINER_FEMALE | #line 6872 @@ -17085,7 +17085,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6883 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6884 F_TRAINER_FEMALE | #line 6885 @@ -17119,7 +17119,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6896 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6897 F_TRAINER_FEMALE | #line 6898 @@ -17153,7 +17153,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6909 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6910 F_TRAINER_FEMALE | #line 6911 @@ -17187,7 +17187,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6922 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 6923 F_TRAINER_FEMALE | #line 6924 @@ -17221,7 +17221,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6935 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6937 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6938 @@ -17264,7 +17264,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 6952 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 6954 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6955 @@ -17307,7 +17307,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6969 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6971 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6972 @@ -17339,7 +17339,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6982 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 6984 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6985 @@ -17382,7 +17382,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6999 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 7001 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7002 @@ -17425,7 +17425,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7016 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 7018 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7019 @@ -17457,7 +17457,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7029 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 7031 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7032 @@ -17489,7 +17489,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7042 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 7044 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7045 @@ -17521,7 +17521,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7055 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 7057 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7058 @@ -17553,7 +17553,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7068 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7069 F_TRAINER_FEMALE | #line 7070 @@ -17587,7 +17587,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7081 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7082 F_TRAINER_FEMALE | #line 7083 @@ -17632,7 +17632,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7098 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7099 F_TRAINER_FEMALE | #line 7100 @@ -17666,7 +17666,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7111 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7112 F_TRAINER_FEMALE | #line 7113 @@ -17700,7 +17700,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7124 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7125 F_TRAINER_FEMALE | #line 7126 @@ -17745,7 +17745,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7141 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7142 F_TRAINER_FEMALE | #line 7143 @@ -17779,7 +17779,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7154 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7155 F_TRAINER_FEMALE | #line 7156 @@ -17813,7 +17813,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7167 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7168 F_TRAINER_FEMALE | #line 7169 @@ -17847,7 +17847,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7180 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7181 F_TRAINER_FEMALE | #line 7182 @@ -17881,7 +17881,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7193 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7195 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7196 @@ -17924,7 +17924,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7210 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7212 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7213 @@ -17967,7 +17967,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7227 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7229 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7230 @@ -18010,7 +18010,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7244 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7246 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7247 @@ -18064,7 +18064,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7265 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7267 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7268 @@ -18120,7 +18120,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7286 .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7288 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7289 @@ -18159,7 +18159,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7303 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7305 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7306 @@ -18191,7 +18191,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7316 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7318 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7319 @@ -18234,7 +18234,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7333 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7335 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7336 @@ -18266,7 +18266,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7346 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7348 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7349 @@ -18320,7 +18320,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7367 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7369 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7370 @@ -18352,7 +18352,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7380 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7382 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7383 @@ -18395,7 +18395,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7397 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7399 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7400 @@ -18438,7 +18438,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7414 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7416 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7417 @@ -18481,7 +18481,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7431 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7433 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7434 @@ -18513,7 +18513,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7444 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7446 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7447 @@ -18567,7 +18567,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7465 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7467 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7468 @@ -18610,7 +18610,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7482 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7484 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7485 @@ -18653,7 +18653,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7499 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7501 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7502 @@ -18696,7 +18696,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7516 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7518 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7519 @@ -18739,7 +18739,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7533 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7535 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7536 @@ -18782,7 +18782,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7550 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7552 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7553 @@ -18825,7 +18825,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 7567 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 7569 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7570 @@ -18857,7 +18857,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7580 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7582 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7583 @@ -18889,7 +18889,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7593 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7595 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7596 @@ -18932,7 +18932,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 7610 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7611 F_TRAINER_FEMALE | #line 7612 @@ -18987,7 +18987,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 7631 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 7632 F_TRAINER_FEMALE | #line 7633 @@ -19019,7 +19019,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7643 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7645 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7646 @@ -19092,7 +19092,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7675 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7677 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7678 @@ -19133,7 +19133,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7691 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7693 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7694 @@ -19221,7 +19221,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7728 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7730 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7731 @@ -19309,7 +19309,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7765 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7767 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7768 @@ -19395,7 +19395,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 7800 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7802 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7803 @@ -19485,7 +19485,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7837 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7838 F_TRAINER_FEMALE | #line 7839 @@ -19519,7 +19519,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7850 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7851 F_TRAINER_FEMALE | #line 7852 @@ -19553,7 +19553,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7863 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7864 F_TRAINER_FEMALE | #line 7865 @@ -19598,7 +19598,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7880 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7881 F_TRAINER_FEMALE | #line 7882 @@ -19632,7 +19632,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7893 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7894 F_TRAINER_FEMALE | #line 7895 @@ -19666,7 +19666,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7906 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7907 F_TRAINER_FEMALE | #line 7908 @@ -19711,7 +19711,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7923 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7924 F_TRAINER_FEMALE | #line 7925 @@ -19756,7 +19756,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7940 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7941 F_TRAINER_FEMALE | #line 7942 @@ -19801,7 +19801,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 7957 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 7958 F_TRAINER_FEMALE | #line 7959 @@ -19846,7 +19846,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 7974 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7975 F_TRAINER_FEMALE | #line 7976 @@ -19887,7 +19887,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 7991 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 7992 F_TRAINER_FEMALE | #line 7993 @@ -19932,7 +19932,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 8008 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 8009 F_TRAINER_FEMALE | #line 8010 @@ -19973,7 +19973,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 8025 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 8026 F_TRAINER_FEMALE | #line 8027 @@ -20014,7 +20014,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 8042 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 8043 F_TRAINER_FEMALE | #line 8044 @@ -20055,7 +20055,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 8059 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 8060 F_TRAINER_FEMALE | #line 8061 @@ -20114,7 +20114,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 8084 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 8085 F_TRAINER_FEMALE | #line 8086 @@ -20173,7 +20173,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8109 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8110 F_TRAINER_FEMALE | #line 8111 @@ -20218,7 +20218,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8126 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8127 F_TRAINER_FEMALE | #line 8128 @@ -20252,7 +20252,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8139 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8140 F_TRAINER_FEMALE | #line 8141 @@ -20286,7 +20286,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8152 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8153 F_TRAINER_FEMALE | #line 8154 @@ -20331,7 +20331,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8169 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8170 F_TRAINER_FEMALE | #line 8171 @@ -20365,7 +20365,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8182 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8183 F_TRAINER_FEMALE | #line 8184 @@ -20410,7 +20410,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8199 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8200 F_TRAINER_FEMALE | #line 8201 @@ -20444,7 +20444,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8212 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8213 F_TRAINER_FEMALE | #line 8214 @@ -20500,7 +20500,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8233 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8234 F_TRAINER_FEMALE | #line 8235 @@ -20534,7 +20534,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8246 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8247 F_TRAINER_FEMALE | #line 8248 @@ -20568,7 +20568,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8259 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8260 F_TRAINER_FEMALE | #line 8261 @@ -20602,7 +20602,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8272 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8273 F_TRAINER_FEMALE | #line 8274 @@ -20636,7 +20636,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8285 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8286 F_TRAINER_FEMALE | #line 8287 @@ -20681,7 +20681,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8302 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8303 F_TRAINER_FEMALE | #line 8304 @@ -20715,7 +20715,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8315 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8316 F_TRAINER_FEMALE | #line 8317 @@ -20760,7 +20760,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8332 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8333 F_TRAINER_FEMALE | #line 8334 @@ -20794,7 +20794,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8345 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8346 F_TRAINER_FEMALE | #line 8347 @@ -20828,7 +20828,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8358 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8359 F_TRAINER_FEMALE | #line 8360 @@ -20862,7 +20862,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8371 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8372 F_TRAINER_FEMALE | #line 8373 @@ -20907,7 +20907,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8388 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8389 F_TRAINER_FEMALE | #line 8390 @@ -20941,7 +20941,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8401 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8402 F_TRAINER_FEMALE | #line 8403 @@ -20986,7 +20986,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8418 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8419 F_TRAINER_FEMALE | #line 8420 @@ -21031,7 +21031,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8435 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8436 F_TRAINER_FEMALE | #line 8437 @@ -21076,7 +21076,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8452 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8453 F_TRAINER_FEMALE | #line 8454 @@ -21110,7 +21110,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8465 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8466 F_TRAINER_FEMALE | #line 8467 @@ -21144,7 +21144,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8478 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8479 F_TRAINER_FEMALE | #line 8480 @@ -21178,7 +21178,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8491 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8492 F_TRAINER_FEMALE | #line 8493 @@ -21223,7 +21223,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 8508 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 8509 F_TRAINER_FEMALE | #line 8510 @@ -21279,7 +21279,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8529 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8530 F_TRAINER_FEMALE | #line 8531 @@ -21338,7 +21338,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8554 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8555 F_TRAINER_FEMALE | #line 8556 @@ -21397,7 +21397,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8579 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8580 F_TRAINER_FEMALE | #line 8581 @@ -21442,7 +21442,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8596 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8597 F_TRAINER_FEMALE | #line 8598 @@ -21487,7 +21487,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8613 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8614 F_TRAINER_FEMALE | #line 8615 @@ -21532,7 +21532,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8630 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8631 F_TRAINER_FEMALE | #line 8632 @@ -21588,7 +21588,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 8651 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 8653 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 8654 @@ -21627,7 +21627,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8668 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8669 F_TRAINER_FEMALE | #line 8670 @@ -21672,7 +21672,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8685 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8686 F_TRAINER_FEMALE | #line 8687 @@ -21728,7 +21728,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8706 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8707 F_TRAINER_FEMALE | #line 8708 @@ -21784,7 +21784,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8727 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8728 F_TRAINER_FEMALE | #line 8729 @@ -21840,7 +21840,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 8748 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 8749 F_TRAINER_FEMALE | #line 8750 @@ -21896,7 +21896,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8769 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8771 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8772 @@ -21939,7 +21939,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8786 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8788 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8789 @@ -21982,7 +21982,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8803 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8805 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8806 @@ -22025,7 +22025,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8820 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8822 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8823 @@ -22068,7 +22068,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8837 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8839 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8840 @@ -22111,7 +22111,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8854 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8856 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8857 @@ -22164,7 +22164,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8875 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8877 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8878 @@ -22207,7 +22207,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8892 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8894 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8895 @@ -22264,7 +22264,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 8917 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 8919 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8920 @@ -22321,7 +22321,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 8942 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 8944 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8945 @@ -22364,7 +22364,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 8959 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 8961 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8962 @@ -22396,7 +22396,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 8972 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 8974 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8975 @@ -22439,7 +22439,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 8989 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 8991 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8992 @@ -22493,7 +22493,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9010 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9012 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9013 @@ -22536,7 +22536,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9027 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9029 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9030 @@ -22590,7 +22590,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9048 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9050 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9051 @@ -22633,7 +22633,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9065 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9067 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9068 @@ -22687,7 +22687,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9086 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9088 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9089 @@ -22741,7 +22741,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9107 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9109 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9110 @@ -22795,7 +22795,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9128 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9130 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9131 @@ -22849,7 +22849,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 9149 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 9151 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 9152 @@ -22881,7 +22881,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 9162 .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 9163 F_TRAINER_FEMALE | #line 9164 @@ -22944,7 +22944,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER_2, #line 9187 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 9188 F_TRAINER_FEMALE | #line 9189 @@ -22980,7 +22980,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 9201 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9203 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9204 @@ -23019,7 +23019,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 9218 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9219 F_TRAINER_FEMALE | #line 9220 @@ -23060,7 +23060,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 9235 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9237 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9238 @@ -23103,7 +23103,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9252 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9254 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9255 @@ -23146,7 +23146,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 9269 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 9270 F_TRAINER_FEMALE | #line 9271 @@ -23189,7 +23189,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 9287 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 9288 F_TRAINER_FEMALE | #line 9289 @@ -23234,7 +23234,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 9304 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9306 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9307 @@ -23266,7 +23266,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 9317 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9319 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9320 @@ -23309,7 +23309,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9334 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9336 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9337 @@ -23352,7 +23352,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9351 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9353 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9354 @@ -23395,7 +23395,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, #line 9368 .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9370 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 9371 @@ -23449,7 +23449,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9389 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9391 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9392 @@ -23492,7 +23492,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9406 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9408 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9409 @@ -23535,7 +23535,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9423 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9425 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9426 @@ -23578,7 +23578,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COLLECTOR, #line 9440 .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 9442 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9443 @@ -23621,7 +23621,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9457 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9459 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9460 @@ -23734,7 +23734,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9507 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9509 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9510 @@ -23766,7 +23766,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9520 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9522 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9523 @@ -23820,7 +23820,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9541 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9543 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9544 @@ -23874,7 +23874,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9562 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9564 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9565 @@ -23906,7 +23906,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9575 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9577 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9578 @@ -23960,7 +23960,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9596 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9598 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9599 @@ -24014,7 +24014,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9617 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9619 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9620 @@ -24046,7 +24046,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9630 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9632 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9633 @@ -24100,7 +24100,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9651 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 9653 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9654 @@ -24154,7 +24154,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9672 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9673 F_TRAINER_FEMALE | #line 9674 @@ -24188,7 +24188,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9685 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9686 F_TRAINER_FEMALE | #line 9687 @@ -24244,7 +24244,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9706 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9707 F_TRAINER_FEMALE | #line 9708 @@ -24300,7 +24300,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9727 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9728 F_TRAINER_FEMALE | #line 9729 @@ -24334,7 +24334,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9740 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9741 F_TRAINER_FEMALE | #line 9742 @@ -24390,7 +24390,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9761 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9762 F_TRAINER_FEMALE | #line 9763 @@ -24446,7 +24446,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9782 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9783 F_TRAINER_FEMALE | #line 9784 @@ -24480,7 +24480,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9795 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9796 F_TRAINER_FEMALE | #line 9797 @@ -24536,7 +24536,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 9816 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 9817 F_TRAINER_FEMALE | #line 9818 @@ -24592,7 +24592,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 9837 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9839 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9840 @@ -24679,7 +24679,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 9870 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 9872 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9873 @@ -24711,7 +24711,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 9883 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9885 TRAINER_ENCOUNTER_MUSIC_COOL, #line 9886 @@ -24768,7 +24768,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 9908 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9910 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9911 @@ -24855,7 +24855,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 9941 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9943 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9944 @@ -24942,7 +24942,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 9974 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 9976 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9977 @@ -25029,7 +25029,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10007 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10009 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10010 @@ -25116,7 +25116,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10040 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10041 F_TRAINER_FEMALE | #line 10042 @@ -25205,7 +25205,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 10073 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10074 F_TRAINER_FEMALE | #line 10075 @@ -25252,7 +25252,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 10091 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 10093 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 10094 @@ -25284,7 +25284,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10104 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10105 F_TRAINER_FEMALE | #line 10106 @@ -25373,7 +25373,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10137 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10138 F_TRAINER_FEMALE | #line 10139 @@ -25462,7 +25462,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10170 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10171 F_TRAINER_FEMALE | #line 10172 @@ -25551,7 +25551,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 10203 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10204 F_TRAINER_FEMALE | #line 10205 @@ -25640,7 +25640,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10236 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10238 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10239 @@ -25674,7 +25674,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10250 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10252 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10253 @@ -25730,7 +25730,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10272 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10274 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10275 @@ -25764,7 +25764,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10286 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10288 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10289 @@ -25798,7 +25798,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10300 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10302 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10303 @@ -25832,7 +25832,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10314 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10316 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10317 @@ -25866,7 +25866,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10328 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10330 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10331 @@ -25911,7 +25911,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10346 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10347 F_TRAINER_FEMALE | #line 10348 @@ -25958,7 +25958,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10364 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10365 F_TRAINER_FEMALE | #line 10366 @@ -26016,7 +26016,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10386 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10387 F_TRAINER_FEMALE | #line 10388 @@ -26063,7 +26063,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10404 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10405 F_TRAINER_FEMALE | #line 10406 @@ -26110,7 +26110,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10422 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10423 F_TRAINER_FEMALE | #line 10424 @@ -26157,7 +26157,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10440 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10441 F_TRAINER_FEMALE | #line 10442 @@ -26204,7 +26204,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10458 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10459 F_TRAINER_FEMALE | #line 10460 @@ -26251,7 +26251,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 10476 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10478 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10479 @@ -26283,7 +26283,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 10489 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10491 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10492 @@ -26326,7 +26326,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10506 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10507 F_TRAINER_FEMALE | #line 10508 @@ -26371,7 +26371,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 10523 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10524 F_TRAINER_FEMALE | #line 10525 @@ -26416,7 +26416,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10540 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10542 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10543 @@ -26459,7 +26459,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 10557 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 10559 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 10560 @@ -26502,7 +26502,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 10574 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 10576 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10577 @@ -26534,7 +26534,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 10587 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 10588 F_TRAINER_FEMALE | #line 10589 @@ -26568,7 +26568,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 10600 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 10602 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10603 @@ -26600,7 +26600,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 10613 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 10614 F_TRAINER_FEMALE | #line 10615 @@ -26634,7 +26634,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 10626 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10628 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10629 @@ -26666,7 +26666,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 10639 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10640 F_TRAINER_FEMALE | #line 10641 @@ -26724,7 +26724,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 10662 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10664 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10665 @@ -26756,7 +26756,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10675 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10677 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10678 @@ -26788,7 +26788,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 10688 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10690 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10691 @@ -26820,7 +26820,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 10701 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10702 F_TRAINER_FEMALE | #line 10703 @@ -26854,7 +26854,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 10714 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10716 TRAINER_ENCOUNTER_MUSIC_RICH, #line 10717 @@ -26886,7 +26886,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HEX_MANIAC, #line 10727 .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 10728 F_TRAINER_FEMALE | #line 10729 @@ -26920,7 +26920,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 10740 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10742 TRAINER_ENCOUNTER_MUSIC_RICH, #line 10743 @@ -26952,7 +26952,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 10753 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10755 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10756 @@ -26984,7 +26984,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10766 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10767 F_TRAINER_FEMALE | #line 10768 @@ -27029,7 +27029,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10783 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10785 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10786 @@ -27061,7 +27061,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10796 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10798 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10799 @@ -27093,7 +27093,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10809 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10811 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10812 @@ -27125,7 +27125,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10822 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10824 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10825 @@ -27157,7 +27157,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 10835 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10836 F_TRAINER_FEMALE | #line 10837 @@ -27191,7 +27191,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 10848 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10850 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10851 @@ -27234,7 +27234,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 10865 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10867 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10868 @@ -27277,7 +27277,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 10882 .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10884 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10885 @@ -27320,7 +27320,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 10899 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10900 F_TRAINER_FEMALE | #line 10901 @@ -27354,7 +27354,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 10912 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 10913 F_TRAINER_FEMALE | #line 10914 @@ -27399,7 +27399,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, #line 10929 .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10931 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10932 @@ -27464,7 +27464,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 10954 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 10956 TRAINER_ENCOUNTER_MUSIC_COOL, #line 10957 @@ -27509,7 +27509,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 10972 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 10974 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10975 @@ -27552,7 +27552,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 10989 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 10990 F_TRAINER_FEMALE | #line 10991 @@ -27597,7 +27597,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_LEADER, #line 11006 .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11008 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 11009 @@ -27653,7 +27653,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_LEADER, #line 11028 .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11030 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 11031 @@ -27709,7 +27709,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11050 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11051 F_TRAINER_FEMALE | #line 11052 @@ -27754,7 +27754,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11067 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11068 F_TRAINER_FEMALE | #line 11069 @@ -27799,7 +27799,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11084 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11085 F_TRAINER_FEMALE | #line 11086 @@ -27833,7 +27833,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_WINSTRATE, #line 11097 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11098 F_TRAINER_FEMALE | #line 11099 @@ -27889,7 +27889,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11118 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11119 F_TRAINER_FEMALE | #line 11120 @@ -27934,7 +27934,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11135 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11136 F_TRAINER_FEMALE | #line 11137 @@ -27979,7 +27979,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11152 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11153 F_TRAINER_FEMALE | #line 11154 @@ -28024,7 +28024,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11169 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11170 F_TRAINER_FEMALE | #line 11171 @@ -28080,7 +28080,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11190 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11191 F_TRAINER_FEMALE | #line 11192 @@ -28114,7 +28114,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11203 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11204 F_TRAINER_FEMALE | #line 11205 @@ -28170,7 +28170,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11224 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11225 F_TRAINER_FEMALE | #line 11226 @@ -28204,7 +28204,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LASS, #line 11237 .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = + .encounterMusic_gender = #line 11238 F_TRAINER_FEMALE | #line 11239 @@ -28249,7 +28249,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11254 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11256 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11257 @@ -28292,7 +28292,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11271 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11273 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11274 @@ -28357,7 +28357,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11296 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11298 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11299 @@ -28400,7 +28400,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11313 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11315 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11316 @@ -28443,7 +28443,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11330 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11332 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11333 @@ -28486,7 +28486,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11347 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11349 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11350 @@ -28518,7 +28518,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11360 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11362 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11363 @@ -28561,7 +28561,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11377 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11379 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11380 @@ -28593,7 +28593,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11390 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11392 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11393 @@ -28636,7 +28636,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11407 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11409 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11410 @@ -28690,7 +28690,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_CATCHER, #line 11428 .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11430 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11431 @@ -28755,7 +28755,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11453 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11455 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11456 @@ -28798,7 +28798,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11470 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11472 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11473 @@ -28852,7 +28852,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11491 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11493 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11494 @@ -28895,7 +28895,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11508 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11510 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11511 @@ -28938,7 +28938,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11525 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11527 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11528 @@ -28992,7 +28992,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11546 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11548 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11549 @@ -29024,7 +29024,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11559 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11561 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11562 @@ -29067,7 +29067,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11576 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11578 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11579 @@ -29104,7 +29104,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11591 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11593 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11594 @@ -29157,7 +29157,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11612 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11614 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11615 @@ -29211,7 +29211,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11633 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11635 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11636 @@ -29276,7 +29276,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11658 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11660 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11661 @@ -29341,7 +29341,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11683 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11685 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11686 @@ -29406,7 +29406,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 11708 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 11710 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11711 @@ -29471,7 +29471,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11733 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11735 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11736 @@ -29514,7 +29514,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11750 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11752 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11753 @@ -29557,7 +29557,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11767 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11769 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11770 @@ -29600,7 +29600,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11784 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11786 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11787 @@ -29643,7 +29643,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11801 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11803 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11804 @@ -29686,7 +29686,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11818 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11820 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11821 @@ -29729,7 +29729,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 11835 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 11837 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11838 @@ -29772,7 +29772,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 11852 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 11853 F_TRAINER_FEMALE | #line 11854 @@ -29806,7 +29806,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 11865 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 11867 TRAINER_ENCOUNTER_MUSIC_COOL, #line 11868 @@ -29847,7 +29847,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 11883 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 11884 F_TRAINER_FEMALE | #line 11885 @@ -29906,7 +29906,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 11908 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 11909 F_TRAINER_FEMALE | #line 11910 @@ -29947,7 +29947,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 11925 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 11927 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11928 @@ -30004,7 +30004,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 11950 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 11952 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11953 @@ -30061,7 +30061,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 11975 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 11977 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11978 @@ -30118,7 +30118,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 12000 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 12002 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12003 @@ -30161,7 +30161,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 12017 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 12018 F_TRAINER_FEMALE | #line 12019 @@ -30217,7 +30217,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12038 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12040 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12041 @@ -30249,7 +30249,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12051 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12053 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12054 @@ -30362,7 +30362,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12101 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12103 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12104 @@ -30475,7 +30475,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12151 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12153 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12154 @@ -30588,7 +30588,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12201 .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12203 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12204 @@ -30701,7 +30701,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12251 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12253 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12254 @@ -30766,7 +30766,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12276 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12278 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12279 @@ -30831,7 +30831,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12301 .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12303 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12304 @@ -30896,7 +30896,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12326 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12327 F_TRAINER_FEMALE | #line 12328 @@ -30963,7 +30963,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12351 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12352 F_TRAINER_FEMALE | #line 12353 @@ -31030,7 +31030,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 12376 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12377 F_TRAINER_FEMALE | #line 12378 @@ -31097,7 +31097,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12401 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12403 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12404 @@ -31151,7 +31151,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12422 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12424 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12425 @@ -31194,7 +31194,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12439 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12441 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12442 @@ -31248,7 +31248,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 12460 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 12461 F_TRAINER_FEMALE | #line 12462 @@ -31295,7 +31295,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 12478 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 12480 TRAINER_ENCOUNTER_MUSIC_COOL, #line 12481 @@ -31340,7 +31340,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 12496 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 12498 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12499 @@ -31372,7 +31372,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12509 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12511 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12512 @@ -31426,7 +31426,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 12530 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 12532 TRAINER_ENCOUNTER_MUSIC_COOL, #line 12533 @@ -31469,7 +31469,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 12547 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 12549 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12550 @@ -31512,7 +31512,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 12564 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 12565 F_TRAINER_FEMALE | #line 12566 @@ -31546,7 +31546,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TWINS, #line 12577 .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = + .encounterMusic_gender = #line 12579 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12580 @@ -31589,7 +31589,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 12594 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 12596 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12597 @@ -31646,7 +31646,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 12619 .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = + .encounterMusic_gender = #line 12621 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12622 @@ -31703,7 +31703,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, #line 12644 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12646 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12647 @@ -31760,7 +31760,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_OLD_COUPLE, #line 12669 .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12671 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12672 @@ -31817,7 +31817,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_OLD_COUPLE, #line 12694 .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12696 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12697 @@ -31874,7 +31874,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_OLD_COUPLE, #line 12719 .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12721 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12722 @@ -31931,7 +31931,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_OLD_COUPLE, #line 12744 .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12746 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12747 @@ -31988,7 +31988,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_OLD_COUPLE, #line 12769 .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = + .encounterMusic_gender = #line 12771 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12772 @@ -32045,7 +32045,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12794 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12796 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12797 @@ -32088,7 +32088,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12811 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12813 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12814 @@ -32131,7 +32131,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12828 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12830 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12831 @@ -32174,7 +32174,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12845 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12847 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12848 @@ -32217,7 +32217,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12862 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12864 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12865 @@ -32260,7 +32260,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12879 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12881 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12882 @@ -32303,7 +32303,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SIS_AND_BRO, #line 12896 .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = + .encounterMusic_gender = #line 12898 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12899 @@ -32346,7 +32346,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12913 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12915 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12916 @@ -32411,7 +32411,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RICH_BOY, #line 12938 .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12940 TRAINER_ENCOUNTER_MUSIC_RICH, #line 12941 @@ -32456,7 +32456,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LADY, #line 12955 .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 12956 F_TRAINER_FEMALE | #line 12957 @@ -32505,7 +32505,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 12973 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 12975 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12976 @@ -32537,7 +32537,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_F, #line 12986 .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 12987 F_TRAINER_FEMALE | #line 12988 @@ -32571,7 +32571,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TUBER_M, #line 12999 .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13001 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13002 @@ -32614,7 +32614,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEFAN, #line 13016 .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13018 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 13019 @@ -32661,7 +32661,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 13033 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 13035 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13036 @@ -32704,7 +32704,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 13050 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13051 F_TRAINER_FEMALE | #line 13052 @@ -32738,7 +32738,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 13063 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 13065 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13066 @@ -32770,7 +32770,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 13076 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 13078 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13079 @@ -32802,7 +32802,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 13089 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13091 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13092 @@ -32834,7 +32834,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 13102 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 13103 F_TRAINER_FEMALE | #line 13104 @@ -32868,7 +32868,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 13115 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13116 F_TRAINER_FEMALE | #line 13117 @@ -32902,7 +32902,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 13128 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13130 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13131 @@ -32934,7 +32934,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 13141 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13142 F_TRAINER_FEMALE | #line 13143 @@ -32979,7 +32979,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 13158 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13160 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13161 @@ -33022,7 +33022,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 13175 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13177 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13178 @@ -33065,7 +33065,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_POKEMANIAC, #line 13192 .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 13194 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 13195 @@ -33108,7 +33108,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 13209 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13210 F_TRAINER_FEMALE | #line 13211 @@ -33153,7 +33153,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FISHERMAN, #line 13226 .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 13228 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13229 @@ -33185,7 +33185,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 13239 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13240 F_TRAINER_FEMALE | #line 13241 @@ -33219,7 +33219,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 13252 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13254 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13255 @@ -33273,7 +33273,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13273 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13275 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13276 @@ -33305,7 +33305,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13286 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13288 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13289 @@ -33337,7 +33337,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13299 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13301 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13302 @@ -33369,7 +33369,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13312 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13314 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13315 @@ -33412,7 +33412,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13329 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13331 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13332 @@ -33455,7 +33455,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13346 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13348 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13349 @@ -33487,7 +33487,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13359 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13361 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13362 @@ -33519,7 +33519,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13372 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13374 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13375 @@ -33551,7 +33551,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13385 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13387 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13388 @@ -33583,7 +33583,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13398 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13400 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13401 @@ -33615,7 +33615,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13411 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13413 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13414 @@ -33647,7 +33647,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13424 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13426 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13427 @@ -33679,7 +33679,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13437 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13439 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13440 @@ -33711,7 +33711,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13450 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13451 F_TRAINER_FEMALE | #line 13452 @@ -33745,7 +33745,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13463 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13464 F_TRAINER_FEMALE | #line 13465 @@ -33779,7 +33779,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13476 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13477 F_TRAINER_FEMALE | #line 13478 @@ -33813,7 +33813,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, #line 13489 .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = + .encounterMusic_gender = #line 13491 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13492 @@ -33878,7 +33878,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 13514 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13515 F_TRAINER_FEMALE | #line 13516 @@ -33925,7 +33925,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_MAGMA_LEADER, #line 13532 .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = + .encounterMusic_gender = #line 13534 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13535 @@ -33979,7 +33979,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 13553 .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13555 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13556 @@ -34011,7 +34011,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SWIMMER_F, #line 13566 .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13567 F_TRAINER_FEMALE | #line 13568 @@ -34045,7 +34045,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 13579 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 13581 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13582 @@ -34088,7 +34088,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 13596 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13598 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13599 @@ -34131,7 +34131,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 13613 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13615 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13616 @@ -34163,7 +34163,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 13626 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 13628 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13629 @@ -34217,7 +34217,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 13647 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13648 F_TRAINER_FEMALE | #line 13649 @@ -34275,7 +34275,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 13669 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13671 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13672 @@ -34318,7 +34318,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PICNICKER, #line 13686 .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13687 F_TRAINER_FEMALE | #line 13688 @@ -34363,7 +34363,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 13703 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 13705 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13706 @@ -34406,7 +34406,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_CAMPER, #line 13720 .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13722 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13723 @@ -34449,7 +34449,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 13737 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13739 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13740 @@ -34492,7 +34492,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_AROMA_LADY, #line 13754 .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 13755 F_TRAINER_FEMALE | #line 13756 @@ -34537,7 +34537,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 13771 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13772 F_TRAINER_FEMALE | #line 13773 @@ -34582,7 +34582,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_NINJA_BOY, #line 13788 .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = + .encounterMusic_gender = #line 13790 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 13791 @@ -34625,7 +34625,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 13805 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13806 F_TRAINER_FEMALE | #line 13807 @@ -34670,7 +34670,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 13822 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 13823 F_TRAINER_FEMALE | #line 13824 @@ -34715,7 +34715,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 13839 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13840 F_TRAINER_FEMALE | #line 13841 @@ -34760,7 +34760,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 13856 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13858 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13859 @@ -34803,7 +34803,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_YOUNGSTER, #line 13873 .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13875 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13876 @@ -34846,7 +34846,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 13890 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13891 F_TRAINER_FEMALE | #line 13892 @@ -34880,7 +34880,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 13903 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13904 F_TRAINER_FEMALE | #line 13905 @@ -34914,7 +34914,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 13916 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 13917 F_TRAINER_FEMALE | #line 13918 @@ -34948,7 +34948,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_EXPERT, #line 13929 .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 13930 F_TRAINER_FEMALE | #line 13931 @@ -34995,7 +34995,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 13947 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 13949 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13950 @@ -35027,7 +35027,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_KINDLER, #line 13960 .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = + .encounterMusic_gender = #line 13962 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13963 @@ -35070,7 +35070,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PARASOL_LADY, #line 13977 .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = + .encounterMusic_gender = #line 13978 F_TRAINER_FEMALE | #line 13979 @@ -35104,7 +35104,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 13990 .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 13992 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13993 @@ -35144,7 +35144,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BATTLE_GIRL, #line 14007 .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .encounterMusic_gender = #line 14008 F_TRAINER_FEMALE | #line 14009 @@ -35189,7 +35189,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 14024 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 14026 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 14027 @@ -35232,7 +35232,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 14041 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 14043 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14044 @@ -35319,7 +35319,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 14074 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 14075 F_TRAINER_FEMALE | #line 14076 @@ -35408,7 +35408,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 14107 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 14108 F_TRAINER_FEMALE | #line 14109 @@ -35455,7 +35455,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 14125 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14126 F_TRAINER_FEMALE | #line 14127 @@ -35500,7 +35500,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 14142 .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14143 F_TRAINER_FEMALE | #line 14144 @@ -35545,7 +35545,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14159 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = + .encounterMusic_gender = #line 14160 F_TRAINER_FEMALE | #line 14161 @@ -35646,7 +35646,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14201 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = + .encounterMusic_gender = #line 14202 F_TRAINER_FEMALE | #line 14203 @@ -35765,7 +35765,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14251 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = + .encounterMusic_gender = #line 14252 F_TRAINER_FEMALE | #line 14253 @@ -35884,7 +35884,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14301 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = + .encounterMusic_gender = #line 14302 F_TRAINER_FEMALE | #line 14303 @@ -36021,7 +36021,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14359 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14361 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14362 @@ -36120,7 +36120,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14401 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14403 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14404 @@ -36219,7 +36219,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14443 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14445 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14446 @@ -36336,7 +36336,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14493 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14495 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14496 @@ -36471,7 +36471,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14551 .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = + .encounterMusic_gender = #line 14553 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14554 @@ -36570,7 +36570,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14593 .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = + .encounterMusic_gender = #line 14595 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14596 @@ -36687,7 +36687,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14643 .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = + .encounterMusic_gender = #line 14645 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14646 @@ -36804,7 +36804,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14693 .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = + .encounterMusic_gender = #line 14695 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14696 @@ -36939,7 +36939,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14751 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14752 F_TRAINER_FEMALE | #line 14753 @@ -37042,7 +37042,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14793 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14794 F_TRAINER_FEMALE | #line 14795 @@ -37163,7 +37163,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14843 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14844 F_TRAINER_FEMALE | #line 14845 @@ -37302,7 +37302,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14901 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = + .encounterMusic_gender = #line 14902 F_TRAINER_FEMALE | #line 14903 @@ -37441,7 +37441,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 14959 .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 14961 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14962 @@ -37540,7 +37540,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15001 .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15003 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15004 @@ -37657,7 +37657,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15051 .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15053 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15054 @@ -37774,7 +37774,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15101 .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15103 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15104 @@ -37909,7 +37909,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15159 .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15160 F_TRAINER_FEMALE | #line 15161 @@ -38028,7 +38028,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15209 .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15210 F_TRAINER_FEMALE | #line 15211 @@ -38165,7 +38165,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15267 .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15268 F_TRAINER_FEMALE | #line 15269 @@ -38302,7 +38302,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15325 .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15326 F_TRAINER_FEMALE | #line 15327 @@ -38439,7 +38439,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15383 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15385 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15386 @@ -38558,7 +38558,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15433 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15435 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15436 @@ -38695,7 +38695,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15491 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15493 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15494 @@ -38832,7 +38832,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15549 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15551 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 15552 @@ -38969,7 +38969,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15607 .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15609 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15610 @@ -39086,7 +39086,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15657 .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15659 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15660 @@ -39203,7 +39203,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15707 .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15709 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15710 @@ -39338,7 +39338,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_LEADER, #line 15765 .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15767 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15768 @@ -39473,7 +39473,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BUG_MANIAC, #line 15823 .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 15825 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 15826 @@ -39528,7 +39528,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BIRD_KEEPER, #line 15846 .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = + .encounterMusic_gender = #line 15848 TRAINER_ENCOUNTER_MUSIC_COOL, #line 15849 @@ -39560,7 +39560,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 15859 .trainerPic = TRAINER_PIC_STEVEN, - .encounterMusic_gender = + .encounterMusic_gender = #line 15861 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15862 @@ -39693,7 +39693,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SALON_MAIDEN, #line 15917 .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, - .encounterMusic_gender = + .encounterMusic_gender = #line 15918 F_TRAINER_FEMALE | #line 15919 @@ -39727,7 +39727,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_DOME_ACE, #line 15930 .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 15932 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15933 @@ -39759,7 +39759,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PALACE_MAVEN, #line 15943 .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, - .encounterMusic_gender = + .encounterMusic_gender = #line 15945 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15946 @@ -39791,7 +39791,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_ARENA_TYCOON, #line 15956 .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, - .encounterMusic_gender = + .encounterMusic_gender = #line 15957 F_TRAINER_FEMALE | #line 15958 @@ -39825,7 +39825,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_FACTORY_HEAD, #line 15969 .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, - .encounterMusic_gender = + .encounterMusic_gender = #line 15971 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15972 @@ -39857,7 +39857,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PIKE_QUEEN, #line 15982 .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, - .encounterMusic_gender = + .encounterMusic_gender = #line 15983 F_TRAINER_FEMALE | #line 15984 @@ -39891,7 +39891,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PYRAMID_KING, #line 15995 .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, - .encounterMusic_gender = + .encounterMusic_gender = #line 15997 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15998 @@ -39923,7 +39923,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 16008 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 16010 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16011 @@ -39966,7 +39966,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 16025 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 16027 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16028 @@ -40020,7 +40020,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 16046 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 16048 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16049 @@ -40074,7 +40074,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RUIN_MANIAC, #line 16067 .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = + .encounterMusic_gender = #line 16069 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16070 @@ -40128,7 +40128,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 16088 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 16090 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16091 @@ -40182,7 +40182,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 16109 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 16111 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16112 @@ -40236,7 +40236,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 16130 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 16132 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16133 @@ -40290,7 +40290,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_SAILOR, #line 16151 .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = + .encounterMusic_gender = #line 16153 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16154 @@ -40344,7 +40344,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 16172 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 16174 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16175 @@ -40387,7 +40387,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 16189 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 16191 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16192 @@ -40441,7 +40441,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 16210 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 16212 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16213 @@ -40495,7 +40495,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 16231 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 16233 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16234 @@ -40549,7 +40549,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16252 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 16254 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16255 @@ -40592,7 +40592,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16269 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 16271 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16272 @@ -40646,7 +40646,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16290 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 16292 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16293 @@ -40700,7 +40700,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16311 .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = + .encounterMusic_gender = #line 16313 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16314 @@ -40754,7 +40754,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 16332 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16333 F_TRAINER_FEMALE | #line 16334 @@ -40801,7 +40801,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 16350 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16351 F_TRAINER_FEMALE | #line 16352 @@ -40859,7 +40859,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 16372 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16373 F_TRAINER_FEMALE | #line 16374 @@ -40917,7 +40917,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 16394 .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16395 F_TRAINER_FEMALE | #line 16396 @@ -40975,7 +40975,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 16416 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 16418 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16419 @@ -41029,7 +41029,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 16437 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 16439 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16440 @@ -41083,7 +41083,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 16458 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 16460 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16461 @@ -41137,7 +41137,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GUITARIST, #line 16479 .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = + .encounterMusic_gender = #line 16481 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16482 @@ -41191,7 +41191,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 16500 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 16502 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16503 @@ -41234,7 +41234,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 16517 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 16519 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16520 @@ -41288,7 +41288,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 16538 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 16540 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16541 @@ -41342,7 +41342,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_HIKER, #line 16559 .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = + .encounterMusic_gender = #line 16561 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16562 @@ -41396,7 +41396,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 16580 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16581 F_TRAINER_FEMALE | #line 16582 @@ -41485,7 +41485,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 16613 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16614 F_TRAINER_FEMALE | #line 16615 @@ -41574,7 +41574,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 16646 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16647 F_TRAINER_FEMALE | #line 16648 @@ -41663,7 +41663,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PKMN_BREEDER, #line 16679 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16680 F_TRAINER_FEMALE | #line 16681 @@ -41752,7 +41752,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 16712 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 16713 F_TRAINER_FEMALE | #line 16714 @@ -41797,7 +41797,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 16729 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 16730 F_TRAINER_FEMALE | #line 16731 @@ -41853,7 +41853,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 16750 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 16751 F_TRAINER_FEMALE | #line 16752 @@ -41909,7 +41909,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_BEAUTY, #line 16771 .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = + .encounterMusic_gender = #line 16772 F_TRAINER_FEMALE | #line 16773 @@ -41965,7 +41965,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 16792 .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .encounterMusic_gender = #line 16793 F_TRAINER_FEMALE | #line 16794 @@ -41997,7 +41997,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_PSYCHIC, #line 16804 .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = + .encounterMusic_gender = #line 16806 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16807 @@ -42038,7 +42038,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_GENTLEMAN, #line 16820 .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 16822 TRAINER_ENCOUNTER_MUSIC_RICH, #line 16823 @@ -42068,7 +42068,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 16832 .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = + .encounterMusic_gender = #line 16834 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16835 @@ -42098,7 +42098,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RIVAL, #line 16844 .trainerPic = TRAINER_PIC_LEAF, - .encounterMusic_gender = + .encounterMusic_gender = #line 16845 F_TRAINER_FEMALE | #line 16846 @@ -42130,7 +42130,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RS_PROTAG, #line 16856 .trainerPic = TRAINER_PIC_RS_BRENDAN, - .encounterMusic_gender = + .encounterMusic_gender = #line 16858 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16859 @@ -42160,7 +42160,7 @@ F_TRAINER_FEMALE | .trainerClass = TRAINER_CLASS_RS_PROTAG, #line 16868 .trainerPic = TRAINER_PIC_RS_MAY, - .encounterMusic_gender = + .encounterMusic_gender = #line 16869 F_TRAINER_FEMALE | #line 16870 From 0f0c8325c5ee908504daedbaf157bfe7772b0ac3 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Wed, 12 Feb 2025 07:44:45 -0500 Subject: [PATCH 104/125] Replaced hardcoded numbers in DexNav with variables (#6241) --- src/dexnav.c | 322 +++++++++++++++++++++++------------------------ src/start_menu.c | 8 +- 2 files changed, 165 insertions(+), 165 deletions(-) diff --git a/src/dexnav.c b/src/dexnav.c index 61b7b78ba0..55e328bf83 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -398,7 +398,7 @@ static const struct SpriteTemplate sSearchIconSpriteTemplate = .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sOwnedIconTemplate = +static const struct SpriteTemplate sOwnedIconTemplate = { .tileTag = OWNED_ICON_TAG, .paletteTag = 0xFFFF, //held item pal @@ -409,7 +409,7 @@ static const struct SpriteTemplate sOwnedIconTemplate = .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sHiddenMonIconTemplate = +static const struct SpriteTemplate sHiddenMonIconTemplate = { .tileTag = HIDDEN_MON_ICON_TAG, .paletteTag = 0xFFFF, //held item pal @@ -446,7 +446,7 @@ static void DrawDexNavSearchMonIcon(u16 species, u8 *dst, bool8 owned) spriteId = CreateMonIcon(species, SpriteCB_MonIcon, SPECIES_ICON_X - 6, GetSearchWindowY() + 8, 0, 0xFFFFFFFF); gSprites[spriteId].oam.priority = 0; *dst = spriteId; - + if (owned) sDexNavSearchDataPtr->ownedIconSpriteId = CreateSprite(&sOwnedIconTemplate, SPECIES_ICON_X + 6, GetSearchWindowY() + 4, 0); } @@ -455,19 +455,19 @@ static void AddSearchWindow(u8 width) { struct WindowTemplate template; u16 y = 16; - + if (sDexNavSearchDataPtr->tileY > (gSaveBlock1Ptr->pos.y + 7)) y = 1; //draw at top if chosen tile is below LoadDexNavWindowGfx(sDexNavSearchDataPtr->windowId, 0x1d5, 14 * 16); - + SetWindowTemplateFields(&template, 0, 1, y, width, 3, 14, 8); - + sDexNavSearchDataPtr->windowId = AddWindow(&template); FillWindowPixelBuffer(sDexNavSearchDataPtr->windowId, PIXEL_FILL(1)); PutWindowTilemap(sDexNavSearchDataPtr->windowId); CopyWindowToVram(sDexNavSearchDataPtr->windowId, 3); - + DrawStdFrameWithCustomTileAndPalette(sDexNavSearchDataPtr->windowId, TRUE, 0x214, 14); } @@ -509,13 +509,13 @@ static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 StringExpandPlaceholders(gStringVar4, sText_EggMove); AddTextPrinterParameterized3(windowId, 0, WINDOW_MOVE_NAME_X, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); } - + if (searchLevel > 2) - { + { // ability name StringCopy(gStringVar1, gAbilitiesInfo[GetAbilityBySpecies(species, sDexNavSearchDataPtr->abilityNum)].name); AddTextPrinterParameterized3(windowId, 0, WINDOW_COL_1 + 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); - + // item name if (sDexNavSearchDataPtr->heldItem) { @@ -542,7 +542,7 @@ static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 static void DrawSearchWindow(u16 species, u8 potential, bool8 hidden) { u8 searchLevel = sDexNavSearchDataPtr->searchLevel; - + AddSearchWindow(SEARCH_WINDOW_WIDTH); AddSearchWindowText(species, sDexNavSearchDataPtr->proximity, searchLevel, hidden); } @@ -552,7 +552,7 @@ static void DrawSearchWindow(u16 species, u8 potential, bool8 hidden) static void RemoveDexNavWindowAndGfx(void) { u32 i; - + // try remove sprites if (sDexNavSearchDataPtr->iconSpriteId != MAX_SPRITES) DestroySprite(&gSprites[sDexNavSearchDataPtr->iconSpriteId]); @@ -564,13 +564,13 @@ static void RemoveDexNavWindowAndGfx(void) DestroySprite(&gSprites[sDexNavSearchDataPtr->ownedIconSpriteId]); if (sDexNavSearchDataPtr->exclamationSpriteId != MAX_SPRITES) DestroySprite(&gSprites[sDexNavSearchDataPtr->exclamationSpriteId]); - + for (i = 0; i < NELEMS(sDexNavSearchDataPtr->starSpriteIds); i++) { if (sDexNavSearchDataPtr->starSpriteIds[i] != MAX_SPRITES) DestroySprite(&gSprites[sDexNavSearchDataPtr->starSpriteIds[i]]); } - + FreeSpriteTilesByTag(HELD_ITEM_TAG); FreeSpriteTilesByTag(OWNED_ICON_TAG); FreeSpriteTilesByTag(HIDDEN_SEARCH_TAG); @@ -578,7 +578,7 @@ static void RemoveDexNavWindowAndGfx(void) FreeSpriteTilesByTag(LIT_STAR_TILE_TAG); FreeSpritePaletteByTag(HELD_ITEM_TAG); SafeFreeMonIconPalette(sDexNavSearchDataPtr->species); - + // remove window ClearStdWindowAndFrameToTransparent(sDexNavSearchDataPtr->windowId, FALSE); CopyWindowToVram(sDexNavSearchDataPtr->windowId, 3); @@ -620,7 +620,7 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) u8 *yPos = AllocZeroed((botX - topX) * (botY - topY) * sizeof(u8)); u32 iter = 0; bool32 ret = FALSE; - + // loop through every tile in area and evaluate while (topY < botY) { @@ -633,14 +633,14 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) tileBuffer = SNEAKING_PROXIMITY + 3; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) tileBuffer = SNEAKING_PROXIMITY + 1; - + if (GetPlayerDistance(topX, topY) <= tileBuffer) { // tile too close to player topX++; continue; } - + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].currentCoords.x == topX && gObjectEvents[i].currentCoords.y == topY) @@ -650,13 +650,13 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) break; } } - + if (nextIter) { topX++; continue; } - + weight = 0; // initiliaze weight switch (environment) { @@ -668,7 +668,7 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) // inside (cave) if (IsElevationMismatchAt(gObjectEvents[gPlayerAvatar.spriteId].currentElevation, topX, topY)) break; //occurs at same z coord - + scale = 440 - (smallScan * 200) - (GetPlayerDistance(topX, topY) / 2) - (2 * (topX + topY)); weight = ((Random() % scale) < 1) && !MapGridGetCollisionAt(topX, topY); } @@ -693,21 +693,21 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) default: break; } - + if (weight > 0) { xPos[iter] = topX; yPos[iter] = topY; iter++; } - + topX++; } - + topY++; topX = gSaveBlock1Ptr->pos.x - SCANSTART_X + (smallScan * 5); } - + if (iter > 0) { i = Random() % iter; @@ -715,7 +715,7 @@ static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) sDexNavSearchDataPtr->tileY = yPos[i]; ret = TRUE; } - + Free(xPos); Free(yPos); @@ -727,7 +727,7 @@ static bool8 TryStartHiddenMonFieldEffect(u8 environment, u8 xSize, u8 ySize, bo { u8 currMapType = GetCurrentMapType(); u8 fldEffId = 0; - + if (DexNavPickTile(environment, xSize, ySize, smallScan)) { u8 metatileBehaviour = MapGridGetMetatileBehaviorAt(sDexNavSearchDataPtr->tileX, sDexNavSearchDataPtr->tileY); @@ -770,7 +770,7 @@ static bool8 TryStartHiddenMonFieldEffect(u8 environment, u8 xSize, u8 ySize, bo default: return FALSE; } - + if (fldEffId != 0) { gFieldEffectArguments[0] = sDexNavSearchDataPtr->tileX; @@ -780,7 +780,7 @@ static bool8 TryStartHiddenMonFieldEffect(u8 environment, u8 xSize, u8 ySize, bo sDexNavSearchDataPtr->fldEffSpriteId = FieldEffectStart(fldEffId); if (sDexNavSearchDataPtr->fldEffSpriteId == MAX_SPRITES) return FALSE; - + sDexNavSearchDataPtr->fldEffId = fldEffId; return TRUE; } @@ -827,7 +827,7 @@ static u8 GetSearchLevel(u16 dexNum) static void Task_SetUpDexNavSearch(u8 taskId) { struct Task *task = &gTasks[taskId]; - + u16 species = sDexNavSearchDataPtr->species; u8 searchLevel = GetSearchLevel(SpeciesToNationalPokedexNum(species)); @@ -839,15 +839,15 @@ static void Task_SetUpDexNavSearch(u8 taskId) sDexNavSearchDataPtr->starSpriteIds[1] = MAX_SPRITES; sDexNavSearchDataPtr->starSpriteIds[2] = MAX_SPRITES; sDexNavSearchDataPtr->ownedIconSpriteId = MAX_SPRITES; - sDexNavSearchDataPtr->exclamationSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->exclamationSpriteId = MAX_SPRITES; sDexNavSearchDataPtr->searchLevel = searchLevel; - + DexNavGenerateMoveset(species, searchLevel, sDexNavSearchDataPtr->monLevel, &sDexNavSearchDataPtr->moves[0]); sDexNavSearchDataPtr->heldItem = DexNavGenerateHeldItem(species, searchLevel); sDexNavSearchDataPtr->abilityNum = DexNavGetAbilityNum(species, searchLevel); sDexNavSearchDataPtr->potential = DexNavGeneratePotential(searchLevel); DexNavProximityUpdate(); - + LoadSearchIconData(); if (sDexNavSearchDataPtr->hiddenSearch) { @@ -858,7 +858,7 @@ static void Task_SetUpDexNavSearch(u8 taskId) DexNavDrawIcons(); DexNavUpdateSearchWindow(sDexNavSearchDataPtr->proximity, searchLevel); } - + FlagSet(DN_FLAG_SEARCHING); gPlayerAvatar.creeping = TRUE; //initialize as true in case mon appears beside you task->tProximity = gSprites[gPlayerAvatar.spriteId].x; @@ -872,7 +872,7 @@ static void DexNavSearchBail(u8 taskId, const u8 *script) TRY_FREE_AND_SET_NULL(sDexNavSearchDataPtr); FreeMonIconPalettes(); ScriptContext_SetupScript(script); - DestroyTask(taskId); + DestroyTask(taskId); } static void Task_InitDexNavSearch(u8 taskId) @@ -880,32 +880,32 @@ static void Task_InitDexNavSearch(u8 taskId) struct Task *task = &gTasks[taskId]; u16 species = task->tSpecies; u8 environment = task->tEnvironment; - + sDexNavSearchDataPtr = AllocZeroed(sizeof(struct DexNavSearch)); if (sDexNavSearchDataPtr == NULL) { DexNavSearchBail(taskId, EventScript_NotFoundNearby); return; } - + // assign non-objects to struct sDexNavSearchDataPtr->species = species; sDexNavSearchDataPtr->environment = environment; //updated in DexNavTryGenerateMonLevel if hidden mon sDexNavSearchDataPtr->isHiddenMon = (environment == ENCOUNTER_TYPE_HIDDEN) ? TRUE : FALSE; sDexNavSearchDataPtr->monLevel = DexNavTryGenerateMonLevel(species, environment); - + if (GetFlashLevel() > 0) { DexNavSearchBail(taskId, EventScript_TooDark); return; } - + if (sDexNavSearchDataPtr->monLevel == MON_LEVEL_NONEXISTENT || !TryStartHiddenMonFieldEffect(sDexNavSearchDataPtr->environment, 12, 12, FALSE)) { DexNavSearchBail(taskId, EventScript_NotFoundNearby); return; } - + sDexNavSearchDataPtr->hiddenSearch = FALSE; task->tRevealed = TRUE; //search window revealed task->func = Task_SetUpDexNavSearch; @@ -915,13 +915,13 @@ static void DexNavDrawPotentialStars(u8 potential, u8* dst) { u8 spriteId; u32 i; - + for (i = 0; i < NELEMS(sDexNavSearchDataPtr->starSpriteIds); i++) { spriteId = MAX_SPRITES; if (potential > i) spriteId = CreateSprite(&sPotentialStarTemplate, SPECIES_ICON_X - 20, GetSearchWindowY() + 4 + (i * 8), 0); - + dst[i] = spriteId; if (spriteId != MAX_SPRITES) gSprites[spriteId].invisible = TRUE; @@ -938,7 +938,7 @@ static void DexNavUpdateDirectionArrow(void) u16 deltaY = abs(tileY - playerY); const u8 *str; u8 windowId = sDexNavSearchDataPtr->windowId; - + FillWindowPixelRect(windowId, PIXEL_FILL(1), SEARCH_ARROW_X, SEARCH_ARROW_Y, 12, 12); if (deltaX <= 1 && deltaY <= 1) { @@ -958,7 +958,7 @@ static void DexNavUpdateDirectionArrow(void) else str = sText_ArrowDown; //player above } - + AddTextPrinterParameterized3(windowId, 1, SEARCH_ARROW_X, SEARCH_ARROW_Y, sSearchFontColor, TEXT_SKIP_DRAW, str); CopyWindowToVram(windowId, 2); } @@ -966,7 +966,7 @@ static void DexNavUpdateDirectionArrow(void) static void DexNavDrawIcons(void) { u16 species = sDexNavSearchDataPtr->species; - + DrawSearchWindow(species, sDexNavSearchDataPtr->potential, FALSE); DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)); DrawDexNavSearchHeldItem(&sDexNavSearchDataPtr->itemSpriteId); @@ -981,10 +981,10 @@ bool8 TryStartDexNavSearch(void) { u8 taskId; u16 val = VarGet(DN_VAR_SPECIES); - + if (FlagGet(DN_FLAG_SEARCHING) || (val & DEXNAV_MASK_SPECIES) == SPECIES_NONE) return FALSE; - + HideMapNamePopUpWindow(); ChangeBgY_ScreenOff(0, 0, 0); taskId = CreateTask(Task_InitDexNavSearch, 0); @@ -1024,26 +1024,26 @@ static void Task_RevealHiddenMon(u8 taskId) { struct Task *task = &gTasks[taskId]; u16 species = sDexNavSearchDataPtr->species; - + // remove owned icon if it exists if (sDexNavSearchDataPtr->ownedIconSpriteId != MAX_SPRITES) { DestroySprite(&gSprites[sDexNavSearchDataPtr->ownedIconSpriteId]); sDexNavSearchDataPtr->ownedIconSpriteId = MAX_SPRITES; } - + // remove exclamation if it exists if (sDexNavSearchDataPtr->exclamationSpriteId != MAX_SPRITES) { DestroySprite(&gSprites[sDexNavSearchDataPtr->exclamationSpriteId]); sDexNavSearchDataPtr->exclamationSpriteId = MAX_SPRITES; } - - + + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) { u8 index; - + //if not seen, hide name and whiteout mon DrawSearchWindow(species, sDexNavSearchDataPtr->potential, TRUE); DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, FALSE); @@ -1058,7 +1058,7 @@ static void Task_RevealHiddenMon(u8 taskId) DrawSearchWindow(species, sDexNavSearchDataPtr->potential, FALSE); DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)); } - + DexNavUpdateDirectionArrow(); task->func = Task_DexNavSearch; task->tFrameCount = 0; //restart search clock @@ -1067,7 +1067,7 @@ static void Task_RevealHiddenMon(u8 taskId) static void Task_DexNavSearch(u8 taskId) { struct Task *task = &gTasks[taskId]; - + if (sDexNavSearchDataPtr->proximity > MAX_PROXIMITY) { // out of range if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) @@ -1076,7 +1076,7 @@ static void Task_DexNavSearch(u8 taskId) EndDexNavSearchSetupScript(EventScript_LostSignal, taskId); return; } - + if (sDexNavSearchDataPtr->proximity <= CREEPING_PROXIMITY && !gPlayerAvatar.creeping && task->tFrameCount > 60) { //should be creeping but player walks normally if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) @@ -1085,20 +1085,20 @@ static void Task_DexNavSearch(u8 taskId) EndDexNavSearchSetupScript(EventScript_MovedTooFast, taskId); return; } - - if (sDexNavSearchDataPtr->proximity <= SNEAKING_PROXIMITY && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_BIKE)) + + if (sDexNavSearchDataPtr->proximity <= SNEAKING_PROXIMITY && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_BIKE)) { // running/biking too close //always do event script, even if player hasn't revealed a hidden mon. It's assumed they would be creeping towards it EndDexNavSearchSetupScript(EventScript_MovedTooFast, taskId); return; } - + if (ArePlayerFieldControlsLocked() == TRUE) { // check if script just executed EndDexNavSearch(taskId); return; } - + if (gTasks[taskId].tFrameCount > DEXNAV_TIMEOUT * 60) { // player took too long if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) @@ -1107,11 +1107,11 @@ static void Task_DexNavSearch(u8 taskId) EndDexNavSearchSetupScript(EventScript_PokemonGotAway, taskId); return; } - + if (sDexNavSearchDataPtr->proximity < 1) { gDexNavBattle = TRUE; - CreateDexNavWildMon(sDexNavSearchDataPtr->species, sDexNavSearchDataPtr->potential, sDexNavSearchDataPtr->monLevel, + CreateDexNavWildMon(sDexNavSearchDataPtr->species, sDexNavSearchDataPtr->potential, sDexNavSearchDataPtr->monLevel, sDexNavSearchDataPtr->abilityNum, sDexNavSearchDataPtr->heldItem, sDexNavSearchDataPtr->moves); FlagClear(DN_FLAG_SEARCHING); @@ -1120,7 +1120,7 @@ static void Task_DexNavSearch(u8 taskId) DestroyTask(taskId); return; } - + if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed && (JOY_NEW(R_BUTTON) || (sDexNavSearchDataPtr->proximity < CREEPING_PROXIMITY))) { @@ -1141,13 +1141,13 @@ static void Task_DexNavSearch(u8 taskId) && task->tRevealed) { FieldEffectStop(&gSprites[sDexNavSearchDataPtr->fldEffSpriteId], sDexNavSearchDataPtr->fldEffId); - + if (!TryStartHiddenMonFieldEffect(sDexNavSearchDataPtr->environment, 10, 10, TRUE)) { EndDexNavSearchSetupScript(EventScript_PokemonGotAway, taskId); return; } - + sDexNavSearchDataPtr->movementCount++; } @@ -1157,10 +1157,10 @@ static void Task_DexNavSearch(u8 taskId) //player has moved if (task->tRevealed) //update search window info only if hidden mon has been revealed (always true for search mode) DexNavUpdateSearchWindow(sDexNavSearchDataPtr->proximity, sDexNavSearchDataPtr->searchLevel); - + task->tProximity = sDexNavSearchDataPtr->proximity; } - + task->tFrameCount++; } @@ -1170,12 +1170,12 @@ static void DexNavUpdateSearchWindow(u8 proximity, u8 searchLevel) if (sDexNavSearchDataPtr->hiddenSearch && !GetSetPokedexFlag(SpeciesToNationalPokedexNum(sDexNavSearchDataPtr->species), FLAG_GET_SEEN)) hideName = TRUE; //if a detector mode hidden search and player hasn't seen the mon, hide info - + FillWindowPixelBuffer(sDexNavSearchDataPtr->windowId, PIXEL_FILL(1)); //clear window AddSearchWindowText(sDexNavSearchDataPtr->species, proximity, searchLevel, hideName); - + DexNavUpdateDirectionArrow(); - + //init hidden sprites if (sDexNavSearchDataPtr->itemSpriteId != MAX_SPRITES) gSprites[sDexNavSearchDataPtr->itemSpriteId].invisible = TRUE; @@ -1185,7 +1185,7 @@ static void DexNavUpdateSearchWindow(u8 proximity, u8 searchLevel) gSprites[sDexNavSearchDataPtr->starSpriteIds[1]].invisible = TRUE; if (sDexNavSearchDataPtr->starSpriteIds[2] != MAX_SPRITES) gSprites[sDexNavSearchDataPtr->starSpriteIds[2]].invisible = TRUE; - + if (proximity <= SNEAKING_PROXIMITY) { if (searchLevel > 2 && sDexNavSearchDataPtr->heldItem) @@ -1194,7 +1194,7 @@ static void DexNavUpdateSearchWindow(u8 proximity, u8 searchLevel) if (sDexNavSearchDataPtr->itemSpriteId != MAX_SPRITES) gSprites[sDexNavSearchDataPtr->itemSpriteId].invisible = FALSE; } - + if (searchLevel > 4) { if (sDexNavSearchDataPtr->starSpriteIds[0] != MAX_SPRITES) @@ -1218,9 +1218,9 @@ static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityN u8 iv[3] = {NUM_STATS}; u8 i; u8 perfectIv = 31; - + CreateWildMon(species, level); // shiny rate bonus handled in CreateBoxMon - + // Pick random, unique IVs to set to 31. The number of perfect IVs that are assigned is equal to the potential iv[0] = Random() % NUM_STATS; // choose 1st perfect stat do { @@ -1228,17 +1228,17 @@ static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityN iv[2] = Random() % NUM_STATS; } while ((iv[1] == iv[0]) // unique 2nd perfect stat || (iv[2] == iv[0] || iv[2] == iv[1])); // unique 3rd perfect stat - + if (potential > 2 && iv[2] != NUM_STATS) SetMonData(mon, MON_DATA_HP_IV + iv[2], &perfectIv); if (potential > 1 && iv[1] != NUM_STATS) SetMonData(mon, MON_DATA_HP_IV + iv[1], &perfectIv); if (potential > 0 && iv[0] != NUM_STATS) SetMonData(mon, MON_DATA_HP_IV + iv[0], &perfectIv); - + //Set ability SetMonData(mon, MON_DATA_ABILITY_NUM, &abilityNum); - + // Set Held Item if (item) SetMonData(mon, MON_DATA_HELD_ITEM, &item); @@ -1259,7 +1259,7 @@ static u8 DexNavTryGenerateMonLevel(u16 species, u8 environment) if (levelBase == MON_LEVEL_NONEXISTENT) return MON_LEVEL_NONEXISTENT; //species not found in the area - + if (Random() % 100 < 4) levelBonus += 10; //4% chance of having a +10 level @@ -1315,7 +1315,7 @@ static void DexNavGenerateMoveset(u16 species, u8 searchLevel, u8 encounterLevel for (i = 0; i < MAX_MON_MOVES; i++) moveDst[i] = GetMonData(&gEnemyParty[0], MON_DATA_MOVE1 + i, NULL); - // set first move slot to a random egg move if search level is good enough + // set first move slot to a random egg move if search level is good enough if (genMove) { u8 numEggMoves = GetEggMoves(&gEnemyParty[0], eggMoveBuffer); @@ -1330,7 +1330,7 @@ static u16 DexNavGenerateHeldItem(u16 species, u8 searchLevel) u8 searchLevelInfluence = searchLevel >> 1; u16 item1 = gSpeciesInfo[species].itemCommon; u16 item2 = gSpeciesInfo[species].itemRare; - + // if both are the same, 100% to hold if (item1 == item2) return item1; @@ -1357,7 +1357,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) bool8 genAbility = FALSE; u16 randVal = Random() % 100; u8 abilityNum = 0; - + if (searchLevel < 5) { #if (SEARCHLEVEL0_ABILITYCHANCE != 0) @@ -1400,7 +1400,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) genAbility = TRUE; #endif } - + if (genAbility && gSpeciesInfo[species].abilities[2] != ABILITY_NONE && GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) @@ -1416,7 +1416,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) else abilityNum = 0; } - + return abilityNum; } @@ -1424,7 +1424,7 @@ static u8 DexNavGeneratePotential(u8 searchLevel) { u8 genChance = 0; int randVal = Random() % 100; - + if (searchLevel < 5) { genChance = SEARCHLEVEL0_ONESTAR + SEARCHLEVEL0_TWOSTAR + SEARCHLEVEL0_THREESTAR; @@ -1509,7 +1509,7 @@ static u8 DexNavGeneratePotential(u8 searchLevel) return 3; } } - + return 0; // No potential } @@ -1522,7 +1522,7 @@ static u8 GetEncounterLevelFromMapData(u16 species, u8 environment) u8 min = 100; u8 max = 0; u8 i; - + switch (environment) { case ENCOUNTER_TYPE_LAND: // grass @@ -1554,7 +1554,7 @@ static u8 GetEncounterLevelFromMapData(u16 species, u8 environment) case ENCOUNTER_TYPE_HIDDEN: if (hiddenMonsInfo == NULL) return MON_LEVEL_NONEXISTENT; - + for (i = 0; i < HIDDEN_WILD_COUNT; i++) { if (hiddenMonsInfo->wildPokemon[i].species == species) @@ -1563,7 +1563,7 @@ static u8 GetEncounterLevelFromMapData(u16 species, u8 environment) max = (max > hiddenMonsInfo->wildPokemon[i].maxLevel) ? max : hiddenMonsInfo->wildPokemon[i].maxLevel; } } - + // use encounter rate to signify is hidden pokemon are on land or in water if (hiddenMonsInfo->encounterRate == 1) sDexNavSearchDataPtr->environment = ENCOUNTER_TYPE_WATER; @@ -1591,7 +1591,7 @@ static const struct BgTemplate sDexNavMenuBgTemplates[2] = .charBaseIndex = 0, .mapBaseIndex = 31, .priority = 0 - }, + }, { .bg = 1, .charBaseIndex = 3, @@ -1623,7 +1623,7 @@ static bool8 DexNav_InitBgs(void) sBg1TilemapBuffer = Alloc(0x800); if (sBg1TilemapBuffer == NULL) return FALSE; - + memset(sBg1TilemapBuffer, 0, 0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sDexNavMenuBgTemplates, NELEMS(sDexNavMenuBgTemplates)); @@ -1660,14 +1660,14 @@ static bool8 DexNav_LoadGraphics(void) sDexNavUiDataPtr->state = 0; return TRUE; } - + return FALSE; } static void UpdateCursorPosition(void) { u16 x, y; - + switch (sDexNavUiDataPtr->cursorRow) { case ROW_WATER: @@ -1693,10 +1693,10 @@ static void UpdateCursorPosition(void) default: return; } - + gSprites[sDexNavUiDataPtr->cursorSpriteId].x = x; gSprites[sDexNavUiDataPtr->cursorSpriteId].y = y; - + PrintCurrentSpeciesInfo(); } @@ -1704,17 +1704,17 @@ static void CreateSelectionCursor(void) { u8 spriteId; struct CompressedSpriteSheet spriteSheet; - + spriteSheet.data = sSelectionCursorGfx; spriteSheet.size = 0x200; spriteSheet.tag = SELECTION_CURSOR_TAG; LoadCompressedSpriteSheet(&spriteSheet); - + LoadPalette(sSelectionCursorPal, (16 * sSelectionCursorOam.paletteNum) + 0x100, 32); - - spriteId = CreateSprite(&sSelectionCursorSpriteTemplate, 12, 32, 0); + + spriteId = CreateSprite(&sSelectionCursorSpriteTemplate, 12, 32, 0); //gSprites[spriteId].data[1] = -1; - + sDexNavUiDataPtr->cursorSpriteId = spriteId; UpdateCursorPosition(); } @@ -1729,9 +1729,9 @@ static bool8 CapturedAllLandMons(u16 headerId) u16 i, species; int count = 0; const struct WildPokemonInfo* landMonsInfo = gWildMonHeaders[headerId].landMonsInfo; - + if (landMonsInfo != NULL) - { + { for (i = 0; i < LAND_WILD_COUNT; ++i) { species = landMonsInfo->wildPokemon[i].species; @@ -1739,7 +1739,7 @@ static bool8 CapturedAllLandMons(u16 headerId) { if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) break; - + count++; } } @@ -1793,7 +1793,7 @@ static bool8 CapturedAllHiddenMons(u16 headerId) u16 species; u8 count = 0; const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; - + if (hiddenMonsInfo != NULL) { for (i = 0; i < HIDDEN_WILD_COUNT; ++i) @@ -1821,7 +1821,7 @@ static bool8 CapturedAllHiddenMons(u16 headerId) static void DexNavLoadCapturedAllSymbols(void) { u16 headerId = GetCurrentMapWildMonHeaderId(); - + LoadCompressedSpriteSheetUsingHeap(&sCapturedAllPokemonSpriteSheet); if (CapturedAllLandMons(headerId)) @@ -1829,7 +1829,7 @@ static void DexNavLoadCapturedAllSymbols(void) if (CapturedAllWaterMons(headerId)) CreateSprite(&sCaptureAllMonsSpriteTemplate, 139, 17, 0); - + if (CapturedAllHiddenMons(headerId)) CreateSprite(&sCaptureAllMonsSpriteTemplate, 114, 123, 0); } @@ -1852,7 +1852,7 @@ static void DexNavGuiFreeResources(void) static void CB1_InitDexNavSearch(void) { u8 taskId; - + if (!gPaletteFade.active && !ArePlayerFieldControlsLocked() && gMain.callback2 == CB2_Overworld) { SetMainCallback1(CB1_Overworld); @@ -1897,7 +1897,7 @@ static bool8 SpeciesInArray(u16 species, u8 section) { u32 i; u16 dexNum = SpeciesToNationalPokedexNum(species); - + switch (section) { case 0: //land @@ -1924,7 +1924,7 @@ static bool8 SpeciesInArray(u16 species, u8 section) default: break; } - + return FALSE; } @@ -1940,12 +1940,12 @@ static void DexNavLoadEncounterData(void) const struct WildPokemonInfo* landMonsInfo = gWildMonHeaders[headerId].landMonsInfo; const struct WildPokemonInfo* waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo; const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; - + // nop struct data memset(sDexNavUiDataPtr->landSpecies, 0, sizeof(sDexNavUiDataPtr->landSpecies)); memset(sDexNavUiDataPtr->waterSpecies, 0, sizeof(sDexNavUiDataPtr->waterSpecies)); memset(sDexNavUiDataPtr->hiddenSpecies, 0, sizeof(sDexNavUiDataPtr->hiddenSpecies)); - + // land mons if (landMonsInfo != NULL && landMonsInfo->encounterRate != 0) { @@ -1967,7 +1967,7 @@ static void DexNavLoadEncounterData(void) sDexNavUiDataPtr->waterSpecies[waterIndex++] = waterMonsInfo->wildPokemon[i].species; } } - + // hidden mons if (hiddenMonsInfo != NULL) // no encounter rate check since 0 means land, 1 means water encounters { @@ -1995,24 +1995,24 @@ static void DrawSpeciesIcons(void) s16 x, y; u32 i; u16 species; - + LoadCompressedSpriteSheetUsingHeap(&sNoDataIconSpriteSheet); for (i = 0; i < LAND_WILD_COUNT; i++) { species = sDexNavUiDataPtr->landSpecies[i]; - x = 20 + (24 * (i % 6)); - y = ROW_LAND_TOP_ICON_Y + (i > 5 ? 28 : 0); + x = ROW_LAND_ICON_X + (24 * (i % COL_LAND_COUNT)); + y = ROW_LAND_TOP_ICON_Y + (i > COL_LAND_MAX ? 28 : 0); TryDrawIconInSlot(species, x, y); } - + for (i = 0; i < WATER_WILD_COUNT; i++) { species = sDexNavUiDataPtr->waterSpecies[i]; - x = 30 + 24 * i; + x = ROW_WATER_ICON_X + 24 * i; y = ROW_WATER_ICON_Y; TryDrawIconInSlot(species, x, y); } - + for (i = 0; i < HIDDEN_WILD_COUNT; i++) { species = sDexNavUiDataPtr->hiddenSpecies[i]; @@ -2030,7 +2030,7 @@ static void DrawSpeciesIcons(void) static u16 DexNavGetSpecies(void) { u16 species; - + switch (sDexNavUiDataPtr->cursorRow) { case ROW_WATER: @@ -2051,10 +2051,10 @@ static u16 DexNavGetSpecies(void) default: return SPECIES_NONE; } - + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) return SPECIES_NONE; - + return species; } @@ -2092,7 +2092,7 @@ static const u8 sMoveTypeToOamPaletteNum[NUMBER_OF_MON_TYPES] = static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) { struct Sprite *sprite; - + sprite = &gSprites[sDexNavUiDataPtr->typeIconSpriteIds[spriteArrayId]]; StartSpriteAnim(sprite, typeId); sprite->oam.paletteNum = sMoveTypeToOamPaletteNum[typeId]; @@ -2106,25 +2106,25 @@ static void PrintCurrentSpeciesInfo(void) u16 species = DexNavGetSpecies(); u16 dexNum = SpeciesToNationalPokedexNum(species); u8 type1, type2; - + if (!GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) species = SPECIES_NONE; // clear windows FillWindowPixelBuffer(WINDOW_INFO, PIXEL_FILL(TEXT_COLOR_TRANSPARENT)); - + //species name if (species == SPECIES_NONE) AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); else AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species)); - + //type icon(s) type1 = gSpeciesInfo[species].types[0]; type2 = gSpeciesInfo[species].types[1]; if (species == SPECIES_NONE) type1 = type2 = TYPE_MYSTERY; - + if (type1 == type2) { SetTypeIconPosAndPal(type1, 186, 69, 0); @@ -2135,7 +2135,7 @@ static void PrintCurrentSpeciesInfo(void) SetTypeIconPosAndPal(type1, 168, 69, 0); SetTypeIconPosAndPal(type2, 168 + 33, 69, 1); } - + //search level if (species == SPECIES_NONE) { @@ -2146,7 +2146,7 @@ static void PrintCurrentSpeciesInfo(void) ConvertIntToDecimalStringN(gStringVar4, GetSearchLevel(dexNum), 0, 4); AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, gStringVar4); } - + //hidden ability if (species == SPECIES_NONE) { @@ -2163,11 +2163,11 @@ static void PrintCurrentSpeciesInfo(void) { AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_CaptureToSee); } - + //current chain ConvertIntToDecimalStringN(gStringVar1, gSaveBlock3Ptr->dexNavChain, STR_CONV_MODE_LEFT_ALIGN, 3); AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, CHAIN_BONUS_Y, sFontColor_Black, 0, gStringVar1); - + CopyWindowToVram(WINDOW_INFO, 3); PutWindowTilemap(WINDOW_INFO); } @@ -2195,7 +2195,7 @@ static void PrintSearchableSpecies(u16 species) StringExpandPlaceholders(gStringVar4, sText_DexNav_SearchForRegisteredSpecies); AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, gStringVar4); } - + PrintMapName(); } @@ -2208,8 +2208,8 @@ static void CreateTypeIconSprites(void) for (i = 0; i < 2; i++) { if (sDexNavUiDataPtr->typeIconSpriteIds[i] == 0xFF) - sDexNavUiDataPtr->typeIconSpriteIds[i] = CreateSprite(&gSpriteTemplate_MoveTypes, 10, 10, 2); - + sDexNavUiDataPtr->typeIconSpriteIds[i] = CreateSprite(&gSpriteTemplate_MoveTypes, 10, 10, 2); + SetSpriteInvisibility(i, TRUE); } } @@ -2217,7 +2217,7 @@ static void CreateTypeIconSprites(void) static bool8 DexNav_DoGfxSetup(void) { u8 taskId; - + switch (gMain.state) { case 0: @@ -2299,7 +2299,7 @@ static bool8 DexNav_DoGfxSetup(void) SetMainCallback2(DexNav_MainCB); return TRUE; } - + return FALSE; } @@ -2316,7 +2316,7 @@ static void DexNavGuiInit(MainCallback callback) SetMainCallback2(callback); return; } - + sDexNavUiDataPtr->state = 0; sDexNavUiDataPtr->savedCallback = callback; SetMainCallback2(DexNav_RunSetup); @@ -2347,10 +2347,10 @@ static void Task_DexNavMain(u8 taskId) { struct Task *task = &gTasks[taskId]; u16 species; - + if (IsSEPlaying()) return; - + if (JOY_NEW(B_BUTTON)) { PlaySE(SE_POKENAV_OFF); @@ -2369,10 +2369,10 @@ static void Task_DexNavMain(u8 taskId) { if (sDexNavUiDataPtr->cursorRow == ROW_LAND_TOP && sDexNavUiDataPtr->cursorCol == COL_LAND_MAX) sDexNavUiDataPtr->cursorCol = COL_WATER_MAX; - + sDexNavUiDataPtr->cursorRow--; } - + PlaySE(SE_RG_BAG_CURSOR); UpdateCursorPosition(); } @@ -2386,14 +2386,14 @@ static void Task_DexNavMain(u8 taskId) { if (sDexNavUiDataPtr->cursorCol >= COL_HIDDEN_COUNT) sDexNavUiDataPtr->cursorCol = COL_HIDDEN_MAX; - + sDexNavUiDataPtr->cursorRow++; } else { sDexNavUiDataPtr->cursorRow++; } - + PlaySE(SE_RG_BAG_CURSOR); UpdateCursorPosition(); } @@ -2418,7 +2418,7 @@ static void Task_DexNavMain(u8 taskId) { sDexNavUiDataPtr->cursorCol--; } - + PlaySE(SE_RG_BAG_CURSOR); UpdateCursorPosition(); } @@ -2445,7 +2445,7 @@ static void Task_DexNavMain(u8 taskId) sDexNavUiDataPtr->cursorCol++; break; } - + PlaySE(SE_RG_BAG_CURSOR); UpdateCursorPosition(); } @@ -2453,13 +2453,13 @@ static void Task_DexNavMain(u8 taskId) { // check selection is valid. Play sound if invalid species = DexNavGetSpecies(); - + if (species != SPECIES_NONE) - { + { PrintSearchableSpecies(species); //PlaySE(SE_DEX_SEARCH); PlayCry_Script(species, 0); - + // create value to store in a var VarSet(DN_VAR_SPECIES, ((sDexNavUiDataPtr->environment << 14) | species)); } @@ -2493,7 +2493,7 @@ static void Task_DexNavMain(u8 taskId) bool8 TryFindHiddenPokemon(void) { u16 *stepPtr = GetVarPointer(DN_VAR_STEP_COUNTER); - + if (DEXNAV_ENABLED == 0 || !FlagGet(DN_FLAG_DETECTOR_MODE) || FlagGet(DN_FLAG_SEARCHING) @@ -2503,7 +2503,7 @@ bool8 TryFindHiddenPokemon(void) (*stepPtr) = 0; return FALSE; } - + (*stepPtr)++; (*stepPtr) %= HIDDEN_MON_STEP_COUNT; if ((*stepPtr) == 0 && (Random() % 100 < HIDDEN_MON_SEARCH_RATE)) @@ -2516,12 +2516,12 @@ bool8 TryFindHiddenPokemon(void) u8 taskId; const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; bool8 isHiddenMon = FALSE; - + // while you can still technically find hidden pokemon if there are not hidden-only pokemon on a map, // this prevents any potential lagging on maps you dont want hidden pokemon to appear on if (hiddenMonsInfo == NULL) return FALSE; - + // encounter rate signifies surfing (1) or land mons (0)! // again, for simplicity switch (hiddenMonsInfo->encounterRate) @@ -2571,12 +2571,12 @@ bool8 TryFindHiddenPokemon(void) default: return FALSE; } - + if (species == SPECIES_NONE) return FALSE; - + sDexNavSearchDataPtr = AllocZeroed(sizeof(struct DexNavSearch)); - + // init search data sDexNavSearchDataPtr->isHiddenMon = isHiddenMon; sDexNavSearchDataPtr->species = species; @@ -2600,7 +2600,7 @@ bool8 TryFindHiddenPokemon(void) gFieldEffectArguments[3] = 2; ObjectEventGetLocalIdAndMap(&gObjectEvents[gPlayerAvatar.objectEventId], &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); - + PlayCry_Script(species, 0); taskId = CreateTask(Task_SetUpDexNavSearch, 0); gTasks[taskId].tSpecies = sDexNavSearchDataPtr->species; @@ -2610,14 +2610,14 @@ bool8 TryFindHiddenPokemon(void) ChangeBgY_ScreenOff(0, 0, 0); return FALSE; // we dont actually want to enable the script context or the game will freeze } - + return FALSE; } static void DrawSearchIcon(void) { - struct CompressedSpriteSheet spriteSheet; - + struct CompressedSpriteSheet spriteSheet; + spriteSheet.data = sHiddenSearchIconGfx; spriteSheet.size = 0x200; spriteSheet.tag = SELECTION_CURSOR_TAG; @@ -2632,7 +2632,7 @@ static void DrawHiddenSearchWindow(u8 width) { AddSearchWindow(width); AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 0, sSearchFontColor, TEXT_SKIP_DRAW, sText_ThreeQmarks); - + ConvertIntToDecimalStringN(gStringVar1, sDexNavSearchDataPtr->searchLevel, STR_CONV_MODE_LEFT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, sText_SearchLevel); AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); @@ -2642,13 +2642,13 @@ static void DrawHiddenSearchWindow(u8 width) static void DexNavDrawHiddenIcons(void) { u16 species = sDexNavSearchDataPtr->species; - + DrawHiddenSearchWindow(12); DrawSearchIcon(); - + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) sDexNavSearchDataPtr->ownedIconSpriteId = CreateSprite(&sOwnedIconTemplate, SPECIES_ICON_X + 6, GetSearchWindowY() + 2, 0); - + if (sDexNavSearchDataPtr->isHiddenMon) sDexNavSearchDataPtr->exclamationSpriteId = CreateSprite(&sHiddenMonIconTemplate, SPECIES_ICON_X + 34, GetSearchWindowY() + 8, 0); } @@ -2660,7 +2660,7 @@ u32 CalculateDexNavShinyRolls(void) { u32 chainBonus, rndBonus; u8 chain = gSaveBlock3Ptr->dexNavChain; - + chainBonus = (chain >= 100) ? 10 : (chain >= 50) ? 5 : 0; rndBonus = (Random() % 100 < 4) ? 4 : 0; return chainBonus + rndBonus; diff --git a/src/start_menu.c b/src/start_menu.c index a49b7c6d8a..72a420e90e 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -329,13 +329,13 @@ static void AddStartMenuAction(u8 action) } static void BuildNormalStartMenu(void) -{ +{ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) AddStartMenuAction(MENU_ACTION_POKEDEX); - + if (DN_FLAG_DEXNAV_GET != 0 && FlagGet(DN_FLAG_DEXNAV_GET)) AddStartMenuAction(MENU_ACTION_DEXNAV); - + if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) AddStartMenuAction(MENU_ACTION_POKEMON); @@ -644,7 +644,7 @@ static bool8 HandleStartMenuInput(void) if (sCurrentStartMenuActions[sStartMenuCursorPos] == MENU_ACTION_DEXNAV && MapHasNoEncounterData()) return FALSE; - + gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void; if (gMenuCallback != StartMenuSaveCallback From a859f40e376d1048017d440d3215cb201787bc53 Mon Sep 17 00:00:00 2001 From: Hedara Date: Wed, 12 Feb 2025 14:31:42 +0100 Subject: [PATCH 105/125] Review comments --- data/scripts/std_msgbox.inc | 4 ++-- include/config/overworld.h | 8 +++++++- include/constants/event_objects.h | 20 -------------------- src/event_object_movement.c | 12 ++++++------ src/scrcmd.c | 9 ++++++--- src/script.c | 2 +- src/script_movement.c | 2 +- 7 files changed, 23 insertions(+), 34 deletions(-) diff --git a/data/scripts/std_msgbox.inc b/data/scripts/std_msgbox.inc index 40026c8ea0..8d5e4167cb 100644 --- a/data/scripts/std_msgbox.inc +++ b/data/scripts/std_msgbox.inc @@ -8,13 +8,13 @@ Std_MsgboxNPC: return Std_MsgboxSign: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT lockall message NULL waitmessage waitbuttonpress releaseall - clearflag FLAG_SAFE_FOLLOWER_MOVEMENT + clearflag FLAG_SAFE_FOLLOWER_MOVEMENT return Std_MsgboxDefault: diff --git a/include/config/overworld.h b/include/config/overworld.h index ff5937743c..7f5be368c2 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -54,10 +54,16 @@ // 16x32, 32x32, 64x64 etc are fine #define OW_MON_WANDER_WALK TRUE // If true, OW pokemon with MOVEMENT_TYPE_WANDER will walk-in-place in between steps. // Follower Pokémon -#define OW_FOLLOWERS_ENABLED TRUE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! +#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! #define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations #define OW_FOLLOWERS_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball +// New/old handling for followers during scripts; +// TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default +// (scripted player movement moves follower too!) +// FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default +#define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE + // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded. // In USUM (here GEN_7), if a Pokémon with Synchronize leads the party, gift Pokémon will always have their same Nature regardless of their Egg Group. diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 63849ec676..b9f2622b54 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -295,26 +295,6 @@ #define SHADOW_SIZE_XL_BATTLE_ONLY SHADOW_SIZE_NONE // Battle-only definition for XL shadow size. -// If true, adds a small amount of overhead -// to OW code so that large (48x48, 64x64) OWs -// will display correctly under bridges, etc. -#define LARGE_OW_SUPPORT TRUE - -// See global.h for the toggle of OW_GFX_COMPRESS -// Compressed gfx are incompatible with non-power-of-two sprite sizes: -// (You should not use 48x48 sprites/tables for compressed gfx) -// 16x32, 32x32, 64x64 etc are fine - -// Followers will emerge from the pokeball they are stored in, -// instead of a normal pokeball -#define OW_MON_POKEBALLS TRUE - -// New/old handling for followers during scripts; -// TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default -// (scripted player movement moves follower too!) -// FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default -#define OW_MON_SCRIPT_MOVEMENT TRUE - // If set, the only pokemon allowed to follow you // will be those matching species, met location, // and/or met level; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 5c7243b0f8..e6c3c4ddf5 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2092,9 +2092,8 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) sprite->y += -(graphicsInfo->height >> 1) - sprite->centerToCornerVecY; } - #if OW_GFX_COMPRESS - LoadSheetGraphicsInfo(graphicsInfo, objEvent->graphicsId, sprite); - #endif + if (OW_GFX_COMPRESS) + LoadSheetGraphicsInfo(graphicsInfo, objEvent->graphicsId, sprite); sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; @@ -5515,8 +5514,8 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri // During a script, if player sidesteps or backsteps, // mirror player's direction instead if (ArePlayerFieldControlsLocked() - && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection - ) { + && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection) + { direction = gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; objectEvent->facingDirectionLocked = TRUE; } @@ -6209,7 +6208,8 @@ u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, b if (objectEvent->localId == OBJ_EVENT_ID_FOLLOWER) return OBJECT_EVENTS_COUNT; // follower cannot collide with other objects, but they can collide with it - if (addCoords) { + if (addCoords) + { x += objectEvent->currentCoords.x; y += objectEvent->currentCoords.y; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 1dd23c36b3..b45a0d76a3 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -998,7 +998,8 @@ bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) return FALSE; } -struct ObjectEvent * ScriptHideFollower(void) { +struct ObjectEvent * ScriptHideFollower(void) +{ struct ObjectEvent *obj = GetFollowerObject(); if (obj == NULL || obj->invisible) @@ -2562,11 +2563,13 @@ bool8 Scrcmd_getobjectfacingdirection(struct ScriptContext *ctx) return FALSE; } -bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) { +bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) +{ bool16 wait = VarGet(ScriptReadHalfword(ctx)); struct ObjectEvent *obj; - if ((obj = ScriptHideFollower()) != NULL && wait) { + if ((obj = ScriptHideFollower()) != NULL && wait) + { sMovingNpcId = obj->localId; sMovingNpcMapGroup = obj->mapGroup; sMovingNpcMapNum = obj->mapNum; diff --git a/src/script.c b/src/script.c index 91cf29a87a..acdaf3f241 100644 --- a/src/script.c +++ b/src/script.c @@ -256,7 +256,7 @@ void ScriptContext_SetupScript(const u8 *ptr) InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd); SetupBytecodeScript(&sGlobalScriptContext, ptr); LockPlayerFieldControls(); - if (OW_MON_SCRIPT_MOVEMENT) + if (OW_FOLLOWERS_SCRIPT_MOVEMENT) FlagSet(FLAG_SAFE_FOLLOWER_MOVEMENT); sGlobalScriptContextStatus = CONTEXT_RUNNING; } diff --git a/src/script_movement.c b/src/script_movement.c index 021be6d621..28e9e02a47 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -222,7 +222,7 @@ static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, cons // a non-player object collides with an active follower pokemon, // put that follower into a pokeball // (sTimer helps limit this expensive check to once per step) - if (OW_MON_SCRIPT_MOVEMENT && + if (OW_FOLLOWERS_SCRIPT_MOVEMENT && gSprites[obj->spriteId].sTimer == 1 && (objEventId = GetObjectObjectCollidesWith(obj, 0, 0, TRUE)) < OBJECT_EVENTS_COUNT && // switch `obj` to follower From f20aebf87856f8396071e0468a0376e328df1bea Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 12 Feb 2025 21:57:51 +0100 Subject: [PATCH 106/125] Fixed multi battle forced switches (#6243) Co-authored-by: Hedara Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_script_commands.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d962390fd8..a34a6dc4b0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12038,7 +12038,6 @@ static void Cmd_forcerandomswitch(void) { CMD_ARGS(const u8 *failInstr); - s32 i; s32 battler1PartyId = 0; s32 battler2PartyId = 0; @@ -12173,7 +12172,7 @@ static void Cmd_forcerandomswitch(void) battler1PartyId = gBattlerPartyIndexes[gBattlerTarget]; } - for (i = firstMonId; i < lastMonId; i++) + for (u32 i = firstMonId; i < lastMonId; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) @@ -12204,12 +12203,12 @@ static void Cmd_forcerandomswitch(void) || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); - SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), i, 1); + SwitchPartyOrderLinkMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget], 0); + SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), gBattleStruct->monToSwitchIntoId[gBattlerTarget], 1); } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - SwitchPartyOrderInGameMulti(gBattlerTarget, i); + SwitchPartyOrderInGameMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget]); } } else From 4f3326f3f4984eadcdde56b090831ea5123599e5 Mon Sep 17 00:00:00 2001 From: Zatsu <118256341+fakuzatsu@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:02:25 +0000 Subject: [PATCH 107/125] fix for battle ui for add to party menu (#6229) (#6240) --- include/reshow_battle_screen.h | 1 + src/battle_script_commands.c | 3 +- src/party_menu.c | 9 ++-- src/reshow_battle_screen.c | 99 ++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/include/reshow_battle_screen.h b/include/reshow_battle_screen.h index 07958bf6c0..59f9c79106 100644 --- a/include/reshow_battle_screen.h +++ b/include/reshow_battle_screen.h @@ -3,6 +3,7 @@ void ReshowBattleScreenDummy(void); void ReshowBattleScreenAfterMenu(void); +void ReshowBlankBattleScreenAfterMenu(void); void CreateBattlerSprite(u32 battler); #endif // GUARD_RESHOW_BATTLE_SCREEN_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5cde7286c5..4635fe0cee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16356,12 +16356,13 @@ static void Cmd_trygivecaughtmonnick(void) { GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); + MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL), - ReshowBattleScreenAfterMenu); + callback); gBattleCommunication[MULTIUSE_STATE]++; } diff --git a/src/party_menu.c b/src/party_menu.c index 784f13acdd..5e79d74d45 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -7183,14 +7183,11 @@ static u8 GetPartyLayoutFromBattleType(void) void OpenPartyMenuInBattle(u8 partyAction) { - u8 partyMessage; - if (partyAction == PARTY_ACTION_SEND_MON_TO_BOX) - partyMessage = PARTY_MSG_CHOOSE_MON_FOR_BOX; + InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON_FOR_BOX, Task_HandleChooseMonInput, ReshowBlankBattleScreenAfterMenu); else - partyMessage = PARTY_MSG_CHOOSE_MON; - - InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, partyMessage, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); + InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); + ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 87f639194c..ba6f615595 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -18,9 +18,11 @@ // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); +static void CB2_ReshowBlankBattleScreenAfterMenu(void); static bool8 LoadBattlerSpriteGfx(u32 battler); static void CreateHealthboxSprite(u32 battler); static void ClearBattleBgCntBaseBlocks(void); +static void CreateCaughtMonSprite(void); void ReshowBattleScreenDummy(void) { @@ -168,6 +170,89 @@ static void CB2_ReshowBattleScreenAfterMenu(void) gBattleScripting.reshowMainState++; } +void ReshowBlankBattleScreenAfterMenu(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + gBattleScripting.reshowMainState = 0; + gBattleScripting.reshowHelperState = 0; + SetMainCallback2(CB2_ReshowBlankBattleScreenAfterMenu); +} + +static void CB2_ReshowBlankBattleScreenAfterMenu(void) +{ + switch (gBattleScripting.reshowMainState) + { + case 0: + ScanlineEffect_Clear(); + BattleInitBgsAndWindows(); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + ResetPaletteFade(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 255; + gBattle_BG3_Y = 0; + break; + case 1: + CpuFastFill(0, (void *)(VRAM), VRAM_SIZE); + break; + case 2: + LoadBattleTextboxAndBackground(); + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = MAX_BATTLERS_COUNT; + break; + case 5: + ClearSpritesHealthboxAnimData(); + break; + case 6: + if (!LoadBattlerSpriteGfx(0)) + gBattleScripting.reshowMainState--; + break; + case 7: + if (!LoadBattlerSpriteGfx(1)) + gBattleScripting.reshowMainState--; + break; + case 8: + if (!LoadBattlerSpriteGfx(2)) + gBattleScripting.reshowMainState--; + break; + case 9: + if (!LoadBattlerSpriteGfx(3)) + gBattleScripting.reshowMainState--; + break; + case 10: + if (gBattleScripting.monCaught) + CreateCaughtMonSprite(); // displays the caught mon for the switch into party feature + break; + default: + SetVBlankCallback(VBlankCB_Battle); + ClearBattleBgCntBaseBlocks(); + BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(BattleMainCB2); + FillAroundBattleWindows(); + break; + } + + gBattleScripting.reshowMainState++; +} + static void ClearBattleBgCntBaseBlocks(void) { vBgCnt *regBgcnt1, *regBgcnt2; @@ -311,3 +396,17 @@ static void CreateHealthboxSprite(u32 battler) } } } + +static void CreateCaughtMonSprite(void) +{ + SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), GetBattlerPosition(gBattlerTarget)); + gBattlerSpriteIds[gBattlerTarget] = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, GetBattlerSpriteSubpriority(gBattlerTarget)); + gSprites[gBattlerSpriteIds[gBattlerTarget]].oam.paletteNum = gBattlerTarget; + gSprites[gBattlerSpriteIds[gBattlerTarget]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[gBattlerTarget]].data[0] = gBattlerTarget; + gSprites[gBattlerSpriteIds[gBattlerTarget]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES); + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[gBattlerTarget]], 0); + + gSprites[gBattlerSpriteIds[gBattlerTarget]].invisible = FALSE; +} From 9aea7c8e3ab1cf312a21b697e64c9a6452b4b938 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 12 Feb 2025 23:36:37 +0100 Subject: [PATCH 108/125] Changed bit order for follower graphicsId creation (#6249) Co-authored-by: Hedara --- include/constants/event_objects.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 219b990c5d..306aa055aa 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -270,10 +270,10 @@ #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) -#define OBJ_EVENT_MON (1 << 13) -#define OBJ_EVENT_MON_SHINY (1 << 14) -#define OBJ_EVENT_MON_FEMALE (1 << 15) -#define OBJ_EVENT_MON_SPECIES_MASK (OBJ_EVENT_MON - 1) +#define OBJ_EVENT_MON (1u << 15) +#define OBJ_EVENT_MON_SHINY (1u << 14) +#define OBJ_EVENT_MON_FEMALE (1u << 13) +#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 13)) // Used to call a specific species' follower graphics. Useful for static encounters. #define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_MON) From 7d1bbf62e1415530f31a469d737f79955a7c2b22 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 13 Feb 2025 10:23:06 +0100 Subject: [PATCH 109/125] Apply suggestions from code review Co-authored-by: Bassoonian --- asm/macros/event.inc | 4 +--- src/event_object_movement.c | 18 +++++++++--------- src/scrcmd.c | 8 ++++---- src/script_movement.c | 12 +++++------- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 3018a774b6..4c0bf54514 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2440,9 +2440,7 @@ .2byte \dest .endm - @ hide any follower pokemon if present, - @ putting them into their pokeball; - @ by default waits for their movement to finish + @ Hides any follower Pokémon if present, putting them into their Poké Ball; by default waits for their movement to finish. .macro hidefollower wait=1 callnative ScrFunc_hidefollower .2byte \wait diff --git a/src/event_object_movement.c b/src/event_object_movement.c index e6c3c4ddf5..8b7733d4e4 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1928,8 +1928,8 @@ struct Pokemon *GetFirstLiveMon(void) { struct Pokemon *mon = &gPlayerParty[i]; if ((OW_MON_ALLOWED_SPECIES && GetMonData(mon, MON_DATA_SPECIES_OR_EGG) != VarGet(OW_MON_ALLOWED_SPECIES)) - || (OW_MON_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_MON_ALLOWED_MET_LVL)) - || (OW_MON_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_MON_ALLOWED_MET_LOC))) + || (OW_MON_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_MON_ALLOWED_MET_LVL)) + || (OW_MON_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_MON_ALLOWED_MET_LOC))) { continue; } @@ -5514,7 +5514,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri // During a script, if player sidesteps or backsteps, // mirror player's direction instead if (ArePlayerFieldControlsLocked() - && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection) + && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection) { direction = gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; objectEvent->facingDirectionLocked = TRUE; @@ -6412,9 +6412,9 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct // When player is moved via script, set copyable movement // for any followers via a lookup table - if (ArePlayerFieldControlsLocked() && - objectEvent->isPlayer && - FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) + if (ArePlayerFieldControlsLocked() + && objectEvent->isPlayer + && FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { objectEvent->playerCopyableMovement = sActionIdToCopyableMovement[objectEvent->movementActionId]; } @@ -6445,9 +6445,9 @@ void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent) // When player is moved via script, set copyable movement // for any followers via a lookup table - if (ArePlayerFieldControlsLocked() && - objectEvent->isPlayer && - FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) + if (ArePlayerFieldControlsLocked() + && objectEvent->isPlayer + && FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { objectEvent->playerCopyableMovement = sActionIdToCopyableMovement[objectEvent->movementActionId]; } diff --git a/src/scrcmd.c b/src/scrcmd.c index b45a0d76a3..9b4d00143a 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -998,7 +998,7 @@ bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) return FALSE; } -struct ObjectEvent * ScriptHideFollower(void) +struct ObjectEvent *ScriptHideFollower(void) { struct ObjectEvent *obj = GetFollowerObject(); @@ -1030,9 +1030,9 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) gObjectEvents[GetObjectEventIdByLocalId(localId)].directionOverwrite = DIR_NONE; ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; - if (localId != OBJ_EVENT_ID_FOLLOWER && - !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT) - && (movementScript < Common_Movement_FollowerSafeStart || movementScript > Common_Movement_FollowerSafeEnd)) + if (localId != OBJ_EVENT_ID_FOLLOWER + && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT) + && (movementScript < Common_Movement_FollowerSafeStart || movementScript > Common_Movement_FollowerSafeEnd)) { ScriptHideFollower(); } diff --git a/src/script_movement.c b/src/script_movement.c index 28e9e02a47..80d9b323f6 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -215,19 +215,17 @@ static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, cons u8 nextMoveActionId; struct ObjectEvent *obj = &gObjectEvents[objEventId]; - if (ObjectEventIsHeldMovementActive(obj) && - !ObjectEventClearHeldMovementIfFinished(obj)) + if (ObjectEventIsHeldMovementActive(obj) && !ObjectEventClearHeldMovementIfFinished(obj)) { // If, while undergoing scripted movement, // a non-player object collides with an active follower pokemon, // put that follower into a pokeball // (sTimer helps limit this expensive check to once per step) - if (OW_FOLLOWERS_SCRIPT_MOVEMENT && - gSprites[obj->spriteId].sTimer == 1 && - (objEventId = GetObjectObjectCollidesWith(obj, 0, 0, TRUE)) < OBJECT_EVENTS_COUNT && + if (OW_FOLLOWERS_SCRIPT_MOVEMENT && gSprites[obj->spriteId].sTimer == 1 + && (objEventId = GetObjectObjectCollidesWith(obj, 0, 0, TRUE)) < OBJECT_EVENTS_COUNT // switch `obj` to follower - ((obj = &gObjectEvents[objEventId])->movementType == MOVEMENT_TYPE_FOLLOW_PLAYER) && - gSprites[obj->spriteId].sTypeFuncId != 0) + && ((obj = &gObjectEvents[objEventId])->movementType == MOVEMENT_TYPE_FOLLOW_PLAYER) + && gSprites[obj->spriteId].sTypeFuncId != 0) { ClearObjectEventMovement(obj, &gSprites[obj->spriteId]); ScriptMovement_StartObjectMovementScript(obj->localId, obj->mapNum, obj->mapGroup, EnterPokeballMovement); From 0da3e4988940cb34c654f063621ba1851b8a12d7 Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 13 Feb 2025 10:36:52 +0100 Subject: [PATCH 110/125] Review comments --- include/config/overworld.h | 29 ++++++++++++++++++++++++----- include/constants/event_objects.h | 21 --------------------- include/constants/flags.h | 5 ++--- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index 7f5be368c2..e09e423a35 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -58,11 +58,30 @@ #define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations #define OW_FOLLOWERS_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball -// New/old handling for followers during scripts; -// TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default -// (scripted player movement moves follower too!) -// FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default -#define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE + +#define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE // TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default + // FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default + +// If set, the only pokemon allowed to follow you +// will be those matching species, met location, +// and/or met level; +// These accept vars, too: VAR_TEMP_1, etc +#define OW_MON_ALLOWED_SPECIES (0) +#define OW_MON_ALLOWED_MET_LVL (0) +#define OW_MON_ALLOWED_MET_LOC (0) +// Examples: +// Yellow Pikachu: +// #define OW_MON_ALLOWED_SPECIES (SPECIES_PIKACHU) +// #define OW_MON_ALLOWED_MET_LVL (0) +// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) +// Hoenn Starter: +// #define OW_MON_ALLOWED_SPECIES (0) +// #define OW_MON_ALLOWED_MET_LVL (5) +// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) +// Species set in VAR_XXXX: +// #define OW_MON_ALLOWED_SPECIES (VAR_XXXX) +// #define OW_MON_ALLOWED_MET_LVL (0) +// #define OW_MON_ALLOWED_MET_LOC (0) // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded. diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index b9f2622b54..219b990c5d 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -295,27 +295,6 @@ #define SHADOW_SIZE_XL_BATTLE_ONLY SHADOW_SIZE_NONE // Battle-only definition for XL shadow size. -// If set, the only pokemon allowed to follow you -// will be those matching species, met location, -// and/or met level; -// These accept vars, too: VAR_TEMP_1, etc -#define OW_MON_ALLOWED_SPECIES (0) -#define OW_MON_ALLOWED_MET_LVL (0) -#define OW_MON_ALLOWED_MET_LOC (0) -// Examples: -// Yellow Pikachu: -// #define OW_MON_ALLOWED_SPECIES (SPECIES_PIKACHU) -// #define OW_MON_ALLOWED_MET_LVL (0) -// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) -// Hoenn Starter: -// #define OW_MON_ALLOWED_SPECIES (0) -// #define OW_MON_ALLOWED_MET_LVL (5) -// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) -// Species set in VAR_XXXX: -// #define OW_MON_ALLOWED_SPECIES (VAR_XXXX) -// #define OW_MON_ALLOWED_MET_LVL (0) -// #define OW_MON_ALLOWED_MET_LOC (0) - #define F_INANIMATE (1 << 6) #define F_DISABLE_REFLECTION_PALETTE_LOAD (1 << 7) diff --git a/include/constants/flags.h b/include/constants/flags.h index 9450c6de1c..8685faca6f 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1647,9 +1647,8 @@ #define FLAG_ENABLE_MULTI_CORRIDOR_DOOR (SPECIAL_FLAGS_START + 0x2) #define FLAG_SPECIAL_FLAG_UNUSED_0x4003 (SPECIAL_FLAGS_START + 0x3) // Unused Flag #define FLAG_STORING_ITEMS_IN_PYRAMID_BAG (SPECIAL_FLAGS_START + 0x4) -// When set, `applymovement` does not hide follower pokemon; -// Also, scripted movements on the player will move follower(s), too -#define FLAG_SAFE_FOLLOWER_MOVEMENT (SPECIAL_FLAGS_START + 0x5) +#define FLAG_SAFE_FOLLOWER_MOVEMENT (SPECIAL_FLAGS_START + 0x5) // When set, applymovement does not put the follower inside a pokeball + // Also, scripted movements on the player will move follower(s), too // FLAG_SPECIAL_FLAG_0x4005 - 0x407F also exist and are unused #define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F) #define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) From 35324497a6438c27a06fdba0fe6e3eccd42908d7 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 13 Feb 2025 13:35:38 +0100 Subject: [PATCH 111/125] Update src/event_object_movement.c --- src/event_object_movement.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 8b7733d4e4..36b8ea69e7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -6201,7 +6201,8 @@ static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent, return FALSE; } -u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords) { +u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords) +{ u8 i; struct ObjectEvent *curObject; From 845679471f22a364b1fba10e09d26ad3b2efa5e7 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 13 Feb 2025 13:32:08 -0300 Subject: [PATCH 112/125] Added missing Dream Eater and Reflect Type tests (#6245) --- src/data/moves_info.h | 1 + test/battle/move_effect/dream_eater.c | 62 ++++++++++++++++++++++++-- test/battle/move_effect/reflect_type.c | 42 ++++++++++++++--- 3 files changed, 97 insertions(+), 8 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 31ac2afe4c..0589866293 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -3550,6 +3550,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .healingMove = B_HEAL_BLOCKING >= GEN_6, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index 85bdb42ac9..70319be9c5 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -55,6 +55,62 @@ SINGLE_BATTLE_TEST("Dream Eater fails if Heal Block applies") } } -TO_DO_BATTLE_TEST("Dream Eater works on targets with Comatose"); -TO_DO_BATTLE_TEST("Dream Eater fails if the target is behind a Substitute (Gen 1-4)"); -TO_DO_BATTLE_TEST("Dream Eater works if the target is behind a Substitute (Gen 5+)"); +SINGLE_BATTLE_TEST("Dream Eater works on targets with Comatose") +{ + s16 damage; + s16 healed; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + } WHEN { + TURN { MOVE(player, MOVE_DREAM_EATER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DREAM_EATER, player); + HP_BAR(opponent, captureDamage: &damage); + HP_BAR(player, captureDamage: &healed); + } THEN { + EXPECT_MUL_EQ(damage, Q_4_12(-1.0/2.0), healed); + } +} + +#if B_UPDATED_MOVE_FLAGS < GEN_5 +SINGLE_BATTLE_TEST("Dream Eater fails if the target is behind a Substitute (Gen 1-4)") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + ASSUME(!gMovesInfo[MOVE_DREAM_EATER].ignoresSubstitute); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_YAWN); MOVE(player, MOVE_SUBSTITUTE); } + TURN { } + TURN { MOVE(opponent, MOVE_DREAM_EATER); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Dream Eater!"); + MESSAGE("Wobbuffet wasn't affected!"); + } +} +#else +SINGLE_BATTLE_TEST("Dream Eater works if the target is behind a Substitute (Gen 5+)") +{ + s16 damage; + s16 healed; + GIVEN { + ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_YAWN); MOVE(player, MOVE_SUBSTITUTE); } + TURN { } + TURN { MOVE(opponent, MOVE_DREAM_EATER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DREAM_EATER, opponent); + HP_BAR(player, captureDamage: &damage); + HP_BAR(opponent, captureDamage: &healed); + } THEN { + EXPECT_MUL_EQ(damage, Q_4_12(-1.0/2.0), healed); + } +} +#endif diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index fc152fc27f..f3093ea4e3 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -1,9 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Reflect Type fails if the user is Terastallized"); -TO_DO_BATTLE_TEST("Reflect Type succeeds against a Terastallized target and copies its Tera type"); - SINGLE_BATTLE_TEST("Reflect Type does not affect any of Arceus' forms") { u32 j; @@ -86,7 +83,7 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms") } } -SINGLE_BATTLE_TEST("Reflect Type does not affect Pokémon with no types") +SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); @@ -151,7 +148,7 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") } } -SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's types[0] and types[1] if the target only has a 3rd type") +SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's 1st and 2nd types if the target only has a 3rd type") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); @@ -184,3 +181,38 @@ SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's types[0] EXPECT_EQ(player->types[2], TYPE_GRASS); } } + +SINGLE_BATTLE_TEST("Reflect Type fails if the user is Terastallized") +{ + GIVEN { + PLAYER(SPECIES_ARCANINE) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_POLIWRATH); + } WHEN { + TURN { MOVE(player, MOVE_REFLECT_TYPE, gimmick: GIMMICK_TERA); } + } SCENE { + MESSAGE("Arcanine used Reflect Type!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(player->types[0], TYPE_FIRE); + EXPECT_EQ(player->types[1], TYPE_FIRE); + EXPECT_EQ(player->types[2], TYPE_MYSTERY); + } +} + +SINGLE_BATTLE_TEST("Reflect Type succeeds against a Terastallized target and copies its Tera type") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] != TYPE_NORMAL); + ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] != TYPE_NORMAL); + PLAYER(SPECIES_ARCANINE) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_POLIWRATH); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_REFLECT_TYPE); } + } SCENE { + MESSAGE("The opposing Poliwrath used Reflect Type!"); + } THEN { + EXPECT_EQ(opponent->types[0], TYPE_NORMAL); + EXPECT_EQ(opponent->types[1], TYPE_NORMAL); + EXPECT_EQ(opponent->types[2], TYPE_NORMAL); + } +} From 0438b66f632d224b96465b52eb2dce4dc2c1668e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:33:21 +0100 Subject: [PATCH 113/125] Minor Clean up for CanAbilityX. Follow up for #6183 (#6252) --- include/battle_util.h | 4 ++-- src/battle_ai_main.c | 4 ++-- src/battle_ai_util.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index e8b0dc697f..eeb3f89135 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -24,8 +24,8 @@ enum AbilityEffectOptions { - ABILITY_CHECK_TRIGGER, - ABILITY_RUN_SCRIPT, + ABILITY_CHECK_TRIGGER, + ABILITY_RUN_SCRIPT, }; enum MoveAbsorbed diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8692cf1bcf..044c1f4812 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -893,10 +893,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // target ability checks if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE)) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER)) RETURN_SCORE_MINUS(20); - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER)) RETURN_SCORE_MINUS(20); switch (aiData->abilities[battlerDef]) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 59308251c4..a122807293 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -436,10 +436,10 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE)) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER)) return TRUE; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER)) return TRUE; switch (GetMoveEffect(move)) From 8448e745eaa362b89edfb351abc09c1c5afaa98c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:33:59 +0100 Subject: [PATCH 114/125] Adds a follower flag define to disable followers on the fly (#6174) --- include/config/overworld.h | 1 + src/event_object_movement.c | 1 + src/overworld.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/include/config/overworld.h b/include/config/overworld.h index e522c978fa..3af0a6589c 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -60,6 +60,7 @@ #define OW_FOLLOWERS_WEATHER_FORMS FALSE // If TRUE, Castform and Cherrim gain FORM_CHANGE_OVERWORLD_WEATHER, which will make them transform in the overworld based on the weather. #define OW_FOLLOWERS_COPY_WILD_PKMN FALSE // If TRUE, follower Pokémon that know Transform or have Illusion/Imposter will copy wild Pokémon at random. #define OW_BATTLE_ONLY_FORMS TRUE // If TRUE, loads overworld sprites for battle-only forms like Mega Evos. Requires OW_POKEMON_OBJECT_EVENTS. +#define B_FLAG_FOLLOWERS_DISABLED 0 // Enables / Disables followers by using a flag. Helpful to disable followers for a period of time. // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded. diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 4dcb1bc1a9..608eed25f7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2179,6 +2179,7 @@ void UpdateFollowingPokemon(void) // 3. flag is set if (OW_POKEMON_OBJECT_EVENTS == FALSE || OW_FOLLOWERS_ENABLED == FALSE + || FlagGet(B_FLAG_FOLLOWERS_DISABLED) || !GetFollowerInfo(&species, &shiny, &female) || SpeciesToGraphicsInfo(species, shiny, female) == NULL || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, shiny, female)->oam->size > ST_OAM_SIZE_2) diff --git a/src/overworld.c b/src/overworld.c index 05c04d0fba..c94c67516a 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -73,6 +73,8 @@ #include "constants/trainer_hill.h" #include "constants/weather.h" +STATIC_ASSERT((B_FLAG_FOLLOWERS_DISABLED == 0 && !OW_FOLLOWERS_ENABLED), FollowersFlagAssignedWithoutEnablingThem); + struct CableClubPlayer { u8 playerId; From f851fb536ad6686f5f55d609d7f63ec75a7fc2e5 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:34:40 -0500 Subject: [PATCH 115/125] Improve Yawn and Status Switching (#6202) Co-authored-by: Bassoonian --- src/battle_ai_switch_items.c | 8 +++++++- test/battle/ai/ai_switching.c | 35 ++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 908568769e..fcd8b5ce71 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -593,6 +593,10 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { switchMon = TRUE; + // If we don't have a good switchin, not worth switching + if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) + switchMon = FALSE; + // Check if Active Pokemon can KO opponent instead of switching // Will still fall asleep, but take out opposing Pokemon first if (AiExpectsToFaintPlayer(battler)) @@ -626,7 +630,8 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) // Secondary Damage if (monAbility != ABILITY_MAGIC_GUARD - && !AiExpectsToFaintPlayer(battler)) + && !AiExpectsToFaintPlayer(battler) + && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) { //Toxic if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2)) @@ -654,6 +659,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) // Infatuation if (gBattleMons[battler].status2 & STATUS2_INFATUATION && !AiExpectsToFaintPlayer(battler) + && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 227909e400..367afbc0f1 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -655,7 +655,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining and it has a good switchin") { u32 hp; PARAMETRIZE { hp = 30; } @@ -665,8 +665,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } - OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } - OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_HEADBUTT); } } WHEN { TURN { MOVE(player, MOVE_YAWN) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } if (hp == 30) @@ -676,6 +676,23 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if it has been Yawn'd with more than 1/3 HP remaining and it does not have a good switchin") +{ + u32 hp; + PARAMETRIZE { hp = 30; } + PARAMETRIZE { hp = 10; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } + OPPONENT(SPECIES_SLAKOTH) { Level(1); Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, MOVE_YAWN) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + } +} + AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining (Doubles)") { u32 hp; @@ -1005,15 +1022,15 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out if Yawn'd wi GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_SLOWKING) { Moves(MOVE_YAWN, MOVE_CONFUSION, MOVE_POWER_GEM, MOVE_WATER_PULSE); Item(ITEM_LEFTOVERS); } - OPPONENT(SPECIES_SCOLIPEDE) { Moves(MOVE_POISON_TAIL); } - OPPONENT(SPECIES_ABSOL) { Moves(MOVE_KNOCK_OFF, MOVE_CRUNCH); } + PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_HEADBUTT); } } WHEN { - TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_POISON_TAIL); } + TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_TACKLE); } if (aceFlag) - TURN { MOVE(player, MOVE_POWER_GEM); EXPECT_MOVE(opponent, MOVE_POISON_TAIL); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); } else - TURN { MOVE(player, MOVE_POWER_GEM); EXPECT_SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_SWITCH(opponent, 1); } } } From a42de40eb2fb47dcd1fcb58cf5c928ab22832139 Mon Sep 17 00:00:00 2001 From: moostoet <70690976+moostoet@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:51:25 +0100 Subject: [PATCH 116/125] Add function to adjust AI scoring for generalized item effects (#6247) --- include/battle_ai_main.h | 2 +- include/config/ai.h | 3 +++ src/battle_ai_main.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index f30759fd24..b21b20751d 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -35,7 +35,7 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define POWERFUL_STATUS_MOVE 10 // Moves with this score will be chosen over a move that faints target #define NO_DAMAGE_OR_FAILS -20 // Move fails or does no damage -// Scores given in AI_CalcMoveEffectScore +// Scores given in AI_CalcMoveEffectScore and AI_CalcHoldEffectMoveScore #define NO_INCREASE 0 #define WEAK_EFFECT 1 #define DECENT_EFFECT 2 diff --git a/include/config/ai.h b/include/config/ai.h index 686ac14c22..48205b733e 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -43,6 +43,9 @@ #define SHOULD_SWITCH_REGENERATOR_PERCENTAGE 50 #define SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE 20 +// AI held item-based move scoring +#define BLUNDER_POLICY_ACCURACY_THRESHOLD 75 // Moves with accuracy equal below this value are prioritized when holding Blunder Policy + // AI prediction chances #define PREDICT_SWITCH_CHANCE 50 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 044c1f4812..efda602fef 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3295,6 +3295,34 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) return score; } +static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) +{ + struct AiLogicData *aiData = AI_DATA; + u32 holdEffect = aiData->holdEffects[battlerAtk]; + + s32 score = 0; + + switch (holdEffect) + { + case HOLD_EFFECT_BLUNDER_POLICY: + { + u32 moveAcc = aiData->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + + if (moveAcc <= BLUNDER_POLICY_ACCURACY_THRESHOLD) + { + ADJUST_SCORE(GOOD_EFFECT); + } + else + { + ADJUST_SCORE(-DECENT_EFFECT); + } + } + break; + } + + return score; +} + static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { // move data @@ -4831,6 +4859,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move)); + ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move)); return score; } From d1b2b045d0a23e6db9405db122f52a4000a27aab Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:58:12 -0500 Subject: [PATCH 117/125] Moved sValidApprenticeMove into gMovesInfo (#6254) --- include/move.h | 4 +- src/apprentice.c | 4 +- src/data/battle_frontier/apprentice.h | 361 -------------------------- src/data/moves_info.h | 297 +++++++++++++++++++++ 4 files changed, 302 insertions(+), 364 deletions(-) diff --git a/include/move.h b/include/move.h index 855dba10c3..d5f14078d6 100644 --- a/include/move.h +++ b/include/move.h @@ -104,7 +104,9 @@ struct MoveInfo bool32 parentalBondBanned:1; bool32 skyBattleBanned:1; bool32 sketchBanned:1; - u32 padding:19; + //Other + bool32 validApprenticeMove:1; + u32 padding:18; // end of word union { diff --git a/src/apprentice.c b/src/apprentice.c index 66011fe76c..7769dde6e3 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -339,7 +339,7 @@ static u16 GetRandomAlternateMove(u8 monId) numLearnsetMoves = j; i = 0; - // i < 5 here is arbitrary, i isnt used and is only incremented when the selected move isnt in sValidApprenticeMoves + // i < 5 here is arbitrary, i isn't used and is only incremented when the selected move isn't valid (determined by the validApprenticeMove value) // This while loop contains 3 potential infinite loops, though none of them would occur in the base game while (i < 5) { @@ -411,7 +411,7 @@ static u16 GetRandomAlternateMove(u8 monId) if (TrySetMove(monId, moveId)) { - if (sValidApprenticeMoves[moveId]) + if (gMovesInfo[moveId].validApprenticeMove) break; i++; } diff --git a/src/data/battle_frontier/apprentice.h b/src/data/battle_frontier/apprentice.h index 408c3902d5..ef0a77bf11 100644 --- a/src/data/battle_frontier/apprentice.h +++ b/src/data/battle_frontier/apprentice.h @@ -568,367 +568,6 @@ static const u8 *const sApprenticeChallengeTexts[NUM_APPRENTICES] = gText_ApprenticeChallenge15, }; -// Unclear what the criteria are for valid moves -// Notably, a large percentage of multi-strike moves are not valid -static const bool8 sValidApprenticeMoves[MOVES_COUNT] = -{ - [MOVE_NONE] = FALSE, - [MOVE_POUND] = FALSE, - [MOVE_KARATE_CHOP] = TRUE, - [MOVE_DOUBLE_SLAP] = TRUE, - [MOVE_COMET_PUNCH] = FALSE, - [MOVE_MEGA_PUNCH] = TRUE, - [MOVE_PAY_DAY] = FALSE, - [MOVE_FIRE_PUNCH] = TRUE, - [MOVE_ICE_PUNCH] = TRUE, - [MOVE_THUNDER_PUNCH] = TRUE, - [MOVE_SCRATCH] = FALSE, - [MOVE_VISE_GRIP] = FALSE, - [MOVE_GUILLOTINE] = TRUE, - [MOVE_RAZOR_WIND] = FALSE, - [MOVE_SWORDS_DANCE] = TRUE, - [MOVE_CUT] = FALSE, - [MOVE_GUST] = FALSE, - [MOVE_WING_ATTACK] = FALSE, - [MOVE_WHIRLWIND] = TRUE, - [MOVE_FLY] = TRUE, - [MOVE_BIND] = TRUE, - [MOVE_SLAM] = TRUE, - [MOVE_VINE_WHIP] = FALSE, - [MOVE_STOMP] = TRUE, - [MOVE_DOUBLE_KICK] = TRUE, - [MOVE_MEGA_KICK] = TRUE, - [MOVE_JUMP_KICK] = TRUE, - [MOVE_ROLLING_KICK] = TRUE, - [MOVE_SAND_ATTACK] = TRUE, - [MOVE_HEADBUTT] = TRUE, - [MOVE_HORN_ATTACK] = FALSE, - [MOVE_FURY_ATTACK] = FALSE, - [MOVE_HORN_DRILL] = TRUE, - [MOVE_TACKLE] = FALSE, - [MOVE_BODY_SLAM] = TRUE, - [MOVE_WRAP] = TRUE, - [MOVE_TAKE_DOWN] = TRUE, - [MOVE_THRASH] = TRUE, - [MOVE_DOUBLE_EDGE] = TRUE, - [MOVE_TAIL_WHIP] = FALSE, - [MOVE_POISON_STING] = FALSE, - [MOVE_TWINEEDLE] = TRUE, - [MOVE_PIN_MISSILE] = FALSE, - [MOVE_LEER] = FALSE, - [MOVE_BITE] = TRUE, - [MOVE_GROWL] = FALSE, - [MOVE_ROAR] = TRUE, - [MOVE_SING] = TRUE, - [MOVE_SUPERSONIC] = TRUE, - [MOVE_SONIC_BOOM] = TRUE, - [MOVE_DISABLE] = TRUE, - [MOVE_ACID] = FALSE, - [MOVE_EMBER] = FALSE, - [MOVE_FLAMETHROWER] = TRUE, - [MOVE_MIST] = TRUE, - [MOVE_WATER_GUN] = FALSE, - [MOVE_HYDRO_PUMP] = TRUE, - [MOVE_SURF] = TRUE, - [MOVE_ICE_BEAM] = TRUE, - [MOVE_BLIZZARD] = TRUE, - [MOVE_PSYBEAM] = TRUE, - [MOVE_BUBBLE_BEAM] = FALSE, - [MOVE_AURORA_BEAM] = FALSE, - [MOVE_HYPER_BEAM] = TRUE, - [MOVE_PECK] = FALSE, - [MOVE_DRILL_PECK] = TRUE, - [MOVE_SUBMISSION] = TRUE, - [MOVE_LOW_KICK] = TRUE, - [MOVE_COUNTER] = TRUE, - [MOVE_SEISMIC_TOSS] = TRUE, - [MOVE_STRENGTH] = TRUE, - [MOVE_ABSORB] = FALSE, - [MOVE_MEGA_DRAIN] = FALSE, - [MOVE_LEECH_SEED] = TRUE, - [MOVE_GROWTH] = TRUE, - [MOVE_RAZOR_LEAF] = TRUE, - [MOVE_SOLAR_BEAM] = TRUE, - [MOVE_POISON_POWDER] = TRUE, - [MOVE_STUN_SPORE] = TRUE, - [MOVE_SLEEP_POWDER] = TRUE, - [MOVE_PETAL_DANCE] = TRUE, - [MOVE_STRING_SHOT] = FALSE, - [MOVE_DRAGON_RAGE] = TRUE, - [MOVE_FIRE_SPIN] = TRUE, - [MOVE_THUNDER_SHOCK] = FALSE, - [MOVE_THUNDERBOLT] = TRUE, - [MOVE_THUNDER_WAVE] = TRUE, - [MOVE_THUNDER] = TRUE, - [MOVE_ROCK_THROW] = FALSE, - [MOVE_EARTHQUAKE] = TRUE, - [MOVE_FISSURE] = TRUE, - [MOVE_DIG] = TRUE, - [MOVE_TOXIC] = TRUE, - [MOVE_CONFUSION] = FALSE, - [MOVE_PSYCHIC] = TRUE, - [MOVE_HYPNOSIS] = TRUE, - [MOVE_MEDITATE] = TRUE, - [MOVE_AGILITY] = TRUE, - [MOVE_QUICK_ATTACK] = TRUE, - [MOVE_RAGE] = FALSE, - [MOVE_TELEPORT] = FALSE, - [MOVE_NIGHT_SHADE] = TRUE, - [MOVE_MIMIC] = TRUE, - [MOVE_SCREECH] = TRUE, - [MOVE_DOUBLE_TEAM] = TRUE, - [MOVE_RECOVER] = TRUE, - [MOVE_HARDEN] = TRUE, - [MOVE_MINIMIZE] = TRUE, - [MOVE_SMOKESCREEN] = TRUE, - [MOVE_CONFUSE_RAY] = TRUE, - [MOVE_WITHDRAW] = TRUE, - [MOVE_DEFENSE_CURL] = TRUE, - [MOVE_BARRIER] = TRUE, - [MOVE_LIGHT_SCREEN] = TRUE, - [MOVE_HAZE] = TRUE, - [MOVE_REFLECT] = TRUE, - [MOVE_FOCUS_ENERGY] = TRUE, - [MOVE_BIDE] = FALSE, - [MOVE_METRONOME] = TRUE, - [MOVE_MIRROR_MOVE] = TRUE, - [MOVE_SELF_DESTRUCT] = TRUE, - [MOVE_EGG_BOMB] = TRUE, - [MOVE_LICK] = TRUE, - [MOVE_SMOG] = FALSE, - [MOVE_SLUDGE] = FALSE, - [MOVE_BONE_CLUB] = FALSE, - [MOVE_FIRE_BLAST] = TRUE, - [MOVE_WATERFALL] = TRUE, - [MOVE_CLAMP] = TRUE, - [MOVE_SWIFT] = TRUE, - [MOVE_SKULL_BASH] = TRUE, - [MOVE_SPIKE_CANNON] = FALSE, - [MOVE_CONSTRICT] = FALSE, - [MOVE_AMNESIA] = TRUE, - [MOVE_KINESIS] = TRUE, - [MOVE_SOFT_BOILED] = TRUE, - [MOVE_HIGH_JUMP_KICK] = TRUE, - [MOVE_GLARE] = TRUE, - [MOVE_DREAM_EATER] = TRUE, - [MOVE_POISON_GAS] = FALSE, - [MOVE_BARRAGE] = FALSE, - [MOVE_LEECH_LIFE] = FALSE, - [MOVE_LOVELY_KISS] = TRUE, - [MOVE_SKY_ATTACK] = TRUE, - [MOVE_TRANSFORM] = TRUE, - [MOVE_BUBBLE] = FALSE, - [MOVE_DIZZY_PUNCH] = TRUE, - [MOVE_SPORE] = TRUE, - [MOVE_FLASH] = TRUE, - [MOVE_PSYWAVE] = TRUE, - [MOVE_SPLASH] = FALSE, - [MOVE_ACID_ARMOR] = TRUE, - [MOVE_CRABHAMMER] = TRUE, - [MOVE_EXPLOSION] = TRUE, - [MOVE_FURY_SWIPES] = FALSE, - [MOVE_BONEMERANG] = TRUE, - [MOVE_REST] = TRUE, - [MOVE_ROCK_SLIDE] = TRUE, - [MOVE_HYPER_FANG] = TRUE, - [MOVE_SHARPEN] = TRUE, - [MOVE_CONVERSION] = TRUE, - [MOVE_TRI_ATTACK] = TRUE, - [MOVE_SUPER_FANG] = TRUE, - [MOVE_SLASH] = TRUE, - [MOVE_SUBSTITUTE] = TRUE, - [MOVE_STRUGGLE] = TRUE, - [MOVE_SKETCH] = TRUE, - [MOVE_TRIPLE_KICK] = TRUE, - [MOVE_THIEF] = TRUE, - [MOVE_SPIDER_WEB] = TRUE, - [MOVE_MIND_READER] = TRUE, - [MOVE_NIGHTMARE] = TRUE, - [MOVE_FLAME_WHEEL] = FALSE, - [MOVE_SNORE] = TRUE, - [MOVE_CURSE] = TRUE, - [MOVE_FLAIL] = TRUE, - [MOVE_CONVERSION_2] = TRUE, - [MOVE_AEROBLAST] = TRUE, - [MOVE_COTTON_SPORE] = TRUE, - [MOVE_REVERSAL] = TRUE, - [MOVE_SPITE] = TRUE, - [MOVE_POWDER_SNOW] = FALSE, - [MOVE_PROTECT] = TRUE, - [MOVE_MACH_PUNCH] = TRUE, - [MOVE_SCARY_FACE] = TRUE, - [MOVE_FEINT_ATTACK] = TRUE, - [MOVE_SWEET_KISS] = TRUE, - [MOVE_BELLY_DRUM] = TRUE, - [MOVE_SLUDGE_BOMB] = TRUE, - [MOVE_MUD_SLAP] = TRUE, - [MOVE_OCTAZOOKA] = TRUE, - [MOVE_SPIKES] = TRUE, - [MOVE_ZAP_CANNON] = TRUE, - [MOVE_FORESIGHT] = TRUE, - [MOVE_DESTINY_BOND] = TRUE, - [MOVE_PERISH_SONG] = TRUE, - [MOVE_ICY_WIND] = TRUE, - [MOVE_DETECT] = TRUE, - [MOVE_BONE_RUSH] = FALSE, - [MOVE_LOCK_ON] = TRUE, - [MOVE_OUTRAGE] = TRUE, - [MOVE_SANDSTORM] = TRUE, - [MOVE_GIGA_DRAIN] = TRUE, - [MOVE_ENDURE] = TRUE, - [MOVE_CHARM] = TRUE, - [MOVE_ROLLOUT] = TRUE, - [MOVE_FALSE_SWIPE] = TRUE, - [MOVE_SWAGGER] = TRUE, - [MOVE_MILK_DRINK] = TRUE, - [MOVE_SPARK] = FALSE, - [MOVE_FURY_CUTTER] = TRUE, - [MOVE_STEEL_WING] = TRUE, - [MOVE_MEAN_LOOK] = TRUE, - [MOVE_ATTRACT] = TRUE, - [MOVE_SLEEP_TALK] = TRUE, - [MOVE_HEAL_BELL] = TRUE, - [MOVE_RETURN] = TRUE, - [MOVE_PRESENT] = TRUE, - [MOVE_FRUSTRATION] = TRUE, - [MOVE_SAFEGUARD] = TRUE, - [MOVE_PAIN_SPLIT] = TRUE, - [MOVE_SACRED_FIRE] = TRUE, - [MOVE_MAGNITUDE] = FALSE, - [MOVE_DYNAMIC_PUNCH] = TRUE, - [MOVE_MEGAHORN] = TRUE, - [MOVE_DRAGON_BREATH] = TRUE, - [MOVE_BATON_PASS] = TRUE, - [MOVE_ENCORE] = TRUE, - [MOVE_PURSUIT] = TRUE, - [MOVE_RAPID_SPIN] = TRUE, - [MOVE_SWEET_SCENT] = TRUE, - [MOVE_IRON_TAIL] = TRUE, - [MOVE_METAL_CLAW] = TRUE, - [MOVE_VITAL_THROW] = TRUE, - [MOVE_MORNING_SUN] = TRUE, - [MOVE_SYNTHESIS] = TRUE, - [MOVE_MOONLIGHT] = TRUE, - [MOVE_HIDDEN_POWER] = TRUE, - [MOVE_CROSS_CHOP] = TRUE, - [MOVE_TWISTER] = FALSE, - [MOVE_RAIN_DANCE] = TRUE, - [MOVE_SUNNY_DAY] = TRUE, - [MOVE_CRUNCH] = TRUE, - [MOVE_MIRROR_COAT] = TRUE, - [MOVE_PSYCH_UP] = TRUE, - [MOVE_EXTREME_SPEED] = TRUE, - [MOVE_ANCIENT_POWER] = TRUE, - [MOVE_SHADOW_BALL] = TRUE, - [MOVE_FUTURE_SIGHT] = TRUE, - [MOVE_ROCK_SMASH] = TRUE, - [MOVE_WHIRLPOOL] = TRUE, - [MOVE_BEAT_UP] = TRUE, - [MOVE_FAKE_OUT] = TRUE, - [MOVE_UPROAR] = TRUE, - [MOVE_STOCKPILE] = TRUE, - [MOVE_SPIT_UP] = TRUE, - [MOVE_SWALLOW] = TRUE, - [MOVE_HEAT_WAVE] = TRUE, - [MOVE_HAIL] = TRUE, - [MOVE_TORMENT] = TRUE, - [MOVE_FLATTER] = TRUE, - [MOVE_WILL_O_WISP] = TRUE, - [MOVE_MEMENTO] = TRUE, - [MOVE_FACADE] = TRUE, - [MOVE_FOCUS_PUNCH] = TRUE, - [MOVE_SMELLING_SALTS] = TRUE, - [MOVE_FOLLOW_ME] = TRUE, - [MOVE_NATURE_POWER] = TRUE, - [MOVE_CHARGE] = TRUE, - [MOVE_TAUNT] = TRUE, - [MOVE_HELPING_HAND] = TRUE, - [MOVE_TRICK] = TRUE, - [MOVE_ROLE_PLAY] = TRUE, - [MOVE_WISH] = TRUE, - [MOVE_ASSIST] = TRUE, - [MOVE_INGRAIN] = TRUE, - [MOVE_SUPERPOWER] = TRUE, - [MOVE_MAGIC_COAT] = TRUE, - [MOVE_RECYCLE] = TRUE, - [MOVE_REVENGE] = TRUE, - [MOVE_BRICK_BREAK] = TRUE, - [MOVE_YAWN] = TRUE, - [MOVE_KNOCK_OFF] = TRUE, - [MOVE_ENDEAVOR] = TRUE, - [MOVE_ERUPTION] = TRUE, - [MOVE_SKILL_SWAP] = TRUE, - [MOVE_IMPRISON] = TRUE, - [MOVE_REFRESH] = TRUE, - [MOVE_GRUDGE] = TRUE, - [MOVE_SNATCH] = TRUE, - [MOVE_SECRET_POWER] = TRUE, - [MOVE_DIVE] = TRUE, - [MOVE_ARM_THRUST] = FALSE, - [MOVE_CAMOUFLAGE] = TRUE, - [MOVE_TAIL_GLOW] = TRUE, - [MOVE_LUSTER_PURGE] = TRUE, - [MOVE_MIST_BALL] = TRUE, - [MOVE_FEATHER_DANCE] = TRUE, - [MOVE_TEETER_DANCE] = TRUE, - [MOVE_BLAZE_KICK] = TRUE, - [MOVE_MUD_SPORT] = TRUE, - [MOVE_ICE_BALL] = FALSE, - [MOVE_NEEDLE_ARM] = TRUE, - [MOVE_SLACK_OFF] = TRUE, - [MOVE_HYPER_VOICE] = TRUE, - [MOVE_POISON_FANG] = FALSE, - [MOVE_CRUSH_CLAW] = TRUE, - [MOVE_BLAST_BURN] = TRUE, - [MOVE_HYDRO_CANNON] = TRUE, - [MOVE_METEOR_MASH] = TRUE, - [MOVE_ASTONISH] = TRUE, - [MOVE_WEATHER_BALL] = TRUE, - [MOVE_AROMATHERAPY] = TRUE, - [MOVE_FAKE_TEARS] = TRUE, - [MOVE_AIR_CUTTER] = TRUE, - [MOVE_OVERHEAT] = TRUE, - [MOVE_ODOR_SLEUTH] = TRUE, - [MOVE_ROCK_TOMB] = TRUE, - [MOVE_SILVER_WIND] = TRUE, - [MOVE_METAL_SOUND] = TRUE, - [MOVE_GRASS_WHISTLE] = TRUE, - [MOVE_TICKLE] = TRUE, - [MOVE_COSMIC_POWER] = TRUE, - [MOVE_WATER_SPOUT] = TRUE, - [MOVE_SIGNAL_BEAM] = TRUE, - [MOVE_SHADOW_PUNCH] = TRUE, - [MOVE_EXTRASENSORY] = TRUE, - [MOVE_SKY_UPPERCUT] = TRUE, - [MOVE_SAND_TOMB] = TRUE, - [MOVE_SHEER_COLD] = TRUE, - [MOVE_MUDDY_WATER] = TRUE, - [MOVE_BULLET_SEED] = FALSE, - [MOVE_AERIAL_ACE] = TRUE, - [MOVE_ICICLE_SPEAR] = FALSE, - [MOVE_IRON_DEFENSE] = TRUE, - [MOVE_BLOCK] = TRUE, - [MOVE_HOWL] = TRUE, - [MOVE_DRAGON_CLAW] = TRUE, - [MOVE_FRENZY_PLANT] = TRUE, - [MOVE_BULK_UP] = TRUE, - [MOVE_BOUNCE] = TRUE, - [MOVE_MUD_SHOT] = FALSE, - [MOVE_POISON_TAIL] = TRUE, - [MOVE_COVET] = TRUE, - [MOVE_VOLT_TACKLE] = TRUE, - [MOVE_MAGICAL_LEAF] = TRUE, - [MOVE_WATER_SPORT] = TRUE, - [MOVE_CALM_MIND] = TRUE, - [MOVE_LEAF_BLADE] = TRUE, - [MOVE_DRAGON_DANCE] = TRUE, - [MOVE_ROCK_BLAST] = FALSE, - [MOVE_SHOCK_WAVE] = TRUE, - [MOVE_WATER_PULSE] = TRUE, - [MOVE_DOOM_DESIRE] = TRUE, - [MOVE_PSYCHO_BOOST] = TRUE, -}; - // The possible questions to ask after the initial 3 WHICH MON questions. Retrieved from here and shuffled // WHAT_ITEM has max 3 occurrences, one for each party member // WHICH_MOVE has max 5 occurrences, defined as NUM_WHICH_MOVE_QUESTIONS diff --git a/src/data/moves_info.h b/src/data/moves_info.h index b481fea731..389fc8d5eb 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -170,6 +170,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_KarateChop, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_SLAP] = @@ -192,6 +193,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_DoubleSlap, + .validApprenticeMove = TRUE, }, [MOVE_COMET_PUNCH] = @@ -238,6 +240,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_MegaPunch, + .validApprenticeMove = TRUE, }, [MOVE_PAY_DAY] = @@ -289,6 +292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_FIRE_PUNCH, .contestComboMoves = {COMBO_STARTER_ICE_PUNCH, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH}, .battleAnimScript = gBattleAnimMove_FirePunch, + .validApprenticeMove = TRUE, }, [MOVE_ICE_PUNCH] = @@ -320,6 +324,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_ICE_PUNCH, .contestComboMoves = {COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_THUNDER_PUNCH}, .battleAnimScript = gBattleAnimMove_IcePunch, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_PUNCH] = @@ -347,6 +352,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_THUNDER_PUNCH, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_ICE_PUNCH}, .battleAnimScript = gBattleAnimMove_ThunderPunch, + .validApprenticeMove = TRUE, }, [MOVE_SCRATCH] = @@ -413,6 +419,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_VICE_GRIP}, .battleAnimScript = gBattleAnimMove_Guillotine, + .validApprenticeMove = TRUE, }, [MOVE_RAZOR_WIND] = @@ -463,6 +470,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SWORDS_DANCE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SwordsDance, + .validApprenticeMove = TRUE, }, [MOVE_CUT] = @@ -560,6 +568,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Whirlwind, + .validApprenticeMove = TRUE, }, [MOVE_FLY] = @@ -587,6 +596,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Fly, + .validApprenticeMove = TRUE, }, [MOVE_BIND] = @@ -613,6 +623,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_VICE_GRIP}, .battleAnimScript = gBattleAnimMove_Bind, + .validApprenticeMove = TRUE, }, [MOVE_SLAM] = @@ -636,6 +647,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_Slam, + .validApprenticeMove = TRUE, }, [MOVE_VINE_WHIP] = @@ -692,6 +704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Stomp, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_KICK] = @@ -715,6 +728,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoubleKick, + .validApprenticeMove = TRUE, }, [MOVE_MEGA_KICK] = @@ -737,6 +751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_MegaKick, + .validApprenticeMove = TRUE, }, [MOVE_JUMP_KICK] = @@ -766,6 +781,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_JumpKick, + .validApprenticeMove = TRUE, }, [MOVE_ROLLING_KICK] = @@ -793,6 +809,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RollingKick, + .validApprenticeMove = TRUE, }, [MOVE_SAND_ATTACK] = @@ -816,6 +833,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SAND_ATTACK, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_SandAttack, + .validApprenticeMove = TRUE, }, [MOVE_HEADBUTT] = @@ -842,6 +860,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_Headbutt, + .validApprenticeMove = TRUE, }, [MOVE_HORN_ATTACK] = @@ -908,6 +927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HORN_ATTACK}, .battleAnimScript = gBattleAnimMove_HornDrill, + .validApprenticeMove = TRUE, }, [MOVE_TACKLE] = @@ -964,6 +984,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BodySlam, + .validApprenticeMove = TRUE, }, [MOVE_WRAP] = @@ -989,6 +1010,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wrap, + .validApprenticeMove = TRUE, }, [MOVE_TAKE_DOWN] = @@ -1012,6 +1034,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_TakeDown, + .validApprenticeMove = TRUE, }, [MOVE_THRASH] = @@ -1039,6 +1062,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAGE}, .battleAnimScript = gBattleAnimMove_Thrash, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_EDGE] = @@ -1062,6 +1086,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_DoubleEdge, + .validApprenticeMove = TRUE, }, [MOVE_TAIL_WHIP] = @@ -1137,6 +1162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Twineedle, + .validApprenticeMove = TRUE, }, [MOVE_PIN_MISSILE] = @@ -1208,6 +1234,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_Bite, + .validApprenticeMove = TRUE, }, [MOVE_GROWL] = @@ -1261,6 +1288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Roar, + .validApprenticeMove = TRUE, }, [MOVE_SING] = @@ -1286,6 +1314,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SING, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sing, + .validApprenticeMove = TRUE, }, [MOVE_SUPERSONIC] = @@ -1311,6 +1340,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Supersonic, + .validApprenticeMove = TRUE, }, [MOVE_SONIC_BOOM] = @@ -1333,6 +1363,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SonicBoom, + .validApprenticeMove = TRUE, }, [MOVE_DISABLE] = @@ -1363,6 +1394,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Disable, + .validApprenticeMove = TRUE, }, [MOVE_ACID] = @@ -1442,6 +1474,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Flamethrower, + .validApprenticeMove = TRUE, }, [MOVE_MIST] = @@ -1467,6 +1500,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Mist, + .validApprenticeMove = TRUE, }, [MOVE_WATER_GUN] = @@ -1509,6 +1543,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_HydroPump, + .validApprenticeMove = TRUE, }, [MOVE_SURF] = @@ -1532,6 +1567,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SURF, .contestComboMoves = {COMBO_STARTER_DIVE, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Surf, + .validApprenticeMove = TRUE, }, [MOVE_ICE_BEAM] = @@ -1563,6 +1599,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IceBeam, + .validApprenticeMove = TRUE, }, [MOVE_BLIZZARD] = @@ -1593,6 +1630,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_POWDER_SNOW}, .battleAnimScript = gBattleAnimMove_Blizzard, + .validApprenticeMove = TRUE, }, [MOVE_PSYBEAM] = @@ -1618,6 +1656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Psybeam, + .validApprenticeMove = TRUE, }, [MOVE_BUBBLE_BEAM] = @@ -1692,6 +1731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperBeam, + .validApprenticeMove = TRUE, }, [MOVE_PECK] = @@ -1736,6 +1776,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_PECK}, .battleAnimScript = gBattleAnimMove_DrillPeck, + .validApprenticeMove = TRUE, }, [MOVE_SUBMISSION] = @@ -1759,6 +1800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_Submission, + .validApprenticeMove = TRUE, }, [MOVE_LOW_KICK] = @@ -1781,6 +1823,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LowKick, + .validApprenticeMove = TRUE, }, [MOVE_COUNTER] = @@ -1808,6 +1851,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_Counter, + .validApprenticeMove = TRUE, }, [MOVE_SEISMIC_TOSS] = @@ -1831,6 +1875,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_SeismicToss, + .validApprenticeMove = TRUE, }, [MOVE_STRENGTH] = @@ -1853,6 +1898,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Strength, + .validApprenticeMove = TRUE, }, [MOVE_ABSORB] = @@ -1923,6 +1969,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_LEECH_SEED, .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED}, .battleAnimScript = gBattleAnimMove_LeechSeed, + .validApprenticeMove = TRUE, }, [MOVE_GROWTH] = @@ -1953,6 +2000,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_GROWTH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Growth, + .validApprenticeMove = TRUE, }, [MOVE_RAZOR_LEAF] = @@ -1976,6 +2024,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_RazorLeaf, + .validApprenticeMove = TRUE, }, [MOVE_SOLAR_BEAM] = @@ -2000,6 +2049,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_SolarBeam, + .validApprenticeMove = TRUE, }, [MOVE_POISON_POWDER] = @@ -2024,6 +2074,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_PoisonPowder, + .validApprenticeMove = TRUE, }, [MOVE_STUN_SPORE] = @@ -2048,6 +2099,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_StunSpore, + .validApprenticeMove = TRUE, }, [MOVE_SLEEP_POWDER] = @@ -2072,6 +2124,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_SleepPowder, + .validApprenticeMove = TRUE, }, [MOVE_PETAL_DANCE] = @@ -2106,6 +2159,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_PetalDance, + .validApprenticeMove = TRUE, }, [MOVE_STRING_SHOT] = @@ -2152,6 +2206,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DRAGON_RAGE, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonRage, + .validApprenticeMove = TRUE, }, [MOVE_FIRE_SPIN] = @@ -2177,6 +2232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_FireSpin, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_SHOCK] = @@ -2227,6 +2283,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_Thunderbolt, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_WAVE] = @@ -2250,6 +2307,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ThunderWave, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER] = @@ -2276,6 +2334,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Thunder, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_THROW] = @@ -2321,6 +2380,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_EARTHQUAKE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Earthquake, + .validApprenticeMove = TRUE, }, [MOVE_FISSURE] = @@ -2344,6 +2404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_EARTHQUAKE}, .battleAnimScript = gBattleAnimMove_Fissure, + .validApprenticeMove = TRUE, }, [MOVE_DIG] = @@ -2371,6 +2432,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Dig, + .validApprenticeMove = TRUE, }, [MOVE_TOXIC] = @@ -2394,6 +2456,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_TOXIC, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Toxic, + .validApprenticeMove = TRUE, }, [MOVE_CONFUSION] = @@ -2444,6 +2507,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_PSYCHIC, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS}, .battleAnimScript = gBattleAnimMove_Psychic, + .validApprenticeMove = TRUE, }, [MOVE_HYPNOSIS] = @@ -2467,6 +2531,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_HYPNOSIS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Hypnosis, + .validApprenticeMove = TRUE, }, [MOVE_MEDITATE] = @@ -2492,6 +2557,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Meditate, + .validApprenticeMove = TRUE, }, [MOVE_AGILITY] = @@ -2517,6 +2583,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_Agility, + .validApprenticeMove = TRUE, }, [MOVE_QUICK_ATTACK] = @@ -2539,6 +2606,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_QuickAttack, + .validApprenticeMove = TRUE, }, [MOVE_RAGE] = @@ -2606,6 +2674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NightShade, + .validApprenticeMove = TRUE, }, [MOVE_MIMIC] = @@ -2636,6 +2705,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Mimic, + .validApprenticeMove = TRUE, }, [MOVE_SCREECH] = @@ -2661,6 +2731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Screech, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_TEAM] = @@ -2686,6 +2757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DOUBLE_TEAM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoubleTeam, + .validApprenticeMove = TRUE, }, [MOVE_RECOVER] = @@ -2718,6 +2790,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Recover, + .validApprenticeMove = TRUE, }, [MOVE_HARDEN] = @@ -2743,6 +2816,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_HARDEN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Harden, + .validApprenticeMove = TRUE, }, [MOVE_MINIMIZE] = @@ -2768,6 +2842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Minimize, + .validApprenticeMove = TRUE, }, [MOVE_SMOKESCREEN] = @@ -2791,6 +2866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SMOG}, .battleAnimScript = gBattleAnimMove_Smokescreen, + .validApprenticeMove = TRUE, }, [MOVE_CONFUSE_RAY] = @@ -2814,6 +2890,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ConfuseRay, + .validApprenticeMove = TRUE, }, [MOVE_WITHDRAW] = @@ -2839,6 +2916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Withdraw, + .validApprenticeMove = TRUE, }, [MOVE_DEFENSE_CURL] = @@ -2864,6 +2942,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DEFENSE_CURL, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DefenseCurl, + .validApprenticeMove = TRUE, }, [MOVE_BARRIER] = @@ -2889,6 +2968,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Barrier, + .validApprenticeMove = TRUE, }, [MOVE_LIGHT_SCREEN] = @@ -2914,6 +2994,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_LightScreen, + .validApprenticeMove = TRUE, }, [MOVE_HAZE] = @@ -2939,6 +3020,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_Haze, + .validApprenticeMove = TRUE, }, [MOVE_REFLECT] = @@ -2964,6 +3046,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Reflect, + .validApprenticeMove = TRUE, }, [MOVE_FOCUS_ENERGY] = @@ -2990,6 +3073,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_FOCUS_ENERGY, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FocusEnergy, + .validApprenticeMove = TRUE, }, [MOVE_BIDE] = @@ -3045,6 +3129,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Metronome, + .validApprenticeMove = TRUE, }, [MOVE_MIRROR_MOVE] = @@ -3074,6 +3159,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MirrorMove, + .validApprenticeMove = TRUE, }, [MOVE_SELF_DESTRUCT] = @@ -3096,6 +3182,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SelfDestruct, + .validApprenticeMove = TRUE, }, [MOVE_EGG_BOMB] = @@ -3118,6 +3205,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SOFT_BOILED}, .battleAnimScript = gBattleAnimMove_EggBomb, + .validApprenticeMove = TRUE, }, [MOVE_LICK] = @@ -3144,6 +3232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Lick, + .validApprenticeMove = TRUE, }, [MOVE_SMOG] = @@ -3244,6 +3333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_FireBlast, + .validApprenticeMove = TRUE, }, [MOVE_WATERFALL] = @@ -3272,6 +3362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Waterfall, + .validApprenticeMove = TRUE, }, [MOVE_CLAMP] = @@ -3298,6 +3389,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Clamp, + .validApprenticeMove = TRUE, }, [MOVE_SWIFT] = @@ -3319,6 +3411,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Swift, + .validApprenticeMove = TRUE, }, [MOVE_SKULL_BASH] = @@ -3349,6 +3442,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkullBash, + .validApprenticeMove = TRUE, }, [MOVE_SPIKE_CANNON] = @@ -3421,6 +3515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Amnesia, + .validApprenticeMove = TRUE, }, [MOVE_KINESIS] = @@ -3444,6 +3539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_KINESIS, .contestComboMoves = {COMBO_STARTER_CONFUSION, COMBO_STARTER_PSYCHIC}, .battleAnimScript = gBattleAnimMove_Kinesis, + .validApprenticeMove = TRUE, }, [MOVE_SOFT_BOILED] = @@ -3470,6 +3566,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SOFT_BOILED, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SoftBoiled, + .validApprenticeMove = TRUE, }, [MOVE_HIGH_JUMP_KICK] = @@ -3499,6 +3596,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_HighJumpKick, + .validApprenticeMove = TRUE, }, [MOVE_GLARE] = @@ -3528,6 +3626,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Glare, + .validApprenticeMove = TRUE, }, [MOVE_DREAM_EATER] = @@ -3551,6 +3650,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS}, .battleAnimScript = gBattleAnimMove_DreamEater, + .validApprenticeMove = TRUE, }, [MOVE_POISON_GAS] = @@ -3650,6 +3750,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LovelyKiss, + .validApprenticeMove = TRUE, }, [MOVE_SKY_ATTACK] = @@ -3681,6 +3782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkyAttack, + .validApprenticeMove = TRUE, }, [MOVE_TRANSFORM] = @@ -3711,6 +3813,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Transform, + .validApprenticeMove = TRUE, }, [MOVE_BUBBLE] = @@ -3763,6 +3866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DizzyPunch, + .validApprenticeMove = TRUE, }, [MOVE_SPORE] = @@ -3787,6 +3891,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spore, + .validApprenticeMove = TRUE, }, [MOVE_FLASH] = @@ -3810,6 +3915,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Flash, + .validApprenticeMove = TRUE, }, [MOVE_PSYWAVE] = @@ -3831,6 +3937,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Psywave, + .validApprenticeMove = TRUE, }, [MOVE_SPLASH] = @@ -3881,6 +3988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AcidArmor, + .validApprenticeMove = TRUE, }, [MOVE_CRABHAMMER] = @@ -3904,6 +4012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_Crabhammer, + .validApprenticeMove = TRUE, }, [MOVE_EXPLOSION] = @@ -3926,6 +4035,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Explosion, + .validApprenticeMove = TRUE, }, [MOVE_FURY_SWIPES] = @@ -3970,6 +4080,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_BONEMERANG, .contestComboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, .battleAnimScript = gBattleAnimMove_Bonemerang, + .validApprenticeMove = TRUE, }, [MOVE_REST] = @@ -3996,6 +4107,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_REST, .contestComboMoves = {COMBO_STARTER_BELLY_DRUM, COMBO_STARTER_CHARM, COMBO_STARTER_YAWN}, .battleAnimScript = gBattleAnimMove_Rest, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_SLIDE] = @@ -4021,6 +4133,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, .battleAnimScript = gBattleAnimMove_RockSlide, + .validApprenticeMove = TRUE, }, [MOVE_HYPER_FANG] = @@ -4048,6 +4161,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperFang, + .validApprenticeMove = TRUE, }, [MOVE_SHARPEN] = @@ -4073,6 +4187,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sharpen, + .validApprenticeMove = TRUE, }, [MOVE_CONVERSION] = @@ -4098,6 +4213,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Conversion, + .validApprenticeMove = TRUE, }, [MOVE_TRI_ATTACK] = @@ -4123,6 +4239,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON}, .battleAnimScript = gBattleAnimMove_TriAttack, + .validApprenticeMove = TRUE, }, [MOVE_SUPER_FANG] = @@ -4146,6 +4263,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_SuperFang, + .validApprenticeMove = TRUE, }, [MOVE_SLASH] = @@ -4170,6 +4288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCRATCH, COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_Slash, + .validApprenticeMove = TRUE, }, [MOVE_SUBSTITUTE] = @@ -4196,6 +4315,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Substitute, + .validApprenticeMove = TRUE, }, [MOVE_STRUGGLE] = @@ -4234,6 +4354,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .assistBanned = TRUE, .sketchBanned = TRUE, .battleAnimScript = gBattleAnimMove_Struggle, + .validApprenticeMove = TRUE, }, [MOVE_SKETCH] = @@ -4267,6 +4388,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sketch, + .validApprenticeMove = TRUE, }, [MOVE_TRIPLE_KICK] = @@ -4290,6 +4412,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_TripleKick, + .validApprenticeMove = TRUE, }, [MOVE_THIEF] = @@ -4320,6 +4443,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Thief, + .validApprenticeMove = TRUE, }, [MOVE_SPIDER_WEB] = @@ -4344,6 +4468,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_SpiderWeb, + .validApprenticeMove = TRUE, }, [MOVE_MIND_READER] = @@ -4366,6 +4491,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_MIND_READER, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MindReader, + .validApprenticeMove = TRUE, }, [MOVE_NIGHTMARE] = @@ -4389,6 +4515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Nightmare, + .validApprenticeMove = TRUE, }, [MOVE_FLAME_WHEEL] = @@ -4444,6 +4571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, .battleAnimScript = gBattleAnimMove_Snore, + .validApprenticeMove = TRUE, }, [MOVE_CURSE] = @@ -4469,6 +4597,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_CURSE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Curse, + .validApprenticeMove = TRUE, }, [MOVE_FLAIL] = @@ -4491,6 +4620,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Flail, + .validApprenticeMove = TRUE, }, [MOVE_CONVERSION_2] = @@ -4516,6 +4646,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Conversion2, + .validApprenticeMove = TRUE, }, [MOVE_AEROBLAST] = @@ -4539,6 +4670,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Aeroblast, + .validApprenticeMove = TRUE, }, [MOVE_COTTON_SPORE] = @@ -4563,6 +4695,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CottonSpore, + .validApprenticeMove = TRUE, }, [MOVE_REVERSAL] = @@ -4585,6 +4718,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Reversal, + .validApprenticeMove = TRUE, }, [MOVE_SPITE] = @@ -4609,6 +4743,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_Spite, + .validApprenticeMove = TRUE, }, [MOVE_POWDER_SNOW] = @@ -4663,6 +4798,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_Protect, + .validApprenticeMove = TRUE, }, [MOVE_MACH_PUNCH] = @@ -4686,6 +4822,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MachPunch, + .validApprenticeMove = TRUE, }, [MOVE_SCARY_FACE] = @@ -4709,6 +4846,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SCARY_FACE, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_RAGE}, .battleAnimScript = gBattleAnimMove_ScaryFace, + .validApprenticeMove = TRUE, }, [MOVE_FEINT_ATTACK] = @@ -4731,6 +4869,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_LEER, COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_FeintAttack, + .validApprenticeMove = TRUE, }, [MOVE_SWEET_KISS] = @@ -4754,6 +4893,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARM}, .battleAnimScript = gBattleAnimMove_SweetKiss, + .validApprenticeMove = TRUE, }, [MOVE_BELLY_DRUM] = @@ -4779,6 +4919,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_BELLY_DRUM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BellyDrum, + .validApprenticeMove = TRUE, }, [MOVE_SLUDGE_BOMB] = @@ -4805,6 +4946,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SLUDGE_BOMB, .contestComboMoves = {COMBO_STARTER_SLUDGE}, .battleAnimScript = gBattleAnimMove_SludgeBomb, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SLAP] = @@ -4830,6 +4972,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_MUD_SLAP, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_MudSlap, + .validApprenticeMove = TRUE, }, [MOVE_OCTAZOOKA] = @@ -4856,6 +4999,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Octazooka, + .validApprenticeMove = TRUE, }, [MOVE_SPIKES] = @@ -4883,6 +5027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spikes, + .validApprenticeMove = TRUE, }, [MOVE_ZAP_CANNON] = @@ -4909,6 +5054,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON}, .battleAnimScript = gBattleAnimMove_ZapCannon, + .validApprenticeMove = TRUE, }, [MOVE_FORESIGHT] = @@ -4933,6 +5079,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Foresight, + .validApprenticeMove = TRUE, }, [MOVE_DESTINY_BOND] = @@ -4961,6 +5108,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK}, .battleAnimScript = gBattleAnimMove_DestinyBond, + .validApprenticeMove = TRUE, }, [MOVE_PERISH_SONG] = @@ -4987,6 +5135,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING}, .battleAnimScript = gBattleAnimMove_PerishSong, + .validApprenticeMove = TRUE, }, [MOVE_ICY_WIND] = @@ -5013,6 +5162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IcyWind, + .validApprenticeMove = TRUE, }, [MOVE_DETECT] = @@ -5040,6 +5190,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_Detect, + .validApprenticeMove = TRUE, }, [MOVE_BONE_RUSH] = @@ -5083,6 +5234,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_LOCK_ON, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LockOn, + .validApprenticeMove = TRUE, }, [MOVE_OUTRAGE] = @@ -5110,6 +5262,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Outrage, + .validApprenticeMove = TRUE, }, [MOVE_SANDSTORM] = @@ -5135,6 +5288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SANDSTORM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sandstorm, + .validApprenticeMove = TRUE, }, [MOVE_GIGA_DRAIN] = @@ -5159,6 +5313,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_GigaDrain, + .validApprenticeMove = TRUE, }, [MOVE_ENDURE] = @@ -5186,6 +5341,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_ENDURE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Endure, + .validApprenticeMove = TRUE, }, [MOVE_CHARM] = @@ -5209,6 +5365,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_CHARM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Charm, + .validApprenticeMove = TRUE, }, [MOVE_ROLLOUT] = @@ -5233,6 +5390,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_Rollout, + .validApprenticeMove = TRUE, }, [MOVE_FALSE_SWIPE] = @@ -5253,6 +5411,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_FalseSwipe, + .validApprenticeMove = TRUE, }, [MOVE_SWAGGER] = @@ -5276,6 +5435,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Swagger, + .validApprenticeMove = TRUE, }, [MOVE_MILK_DRINK] = @@ -5302,6 +5462,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MilkDrink, + .validApprenticeMove = TRUE, }, [MOVE_SPARK] = @@ -5357,6 +5518,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_FuryCutter, + .validApprenticeMove = TRUE, }, [MOVE_STEEL_WING] = @@ -5384,6 +5546,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SteelWing, + .validApprenticeMove = TRUE, }, [MOVE_MEAN_LOOK] = @@ -5408,6 +5571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_MEAN_LOOK, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_MeanLook, + .validApprenticeMove = TRUE, }, [MOVE_ATTRACT] = @@ -5432,6 +5596,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Attract, + .validApprenticeMove = TRUE, }, [MOVE_SLEEP_TALK] = @@ -5463,6 +5628,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, .battleAnimScript = gBattleAnimMove_SleepTalk, + .validApprenticeMove = TRUE, }, [MOVE_HEAL_BELL] = @@ -5490,6 +5656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_HEAL_BELL, .contestComboMoves = {COMBO_STARTER_LUCKY_CHANT}, .battleAnimScript = gBattleAnimMove_HealBell, + .validApprenticeMove = TRUE, }, [MOVE_RETURN] = @@ -5512,6 +5679,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Return, + .validApprenticeMove = TRUE, }, [MOVE_PRESENT] = @@ -5534,6 +5702,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Present, + .validApprenticeMove = TRUE, }, [MOVE_FRUSTRATION] = @@ -5556,6 +5725,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Frustration, + .validApprenticeMove = TRUE, }, [MOVE_SAFEGUARD] = @@ -5581,6 +5751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Safeguard, + .validApprenticeMove = TRUE, }, [MOVE_PAIN_SPLIT] = @@ -5603,6 +5774,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_PainSplit, + .validApprenticeMove = TRUE, }, [MOVE_SACRED_FIRE] = @@ -5629,6 +5801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_SacredFire, + .validApprenticeMove = TRUE, }, [MOVE_MAGNITUDE] = @@ -5679,6 +5852,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_DynamicPunch, + .validApprenticeMove = TRUE, }, [MOVE_MEGAHORN] = @@ -5701,6 +5875,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Megahorn, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_BREATH] = @@ -5727,6 +5902,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DRAGON_BREATH, .contestComboMoves = {COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonBreath, + .validApprenticeMove = TRUE, }, [MOVE_BATON_PASS] = @@ -5751,6 +5927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BatonPass, + .validApprenticeMove = TRUE, }, [MOVE_ENCORE] = @@ -5776,6 +5953,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Encore, + .validApprenticeMove = TRUE, }, [MOVE_PURSUIT] = @@ -5799,6 +5977,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Pursuit, + .validApprenticeMove = TRUE, }, [MOVE_RAPID_SPIN] = @@ -5830,6 +6009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RapidSpin, + .validApprenticeMove = TRUE, }, [MOVE_SWEET_SCENT] = @@ -5853,6 +6033,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SWEET_SCENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SweetScent, + .validApprenticeMove = TRUE, }, [MOVE_IRON_TAIL] = @@ -5879,6 +6060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_IronTail, + .validApprenticeMove = TRUE, }, [MOVE_METAL_CLAW] = @@ -5906,6 +6088,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_METAL_SOUND}, .battleAnimScript = gBattleAnimMove_MetalClaw, + .validApprenticeMove = TRUE, }, [MOVE_VITAL_THROW] = @@ -5928,6 +6111,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_VitalThrow, + .validApprenticeMove = TRUE, }, [MOVE_MORNING_SUN] = @@ -5954,6 +6138,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_MorningSun, + .validApprenticeMove = TRUE, }, [MOVE_SYNTHESIS] = @@ -5980,6 +6165,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Synthesis, + .validApprenticeMove = TRUE, }, [MOVE_MOONLIGHT] = @@ -6006,6 +6192,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Moonlight, + .validApprenticeMove = TRUE, }, [MOVE_HIDDEN_POWER] = @@ -6027,6 +6214,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HiddenPower, + .validApprenticeMove = TRUE, }, [MOVE_CROSS_CHOP] = @@ -6050,6 +6238,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_CrossChop, + .validApprenticeMove = TRUE, }, [MOVE_TWISTER] = @@ -6101,6 +6290,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_RAIN_DANCE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RainDance, + .validApprenticeMove = TRUE, }, [MOVE_SUNNY_DAY] = @@ -6125,6 +6315,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_SUNNY_DAY, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SunnyDay, + .validApprenticeMove = TRUE, }, [MOVE_CRUNCH] = @@ -6160,6 +6351,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_Crunch, + .validApprenticeMove = TRUE, }, [MOVE_MIRROR_COAT] = @@ -6185,6 +6377,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_MirrorCoat, + .validApprenticeMove = TRUE, }, [MOVE_PSYCH_UP] = @@ -6211,6 +6404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PsychUp, + .validApprenticeMove = TRUE, }, [MOVE_EXTREME_SPEED] = @@ -6233,6 +6427,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ExtremeSpeed, + .validApprenticeMove = TRUE, }, [MOVE_ANCIENT_POWER] = @@ -6260,6 +6455,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AncientPower, + .validApprenticeMove = TRUE, }, [MOVE_SHADOW_BALL] = @@ -6286,6 +6482,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShadowBall, + .validApprenticeMove = TRUE, }, [MOVE_FUTURE_SIGHT] = @@ -6315,6 +6512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, .battleAnimScript = gBattleAnimMove_FutureSight, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_SMASH] = @@ -6341,6 +6539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RockSmash, + .validApprenticeMove = TRUE, }, [MOVE_WHIRLPOOL] = @@ -6366,6 +6565,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Whirlpool, + .validApprenticeMove = TRUE, }, [MOVE_BEAT_UP] = @@ -6387,6 +6587,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BeatUp, + .validApprenticeMove = TRUE, }, [MOVE_FAKE_OUT] = @@ -6413,6 +6614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_FAKE_OUT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FakeOut, + .validApprenticeMove = TRUE, }, [MOVE_UPROAR] = @@ -6446,6 +6648,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Uproar, + .validApprenticeMove = TRUE, }, [MOVE_STOCKPILE] = @@ -6471,6 +6674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_STOCKPILE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Stockpile, + .validApprenticeMove = TRUE, }, [MOVE_SPIT_UP] = @@ -6493,6 +6697,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, .battleAnimScript = gBattleAnimMove_SpitUp, + .validApprenticeMove = TRUE, }, [MOVE_SWALLOW] = @@ -6519,6 +6724,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, .battleAnimScript = gBattleAnimMove_Swallow, + .validApprenticeMove = TRUE, }, [MOVE_HEAT_WAVE] = @@ -6545,6 +6751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_HeatWave, + .validApprenticeMove = TRUE, }, [MOVE_HAIL] = @@ -6569,6 +6776,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_HAIL, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Hail, + .validApprenticeMove = TRUE, }, [MOVE_TORMENT] = @@ -6592,6 +6800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Torment, + .validApprenticeMove = TRUE, }, [MOVE_FLATTER] = @@ -6615,6 +6824,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARM}, .battleAnimScript = gBattleAnimMove_Flatter, + .validApprenticeMove = TRUE, }, [MOVE_WILL_O_WISP] = @@ -6638,6 +6848,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WillOWisp, + .validApprenticeMove = TRUE, }, [MOVE_MEMENTO] = @@ -6660,6 +6871,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Memento, + .validApprenticeMove = TRUE, }, [MOVE_FACADE] = @@ -6682,6 +6894,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Facade, + .validApprenticeMove = TRUE, }, [MOVE_FOCUS_PUNCH] = @@ -6712,6 +6925,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_FocusPunch, + .validApprenticeMove = TRUE, }, [MOVE_SMELLING_SALTS] = @@ -6738,6 +6952,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SmellingSalts, + .validApprenticeMove = TRUE, }, [MOVE_FOLLOW_ME] = @@ -6765,6 +6980,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FollowMe, + .validApprenticeMove = TRUE, }, [MOVE_NATURE_POWER] = @@ -6793,6 +7009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NaturePower, + .validApprenticeMove = TRUE, }, [MOVE_CHARGE] = @@ -6818,6 +7035,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Charge, + .validApprenticeMove = TRUE, }, [MOVE_TAUNT] = @@ -6842,6 +7060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_TAUNT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Taunt, + .validApprenticeMove = TRUE, }, [MOVE_HELPING_HAND] = @@ -6870,6 +7089,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HelpingHand, + .validApprenticeMove = TRUE, }, [MOVE_TRICK] = @@ -6895,6 +7115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Trick, + .validApprenticeMove = TRUE, }, [MOVE_ROLE_PLAY] = @@ -6920,6 +7141,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RolePlay, + .validApprenticeMove = TRUE, }, [MOVE_WISH] = @@ -6946,6 +7168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wish, + .validApprenticeMove = TRUE, }, [MOVE_ASSIST] = @@ -6976,6 +7199,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Assist, + .validApprenticeMove = TRUE, }, [MOVE_INGRAIN] = @@ -7002,6 +7226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Ingrain, + .validApprenticeMove = TRUE, }, [MOVE_SUPERPOWER] = @@ -7028,6 +7253,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_Superpower, + .validApprenticeMove = TRUE, }, [MOVE_MAGIC_COAT] = @@ -7052,6 +7278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MagicCoat, + .validApprenticeMove = TRUE, }, [MOVE_RECYCLE] = @@ -7077,6 +7304,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Recycle, + .validApprenticeMove = TRUE, }, [MOVE_REVENGE] = @@ -7097,6 +7325,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_REVENGE, .contestComboMoves = {COMBO_STARTER_PAYBACK}, .battleAnimScript = gBattleAnimMove_Revenge, + .validApprenticeMove = TRUE, }, [MOVE_BRICK_BREAK] = @@ -7119,6 +7348,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_BrickBreak, + .validApprenticeMove = TRUE, }, [MOVE_YAWN] = @@ -7142,6 +7372,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_YAWN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Yawn, + .validApprenticeMove = TRUE, }, [MOVE_KNOCK_OFF] = @@ -7167,6 +7398,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_KnockOff, + .validApprenticeMove = TRUE, }, [MOVE_ENDEAVOR] = @@ -7190,6 +7422,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Endeavor, + .validApprenticeMove = TRUE, }, [MOVE_ERUPTION] = @@ -7211,6 +7444,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_ENDURE, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Eruption, + .validApprenticeMove = TRUE, }, [MOVE_SKILL_SWAP] = @@ -7234,6 +7468,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkillSwap, + .validApprenticeMove = TRUE, }, [MOVE_IMPRISON] = @@ -7261,6 +7496,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Imprison, + .validApprenticeMove = TRUE, }, [MOVE_REFRESH] = @@ -7286,6 +7522,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SING, COMBO_STARTER_WATER_SPORT}, .battleAnimScript = gBattleAnimMove_Refresh, + .validApprenticeMove = TRUE, }, [MOVE_GRUDGE] = @@ -7311,6 +7548,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_Grudge, + .validApprenticeMove = TRUE, }, [MOVE_SNATCH] = @@ -7338,6 +7576,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Snatch, + .validApprenticeMove = TRUE, }, [MOVE_SECRET_POWER] = @@ -7363,6 +7602,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SecretPower, + .validApprenticeMove = TRUE, }, [MOVE_DIVE] = @@ -7390,6 +7630,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DIVE, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SURF}, .battleAnimScript = gBattleAnimMove_Dive, + .validApprenticeMove = TRUE, }, [MOVE_ARM_THRUST] = @@ -7437,6 +7678,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Camouflage, + .validApprenticeMove = TRUE, }, [MOVE_TAIL_GLOW] = @@ -7462,6 +7704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TailGlow, + .validApprenticeMove = TRUE, }, [MOVE_LUSTER_PURGE] = @@ -7487,6 +7730,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_LusterPurge, + .validApprenticeMove = TRUE, }, [MOVE_MIST_BALL] = @@ -7513,6 +7757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_MistBall, + .validApprenticeMove = TRUE, }, [MOVE_FEATHER_DANCE] = @@ -7537,6 +7782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FeatherDance, + .validApprenticeMove = TRUE, }, [MOVE_TEETER_DANCE] = @@ -7561,6 +7807,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TeeterDance, + .validApprenticeMove = TRUE, }, [MOVE_BLAZE_KICK] = @@ -7588,6 +7835,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_BlazeKick, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SPORT] = @@ -7613,6 +7861,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_MUD_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM, COMBO_STARTER_WATER_SPORT}, .battleAnimScript = gBattleAnimMove_MudSport, + .validApprenticeMove = TRUE, }, [MOVE_ICE_BALL] = @@ -7665,6 +7914,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NeedleArm, + .validApprenticeMove = TRUE, }, [MOVE_SLACK_OFF] = @@ -7691,6 +7941,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SlackOff, + .validApprenticeMove = TRUE, }, [MOVE_HYPER_VOICE] = @@ -7714,6 +7965,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperVoice, + .validApprenticeMove = TRUE, }, [MOVE_POISON_FANG] = @@ -7767,6 +8019,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_CrushClaw, + .validApprenticeMove = TRUE, }, [MOVE_BLAST_BURN] = @@ -7792,6 +8045,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_BlastBurn, + .validApprenticeMove = TRUE, }, [MOVE_HYDRO_CANNON] = @@ -7817,6 +8071,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_HydroCannon, + .validApprenticeMove = TRUE, }, [MOVE_METEOR_MASH] = @@ -7845,6 +8100,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MeteorMash, + .validApprenticeMove = TRUE, }, [MOVE_ASTONISH] = @@ -7872,6 +8128,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Astonish, + .validApprenticeMove = TRUE, }, [MOVE_WEATHER_BALL] = @@ -7895,6 +8152,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SANDSTORM, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WeatherBall, + .validApprenticeMove = TRUE, }, [MOVE_AROMATHERAPY] = @@ -7920,6 +8178,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Aromatherapy, + .validApprenticeMove = TRUE, }, [MOVE_FAKE_TEARS] = @@ -7943,6 +8202,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FakeTears, + .validApprenticeMove = TRUE, }, [MOVE_AIR_CUTTER] = @@ -7967,6 +8227,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AirCutter, + .validApprenticeMove = TRUE, }, [MOVE_OVERHEAT] = @@ -7993,6 +8254,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Overheat, + .validApprenticeMove = TRUE, }, [MOVE_ODOR_SLEUTH] = @@ -8017,6 +8279,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_OdorSleuth, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_TOMB] = @@ -8042,6 +8305,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, .battleAnimScript = gBattleAnimMove_RockTomb, + .validApprenticeMove = TRUE, }, [MOVE_SILVER_WIND] = @@ -8069,6 +8333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SilverWind, + .validApprenticeMove = TRUE, }, [MOVE_METAL_SOUND] = @@ -8094,6 +8359,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_METAL_SOUND, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MetalSound, + .validApprenticeMove = TRUE, }, [MOVE_GRASS_WHISTLE] = @@ -8119,6 +8385,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassWhistle, + .validApprenticeMove = TRUE, }, [MOVE_TICKLE] = @@ -8142,6 +8409,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Tickle, + .validApprenticeMove = TRUE, }, [MOVE_COSMIC_POWER] = @@ -8167,6 +8435,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CosmicPower, + .validApprenticeMove = TRUE, }, [MOVE_WATER_SPOUT] = @@ -8188,6 +8457,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterSpout, + .validApprenticeMove = TRUE, }, [MOVE_SIGNAL_BEAM] = @@ -8213,6 +8483,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SignalBeam, + .validApprenticeMove = TRUE, }, [MOVE_SHADOW_PUNCH] = @@ -8236,6 +8507,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShadowPunch, + .validApprenticeMove = TRUE, }, [MOVE_EXTRASENSORY] = @@ -8262,6 +8534,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Extrasensory, + .validApprenticeMove = TRUE, }, [MOVE_SKY_UPPERCUT] = @@ -8286,6 +8559,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_SkyUppercut, + .validApprenticeMove = TRUE, }, [MOVE_SAND_TOMB] = @@ -8310,6 +8584,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_SandTomb, + .validApprenticeMove = TRUE, }, [MOVE_SHEER_COLD] = @@ -8331,6 +8606,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_SheerCold, + .validApprenticeMove = TRUE, }, [MOVE_MUDDY_WATER] = @@ -8357,6 +8633,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_MuddyWater, + .validApprenticeMove = TRUE, }, [MOVE_BULLET_SEED] = @@ -8402,6 +8679,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AerialAce, + .validApprenticeMove = TRUE, }, [MOVE_ICICLE_SPEAR] = @@ -8448,6 +8726,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_IronDefense, + .validApprenticeMove = TRUE, }, [MOVE_BLOCK] = @@ -8472,6 +8751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Block, + .validApprenticeMove = TRUE, }, [MOVE_HOWL] = @@ -8498,6 +8778,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Howl, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_CLAW] = @@ -8520,6 +8801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonClaw, + .validApprenticeMove = TRUE, }, [MOVE_FRENZY_PLANT] = @@ -8546,6 +8828,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_FrenzyPlant, + .validApprenticeMove = TRUE, }, [MOVE_BULK_UP] = @@ -8571,6 +8854,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BulkUp, + .validApprenticeMove = TRUE, }, [MOVE_BOUNCE] = @@ -8602,6 +8886,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Bounce, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SHOT] = @@ -8654,6 +8939,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PoisonTail, + .validApprenticeMove = TRUE, }, [MOVE_COVET] = @@ -8683,6 +8969,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Covet, + .validApprenticeMove = TRUE, }, [MOVE_VOLT_TACKLE] = @@ -8712,6 +8999,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltTackle, + .validApprenticeMove = TRUE, }, [MOVE_MAGICAL_LEAF] = @@ -8733,6 +9021,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_MagicalLeaf, + .validApprenticeMove = TRUE, }, [MOVE_WATER_SPORT] = @@ -8758,6 +9047,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_WATER_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterSport, + .validApprenticeMove = TRUE, }, [MOVE_CALM_MIND] = @@ -8783,6 +9073,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_CALM_MIND, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CalmMind, + .validApprenticeMove = TRUE, }, [MOVE_LEAF_BLADE] = @@ -8807,6 +9098,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LeafBlade, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_DANCE] = @@ -8833,6 +9125,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = COMBO_STARTER_DRAGON_DANCE, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonDance, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_BLAST] = @@ -8876,6 +9169,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ShockWave, + .validApprenticeMove = TRUE, }, [MOVE_WATER_PULSE] = @@ -8902,6 +9196,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterPulse, + .validApprenticeMove = TRUE, }, [MOVE_DOOM_DESIRE] = @@ -8925,6 +9220,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoomDesire, + .validApprenticeMove = TRUE, }, [MOVE_PSYCHO_BOOST] = @@ -8950,6 +9246,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_PsychoBoost, + .validApprenticeMove = TRUE, }, [MOVE_ROOST] = From 2b2d703c8a79e72ad197774ae9c262afcccfd76c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:31:50 +0100 Subject: [PATCH 118/125] Fixes Static Assert from pr #6174 (#6258) --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index c94c67516a..3dcb26de87 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -73,7 +73,7 @@ #include "constants/trainer_hill.h" #include "constants/weather.h" -STATIC_ASSERT((B_FLAG_FOLLOWERS_DISABLED == 0 && !OW_FOLLOWERS_ENABLED), FollowersFlagAssignedWithoutEnablingThem); +STATIC_ASSERT((B_FLAG_FOLLOWERS_DISABLED == 0 || OW_FOLLOWERS_ENABLED), FollowersFlagAssignedWithoutEnablingThem); struct CableClubPlayer { From de8d25da559a64adbd8b7a95d99ffafe16903e5b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:31:21 +0100 Subject: [PATCH 119/125] Expand usage of IsBattlerAlly (rename from IsAlly) (#6251) --- include/battle.h | 5 +++++ src/battle_anim.c | 9 ++++----- src/battle_anim_bug.c | 2 +- src/battle_anim_effects_1.c | 8 +++++--- src/battle_anim_fire.c | 2 +- src/battle_anim_new.c | 6 +++--- src/battle_anim_psychic.c | 2 +- src/battle_anim_status_effects.c | 2 +- src/battle_anim_utility_funcs.c | 2 +- src/battle_anim_water.c | 2 +- src/battle_script_commands.c | 6 +++--- src/battle_util.c | 26 +++++++++++--------------- src/pokemon.c | 10 ++++++---- 13 files changed, 43 insertions(+), 39 deletions(-) diff --git a/include/battle.h b/include/battle.h index e0a6225f82..f43659020f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1243,6 +1243,11 @@ static inline u32 GetBattlerSide(u32 battler) return GetBattlerPosition(battler) & BIT_SIDE; } +static inline bool32 IsBattlerAlly(u32 battlerAtk, u32 battlerDef) +{ + return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)); +} + static inline u32 GetOpposingSideBattler(u32 battler) { return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); diff --git a/src/battle_anim.c b/src/battle_anim.c index 38648310a7..eb0e2af560 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -304,7 +304,7 @@ void DoMoveAnim(u16 move) // Make sure the anim target of moves hitting everyone is at the opposite side. if (GetBattlerMoveTargetType(gBattlerAttacker, move) & MOVE_TARGET_FOES_AND_ALLY && IsDoubleBattle()) { - while (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + while (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (++gBattleAnimTarget >= MAX_BATTLERS_COUNT) gBattleAnimTarget = 0; @@ -563,7 +563,7 @@ static u8 GetBattleAnimMoveTargets(u8 battlerArgIndex, u8 *targets) case MOVE_TARGET_BOTH: // all opponents for (i = 0; i < gBattlersCount; i++) { - if (i != ignoredTgt && !IsAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i)) + if (i != ignoredTgt && !IsBattlerAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i)) targets[numTargets++] = i + MAX_BATTLERS_COUNT; } break; @@ -2157,8 +2157,7 @@ static void Cmd_teamattack_moveback(void) sBattleAnimScriptPtr += 2; // Apply to double battles when attacking own side - if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsDoubleBattle() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { @@ -2195,7 +2194,7 @@ static void Cmd_teamattack_movefwd(void) // Apply to double battles when attacking own side if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index e897290768..19e201a45e 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -389,7 +389,7 @@ void AnimTranslateStinger(struct Sprite *sprite) } } - if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index ca322e222f..4162447094 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -4022,7 +4022,7 @@ static const union AffineAnimCmd *const sAffineAnims_TeraStarstormBeamRing[] = sAffineAnim_TeraStarstormBeamRing, }; -const struct SpriteTemplate gTeraStarstormBeamSpriteTemplate = +const struct SpriteTemplate gTeraStarstormBeamSpriteTemplate = { .tileTag = ANIM_TAG_STARSTORM, .paletteTag = ANIM_TAG_STARSTORM, @@ -4170,7 +4170,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite *sprite) sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) sprite->data[0] = 1; else sprite->data[0] = 0; @@ -6845,10 +6845,12 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) // if used future sight on opposing side, properly track who used it if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) { + u32 battlerAtkSide = GetBattlerSide(battlerAtk); for (i = 0; i < gBattlersCount; i++) { - if (IsAlly(i,battlerAtk)) + if (battlerAtkSide == GetBattlerSide(i)) continue; // only on opposing side + if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) { // if target was attacked with future sight from us, now they'll be the partner slot diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 401cc09eaf..b67304e05e 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -717,7 +717,7 @@ static void AnimSunlight(struct Sprite *sprite) // arg 6: ? (todo: something related to which mon the pixel offsets are based on) static void AnimEmberFlare(struct Sprite *sprite) { - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget) && (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) || gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index f344b711d6..3386570885 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -8896,7 +8896,7 @@ static void SpriteCB_AnimSpriteOnTargetSideCentre(struct Sprite *sprite) if (!sprite->data[0]) { - if (IsAlly(gBattleAnimAttacker, target)) + if (IsBattlerAlly(gBattleAnimAttacker, target)) { if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); @@ -9072,7 +9072,7 @@ static void SpriteCB_DragonEnergyShot(struct Sprite* sprite) u8 def1 = gBattleAnimTarget; u8 def2 = BATTLE_PARTNER(def1); - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) y = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET); else { @@ -9172,7 +9172,7 @@ static void SpriteCB_GlacialLance(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[6]; - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { sprite->data[2] = GetBattlerSpriteCoord(def1, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Converge on target sprite->data[4] = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 0b4b67f3b7..b7e023c9ad 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -501,7 +501,7 @@ static void AnimPsychoCut(struct Sprite *sprite) } } - if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index f746f186aa..9090893fda 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -403,7 +403,7 @@ void AnimTask_CentredFrozenIceCube(u8 taskId) u8 battler1 = gBattleAnimTarget; u8 battler2 = BATTLE_PARTNER(battler1); - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { x = GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2); y = GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET); diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 47850bc56a..47642b9fce 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1036,7 +1036,7 @@ void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId) void AnimTask_IsTargetSameSide(u8 taskId) { - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) gBattleAnimArgs[ARG_RET_ID] = TRUE; else gBattleAnimArgs[ARG_RET_ID] = FALSE; diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 4265e8d03c..57053ef043 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -940,7 +940,7 @@ static void AnimHydroCannonBeam(struct Sprite *sprite) { bool8 animType; u8 coordType; - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { gBattleAnimArgs[0] *= -1; if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9b73ba1207..4241b989b9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12489,7 +12489,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr // Check Mirror Herb / Opportunist for (index = 0; index < gBattlersCount; index++) { - if (GetBattlerSide(index) == GetBattlerSide(battler)) + if (IsBattlerAlly(index, battler)) continue; // Only triggers on opposing side if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST @@ -17959,7 +17959,7 @@ void BS_JumpIfSleepClause(void) NATIVE_ARGS(const u8 *jumpInstr); // Can freely sleep own partner - if (IsDoubleBattle() && IsSleepClauseEnabled() && GetBattlerSide(gBattlerAttacker) == GetBattlerSide(gBattlerTarget)) + if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) { gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -18079,7 +18079,7 @@ void BS_TryWindRiderPower(void) u32 battler = GetBattlerForBattleScript(cmd->battler); u16 ability = GetBattlerAbility(battler); - if (GetBattlerSide(battler) == GetBattlerSide(gBattlerAttacker) + if (IsBattlerAlly(battler, gBattlerAttacker) && (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER)) { gLastUsedAbility = ability; diff --git a/src/battle_util.c b/src/battle_util.c index bed82d81bd..4dc362cb3a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -346,7 +346,7 @@ void HandleAction_UseMove(void) for (battler = 0; battler < gBattlersCount; battler++) { ability = GetBattlerAbility(battler); - if ((B_REDIRECT_ABILITY_ALLIES >= GEN_4 || !IsAlly(gBattlerAttacker, battler)) + if ((B_REDIRECT_ABILITY_ALLIES >= GEN_4 || !IsBattlerAlly(gBattlerAttacker, battler)) && battler != gBattlerAttacker && gBattleStruct->moveTarget[gBattlerAttacker] != battler && ((ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) @@ -458,7 +458,7 @@ void HandleAction_UseMove(void) } } - if ((GetBattlerSide(gBattlerAttacker) == GetBattlerSide(gBattlerTarget)) + if ((IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) && (!IsBattlerAlive(gBattlerTarget) || gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch)) { gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler; @@ -4253,7 +4253,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (atkPriority > 0 && !IsAlly(battlerAtk, battlerDef)) + if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) { if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; @@ -4278,7 +4278,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (atkPriority > 0 && !IsAlly(battlerAtk, BATTLE_PARTNER(battlerDef))) + if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, BATTLE_PARTNER(battlerDef))) { if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; @@ -6309,7 +6309,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 SetTypeBeforeUsingMove(gCalledMove, battler); // Make sure that the target isn't an ally - if it is, target the original user - if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker)) + if (IsBattlerAlly(gBattlerTarget, gBattlerAttacker)) gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; BattleScriptExecute(BattleScript_DancerActivates); @@ -11677,7 +11677,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch return FALSE; if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; - if (GetBattlerSide(battlerPrankster) == GetBattlerSide(battlerDef)) + if (IsBattlerAlly(battlerPrankster, battlerDef)) return FALSE; if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) return FALSE; @@ -11744,12 +11744,13 @@ u32 GetBattlerMoveTargetType(u32 battler, u32 move) bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) { if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY - && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef) - && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + && IsBattlerAlly(battlerAtk, battlerDef) + && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff - if ((GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX)) - && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)) + if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX + || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))) return FALSE; + return TRUE; } @@ -11870,11 +11871,6 @@ bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct Addi return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; } -bool32 IsAlly(u32 battlerAtk, u32 battlerDef) -{ - return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)); -} - bool32 IsGen6ExpShareEnabled(void) { if (I_EXP_SHARE_FLAG <= TEMP_FLAGS_END) diff --git a/src/pokemon.c b/src/pokemon.c index 128f09f514..38bbda8c11 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2068,8 +2068,9 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) u8 CountAliveMonsInBattle(u8 caseId, u32 battler) { - s32 i; - u8 retVal = 0; + u32 i; + u32 battlerSide; + u32 retVal = 0; switch (caseId) { @@ -2088,9 +2089,10 @@ u8 CountAliveMonsInBattle(u8 caseId, u32 battler) } break; case BATTLE_ALIVE_SIDE: + battlerSide = GetBattlerSide(battler); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & (1u << i))) + if (GetBattlerSide(i) == battlerSide && !(gAbsentBattlerFlags & (1u << i))) retVal++; } break; @@ -7033,7 +7035,7 @@ u32 GetRegionalFormByRegion(u32 species, u32 region) { if (firstFoundSpecies == 0) firstFoundSpecies = formTable[formId]; - + if (IsSpeciesRegionalFormFromRegion(formTable[formId], region)) return formTable[formId]; } From d555f5c97f31ce19c3a9b4d771ee9cd3b8d549a6 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 17 Feb 2025 14:56:15 +0000 Subject: [PATCH 120/125] Do not add TRAINER_FLAG_DOUBLE_BATTLE to recorded battles (#6285) --- src/battle_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index ab95fbf4a8..d88f322a1a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -512,7 +512,8 @@ static void CB2_InitBattleInternal(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_TRAINER_HILL))) + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_RECORDED))) { gBattleTypeFlags |= (IsTrainerDoubleBattle(TRAINER_BATTLE_PARAM.opponentA) ? BATTLE_TYPE_DOUBLE : 0); } From 502b1c5087f22387fb591413d53baae2d3e84090 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:07:30 +0100 Subject: [PATCH 121/125] Rename SetPhotonGeyser to a more general use and clean up (#6272) --- asm/macros/battle_script.inc | 4 ++-- data/battle_scripts_1.s | 4 ++-- include/battle_scripts.h | 2 +- src/battle_script_commands.c | 20 ++++++++++++++++---- src/data/battle_move_effects.h | 6 +++--- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index bfd2c2378d..a169b3580b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1641,8 +1641,8 @@ callnative BS_TryTriggerStatusForm .endm - .macro setphotongeysercategory - callnative BS_SetPhotonGeyserCategory + .macro setdynamicmovecategory + callnative BS_SetDynamicMoveCategory .endm .macro tryupperhand failInstr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fe9b6ea4ff..c8fa0103d6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -836,8 +836,8 @@ BattleScript_FlingMissed: ppreduce goto BattleScript_MoveMissedPause -BattleScript_EffectPhotonGeyser:: - setphotongeysercategory +BattleScript_EffectDynamicCategory:: + setdynamicmovecategory goto BattleScript_EffectHit BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko diff --git a/include/battle_scripts.h b/include/battle_scripts.h index bd8601514c..ffa18d0343 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -825,7 +825,7 @@ extern const u8 BattleScript_MoveEffectHaze[]; extern const u8 BattleScript_MoveEffectIonDeluge[]; extern const u8 BattleScript_EffectHyperspaceFury[]; extern const u8 BattleScript_EffectAuraWheel[]; -extern const u8 BattleScript_EffectPhotonGeyser[]; +extern const u8 BattleScript_EffectDynamicCategory[]; extern const u8 BattleScript_EffectNoRetreat[]; extern const u8 BattleScript_EffectTarShot[]; extern const u8 BattleScript_EffectPoltergeist[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4241b989b9..6824243300 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17705,13 +17705,25 @@ void BS_AllySwitchFailChance(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetPhotonGeyserCategory(void) +void BS_SetDynamicMoveCategory(void) { NATIVE_ARGS(); - u32 effect = GetMoveEffect(gCurrentMove); - if (!((effect == EFFECT_TERA_BLAST && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA) - || (effect == EFFECT_TERA_STARSTORM && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR))) + + switch (GetMoveEffect(gCurrentMove)) + { + case EFFECT_TERA_BLAST: + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + case EFFECT_TERA_STARSTORM: + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR) + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + default: gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + } + gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index d657c429df..e2970afcaf 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1909,7 +1909,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PHOTON_GEYSER] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, @@ -2201,13 +2201,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_TERA_BLAST] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, [EFFECT_TERA_STARSTORM] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, From ff098bc520a8e89273bf9ad6e1148629a989de6b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 19 Feb 2025 15:17:59 -0300 Subject: [PATCH 122/125] Reverted compound literal OW mon pic tables (#6216) --- .../object_event_pic_tables_followers.h | 6632 +++++++++++++++++ src/data/pokemon/species_info.h | 6 +- .../pokemon/species_info/gen_1_families.h | 550 +- .../pokemon/species_info/gen_2_families.h | 268 +- .../pokemon/species_info/gen_3_families.h | 382 +- .../pokemon/species_info/gen_4_families.h | 244 +- .../pokemon/species_info/gen_5_families.h | 374 +- .../pokemon/species_info/gen_6_families.h | 182 +- .../pokemon/species_info/gen_7_families.h | 216 +- .../pokemon/species_info/gen_8_families.h | 194 +- .../pokemon/species_info/gen_9_families.h | 368 +- src/pokemon.c | 2 +- 12 files changed, 8025 insertions(+), 1393 deletions(-) create mode 100644 src/data/object_events/object_event_pic_tables_followers.h diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h new file mode 100644 index 0000000000..d77010c0c0 --- /dev/null +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -0,0 +1,6632 @@ +static const struct SpriteFrameImage sPicTable_Substitute[] = { + overworld_ascending_frames(gObjectEventPic_Substitute, 4, 4), +}; + +#if OW_POKEMON_OBJECT_EVENTS +#if P_FAMILY_BULBASAUR +static const struct SpriteFrameImage sPicTable_Bulbasaur[] = { + overworld_ascending_frames(gObjectEventPic_Bulbasaur, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ivysaur[] = { + overworld_ascending_frames(gObjectEventPic_Ivysaur, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Venusaur[] = { + overworld_ascending_frames(gObjectEventPic_Venusaur, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_VenusaurF[] = { + overworld_ascending_frames(gObjectEventPic_VenusaurF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_VenusaurMega[] = { + overworld_ascending_frames(gObjectEventPic_VenusaurMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_VenusaurGmax[] = { + overworld_ascending_frames(gObjectEventPic_VenusaurGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_BULBASAUR + +#if P_FAMILY_CHARMANDER +static const struct SpriteFrameImage sPicTable_Charmander[] = { + overworld_ascending_frames(gObjectEventPic_Charmander, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Charmeleon[] = { + overworld_ascending_frames(gObjectEventPic_Charmeleon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Charizard[] = { + overworld_ascending_frames(gObjectEventPic_Charizard, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_CharizardMegaX[] = { + overworld_ascending_frames(gObjectEventPic_CharizardMegaX, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CharizardMegaY[] = { + overworld_ascending_frames(gObjectEventPic_CharizardMegaY, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CharizardGmax[] = { + overworld_ascending_frames(gObjectEventPic_CharizardGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_CHARMANDER + +#if P_FAMILY_SQUIRTLE +static const struct SpriteFrameImage sPicTable_Squirtle[] = { + overworld_ascending_frames(gObjectEventPic_Squirtle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Wartortle[] = { + overworld_ascending_frames(gObjectEventPic_Wartortle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Blastoise[] = { + overworld_ascending_frames(gObjectEventPic_Blastoise, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_BlastoiseMega[] = { + overworld_ascending_frames(gObjectEventPic_BlastoiseMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_BlastoiseGmax[] = { + overworld_ascending_frames(gObjectEventPic_BlastoiseGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SQUIRTLE + +#if P_FAMILY_CATERPIE +static const struct SpriteFrameImage sPicTable_Caterpie[] = { + overworld_ascending_frames(gObjectEventPic_Caterpie, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Metapod[] = { + overworld_ascending_frames(gObjectEventPic_Metapod, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Butterfree[] = { + overworld_ascending_frames(gObjectEventPic_Butterfree, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ButterfreeF[] = { + overworld_ascending_frames(gObjectEventPic_ButterfreeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_ButterfreeGmax[] = { + overworld_ascending_frames(gObjectEventPic_ButterfreeGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_CATERPIE + +#if P_FAMILY_WEEDLE +static const struct SpriteFrameImage sPicTable_Weedle[] = { + overworld_ascending_frames(gObjectEventPic_Weedle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kakuna[] = { + overworld_ascending_frames(gObjectEventPic_Kakuna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Beedrill[] = { + overworld_ascending_frames(gObjectEventPic_Beedrill, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_BeedrillMega[] = { + overworld_ascending_frames(gObjectEventPic_BeedrillMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_WEEDLE + +#if P_FAMILY_PIDGEY +static const struct SpriteFrameImage sPicTable_Pidgey[] = { + overworld_ascending_frames(gObjectEventPic_Pidgey, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pidgeotto[] = { + overworld_ascending_frames(gObjectEventPic_Pidgeotto, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pidgeot[] = { + overworld_ascending_frames(gObjectEventPic_Pidgeot, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_PidgeotMega[] = { + overworld_ascending_frames(gObjectEventPic_PidgeotMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_PIDGEY + +#if P_FAMILY_RATTATA +static const struct SpriteFrameImage sPicTable_Rattata[] = { + overworld_ascending_frames(gObjectEventPic_Rattata, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RattataF[] = { + overworld_ascending_frames(gObjectEventPic_RattataF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Raticate[] = { + overworld_ascending_frames(gObjectEventPic_Raticate, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RaticateF[] = { + overworld_ascending_frames(gObjectEventPic_RaticateF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_RattataAlola[] = { + overworld_ascending_frames(gObjectEventPic_RattataAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RaticateAlola[] = { + overworld_ascending_frames(gObjectEventPic_RaticateAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_RATTATA + +#if P_FAMILY_SPEAROW +static const struct SpriteFrameImage sPicTable_Spearow[] = { + overworld_ascending_frames(gObjectEventPic_Spearow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Fearow[] = { + overworld_ascending_frames(gObjectEventPic_Fearow, 4, 4), +}; +#endif //P_FAMILY_SPEAROW + +#if P_FAMILY_EKANS +static const struct SpriteFrameImage sPicTable_Ekans[] = { + overworld_ascending_frames(gObjectEventPic_Ekans, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Arbok[] = { + overworld_ascending_frames(gObjectEventPic_Arbok, 4, 4), +}; +#endif //P_FAMILY_EKANS + +#if P_FAMILY_PIKACHU +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Pichu[] = { + overworld_ascending_frames(gObjectEventPic_Pichu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PichuSpikyEared[] = { + overworld_ascending_frames(gObjectEventPic_PichuSpikyEared, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Pikachu[] = { + overworld_ascending_frames(gObjectEventPic_Pikachu, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_PikachuF[] = { + overworld_ascending_frames(gObjectEventPic_PikachuF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_COSPLAY_PIKACHU_FORMS +/*static const struct SpriteFrameImage sPicTable_PikachuCosplay[] = { + overworld_ascending_frames(gObjectEventPic_PikachuCosplay, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuRockStar[] = { + overworld_ascending_frames(gObjectEventPic_PikachuRockStar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuBelle[] = { + overworld_ascending_frames(gObjectEventPic_PikachuBelle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuPopStar[] = { + overworld_ascending_frames(gObjectEventPic_PikachuPopStar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuPhD[] = { + overworld_ascending_frames(gObjectEventPic_PikachuPhD, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuLibre[] = { + overworld_ascending_frames(gObjectEventPic_PikachuLibre, 4, 4), +};*/ +#endif //P_COSPLAY_PIKACHU_FORMS + +#if P_CAP_PIKACHU_FORMS +/*static const struct SpriteFrameImage sPicTable_PikachuOriginal[] = { + overworld_ascending_frames(gObjectEventPic_PikachuOriginal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuHoenn[] = { + overworld_ascending_frames(gObjectEventPic_PikachuHoenn, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuSinnoh[] = { + overworld_ascending_frames(gObjectEventPic_PikachuSinnoh, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuUnova[] = { + overworld_ascending_frames(gObjectEventPic_PikachuUnova, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuKalos[] = { + overworld_ascending_frames(gObjectEventPic_PikachuKalos, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuAlola[] = { + overworld_ascending_frames(gObjectEventPic_PikachuAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuPartner[] = { + overworld_ascending_frames(gObjectEventPic_PikachuPartner, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PikachuWorld[] = { + overworld_ascending_frames(gObjectEventPic_PikachuWorld, 4, 4), +};*/ +#endif //P_CAP_PIKACHU_FORMS + +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_PikachuGmax[] = { + overworld_ascending_frames(gObjectEventPic_PikachuGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS + +static const struct SpriteFrameImage sPicTable_Raichu[] = { + overworld_ascending_frames(gObjectEventPic_Raichu, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RaichuF[] = { + overworld_ascending_frames(gObjectEventPic_RaichuF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_RaichuAlola[] = { + overworld_ascending_frames(gObjectEventPic_RaichuAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_PIKACHU + +#if P_FAMILY_SANDSHREW +static const struct SpriteFrameImage sPicTable_Sandshrew[] = { + overworld_ascending_frames(gObjectEventPic_Sandshrew, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sandslash[] = { + overworld_ascending_frames(gObjectEventPic_Sandslash, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_SandshrewAlola[] = { + overworld_ascending_frames(gObjectEventPic_SandshrewAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SandslashAlola[] = { + overworld_ascending_frames(gObjectEventPic_SandslashAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_SANDSHREW + +#if P_FAMILY_NIDORAN +static const struct SpriteFrameImage sPicTable_NidoranF[] = { + overworld_ascending_frames(gObjectEventPic_NidoranF, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Nidorina[] = { + overworld_ascending_frames(gObjectEventPic_Nidorina, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Nidoqueen[] = { + overworld_ascending_frames(gObjectEventPic_Nidoqueen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_NidoranM[] = { + overworld_ascending_frames(gObjectEventPic_NidoranM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Nidorino[] = { + overworld_ascending_frames(gObjectEventPic_Nidorino, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Nidoking[] = { + overworld_ascending_frames(gObjectEventPic_Nidoking, 4, 4), +}; +#endif //P_FAMILY_NIDORAN + +#if P_FAMILY_CLEFAIRY +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Cleffa[] = { + overworld_ascending_frames(gObjectEventPic_Cleffa, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Clefairy[] = { + overworld_ascending_frames(gObjectEventPic_Clefairy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Clefable[] = { + overworld_ascending_frames(gObjectEventPic_Clefable, 4, 4), +}; +#endif //P_FAMILY_CLEFAIRY + +#if P_FAMILY_VULPIX +static const struct SpriteFrameImage sPicTable_Vulpix[] = { + overworld_ascending_frames(gObjectEventPic_Vulpix, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ninetales[] = { + overworld_ascending_frames(gObjectEventPic_Ninetales, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_VulpixAlola[] = { + overworld_ascending_frames(gObjectEventPic_VulpixAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_NinetalesAlola[] = { + overworld_ascending_frames(gObjectEventPic_NinetalesAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_VULPIX + +#if P_FAMILY_JIGGLYPUFF +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Igglybuff[] = { + overworld_ascending_frames(gObjectEventPic_Igglybuff, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Jigglypuff[] = { + overworld_ascending_frames(gObjectEventPic_Jigglypuff, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Wigglytuff[] = { + overworld_ascending_frames(gObjectEventPic_Wigglytuff, 4, 4), +}; +#endif //P_FAMILY_JIGGLYPUFF + +#if P_FAMILY_ZUBAT +static const struct SpriteFrameImage sPicTable_Zubat[] = { + overworld_ascending_frames(gObjectEventPic_Zubat, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ZubatF[] = { + overworld_ascending_frames(gObjectEventPic_ZubatF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Golbat[] = { + overworld_ascending_frames(gObjectEventPic_Golbat, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GolbatF[] = { + overworld_ascending_frames(gObjectEventPic_GolbatF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Crobat[] = { + overworld_ascending_frames(gObjectEventPic_Crobat, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_ZUBAT + +#if P_FAMILY_ODDISH +static const struct SpriteFrameImage sPicTable_Oddish[] = { + overworld_ascending_frames(gObjectEventPic_Oddish, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gloom[] = { + overworld_ascending_frames(gObjectEventPic_Gloom, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GloomF[] = { + overworld_ascending_frames(gObjectEventPic_GloomF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Vileplume[] = { + overworld_ascending_frames(gObjectEventPic_Vileplume, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_VileplumeF[] = { + overworld_ascending_frames(gObjectEventPic_VileplumeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Bellossom[] = { + overworld_ascending_frames(gObjectEventPic_Bellossom, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_ODDISH + +#if P_FAMILY_PARAS +static const struct SpriteFrameImage sPicTable_Paras[] = { + overworld_ascending_frames(gObjectEventPic_Paras, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Parasect[] = { + overworld_ascending_frames(gObjectEventPic_Parasect, 4, 4), +}; +#endif //P_FAMILY_PARAS + +#if P_FAMILY_VENONAT +static const struct SpriteFrameImage sPicTable_Venonat[] = { + overworld_ascending_frames(gObjectEventPic_Venonat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Venomoth[] = { + overworld_ascending_frames(gObjectEventPic_Venomoth, 4, 4), +}; +#endif //P_FAMILY_VENONAT + +#if P_FAMILY_DIGLETT +static const struct SpriteFrameImage sPicTable_Diglett[] = { + overworld_ascending_frames(gObjectEventPic_Diglett, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dugtrio[] = { + overworld_ascending_frames(gObjectEventPic_Dugtrio, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_DiglettAlola[] = { + overworld_ascending_frames(gObjectEventPic_DiglettAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DugtrioAlola[] = { + overworld_ascending_frames(gObjectEventPic_DugtrioAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_DIGLETT + +#if P_FAMILY_MEOWTH +static const struct SpriteFrameImage sPicTable_Meowth[] = { + overworld_ascending_frames(gObjectEventPic_Meowth, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Persian[] = { + overworld_ascending_frames(gObjectEventPic_Persian, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_MeowthAlola[] = { + overworld_ascending_frames(gObjectEventPic_MeowthAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PersianAlola[] = { + overworld_ascending_frames(gObjectEventPic_PersianAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS + +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_MeowthGalar[] = { + overworld_ascending_frames(gObjectEventPic_MeowthGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Perrserker[] = { + overworld_ascending_frames(gObjectEventPic_Perrserker, 4, 4), +}; +#endif //P_GALARIAN_FORMS + +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_MeowthGmax[] = { + overworld_ascending_frames(gObjectEventPic_MeowthGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_MEOWTH + +#if P_FAMILY_PSYDUCK +static const struct SpriteFrameImage sPicTable_Psyduck[] = { + overworld_ascending_frames(gObjectEventPic_Psyduck, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Golduck[] = { + overworld_ascending_frames(gObjectEventPic_Golduck, 4, 4), +}; +#endif //P_FAMILY_PSYDUCK + +#if P_FAMILY_MANKEY +static const struct SpriteFrameImage sPicTable_Mankey[] = { + overworld_ascending_frames(gObjectEventPic_Mankey, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Primeape[] = { + overworld_ascending_frames(gObjectEventPic_Primeape, 4, 4), +}; +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Annihilape[] = { + overworld_ascending_frames(gObjectEventPic_Annihilape, 4, 4), +}; +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_MANKEY + +#if P_FAMILY_GROWLITHE +static const struct SpriteFrameImage sPicTable_Growlithe[] = { + overworld_ascending_frames(gObjectEventPic_Growlithe, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Arcanine[] = { + overworld_ascending_frames(gObjectEventPic_Arcanine, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_GrowlitheHisui[] = { + overworld_ascending_frames(gObjectEventPic_GrowlitheHisui, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ArcanineHisui[] = { + overworld_ascending_frames(gObjectEventPic_ArcanineHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_GROWLITHE + +#if P_FAMILY_POLIWAG +static const struct SpriteFrameImage sPicTable_Poliwag[] = { + overworld_ascending_frames(gObjectEventPic_Poliwag, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Poliwhirl[] = { + overworld_ascending_frames(gObjectEventPic_Poliwhirl, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Poliwrath[] = { + overworld_ascending_frames(gObjectEventPic_Poliwrath, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Politoed[] = { + overworld_ascending_frames(gObjectEventPic_Politoed, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_PolitoedF[] = { + overworld_ascending_frames(gObjectEventPic_PolitoedF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_POLIWAG + +#if P_FAMILY_ABRA +static const struct SpriteFrameImage sPicTable_Abra[] = { + overworld_ascending_frames(gObjectEventPic_Abra, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kadabra[] = { + overworld_ascending_frames(gObjectEventPic_Kadabra, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_KadabraF[] = { + overworld_ascending_frames(gObjectEventPic_KadabraF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Alakazam[] = { + overworld_ascending_frames(gObjectEventPic_Alakazam, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_AlakazamF[] = { + overworld_ascending_frames(gObjectEventPic_AlakazamF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AlakazamMega[] = { + overworld_ascending_frames(gObjectEventPic_AlakazamMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_ABRA + +#if P_FAMILY_MACHOP +static const struct SpriteFrameImage sPicTable_Machop[] = { + overworld_ascending_frames(gObjectEventPic_Machop, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Machoke[] = { + overworld_ascending_frames(gObjectEventPic_Machoke, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Machamp[] = { + overworld_ascending_frames(gObjectEventPic_Machamp, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_MachampGmax[] = { + overworld_ascending_frames(gObjectEventPic_MachampGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_MACHOP + +#if P_FAMILY_BELLSPROUT +static const struct SpriteFrameImage sPicTable_Bellsprout[] = { + overworld_ascending_frames(gObjectEventPic_Bellsprout, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Weepinbell[] = { + overworld_ascending_frames(gObjectEventPic_Weepinbell, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Victreebel[] = { + overworld_ascending_frames(gObjectEventPic_Victreebel, 4, 4), +}; +#endif //P_FAMILY_BELLSPROUT + +#if P_FAMILY_TENTACOOL +static const struct SpriteFrameImage sPicTable_Tentacool[] = { + overworld_ascending_frames(gObjectEventPic_Tentacool, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tentacruel[] = { + overworld_ascending_frames(gObjectEventPic_Tentacruel, 4, 4), +}; +#endif //P_FAMILY_TENTACOOL + +#if P_FAMILY_GEODUDE +static const struct SpriteFrameImage sPicTable_Geodude[] = { + overworld_ascending_frames(gObjectEventPic_Geodude, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Graveler[] = { + overworld_ascending_frames(gObjectEventPic_Graveler, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Golem[] = { + overworld_ascending_frames(gObjectEventPic_Golem, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_GeodudeAlola[] = { + overworld_ascending_frames(gObjectEventPic_GeodudeAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GravelerAlola[] = { + overworld_ascending_frames(gObjectEventPic_GravelerAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GolemAlola[] = { + overworld_ascending_frames(gObjectEventPic_GolemAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_GEODUDE + +#if P_FAMILY_PONYTA +static const struct SpriteFrameImage sPicTable_Ponyta[] = { + overworld_ascending_frames(gObjectEventPic_Ponyta, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Rapidash[] = { + overworld_ascending_frames(gObjectEventPic_Rapidash, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_PonytaGalar[] = { + overworld_ascending_frames(gObjectEventPic_PonytaGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RapidashGalar[] = { + overworld_ascending_frames(gObjectEventPic_RapidashGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_PONYTA + +#if P_FAMILY_SLOWPOKE +static const struct SpriteFrameImage sPicTable_Slowpoke[] = { + overworld_ascending_frames(gObjectEventPic_Slowpoke, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Slowbro[] = { + overworld_ascending_frames(gObjectEventPic_Slowbro, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Slowking[] = { + overworld_ascending_frames(gObjectEventPic_Slowking, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS + +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SlowbroMega[] = { + overworld_ascending_frames(gObjectEventPic_SlowbroMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS + +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_SlowpokeGalar[] = { + overworld_ascending_frames(gObjectEventPic_SlowpokeGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SlowbroGalar[] = { + overworld_ascending_frames(gObjectEventPic_SlowbroGalar, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_SlowkingGalar[] = { + overworld_ascending_frames(gObjectEventPic_SlowkingGalar, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_SLOWPOKE + +#if P_FAMILY_MAGNEMITE +static const struct SpriteFrameImage sPicTable_Magnemite[] = { + overworld_ascending_frames(gObjectEventPic_Magnemite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Magneton[] = { + overworld_ascending_frames(gObjectEventPic_Magneton, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Magnezone[] = { + overworld_ascending_frames(gObjectEventPic_Magnezone, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_MAGNEMITE + +#if P_FAMILY_FARFETCHD +static const struct SpriteFrameImage sPicTable_Farfetchd[] = { + overworld_ascending_frames(gObjectEventPic_Farfetchd, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_FarfetchdGalar[] = { + overworld_ascending_frames(gObjectEventPic_FarfetchdGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sirfetchd[] = { + overworld_ascending_frames(gObjectEventPic_Sirfetchd, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_FARFETCHD + +#if P_FAMILY_DODUO +static const struct SpriteFrameImage sPicTable_Doduo[] = { + overworld_ascending_frames(gObjectEventPic_Doduo, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_DoduoF[] = { + overworld_ascending_frames(gObjectEventPic_DoduoF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Dodrio[] = { + overworld_ascending_frames(gObjectEventPic_Dodrio, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_DodrioF[] = { + overworld_ascending_frames(gObjectEventPic_DodrioF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_DODUO + +#if P_FAMILY_SEEL +static const struct SpriteFrameImage sPicTable_Seel[] = { + overworld_ascending_frames(gObjectEventPic_Seel, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dewgong[] = { + overworld_ascending_frames(gObjectEventPic_Dewgong, 4, 4), +}; +#endif //P_FAMILY_SEEL + +#if P_FAMILY_GRIMER +static const struct SpriteFrameImage sPicTable_Grimer[] = { + overworld_ascending_frames(gObjectEventPic_Grimer, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Muk[] = { + overworld_ascending_frames(gObjectEventPic_Muk, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_GrimerAlola[] = { + overworld_ascending_frames(gObjectEventPic_GrimerAlola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MukAlola[] = { + overworld_ascending_frames(gObjectEventPic_MukAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_GRIMER + +#if P_FAMILY_SHELLDER +static const struct SpriteFrameImage sPicTable_Shellder[] = { + overworld_ascending_frames(gObjectEventPic_Shellder, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cloyster[] = { + overworld_ascending_frames(gObjectEventPic_Cloyster, 4, 4), +}; +#endif //P_FAMILY_SHELLDER + +#if P_FAMILY_GASTLY +static const struct SpriteFrameImage sPicTable_Gastly[] = { + overworld_ascending_frames(gObjectEventPic_Gastly, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Haunter[] = { + overworld_ascending_frames(gObjectEventPic_Haunter, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gengar[] = { + overworld_ascending_frames(gObjectEventPic_Gengar, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GengarMega[] = { + overworld_ascending_frames(gObjectEventPic_GengarMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_GengarGmax[] = { + overworld_ascending_frames(gObjectEventPic_GengarGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_GASTLY + +#if P_FAMILY_ONIX +static const struct SpriteFrameImage sPicTable_Onix[] = { + overworld_ascending_frames(gObjectEventPic_Onix, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Steelix[] = { + overworld_ascending_frames(gObjectEventPic_Steelix, 8, 8), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SteelixF[] = { + overworld_ascending_frames(gObjectEventPic_SteelixF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SteelixMega[] = { + overworld_ascending_frames(gObjectEventPic_SteelixMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_ONIX + +#if P_FAMILY_DROWZEE +static const struct SpriteFrameImage sPicTable_Drowzee[] = { + overworld_ascending_frames(gObjectEventPic_Drowzee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hypno[] = { + overworld_ascending_frames(gObjectEventPic_Hypno, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_HypnoF[] = { + overworld_ascending_frames(gObjectEventPic_HypnoF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_DROWZEE + +#if P_FAMILY_KRABBY +static const struct SpriteFrameImage sPicTable_Krabby[] = { + overworld_ascending_frames(gObjectEventPic_Krabby, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kingler[] = { + overworld_ascending_frames(gObjectEventPic_Kingler, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_KinglerGmax[] = { + overworld_ascending_frames(gObjectEventPic_KinglerGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_KRABBY + +#if P_FAMILY_VOLTORB +static const struct SpriteFrameImage sPicTable_Voltorb[] = { + overworld_ascending_frames(gObjectEventPic_Voltorb, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Electrode[] = { + overworld_ascending_frames(gObjectEventPic_Electrode, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_VoltorbHisui[] = { + overworld_ascending_frames(gObjectEventPic_VoltorbHisui, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ElectrodeHisui[] = { + overworld_ascending_frames(gObjectEventPic_ElectrodeHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_VOLTORB + +#if P_FAMILY_EXEGGCUTE +static const struct SpriteFrameImage sPicTable_Exeggcute[] = { + overworld_ascending_frames(gObjectEventPic_Exeggcute, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Exeggutor[] = { + overworld_ascending_frames(gObjectEventPic_Exeggutor, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_ExeggutorAlola[] = { + overworld_ascending_frames(gObjectEventPic_ExeggutorAlola, 8, 8), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_EXEGGCUTE + +#if P_FAMILY_CUBONE +static const struct SpriteFrameImage sPicTable_Cubone[] = { + overworld_ascending_frames(gObjectEventPic_Cubone, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Marowak[] = { + overworld_ascending_frames(gObjectEventPic_Marowak, 4, 4), +}; +#if P_ALOLAN_FORMS +static const struct SpriteFrameImage sPicTable_MarowakAlola[] = { + overworld_ascending_frames(gObjectEventPic_MarowakAlola, 4, 4), +}; +#endif //P_ALOLAN_FORMS +#endif //P_FAMILY_CUBONE + +#if P_FAMILY_HITMONS +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Tyrogue[] = { + overworld_ascending_frames(gObjectEventPic_Tyrogue, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Hitmonlee[] = { + overworld_ascending_frames(gObjectEventPic_Hitmonlee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hitmonchan[] = { + overworld_ascending_frames(gObjectEventPic_Hitmonchan, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Hitmontop[] = { + overworld_ascending_frames(gObjectEventPic_Hitmontop, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_HITMONS + +#if P_FAMILY_LICKITUNG +static const struct SpriteFrameImage sPicTable_Lickitung[] = { + overworld_ascending_frames(gObjectEventPic_Lickitung, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Lickilicky[] = { + overworld_ascending_frames(gObjectEventPic_Lickilicky, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_LICKITUNG + +#if P_FAMILY_KOFFING +static const struct SpriteFrameImage sPicTable_Koffing[] = { + overworld_ascending_frames(gObjectEventPic_Koffing, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Weezing[] = { + overworld_ascending_frames(gObjectEventPic_Weezing, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_WeezingGalar[] = { + overworld_ascending_frames(gObjectEventPic_WeezingGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_KOFFING + +#if P_FAMILY_RHYHORN +static const struct SpriteFrameImage sPicTable_Rhyhorn[] = { + overworld_ascending_frames(gObjectEventPic_Rhyhorn, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RhyhornF[] = { + overworld_ascending_frames(gObjectEventPic_RhyhornF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Rhydon[] = { + overworld_ascending_frames(gObjectEventPic_Rhydon, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RhydonF[] = { + overworld_ascending_frames(gObjectEventPic_RhydonF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Rhyperior[] = { + overworld_ascending_frames(gObjectEventPic_Rhyperior, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RhyperiorF[] = { + overworld_ascending_frames(gObjectEventPic_RhyperiorF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_RHYHORN + +#if P_FAMILY_CHANSEY +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Happiny[] = { + overworld_ascending_frames(gObjectEventPic_Happiny, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Chansey[] = { + overworld_ascending_frames(gObjectEventPic_Chansey, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Blissey[] = { + overworld_ascending_frames(gObjectEventPic_Blissey, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_CHANSEY + +#if P_FAMILY_TANGELA +static const struct SpriteFrameImage sPicTable_Tangela[] = { + overworld_ascending_frames(gObjectEventPic_Tangela, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Tangrowth[] = { + overworld_ascending_frames(gObjectEventPic_Tangrowth, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_TangrowthF[] = { + overworld_ascending_frames(gObjectEventPic_TangrowthF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_TANGELA + +#if P_FAMILY_KANGASKHAN +static const struct SpriteFrameImage sPicTable_Kangaskhan[] = { + overworld_ascending_frames(gObjectEventPic_Kangaskhan, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_KangaskhanMega[] = { + overworld_ascending_frames(gObjectEventPic_KangaskhanMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_KANGASKHAN + +#if P_FAMILY_HORSEA +static const struct SpriteFrameImage sPicTable_Horsea[] = { + overworld_ascending_frames(gObjectEventPic_Horsea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Seadra[] = { + overworld_ascending_frames(gObjectEventPic_Seadra, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Kingdra[] = { + overworld_ascending_frames(gObjectEventPic_Kingdra, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_HORSEA + +#if P_FAMILY_GOLDEEN +static const struct SpriteFrameImage sPicTable_Goldeen[] = { + overworld_ascending_frames(gObjectEventPic_Goldeen, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GoldeenF[] = { + overworld_ascending_frames(gObjectEventPic_GoldeenF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Seaking[] = { + overworld_ascending_frames(gObjectEventPic_Seaking, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SeakingF[] = { + overworld_ascending_frames(gObjectEventPic_SeakingF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_GOLDEEN + +#if P_FAMILY_STARYU +static const struct SpriteFrameImage sPicTable_Staryu[] = { + overworld_ascending_frames(gObjectEventPic_Staryu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Starmie[] = { + overworld_ascending_frames(gObjectEventPic_Starmie, 4, 4), +}; +#endif //P_FAMILY_STARYU + +#if P_FAMILY_MR_MIME +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_MimeJr[] = { + overworld_ascending_frames(gObjectEventPic_MimeJr, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_MrMime[] = { + overworld_ascending_frames(gObjectEventPic_MrMime, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_MrMimeGalar[] = { + overworld_ascending_frames(gObjectEventPic_MrMimeGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MrRime[] = { + overworld_ascending_frames(gObjectEventPic_MrRime, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_MR_MIME + +#if P_FAMILY_SCYTHER +static const struct SpriteFrameImage sPicTable_Scyther[] = { + overworld_ascending_frames(gObjectEventPic_Scyther, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ScytherF[] = { + overworld_ascending_frames(gObjectEventPic_ScytherF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Scizor[] = { + overworld_ascending_frames(gObjectEventPic_Scizor, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ScizorF[] = { + overworld_ascending_frames(gObjectEventPic_ScizorF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_ScizorMega[] = { + overworld_ascending_frames(gObjectEventPic_ScizorMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_GEN_2_CROSS_EVOS + +#if P_GEN_8_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Kleavor[] = { + overworld_ascending_frames(gObjectEventPic_Kleavor, 4, 4), +}; +#endif //P_GEN_8_CROSS_EVOS +#endif //P_FAMILY_SCYTHER + +#if P_FAMILY_JYNX +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Smoochum[] = { + overworld_ascending_frames(gObjectEventPic_Smoochum, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Jynx[] = { + overworld_ascending_frames(gObjectEventPic_Jynx, 4, 4), +}; +#endif //P_FAMILY_JYNX + +#if P_FAMILY_ELECTABUZZ +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Elekid[] = { + overworld_ascending_frames(gObjectEventPic_Elekid, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Electabuzz[] = { + overworld_ascending_frames(gObjectEventPic_Electabuzz, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Electivire[] = { + overworld_ascending_frames(gObjectEventPic_Electivire, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_ELECTABUZZ + +#if P_FAMILY_MAGMAR +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Magby[] = { + overworld_ascending_frames(gObjectEventPic_Magby, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Magmar[] = { + overworld_ascending_frames(gObjectEventPic_Magmar, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Magmortar[] = { + overworld_ascending_frames(gObjectEventPic_Magmortar, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_MAGMAR + +#if P_FAMILY_PINSIR +static const struct SpriteFrameImage sPicTable_Pinsir[] = { + overworld_ascending_frames(gObjectEventPic_Pinsir, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_PinsirMega[] = { + overworld_ascending_frames(gObjectEventPic_PinsirMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_PINSIR + +#if P_FAMILY_TAUROS +static const struct SpriteFrameImage sPicTable_Tauros[] = { + overworld_ascending_frames(gObjectEventPic_Tauros, 4, 4), +}; +#if P_PALDEAN_FORMS +static const struct SpriteFrameImage sPicTable_TaurosPaldeaCombat[] = { + overworld_ascending_frames(gObjectEventPic_TaurosPaldeaCombat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TaurosPaldeaBlaze[] = { + overworld_ascending_frames(gObjectEventPic_TaurosPaldeaBlaze, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TaurosPaldeaAqua[] = { + overworld_ascending_frames(gObjectEventPic_TaurosPaldeaAqua, 4, 4), +}; +#endif //P_PALDEAN_FORMS +#endif //P_FAMILY_TAUROS + +#if P_FAMILY_MAGIKARP +static const struct SpriteFrameImage sPicTable_Magikarp[] = { + overworld_ascending_frames(gObjectEventPic_Magikarp, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MagikarpF[] = { + overworld_ascending_frames(gObjectEventPic_MagikarpF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Gyarados[] = { + overworld_ascending_frames(gObjectEventPic_Gyarados, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GyaradosF[] = { + overworld_ascending_frames(gObjectEventPic_GyaradosF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GyaradosMega[] = { + overworld_ascending_frames(gObjectEventPic_GyaradosMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MAGIKARP + +#if P_FAMILY_LAPRAS +static const struct SpriteFrameImage sPicTable_Lapras[] = { + overworld_ascending_frames(gObjectEventPic_Lapras, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_LaprasGmax[] = { + overworld_ascending_frames(gObjectEventPic_LaprasGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_LAPRAS + +#if P_FAMILY_DITTO +static const struct SpriteFrameImage sPicTable_Ditto[] = { + overworld_ascending_frames(gObjectEventPic_Ditto, 4, 4), +}; +#endif //P_FAMILY_DITTO + +#if P_FAMILY_EEVEE +static const struct SpriteFrameImage sPicTable_Eevee[] = { + overworld_ascending_frames(gObjectEventPic_Eevee, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_EeveeF[] = { + overworld_ascending_frames(gObjectEventPic_EeveeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_EeveeGmax[] = { + overworld_ascending_frames(gObjectEventPic_EeveeGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS + +static const struct SpriteFrameImage sPicTable_Vaporeon[] = { + overworld_ascending_frames(gObjectEventPic_Vaporeon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Jolteon[] = { + overworld_ascending_frames(gObjectEventPic_Jolteon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Flareon[] = { + overworld_ascending_frames(gObjectEventPic_Flareon, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Espeon[] = { + overworld_ascending_frames(gObjectEventPic_Espeon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Umbreon[] = { + overworld_ascending_frames(gObjectEventPic_Umbreon, 4, 4), +}; +#endif //P_GEN_2_CROSS_EVOS + +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Leafeon[] = { + overworld_ascending_frames(gObjectEventPic_Leafeon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Glaceon[] = { + overworld_ascending_frames(gObjectEventPic_Glaceon, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS + +#if P_GEN_6_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Sylveon[] = { + overworld_ascending_frames(gObjectEventPic_Sylveon, 4, 4), +}; +#endif //P_GEN_6_CROSS_EVOS +#endif //P_FAMILY_EEVEE + +#if P_FAMILY_PORYGON +static const struct SpriteFrameImage sPicTable_Porygon[] = { + overworld_ascending_frames(gObjectEventPic_Porygon, 4, 4), +}; +#if P_GEN_2_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Porygon2[] = { + overworld_ascending_frames(gObjectEventPic_Porygon2, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_PorygonZ[] = { + overworld_ascending_frames(gObjectEventPic_PorygonZ, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_GEN_2_CROSS_EVOS +#endif //P_FAMILY_PORYGON + +#if P_FAMILY_OMANYTE +static const struct SpriteFrameImage sPicTable_Omanyte[] = { + overworld_ascending_frames(gObjectEventPic_Omanyte, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Omastar[] = { + overworld_ascending_frames(gObjectEventPic_Omastar, 4, 4), +}; +#endif //P_FAMILY_OMANYTE + +#if P_FAMILY_KABUTO +static const struct SpriteFrameImage sPicTable_Kabuto[] = { + overworld_ascending_frames(gObjectEventPic_Kabuto, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kabutops[] = { + overworld_ascending_frames(gObjectEventPic_Kabutops, 4, 4), +}; +#endif //P_FAMILY_KABUTO + +#if P_FAMILY_AERODACTYL +static const struct SpriteFrameImage sPicTable_Aerodactyl[] = { + overworld_ascending_frames(gObjectEventPic_Aerodactyl, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AerodactylMega[] = { + overworld_ascending_frames(gObjectEventPic_AerodactylMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_AERODACTYL + +#if P_FAMILY_SNORLAX +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Munchlax[] = { + overworld_ascending_frames(gObjectEventPic_Munchlax, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Snorlax[] = { + overworld_ascending_frames(gObjectEventPic_Snorlax, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_SnorlaxGmax[] = { + overworld_ascending_frames(gObjectEventPic_SnorlaxGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SNORLAX + +#if P_FAMILY_ARTICUNO +static const struct SpriteFrameImage sPicTable_Articuno[] = { + overworld_ascending_frames(gObjectEventPic_Articuno, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_ArticunoGalar[] = { + overworld_ascending_frames(gObjectEventPic_ArticunoGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_ARTICUNO + +#if P_FAMILY_ZAPDOS +static const struct SpriteFrameImage sPicTable_Zapdos[] = { + overworld_ascending_frames(gObjectEventPic_Zapdos, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_ZapdosGalar[] = { + overworld_ascending_frames(gObjectEventPic_ZapdosGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_ZAPDOS + +#if P_FAMILY_MOLTRES +static const struct SpriteFrameImage sPicTable_Moltres[] = { + overworld_ascending_frames(gObjectEventPic_Moltres, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_MoltresGalar[] = { + overworld_ascending_frames(gObjectEventPic_MoltresGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_MOLTRES + +#if P_FAMILY_DRATINI +static const struct SpriteFrameImage sPicTable_Dratini[] = { + overworld_ascending_frames(gObjectEventPic_Dratini, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dragonair[] = { + overworld_ascending_frames(gObjectEventPic_Dragonair, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dragonite[] = { + overworld_ascending_frames(gObjectEventPic_Dragonite, 4, 4), +}; +#endif //P_FAMILY_DRATINI + +#if P_FAMILY_MEWTWO +static const struct SpriteFrameImage sPicTable_Mewtwo[] = { + overworld_ascending_frames(gObjectEventPic_Mewtwo, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_MewtwoMegaX[] = { + overworld_ascending_frames(gObjectEventPic_MewtwoMegaX, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MewtwoMegaY[] = { + overworld_ascending_frames(gObjectEventPic_MewtwoMegaY, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MEWTWO + +#if P_FAMILY_MEW +static const struct SpriteFrameImage sPicTable_Mew[] = { + overworld_ascending_frames(gObjectEventPic_Mew, 4, 4), +}; +#endif //P_FAMILY_MEW + +#if P_FAMILY_CHIKORITA +static const struct SpriteFrameImage sPicTable_Chikorita[] = { + overworld_ascending_frames(gObjectEventPic_Chikorita, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bayleef[] = { + overworld_ascending_frames(gObjectEventPic_Bayleef, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Meganium[] = { + overworld_ascending_frames(gObjectEventPic_Meganium, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MeganiumF[] = { + overworld_ascending_frames(gObjectEventPic_MeganiumF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_CHIKORITA + +#if P_FAMILY_CYNDAQUIL +static const struct SpriteFrameImage sPicTable_Cyndaquil[] = { + overworld_ascending_frames(gObjectEventPic_Cyndaquil, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Quilava[] = { + overworld_ascending_frames(gObjectEventPic_Quilava, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Typhlosion[] = { + overworld_ascending_frames(gObjectEventPic_Typhlosion, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_TyphlosionHisui[] = { + overworld_ascending_frames(gObjectEventPic_TyphlosionHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_CYNDAQUIL + +#if P_FAMILY_TOTODILE +static const struct SpriteFrameImage sPicTable_Totodile[] = { + overworld_ascending_frames(gObjectEventPic_Totodile, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Croconaw[] = { + overworld_ascending_frames(gObjectEventPic_Croconaw, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Feraligatr[] = { + overworld_ascending_frames(gObjectEventPic_Feraligatr, 4, 4), +}; +#endif //P_FAMILY_TOTODILE + +#if P_FAMILY_SENTRET +static const struct SpriteFrameImage sPicTable_Sentret[] = { + overworld_ascending_frames(gObjectEventPic_Sentret, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Furret[] = { + overworld_ascending_frames(gObjectEventPic_Furret, 4, 4), +}; +#endif //P_FAMILY_SENTRET + +#if P_FAMILY_HOOTHOOT +static const struct SpriteFrameImage sPicTable_Hoothoot[] = { + overworld_ascending_frames(gObjectEventPic_Hoothoot, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Noctowl[] = { + overworld_ascending_frames(gObjectEventPic_Noctowl, 4, 4), +}; +#endif //P_FAMILY_HOOTHOOT + +#if P_FAMILY_LEDYBA +static const struct SpriteFrameImage sPicTable_Ledyba[] = { + overworld_ascending_frames(gObjectEventPic_Ledyba, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LedybaF[] = { + overworld_ascending_frames(gObjectEventPic_LedybaF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Ledian[] = { + overworld_ascending_frames(gObjectEventPic_Ledian, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LedianF[] = { + overworld_ascending_frames(gObjectEventPic_LedianF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_LEDYBA + +#if P_FAMILY_SPINARAK +static const struct SpriteFrameImage sPicTable_Spinarak[] = { + overworld_ascending_frames(gObjectEventPic_Spinarak, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ariados[] = { + overworld_ascending_frames(gObjectEventPic_Ariados, 4, 4), +}; +#endif //P_FAMILY_SPINARAK + +#if P_FAMILY_CHINCHOU +static const struct SpriteFrameImage sPicTable_Chinchou[] = { + overworld_ascending_frames(gObjectEventPic_Chinchou, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lanturn[] = { + overworld_ascending_frames(gObjectEventPic_Lanturn, 4, 4), +}; +#endif //P_FAMILY_CHINCHOU + +#if P_FAMILY_TOGEPI +static const struct SpriteFrameImage sPicTable_Togepi[] = { + overworld_ascending_frames(gObjectEventPic_Togepi, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Togetic[] = { + overworld_ascending_frames(gObjectEventPic_Togetic, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Togekiss[] = { + overworld_ascending_frames(gObjectEventPic_Togekiss, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_TOGEPI + +#if P_FAMILY_NATU +static const struct SpriteFrameImage sPicTable_Natu[] = { + overworld_ascending_frames(gObjectEventPic_Natu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Xatu[] = { + overworld_ascending_frames(gObjectEventPic_Xatu, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_XatuF[] = { + overworld_ascending_frames(gObjectEventPic_XatuF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_NATU + +#if P_FAMILY_MAREEP +static const struct SpriteFrameImage sPicTable_Mareep[] = { + overworld_ascending_frames(gObjectEventPic_Mareep, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Flaaffy[] = { + overworld_ascending_frames(gObjectEventPic_Flaaffy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ampharos[] = { + overworld_ascending_frames(gObjectEventPic_Ampharos, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AmpharosMega[] = { + overworld_ascending_frames(gObjectEventPic_AmpharosMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MAREEP + +#if P_FAMILY_MARILL +#if P_GEN_3_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Azurill[] = { + overworld_ascending_frames(gObjectEventPic_Azurill, 4, 4), +}; +#endif //P_GEN_3_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Marill[] = { + overworld_ascending_frames(gObjectEventPic_Marill, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Azumarill[] = { + overworld_ascending_frames(gObjectEventPic_Azumarill, 4, 4), +}; +#endif //P_FAMILY_MARILL + +#if P_FAMILY_SUDOWOODO +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Bonsly[] = { + overworld_ascending_frames(gObjectEventPic_Bonsly, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Sudowoodo[] = { + overworld_ascending_frames(gObjectEventPic_Sudowoodo, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SudowoodoF[] = { + overworld_ascending_frames(gObjectEventPic_SudowoodoF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_SUDOWOODO + +#if P_FAMILY_HOPPIP +static const struct SpriteFrameImage sPicTable_Hoppip[] = { + overworld_ascending_frames(gObjectEventPic_Hoppip, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Skiploom[] = { + overworld_ascending_frames(gObjectEventPic_Skiploom, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Jumpluff[] = { + overworld_ascending_frames(gObjectEventPic_Jumpluff, 4, 4), +}; +#endif //P_FAMILY_HOPPIP + +#if P_FAMILY_AIPOM +static const struct SpriteFrameImage sPicTable_Aipom[] = { + overworld_ascending_frames(gObjectEventPic_Aipom, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_AipomF[] = { + overworld_ascending_frames(gObjectEventPic_AipomF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Ambipom[] = { + overworld_ascending_frames(gObjectEventPic_Ambipom, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_AmbipomF[] = { + overworld_ascending_frames(gObjectEventPic_AmbipomF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_AIPOM + +#if P_FAMILY_SUNKERN +static const struct SpriteFrameImage sPicTable_Sunkern[] = { + overworld_ascending_frames(gObjectEventPic_Sunkern, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sunflora[] = { + overworld_ascending_frames(gObjectEventPic_Sunflora, 4, 4), +}; +#endif //P_FAMILY_SUNKERN + +#if P_FAMILY_YANMA +static const struct SpriteFrameImage sPicTable_Yanma[] = { + overworld_ascending_frames(gObjectEventPic_Yanma, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Yanmega[] = { + overworld_ascending_frames(gObjectEventPic_Yanmega, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_YANMA + +#if P_FAMILY_WOOPER +static const struct SpriteFrameImage sPicTable_Wooper[] = { + overworld_ascending_frames(gObjectEventPic_Wooper, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_WooperF[] = { + overworld_ascending_frames(gObjectEventPic_WooperF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Quagsire[] = { + overworld_ascending_frames(gObjectEventPic_Quagsire, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_QuagsireF[] = { + overworld_ascending_frames(gObjectEventPic_QuagsireF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_PALDEAN_FORMS +static const struct SpriteFrameImage sPicTable_WooperPaldea[] = { + overworld_ascending_frames(gObjectEventPic_WooperPaldea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Clodsire[] = { + overworld_ascending_frames(gObjectEventPic_Clodsire, 4, 4), +}; +#endif //P_PALDEAN_FORMS +#endif //P_FAMILY_WOOPER + +#if P_FAMILY_MURKROW +static const struct SpriteFrameImage sPicTable_Murkrow[] = { + overworld_ascending_frames(gObjectEventPic_Murkrow, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MurkrowF[] = { + overworld_ascending_frames(gObjectEventPic_MurkrowF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Honchkrow[] = { + overworld_ascending_frames(gObjectEventPic_Honchkrow, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_MURKROW + +#if P_FAMILY_MISDREAVUS +static const struct SpriteFrameImage sPicTable_Misdreavus[] = { + overworld_ascending_frames(gObjectEventPic_Misdreavus, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Mismagius[] = { + overworld_ascending_frames(gObjectEventPic_Mismagius, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_MISDREAVUS + +#if P_FAMILY_UNOWN +static const struct SpriteFrameImage sPicTable_UnownA[] = { + overworld_ascending_frames(gObjectEventPic_UnownA, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownB[] = { + overworld_ascending_frames(gObjectEventPic_UnownB, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownC[] = { + overworld_ascending_frames(gObjectEventPic_UnownC, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownD[] = { + overworld_ascending_frames(gObjectEventPic_UnownD, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownE[] = { + overworld_ascending_frames(gObjectEventPic_UnownE, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownF[] = { + overworld_ascending_frames(gObjectEventPic_UnownF, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownG[] = { + overworld_ascending_frames(gObjectEventPic_UnownG, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownH[] = { + overworld_ascending_frames(gObjectEventPic_UnownH, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownI[] = { + overworld_ascending_frames(gObjectEventPic_UnownI, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownJ[] = { + overworld_ascending_frames(gObjectEventPic_UnownJ, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownK[] = { + overworld_ascending_frames(gObjectEventPic_UnownK, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownL[] = { + overworld_ascending_frames(gObjectEventPic_UnownL, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownM[] = { + overworld_ascending_frames(gObjectEventPic_UnownM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownN[] = { + overworld_ascending_frames(gObjectEventPic_UnownN, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownO[] = { + overworld_ascending_frames(gObjectEventPic_UnownO, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownP[] = { + overworld_ascending_frames(gObjectEventPic_UnownP, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownQ[] = { + overworld_ascending_frames(gObjectEventPic_UnownQ, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownR[] = { + overworld_ascending_frames(gObjectEventPic_UnownR, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownS[] = { + overworld_ascending_frames(gObjectEventPic_UnownS, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownT[] = { + overworld_ascending_frames(gObjectEventPic_UnownT, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownU[] = { + overworld_ascending_frames(gObjectEventPic_UnownU, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownV[] = { + overworld_ascending_frames(gObjectEventPic_UnownV, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownW[] = { + overworld_ascending_frames(gObjectEventPic_UnownW, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownX[] = { + overworld_ascending_frames(gObjectEventPic_UnownX, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownY[] = { + overworld_ascending_frames(gObjectEventPic_UnownY, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownZ[] = { + overworld_ascending_frames(gObjectEventPic_UnownZ, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownExclamation[] = { + overworld_ascending_frames(gObjectEventPic_UnownExclamation, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UnownQuestion[] = { + overworld_ascending_frames(gObjectEventPic_UnownQuestion, 4, 4), +}; +#endif //P_FAMILY_UNOWN + +#if P_FAMILY_WOBBUFFET +#if P_GEN_3_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Wynaut[] = { + overworld_ascending_frames(gObjectEventPic_Wynaut, 4, 4), +}; +#endif //P_GEN_3_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Wobbuffet[] = { + overworld_ascending_frames(gObjectEventPic_Wobbuffet, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_WobbuffetF[] = { + overworld_ascending_frames(gObjectEventPic_WobbuffetF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_WOBBUFFET + +#if P_FAMILY_GIRAFARIG +static const struct SpriteFrameImage sPicTable_Girafarig[] = { + overworld_ascending_frames(gObjectEventPic_Girafarig, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GirafarigF[] = { + overworld_ascending_frames(gObjectEventPic_GirafarigF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Farigiraf[] = { + overworld_ascending_frames(gObjectEventPic_Farigiraf, 4, 4), +}; +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_GIRAFARIG + +#if P_FAMILY_PINECO +static const struct SpriteFrameImage sPicTable_Pineco[] = { + overworld_ascending_frames(gObjectEventPic_Pineco, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Forretress[] = { + overworld_ascending_frames(gObjectEventPic_Forretress, 4, 4), +}; +#endif //P_FAMILY_PINECO + +#if P_FAMILY_DUNSPARCE +static const struct SpriteFrameImage sPicTable_Dunsparce[] = { + overworld_ascending_frames(gObjectEventPic_Dunsparce, 4, 4), +}; +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_DudunsparceTwoSegment[] = { + overworld_ascending_frames(gObjectEventPic_DudunsparceTwoSegment, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DudunsparceThreeSegment[] = { + overworld_ascending_frames(gObjectEventPic_DudunsparceThreeSegment, 8, 8), +}; + + +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_DUNSPARCE + +#if P_FAMILY_GLIGAR +static const struct SpriteFrameImage sPicTable_Gligar[] = { + overworld_ascending_frames(gObjectEventPic_Gligar, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GligarF[] = { + overworld_ascending_frames(gObjectEventPic_GligarF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Gliscor[] = { + overworld_ascending_frames(gObjectEventPic_Gliscor, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_GLIGAR + +#if P_FAMILY_SNUBBULL +static const struct SpriteFrameImage sPicTable_Snubbull[] = { + overworld_ascending_frames(gObjectEventPic_Snubbull, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Granbull[] = { + overworld_ascending_frames(gObjectEventPic_Granbull, 4, 4), +}; +#endif //P_FAMILY_SNUBBULL + +#if P_FAMILY_QWILFISH +static const struct SpriteFrameImage sPicTable_Qwilfish[] = { + overworld_ascending_frames(gObjectEventPic_Qwilfish, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_QwilfishHisui[] = { + overworld_ascending_frames(gObjectEventPic_QwilfishHisui, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Overqwil[] = { + overworld_ascending_frames(gObjectEventPic_Overqwil, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_QWILFISH + +#if P_FAMILY_SHUCKLE +static const struct SpriteFrameImage sPicTable_Shuckle[] = { + overworld_ascending_frames(gObjectEventPic_Shuckle, 4, 4), +}; +#endif //P_FAMILY_SHUCKLE + +#if P_FAMILY_HERACROSS +static const struct SpriteFrameImage sPicTable_Heracross[] = { + overworld_ascending_frames(gObjectEventPic_Heracross, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_HeracrossF[] = { + overworld_ascending_frames(gObjectEventPic_HeracrossF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_HeracrossMega[] = { + overworld_ascending_frames(gObjectEventPic_HeracrossMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_HERACROSS + +#if P_FAMILY_SNEASEL +static const struct SpriteFrameImage sPicTable_Sneasel[] = { + overworld_ascending_frames(gObjectEventPic_Sneasel, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SneaselF[] = { + overworld_ascending_frames(gObjectEventPic_SneaselF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Weavile[] = { + overworld_ascending_frames(gObjectEventPic_Weavile, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_WeavileF[] = { + overworld_ascending_frames(gObjectEventPic_WeavileF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS + +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_SneaselHisui[] = { + overworld_ascending_frames(gObjectEventPic_SneaselHisui, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SneaselHisuiF[] = { + overworld_ascending_frames(gObjectEventPic_SneaselHisuiF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Sneasler[] = { + overworld_ascending_frames(gObjectEventPic_Sneasler, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_SNEASEL + +#if P_FAMILY_TEDDIURSA +static const struct SpriteFrameImage sPicTable_Teddiursa[] = { + overworld_ascending_frames(gObjectEventPic_Teddiursa, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ursaring[] = { + overworld_ascending_frames(gObjectEventPic_Ursaring, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_UrsaringF[] = { + overworld_ascending_frames(gObjectEventPic_UrsaringF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_8_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Ursaluna[] = { + overworld_ascending_frames(gObjectEventPic_Ursaluna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UrsalunaBloodmoon[] = { + overworld_ascending_frames(gObjectEventPic_UrsalunaBloodmoon, 4, 4), +}; +#endif //P_GEN_8_CROSS_EVOS +#endif //P_FAMILY_TEDDIURSA + +#if P_FAMILY_SLUGMA +static const struct SpriteFrameImage sPicTable_Slugma[] = { + overworld_ascending_frames(gObjectEventPic_Slugma, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Magcargo[] = { + overworld_ascending_frames(gObjectEventPic_Magcargo, 4, 4), +}; +#endif //P_FAMILY_SLUGMA + +#if P_FAMILY_SWINUB +static const struct SpriteFrameImage sPicTable_Swinub[] = { + overworld_ascending_frames(gObjectEventPic_Swinub, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Piloswine[] = { + overworld_ascending_frames(gObjectEventPic_Piloswine, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_PiloswineF[] = { + overworld_ascending_frames(gObjectEventPic_PiloswineF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Mamoswine[] = { + overworld_ascending_frames(gObjectEventPic_Mamoswine, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MamoswineF[] = { + overworld_ascending_frames(gObjectEventPic_MamoswineF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_SWINUB + +#if P_FAMILY_CORSOLA +static const struct SpriteFrameImage sPicTable_Corsola[] = { + overworld_ascending_frames(gObjectEventPic_Corsola, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_CorsolaGalar[] = { + overworld_ascending_frames(gObjectEventPic_CorsolaGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cursola[] = { + overworld_ascending_frames(gObjectEventPic_Cursola, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_CORSOLA + +#if P_FAMILY_REMORAID +static const struct SpriteFrameImage sPicTable_Remoraid[] = { + overworld_ascending_frames(gObjectEventPic_Remoraid, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Octillery[] = { + overworld_ascending_frames(gObjectEventPic_Octillery, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_OctilleryF[] = { + overworld_ascending_frames(gObjectEventPic_OctilleryF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_REMORAID + +#if P_FAMILY_DELIBIRD +static const struct SpriteFrameImage sPicTable_Delibird[] = { + overworld_ascending_frames(gObjectEventPic_Delibird, 4, 4), +}; +#endif //P_FAMILY_DELIBIRD + +#if P_FAMILY_MANTINE +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Mantyke[] = { + overworld_ascending_frames(gObjectEventPic_Mantyke, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Mantine[] = { + overworld_ascending_frames(gObjectEventPic_Mantine, 4, 4), +}; +#endif //P_FAMILY_MANTINE + +#if P_FAMILY_SKARMORY +static const struct SpriteFrameImage sPicTable_Skarmory[] = { + overworld_ascending_frames(gObjectEventPic_Skarmory, 4, 4), +}; +#endif //P_FAMILY_SKARMORY + +#if P_FAMILY_HOUNDOUR +static const struct SpriteFrameImage sPicTable_Houndour[] = { + overworld_ascending_frames(gObjectEventPic_Houndour, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Houndoom[] = { + overworld_ascending_frames(gObjectEventPic_Houndoom, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_HoundoomF[] = { + overworld_ascending_frames(gObjectEventPic_HoundoomF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_HoundoomMega[] = { + overworld_ascending_frames(gObjectEventPic_HoundoomMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_HOUNDOUR + +#if P_FAMILY_PHANPY +static const struct SpriteFrameImage sPicTable_Phanpy[] = { + overworld_ascending_frames(gObjectEventPic_Phanpy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Donphan[] = { + overworld_ascending_frames(gObjectEventPic_Donphan, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_DonphanF[] = { + overworld_ascending_frames(gObjectEventPic_DonphanF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_PHANPY + +#if P_FAMILY_STANTLER +static const struct SpriteFrameImage sPicTable_Stantler[] = { + overworld_ascending_frames(gObjectEventPic_Stantler, 4, 4), +}; +#if P_GEN_8_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Wyrdeer[] = { + overworld_ascending_frames(gObjectEventPic_Wyrdeer, 4, 4), +}; +#endif //P_GEN_8_CROSS_EVOS +#endif //P_FAMILY_STANTLER + +#if P_FAMILY_SMEARGLE +static const struct SpriteFrameImage sPicTable_Smeargle[] = { + overworld_ascending_frames(gObjectEventPic_Smeargle, 4, 4), +}; +#endif //P_FAMILY_SMEARGLE + +#if P_FAMILY_MILTANK +static const struct SpriteFrameImage sPicTable_Miltank[] = { + overworld_ascending_frames(gObjectEventPic_Miltank, 4, 4), +}; +#endif //P_FAMILY_MILTANK + +#if P_FAMILY_RAIKOU +static const struct SpriteFrameImage sPicTable_Raikou[] = { + overworld_ascending_frames(gObjectEventPic_Raikou, 4, 4), +}; +#endif //P_FAMILY_RAIKOU + +#if P_FAMILY_ENTEI +static const struct SpriteFrameImage sPicTable_Entei[] = { + overworld_ascending_frames(gObjectEventPic_Entei, 4, 4), +}; +#endif //P_FAMILY_ENTEI + +#if P_FAMILY_SUICUNE +static const struct SpriteFrameImage sPicTable_Suicune[] = { + overworld_ascending_frames(gObjectEventPic_Suicune, 4, 4), +}; +#endif //P_FAMILY_SUICUNE + +#if P_FAMILY_LARVITAR +static const struct SpriteFrameImage sPicTable_Larvitar[] = { + overworld_ascending_frames(gObjectEventPic_Larvitar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pupitar[] = { + overworld_ascending_frames(gObjectEventPic_Pupitar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tyranitar[] = { + overworld_ascending_frames(gObjectEventPic_Tyranitar, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_TyranitarMega[] = { + overworld_ascending_frames(gObjectEventPic_TyranitarMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_LARVITAR + +#if P_FAMILY_LUGIA +static const struct SpriteFrameImage sPicTable_Lugia[] = { + overworld_ascending_frames(gObjectEventPic_Lugia, 8, 8), +}; +#endif //P_FAMILY_LUGIA + +#if P_FAMILY_HO_OH +static const struct SpriteFrameImage sPicTable_HoOh[] = { + overworld_ascending_frames(gObjectEventPic_HoOh, 8, 8), +}; +#endif //P_FAMILY_HO_OH + +#if P_FAMILY_CELEBI +static const struct SpriteFrameImage sPicTable_Celebi[] = { + overworld_ascending_frames(gObjectEventPic_Celebi, 4, 4), +}; +#endif //P_FAMILY_CELEBI + +#if P_FAMILY_TREECKO +static const struct SpriteFrameImage sPicTable_Treecko[] = { + overworld_ascending_frames(gObjectEventPic_Treecko, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grovyle[] = { + overworld_ascending_frames(gObjectEventPic_Grovyle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sceptile[] = { + overworld_ascending_frames(gObjectEventPic_Sceptile, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SceptileMega[] = { + overworld_ascending_frames(gObjectEventPic_SceptileMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_TREECKO + +#if P_FAMILY_TORCHIC +static const struct SpriteFrameImage sPicTable_Torchic[] = { + overworld_ascending_frames(gObjectEventPic_Torchic, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_TorchicF[] = { + overworld_ascending_frames(gObjectEventPic_TorchicF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Combusken[] = { + overworld_ascending_frames(gObjectEventPic_Combusken, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_CombuskenF[] = { + overworld_ascending_frames(gObjectEventPic_CombuskenF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Blaziken[] = { + overworld_ascending_frames(gObjectEventPic_Blaziken, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_BlazikenF[] = { + overworld_ascending_frames(gObjectEventPic_BlazikenF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_BlazikenMega[] = { + overworld_ascending_frames(gObjectEventPic_BlazikenMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_TORCHIC + +#if P_FAMILY_MUDKIP +static const struct SpriteFrameImage sPicTable_Mudkip[] = { + overworld_ascending_frames(gObjectEventPic_Mudkip, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Marshtomp[] = { + overworld_ascending_frames(gObjectEventPic_Marshtomp, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Swampert[] = { + overworld_ascending_frames(gObjectEventPic_Swampert, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SwampertMega[] = { + overworld_ascending_frames(gObjectEventPic_SwampertMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MUDKIP + +#if P_FAMILY_POOCHYENA +static const struct SpriteFrameImage sPicTable_Poochyena[] = { + overworld_ascending_frames(gObjectEventPic_Poochyena, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mightyena[] = { + overworld_ascending_frames(gObjectEventPic_Mightyena, 4, 4), +}; +#endif //P_FAMILY_POOCHYENA + +#if P_FAMILY_ZIGZAGOON +static const struct SpriteFrameImage sPicTable_Zigzagoon[] = { + overworld_ascending_frames(gObjectEventPic_Zigzagoon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Linoone[] = { + overworld_ascending_frames(gObjectEventPic_Linoone, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_ZigzagoonGalar[] = { + overworld_ascending_frames(gObjectEventPic_ZigzagoonGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_LinooneGalar[] = { + overworld_ascending_frames(gObjectEventPic_LinooneGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Obstagoon[] = { + overworld_ascending_frames(gObjectEventPic_Obstagoon, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_ZIGZAGOON + +#if P_FAMILY_WURMPLE +static const struct SpriteFrameImage sPicTable_Wurmple[] = { + overworld_ascending_frames(gObjectEventPic_Wurmple, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Silcoon[] = { + overworld_ascending_frames(gObjectEventPic_Silcoon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Beautifly[] = { + overworld_ascending_frames(gObjectEventPic_Beautifly, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_BeautiflyF[] = { + overworld_ascending_frames(gObjectEventPic_BeautiflyF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Cascoon[] = { + overworld_ascending_frames(gObjectEventPic_Cascoon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dustox[] = { + overworld_ascending_frames(gObjectEventPic_Dustox, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_DustoxF[] = { + overworld_ascending_frames(gObjectEventPic_DustoxF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_WURMPLE + +#if P_FAMILY_LOTAD +static const struct SpriteFrameImage sPicTable_Lotad[] = { + overworld_ascending_frames(gObjectEventPic_Lotad, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lombre[] = { + overworld_ascending_frames(gObjectEventPic_Lombre, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ludicolo[] = { + overworld_ascending_frames(gObjectEventPic_Ludicolo, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LudicoloF[] = { + overworld_ascending_frames(gObjectEventPic_LudicoloF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_LOTAD + +#if P_FAMILY_SEEDOT +static const struct SpriteFrameImage sPicTable_Seedot[] = { + overworld_ascending_frames(gObjectEventPic_Seedot, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Nuzleaf[] = { + overworld_ascending_frames(gObjectEventPic_Nuzleaf, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_NuzleafF[] = { + overworld_ascending_frames(gObjectEventPic_NuzleafF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Shiftry[] = { + overworld_ascending_frames(gObjectEventPic_Shiftry, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ShiftryF[] = { + overworld_ascending_frames(gObjectEventPic_ShiftryF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_SEEDOT + +#if P_FAMILY_TAILLOW +static const struct SpriteFrameImage sPicTable_Taillow[] = { + overworld_ascending_frames(gObjectEventPic_Taillow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Swellow[] = { + overworld_ascending_frames(gObjectEventPic_Swellow, 4, 4), +}; +#endif //P_FAMILY_TAILLOW + +#if P_FAMILY_WINGULL +static const struct SpriteFrameImage sPicTable_Wingull[] = { + overworld_ascending_frames(gObjectEventPic_Wingull, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pelipper[] = { + overworld_ascending_frames(gObjectEventPic_Pelipper, 4, 4), +}; +#endif //P_FAMILY_WINGULL + +#if P_FAMILY_RALTS +static const struct SpriteFrameImage sPicTable_Ralts[] = { + overworld_ascending_frames(gObjectEventPic_Ralts, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kirlia[] = { + overworld_ascending_frames(gObjectEventPic_Kirlia, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gardevoir[] = { + overworld_ascending_frames(gObjectEventPic_Gardevoir, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GardevoirMega[] = { + overworld_ascending_frames(gObjectEventPic_GardevoirMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS + +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Gallade[] = { + overworld_ascending_frames(gObjectEventPic_Gallade, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GalladeMega[] = { + overworld_ascending_frames(gObjectEventPic_GalladeMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_RALTS + +#if P_FAMILY_SURSKIT +static const struct SpriteFrameImage sPicTable_Surskit[] = { + overworld_ascending_frames(gObjectEventPic_Surskit, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Masquerain[] = { + overworld_ascending_frames(gObjectEventPic_Masquerain, 4, 4), +}; +#endif //P_FAMILY_SURSKIT + +#if P_FAMILY_SHROOMISH +static const struct SpriteFrameImage sPicTable_Shroomish[] = { + overworld_ascending_frames(gObjectEventPic_Shroomish, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Breloom[] = { + overworld_ascending_frames(gObjectEventPic_Breloom, 4, 4), +}; +#endif //P_FAMILY_SHROOMISH + +#if P_FAMILY_SLAKOTH +static const struct SpriteFrameImage sPicTable_Slakoth[] = { + overworld_ascending_frames(gObjectEventPic_Slakoth, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Vigoroth[] = { + overworld_ascending_frames(gObjectEventPic_Vigoroth, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Slaking[] = { + overworld_ascending_frames(gObjectEventPic_Slaking, 4, 4), +}; +#endif //P_FAMILY_SLAKOTH + +#if P_FAMILY_NINCADA +static const struct SpriteFrameImage sPicTable_Nincada[] = { + overworld_ascending_frames(gObjectEventPic_Nincada, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ninjask[] = { + overworld_ascending_frames(gObjectEventPic_Ninjask, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Shedinja[] = { + overworld_ascending_frames(gObjectEventPic_Shedinja, 4, 4), +}; +#endif //P_FAMILY_NINCADA + +#if P_FAMILY_WHISMUR +static const struct SpriteFrameImage sPicTable_Whismur[] = { + overworld_ascending_frames(gObjectEventPic_Whismur, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Loudred[] = { + overworld_ascending_frames(gObjectEventPic_Loudred, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Exploud[] = { + overworld_ascending_frames(gObjectEventPic_Exploud, 4, 4), +}; +#endif //P_FAMILY_WHISMUR + +#if P_FAMILY_MAKUHITA +static const struct SpriteFrameImage sPicTable_Makuhita[] = { + overworld_ascending_frames(gObjectEventPic_Makuhita, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hariyama[] = { + overworld_ascending_frames(gObjectEventPic_Hariyama, 4, 4), +}; +#endif //P_FAMILY_MAKUHITA + +#if P_FAMILY_NOSEPASS +static const struct SpriteFrameImage sPicTable_Nosepass[] = { + overworld_ascending_frames(gObjectEventPic_Nosepass, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Probopass[] = { + overworld_ascending_frames(gObjectEventPic_Probopass, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_NOSEPASS + +#if P_FAMILY_SKITTY +static const struct SpriteFrameImage sPicTable_Skitty[] = { + overworld_ascending_frames(gObjectEventPic_Skitty, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Delcatty[] = { + overworld_ascending_frames(gObjectEventPic_Delcatty, 4, 4), +}; +#endif //P_FAMILY_SKITTY + +#if P_FAMILY_SABLEYE +static const struct SpriteFrameImage sPicTable_Sableye[] = { + overworld_ascending_frames(gObjectEventPic_Sableye, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SableyeMega[] = { + overworld_ascending_frames(gObjectEventPic_SableyeMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_SABLEYE + +#if P_FAMILY_MAWILE +static const struct SpriteFrameImage sPicTable_Mawile[] = { + overworld_ascending_frames(gObjectEventPic_Mawile, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_MawileMega[] = { + overworld_ascending_frames(gObjectEventPic_MawileMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MAWILE + +#if P_FAMILY_ARON +static const struct SpriteFrameImage sPicTable_Aron[] = { + overworld_ascending_frames(gObjectEventPic_Aron, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lairon[] = { + overworld_ascending_frames(gObjectEventPic_Lairon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Aggron[] = { + overworld_ascending_frames(gObjectEventPic_Aggron, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AggronMega[] = { + overworld_ascending_frames(gObjectEventPic_AggronMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_ARON + +#if P_FAMILY_MEDITITE +static const struct SpriteFrameImage sPicTable_Meditite[] = { + overworld_ascending_frames(gObjectEventPic_Meditite, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MedititeF[] = { + overworld_ascending_frames(gObjectEventPic_MedititeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Medicham[] = { + overworld_ascending_frames(gObjectEventPic_Medicham, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MedichamF[] = { + overworld_ascending_frames(gObjectEventPic_MedichamF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_MedichamMega[] = { + overworld_ascending_frames(gObjectEventPic_MedichamMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_MEDITITE + +#if P_FAMILY_ELECTRIKE +static const struct SpriteFrameImage sPicTable_Electrike[] = { + overworld_ascending_frames(gObjectEventPic_Electrike, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Manectric[] = { + overworld_ascending_frames(gObjectEventPic_Manectric, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_ManectricMega[] = { + overworld_ascending_frames(gObjectEventPic_ManectricMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_ELECTRIKE + +#if P_FAMILY_PLUSLE +static const struct SpriteFrameImage sPicTable_Plusle[] = { + overworld_ascending_frames(gObjectEventPic_Plusle, 4, 4), +}; +#endif //P_FAMILY_PLUSLE + +#if P_FAMILY_MINUN +static const struct SpriteFrameImage sPicTable_Minun[] = { + overworld_ascending_frames(gObjectEventPic_Minun, 4, 4), +}; +#endif //P_FAMILY_MINUN + +#if P_FAMILY_VOLBEAT_ILLUMISE +static const struct SpriteFrameImage sPicTable_Volbeat[] = { + overworld_ascending_frames(gObjectEventPic_Volbeat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Illumise[] = { + overworld_ascending_frames(gObjectEventPic_Illumise, 4, 4), +}; +#endif //P_FAMILY_VOLBEAT_ILLUMISE + +#if P_FAMILY_ROSELIA +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Budew[] = { + overworld_ascending_frames(gObjectEventPic_Budew, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Roselia[] = { + overworld_ascending_frames(gObjectEventPic_Roselia, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RoseliaF[] = { + overworld_ascending_frames(gObjectEventPic_RoseliaF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Roserade[] = { + overworld_ascending_frames(gObjectEventPic_Roserade, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RoseradeF[] = { + overworld_ascending_frames(gObjectEventPic_RoseradeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_ROSELIA + +#if P_FAMILY_GULPIN +static const struct SpriteFrameImage sPicTable_Gulpin[] = { + overworld_ascending_frames(gObjectEventPic_Gulpin, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GulpinF[] = { + overworld_ascending_frames(gObjectEventPic_GulpinF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Swalot[] = { + overworld_ascending_frames(gObjectEventPic_Swalot, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SwalotF[] = { + overworld_ascending_frames(gObjectEventPic_SwalotF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_GULPIN + +#if P_FAMILY_CARVANHA +static const struct SpriteFrameImage sPicTable_Carvanha[] = { + overworld_ascending_frames(gObjectEventPic_Carvanha, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sharpedo[] = { + overworld_ascending_frames(gObjectEventPic_Sharpedo, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SharpedoMega[] = { + overworld_ascending_frames(gObjectEventPic_SharpedoMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_CARVANHA + +#if P_FAMILY_WAILMER +static const struct SpriteFrameImage sPicTable_Wailmer[] = { + overworld_ascending_frames(gObjectEventPic_Wailmer, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Wailord[] = { + overworld_ascending_frames(gObjectEventPic_Wailord, 8, 8), +}; +#endif //P_FAMILY_WAILMER + +#if P_FAMILY_NUMEL +static const struct SpriteFrameImage sPicTable_Numel[] = { + overworld_ascending_frames(gObjectEventPic_Numel, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_NumelF[] = { + overworld_ascending_frames(gObjectEventPic_NumelF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Camerupt[] = { + overworld_ascending_frames(gObjectEventPic_Camerupt, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_CameruptF[] = { + overworld_ascending_frames(gObjectEventPic_CameruptF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_CameruptMega[] = { + overworld_ascending_frames(gObjectEventPic_CameruptMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_NUMEL + +#if P_FAMILY_TORKOAL +static const struct SpriteFrameImage sPicTable_Torkoal[] = { + overworld_ascending_frames(gObjectEventPic_Torkoal, 4, 4), +}; +#endif //P_FAMILY_TORKOAL + +#if P_FAMILY_SPOINK +static const struct SpriteFrameImage sPicTable_Spoink[] = { + overworld_ascending_frames(gObjectEventPic_Spoink, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grumpig[] = { + overworld_ascending_frames(gObjectEventPic_Grumpig, 4, 4), +}; +#endif //P_FAMILY_SPOINK + +#if P_FAMILY_SPINDA +static const struct SpriteFrameImage sPicTable_Spinda[] = { + overworld_ascending_frames(gObjectEventPic_Spinda, 4, 4), +}; +#endif //P_FAMILY_SPINDA + +#if P_FAMILY_TRAPINCH +static const struct SpriteFrameImage sPicTable_Trapinch[] = { + overworld_ascending_frames(gObjectEventPic_Trapinch, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Vibrava[] = { + overworld_ascending_frames(gObjectEventPic_Vibrava, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Flygon[] = { + overworld_ascending_frames(gObjectEventPic_Flygon, 4, 4), +}; +#endif //P_FAMILY_TRAPINCH + +#if P_FAMILY_CACNEA +static const struct SpriteFrameImage sPicTable_Cacnea[] = { + overworld_ascending_frames(gObjectEventPic_Cacnea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cacturne[] = { + overworld_ascending_frames(gObjectEventPic_Cacturne, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_CacturneF[] = { + overworld_ascending_frames(gObjectEventPic_CacturneF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_CACNEA + +#if P_FAMILY_SWABLU +static const struct SpriteFrameImage sPicTable_Swablu[] = { + overworld_ascending_frames(gObjectEventPic_Swablu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Altaria[] = { + overworld_ascending_frames(gObjectEventPic_Altaria, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AltariaMega[] = { + overworld_ascending_frames(gObjectEventPic_AltariaMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_SWABLU + +#if P_FAMILY_ZANGOOSE +static const struct SpriteFrameImage sPicTable_Zangoose[] = { + overworld_ascending_frames(gObjectEventPic_Zangoose, 4, 4), +}; +#endif //P_FAMILY_ZANGOOSE + +#if P_FAMILY_SEVIPER +static const struct SpriteFrameImage sPicTable_Seviper[] = { + overworld_ascending_frames(gObjectEventPic_Seviper, 4, 4), +}; +#endif //P_FAMILY_SEVIPER + +#if P_FAMILY_LUNATONE +static const struct SpriteFrameImage sPicTable_Lunatone[] = { + overworld_ascending_frames(gObjectEventPic_Lunatone, 4, 4), +}; +#endif //P_FAMILY_LUNATONE + +#if P_FAMILY_SOLROCK +static const struct SpriteFrameImage sPicTable_Solrock[] = { + overworld_ascending_frames(gObjectEventPic_Solrock, 4, 4), +}; +#endif //P_FAMILY_SOLROCK + +#if P_FAMILY_BARBOACH +static const struct SpriteFrameImage sPicTable_Barboach[] = { + overworld_ascending_frames(gObjectEventPic_Barboach, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Whiscash[] = { + overworld_ascending_frames(gObjectEventPic_Whiscash, 4, 4), +}; +#endif //P_FAMILY_BARBOACH + +#if P_FAMILY_CORPHISH +static const struct SpriteFrameImage sPicTable_Corphish[] = { + overworld_ascending_frames(gObjectEventPic_Corphish, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Crawdaunt[] = { + overworld_ascending_frames(gObjectEventPic_Crawdaunt, 4, 4), +}; +#endif //P_FAMILY_CORPHISH + +#if P_FAMILY_BALTOY +static const struct SpriteFrameImage sPicTable_Baltoy[] = { + overworld_ascending_frames(gObjectEventPic_Baltoy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Claydol[] = { + overworld_ascending_frames(gObjectEventPic_Claydol, 4, 4), +}; +#endif //P_FAMILY_BALTOY + +#if P_FAMILY_LILEEP +static const struct SpriteFrameImage sPicTable_Lileep[] = { + overworld_ascending_frames(gObjectEventPic_Lileep, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cradily[] = { + overworld_ascending_frames(gObjectEventPic_Cradily, 4, 4), +}; +#endif //P_FAMILY_LILEEP + +#if P_FAMILY_ANORITH +static const struct SpriteFrameImage sPicTable_Anorith[] = { + overworld_ascending_frames(gObjectEventPic_Anorith, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Armaldo[] = { + overworld_ascending_frames(gObjectEventPic_Armaldo, 4, 4), +}; +#endif //P_FAMILY_ANORITH + +#if P_FAMILY_FEEBAS +static const struct SpriteFrameImage sPicTable_Feebas[] = { + overworld_ascending_frames(gObjectEventPic_Feebas, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Milotic[] = { + overworld_ascending_frames(gObjectEventPic_Milotic, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_MiloticF[] = { + overworld_ascending_frames(gObjectEventPic_MiloticF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_FEEBAS + +#if P_FAMILY_CASTFORM +static const struct SpriteFrameImage sPicTable_CastformNormal[] = { + overworld_ascending_frames(gObjectEventPic_CastformNormal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CastformSunny[] = { + overworld_ascending_frames(gObjectEventPic_CastformSunny, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CastformRainy[] = { + overworld_ascending_frames(gObjectEventPic_CastformRainy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CastformSnowy[] = { + overworld_ascending_frames(gObjectEventPic_CastformSnowy, 4, 4), +}; +#endif //P_FAMILY_CASTFORM + +#if P_FAMILY_KECLEON +static const struct SpriteFrameImage sPicTable_Kecleon[] = { + overworld_ascending_frames(gObjectEventPic_Kecleon, 4, 4), +}; +#endif //P_FAMILY_KECLEON + +#if P_FAMILY_SHUPPET +static const struct SpriteFrameImage sPicTable_Shuppet[] = { + overworld_ascending_frames(gObjectEventPic_Shuppet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Banette[] = { + overworld_ascending_frames(gObjectEventPic_Banette, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_BanetteMega[] = { + overworld_ascending_frames(gObjectEventPic_BanetteMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_SHUPPET + +#if P_FAMILY_DUSKULL +static const struct SpriteFrameImage sPicTable_Duskull[] = { + overworld_ascending_frames(gObjectEventPic_Duskull, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dusclops[] = { + overworld_ascending_frames(gObjectEventPic_Dusclops, 4, 4), +}; +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Dusknoir[] = { + overworld_ascending_frames(gObjectEventPic_Dusknoir, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_DUSKULL + +#if P_FAMILY_TROPIUS +static const struct SpriteFrameImage sPicTable_Tropius[] = { + overworld_ascending_frames(gObjectEventPic_Tropius, 4, 4), +}; +#endif //P_FAMILY_TROPIUS + +#if P_FAMILY_CHIMECHO +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Chingling[] = { + overworld_ascending_frames(gObjectEventPic_Chingling, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Chimecho[] = { + overworld_ascending_frames(gObjectEventPic_Chimecho, 4, 4), +}; +#endif //P_FAMILY_CHIMECHO + +#if P_FAMILY_ABSOL +static const struct SpriteFrameImage sPicTable_Absol[] = { + overworld_ascending_frames(gObjectEventPic_Absol, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AbsolMega[] = { + overworld_ascending_frames(gObjectEventPic_AbsolMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_ABSOL + +#if P_FAMILY_SNORUNT +static const struct SpriteFrameImage sPicTable_Snorunt[] = { + overworld_ascending_frames(gObjectEventPic_Snorunt, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Glalie[] = { + overworld_ascending_frames(gObjectEventPic_Glalie, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GlalieMega[] = { + overworld_ascending_frames(gObjectEventPic_GlalieMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS + +#if P_GEN_4_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Froslass[] = { + overworld_ascending_frames(gObjectEventPic_Froslass, 4, 4), +}; +#endif //P_GEN_4_CROSS_EVOS +#endif //P_FAMILY_SNORUNT + +#if P_FAMILY_SPHEAL +static const struct SpriteFrameImage sPicTable_Spheal[] = { + overworld_ascending_frames(gObjectEventPic_Spheal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sealeo[] = { + overworld_ascending_frames(gObjectEventPic_Sealeo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Walrein[] = { + overworld_ascending_frames(gObjectEventPic_Walrein, 4, 4), +}; +#endif //P_FAMILY_SPHEAL + +#if P_FAMILY_CLAMPERL +static const struct SpriteFrameImage sPicTable_Clamperl[] = { + overworld_ascending_frames(gObjectEventPic_Clamperl, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Huntail[] = { + overworld_ascending_frames(gObjectEventPic_Huntail, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gorebyss[] = { + overworld_ascending_frames(gObjectEventPic_Gorebyss, 4, 4), +}; +#endif //P_FAMILY_CLAMPERL + +#if P_FAMILY_RELICANTH +static const struct SpriteFrameImage sPicTable_Relicanth[] = { + overworld_ascending_frames(gObjectEventPic_Relicanth, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_RelicanthF[] = { + overworld_ascending_frames(gObjectEventPic_RelicanthF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_RELICANTH + +#if P_FAMILY_LUVDISC +static const struct SpriteFrameImage sPicTable_Luvdisc[] = { + overworld_ascending_frames(gObjectEventPic_Luvdisc, 4, 4), +}; +#endif //P_FAMILY_LUVDISC + +#if P_FAMILY_BAGON +static const struct SpriteFrameImage sPicTable_Bagon[] = { + overworld_ascending_frames(gObjectEventPic_Bagon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Shelgon[] = { + overworld_ascending_frames(gObjectEventPic_Shelgon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Salamence[] = { + overworld_ascending_frames(gObjectEventPic_Salamence, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_SalamenceMega[] = { + overworld_ascending_frames(gObjectEventPic_SalamenceMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_BAGON + +#if P_FAMILY_BELDUM +static const struct SpriteFrameImage sPicTable_Beldum[] = { + overworld_ascending_frames(gObjectEventPic_Beldum, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Metang[] = { + overworld_ascending_frames(gObjectEventPic_Metang, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Metagross[] = { + overworld_ascending_frames(gObjectEventPic_Metagross, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_MetagrossMega[] = { + overworld_ascending_frames(gObjectEventPic_MetagrossMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_BELDUM + +#if P_FAMILY_REGIROCK +static const struct SpriteFrameImage sPicTable_Regirock[] = { + overworld_ascending_frames(gObjectEventPic_Regirock, 4, 4), +}; +#endif //P_FAMILY_REGIROCK + +#if P_FAMILY_REGICE +static const struct SpriteFrameImage sPicTable_Regice[] = { + overworld_ascending_frames(gObjectEventPic_Regice, 4, 4), +}; +#endif //P_FAMILY_REGICE + +#if P_FAMILY_REGISTEEL +static const struct SpriteFrameImage sPicTable_Registeel[] = { + overworld_ascending_frames(gObjectEventPic_Registeel, 4, 4), +}; +#endif //P_FAMILY_REGISTEEL + +#if P_FAMILY_LATIAS +static const struct SpriteFrameImage sPicTable_Latias[] = { + overworld_ascending_frames(gObjectEventPic_Latias, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_LatiasMega[] = { + overworld_ascending_frames(gObjectEventPic_LatiasMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_LATIAS + +#if P_FAMILY_LATIOS +static const struct SpriteFrameImage sPicTable_Latios[] = { + overworld_ascending_frames(gObjectEventPic_Latios, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_LatiosMega[] = { + overworld_ascending_frames(gObjectEventPic_LatiosMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_LATIOS + +#if P_FAMILY_KYOGRE +static const struct SpriteFrameImage sPicTable_Kyogre[] = { + overworld_ascending_frames(gObjectEventPic_Kyogre, 8, 8), +}; +#if P_PRIMAL_REVERSIONS +static const struct SpriteFrameImage sPicTable_KyogrePrimal[] = { + overworld_ascending_frames(gObjectEventPic_KyogrePrimal, 4, 4), +}; +#endif //P_PRIMAL_REVERSIONS +#endif //P_FAMILY_KYOGRE + +#if P_FAMILY_GROUDON +static const struct SpriteFrameImage sPicTable_Groudon[] = { + overworld_ascending_frames(gObjectEventPic_Groudon, 8, 8), +}; +#if P_PRIMAL_REVERSIONS +static const struct SpriteFrameImage sPicTable_GroudonPrimal[] = { + overworld_ascending_frames(gObjectEventPic_GroudonPrimal, 4, 4), +}; +#endif //P_PRIMAL_REVERSIONS +#endif //P_FAMILY_GROUDON + +#if P_FAMILY_RAYQUAZA +static const struct SpriteFrameImage sPicTable_Rayquaza[] = { + overworld_ascending_frames(gObjectEventPic_Rayquaza, 8, 8), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_RayquazaMega[] = { + overworld_ascending_frames(gObjectEventPic_RayquazaMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_RAYQUAZA + +#if P_FAMILY_JIRACHI +static const struct SpriteFrameImage sPicTable_Jirachi[] = { + overworld_ascending_frames(gObjectEventPic_Jirachi, 4, 4), +}; +#endif //P_FAMILY_JIRACHI + +#if P_FAMILY_DEOXYS +static const struct SpriteFrameImage sPicTable_DeoxysNormal[] = { + overworld_ascending_frames(gObjectEventPic_DeoxysNormal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeoxysAttack[] = { + overworld_ascending_frames(gObjectEventPic_DeoxysAttack, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeoxysDefense[] = { + overworld_ascending_frames(gObjectEventPic_DeoxysDefense, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeoxysSpeed[] = { + overworld_ascending_frames(gObjectEventPic_DeoxysSpeed, 4, 4), +}; +#endif //P_FAMILY_DEOXYS + +#if P_FAMILY_TURTWIG +static const struct SpriteFrameImage sPicTable_Turtwig[] = { + overworld_ascending_frames(gObjectEventPic_Turtwig, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grotle[] = { + overworld_ascending_frames(gObjectEventPic_Grotle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Torterra[] = { + overworld_ascending_frames(gObjectEventPic_Torterra, 4, 4), +}; +#endif //P_FAMILY_TURTWIG + +#if P_FAMILY_CHIMCHAR +static const struct SpriteFrameImage sPicTable_Chimchar[] = { + overworld_ascending_frames(gObjectEventPic_Chimchar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Monferno[] = { + overworld_ascending_frames(gObjectEventPic_Monferno, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Infernape[] = { + overworld_ascending_frames(gObjectEventPic_Infernape, 4, 4), +}; +#endif //P_FAMILY_CHIMCHAR + +#if P_FAMILY_PIPLUP +static const struct SpriteFrameImage sPicTable_Piplup[] = { + overworld_ascending_frames(gObjectEventPic_Piplup, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Prinplup[] = { + overworld_ascending_frames(gObjectEventPic_Prinplup, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Empoleon[] = { + overworld_ascending_frames(gObjectEventPic_Empoleon, 4, 4), +}; +#endif //P_FAMILY_PIPLUP + +#if P_FAMILY_STARLY +static const struct SpriteFrameImage sPicTable_Starly[] = { + overworld_ascending_frames(gObjectEventPic_Starly, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_StarlyF[] = { + overworld_ascending_frames(gObjectEventPic_StarlyF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Staravia[] = { + overworld_ascending_frames(gObjectEventPic_Staravia, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_StaraviaF[] = { + overworld_ascending_frames(gObjectEventPic_StaraviaF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Staraptor[] = { + overworld_ascending_frames(gObjectEventPic_Staraptor, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_StaraptorF[] = { + overworld_ascending_frames(gObjectEventPic_StaraptorF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_STARLY + +#if P_FAMILY_BIDOOF +static const struct SpriteFrameImage sPicTable_Bidoof[] = { + overworld_ascending_frames(gObjectEventPic_Bidoof, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_BidoofF[] = { + overworld_ascending_frames(gObjectEventPic_BidoofF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Bibarel[] = { + overworld_ascending_frames(gObjectEventPic_Bibarel, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_BibarelF[] = { + overworld_ascending_frames(gObjectEventPic_BibarelF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_BIDOOF + +#if P_FAMILY_KRICKETOT +static const struct SpriteFrameImage sPicTable_Kricketot[] = { + overworld_ascending_frames(gObjectEventPic_Kricketot, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_KricketotF[] = { + overworld_ascending_frames(gObjectEventPic_KricketotF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Kricketune[] = { + overworld_ascending_frames(gObjectEventPic_Kricketune, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_KricketuneF[] = { + overworld_ascending_frames(gObjectEventPic_KricketuneF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_KRICKETOT + +#if P_FAMILY_SHINX +static const struct SpriteFrameImage sPicTable_Shinx[] = { + overworld_ascending_frames(gObjectEventPic_Shinx, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ShinxF[] = { + overworld_ascending_frames(gObjectEventPic_ShinxF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Luxio[] = { + overworld_ascending_frames(gObjectEventPic_Luxio, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LuxioF[] = { + overworld_ascending_frames(gObjectEventPic_LuxioF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Luxray[] = { + overworld_ascending_frames(gObjectEventPic_Luxray, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LuxrayF[] = { + overworld_ascending_frames(gObjectEventPic_LuxrayF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_SHINX + +#if P_FAMILY_CRANIDOS +static const struct SpriteFrameImage sPicTable_Cranidos[] = { + overworld_ascending_frames(gObjectEventPic_Cranidos, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Rampardos[] = { + overworld_ascending_frames(gObjectEventPic_Rampardos, 4, 4), +}; +#endif //P_FAMILY_CRANIDOS + +#if P_FAMILY_SHIELDON +static const struct SpriteFrameImage sPicTable_Shieldon[] = { + overworld_ascending_frames(gObjectEventPic_Shieldon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bastiodon[] = { + overworld_ascending_frames(gObjectEventPic_Bastiodon, 4, 4), +}; +#endif //P_FAMILY_SHIELDON + +#if P_FAMILY_BURMY +static const struct SpriteFrameImage sPicTable_BurmyPlant[] = { + overworld_ascending_frames(gObjectEventPic_BurmyPlant, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_BurmySandy[] = { + overworld_ascending_frames(gObjectEventPic_BurmySandy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_BurmyTrash[] = { + overworld_ascending_frames(gObjectEventPic_BurmyTrash, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_WormadamPlant[] = { + overworld_ascending_frames(gObjectEventPic_WormadamPlant, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_WormadamSandy[] = { + overworld_ascending_frames(gObjectEventPic_WormadamSandy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_WormadamTrash[] = { + overworld_ascending_frames(gObjectEventPic_WormadamTrash, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mothim[] = { + overworld_ascending_frames(gObjectEventPic_Mothim, 4, 4), +}; +#endif //P_FAMILY_BURMY + +#if P_FAMILY_COMBEE +static const struct SpriteFrameImage sPicTable_Combee[] = { + overworld_ascending_frames(gObjectEventPic_Combee, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_CombeeF[] = { + overworld_ascending_frames(gObjectEventPic_CombeeF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Vespiquen[] = { + overworld_ascending_frames(gObjectEventPic_Vespiquen, 4, 4), +}; +#endif //P_FAMILY_COMBEE + +#if P_FAMILY_PACHIRISU +static const struct SpriteFrameImage sPicTable_Pachirisu[] = { + overworld_ascending_frames(gObjectEventPic_Pachirisu, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_PachirisuF[] = { + overworld_ascending_frames(gObjectEventPic_PachirisuF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_PACHIRISU + +#if P_FAMILY_BUIZEL +static const struct SpriteFrameImage sPicTable_Buizel[] = { + overworld_ascending_frames(gObjectEventPic_Buizel, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_BuizelF[] = { + overworld_ascending_frames(gObjectEventPic_BuizelF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Floatzel[] = { + overworld_ascending_frames(gObjectEventPic_Floatzel, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_FloatzelF[] = { + overworld_ascending_frames(gObjectEventPic_FloatzelF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_BUIZEL + +#if P_FAMILY_CHERUBI +static const struct SpriteFrameImage sPicTable_Cherubi[] = { + overworld_ascending_frames(gObjectEventPic_Cherubi, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CherrimOvercast[] = { + overworld_ascending_frames(gObjectEventPic_CherrimOvercast, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_CherrimSunshine[] = { + overworld_ascending_frames(gObjectEventPic_CherrimSunshine, 4, 4), +};*/ +#endif //P_FAMILY_CHERUBI + +#if P_FAMILY_SHELLOS +static const struct SpriteFrameImage sPicTable_ShellosWestSea[] = { + overworld_ascending_frames(gObjectEventPic_ShellosWestSea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ShellosEast[] = { + overworld_ascending_frames(gObjectEventPic_ShellosEast, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GastrodonWestSea[] = { + overworld_ascending_frames(gObjectEventPic_GastrodonWestSea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GastrodonEast[] = { + overworld_ascending_frames(gObjectEventPic_GastrodonEast, 4, 4), +}; +#endif //P_FAMILY_SHELLOS + +#if P_FAMILY_DRIFLOON +static const struct SpriteFrameImage sPicTable_Drifloon[] = { + overworld_ascending_frames(gObjectEventPic_Drifloon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Drifblim[] = { + overworld_ascending_frames(gObjectEventPic_Drifblim, 4, 4), +}; +#endif //P_FAMILY_DRIFLOON + +#if P_FAMILY_BUNEARY +static const struct SpriteFrameImage sPicTable_Buneary[] = { + overworld_ascending_frames(gObjectEventPic_Buneary, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lopunny[] = { + overworld_ascending_frames(gObjectEventPic_Lopunny, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_LopunnyMega[] = { + overworld_ascending_frames(gObjectEventPic_LopunnyMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_BUNEARY + +#if P_FAMILY_GLAMEOW +static const struct SpriteFrameImage sPicTable_Glameow[] = { + overworld_ascending_frames(gObjectEventPic_Glameow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Purugly[] = { + overworld_ascending_frames(gObjectEventPic_Purugly, 4, 4), +}; +#endif //P_FAMILY_GLAMEOW + +#if P_FAMILY_STUNKY +static const struct SpriteFrameImage sPicTable_Stunky[] = { + overworld_ascending_frames(gObjectEventPic_Stunky, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Skuntank[] = { + overworld_ascending_frames(gObjectEventPic_Skuntank, 4, 4), +}; +#endif //P_FAMILY_STUNKY + +#if P_FAMILY_BRONZOR +static const struct SpriteFrameImage sPicTable_Bronzor[] = { + overworld_ascending_frames(gObjectEventPic_Bronzor, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bronzong[] = { + overworld_ascending_frames(gObjectEventPic_Bronzong, 4, 4), +}; +#endif //P_FAMILY_BRONZOR + +#if P_FAMILY_CHATOT +static const struct SpriteFrameImage sPicTable_Chatot[] = { + overworld_ascending_frames(gObjectEventPic_Chatot, 4, 4), +}; +#endif //P_FAMILY_CHATOT + +#if P_FAMILY_SPIRITOMB +static const struct SpriteFrameImage sPicTable_Spiritomb[] = { + overworld_ascending_frames(gObjectEventPic_Spiritomb, 4, 4), +}; +#endif //P_FAMILY_SPIRITOMB + +#if P_FAMILY_GIBLE +static const struct SpriteFrameImage sPicTable_Gible[] = { + overworld_ascending_frames(gObjectEventPic_Gible, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GibleF[] = { + overworld_ascending_frames(gObjectEventPic_GibleF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Gabite[] = { + overworld_ascending_frames(gObjectEventPic_Gabite, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GabiteF[] = { + overworld_ascending_frames(gObjectEventPic_GabiteF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Garchomp[] = { + overworld_ascending_frames(gObjectEventPic_Garchomp, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_GarchompF[] = { + overworld_ascending_frames(gObjectEventPic_GarchompF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_GarchompMega[] = { + overworld_ascending_frames(gObjectEventPic_GarchompMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_GIBLE + +#if P_FAMILY_RIOLU +static const struct SpriteFrameImage sPicTable_Riolu[] = { + overworld_ascending_frames(gObjectEventPic_Riolu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lucario[] = { + overworld_ascending_frames(gObjectEventPic_Lucario, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_LucarioMega[] = { + overworld_ascending_frames(gObjectEventPic_LucarioMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_RIOLU + +#if P_FAMILY_HIPPOPOTAS +static const struct SpriteFrameImage sPicTable_Hippopotas[] = { + overworld_ascending_frames(gObjectEventPic_Hippopotas, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_HippopotasF[] = { + overworld_ascending_frames(gObjectEventPic_HippopotasF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Hippowdon[] = { + overworld_ascending_frames(gObjectEventPic_Hippowdon, 4, 4), +}; +#endif //P_FAMILY_HIPPOPOTAS + +#if P_FAMILY_SKORUPI +static const struct SpriteFrameImage sPicTable_Skorupi[] = { + overworld_ascending_frames(gObjectEventPic_Skorupi, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Drapion[] = { + overworld_ascending_frames(gObjectEventPic_Drapion, 4, 4), +}; +#endif //P_FAMILY_SKORUPI + +#if P_FAMILY_CROAGUNK +static const struct SpriteFrameImage sPicTable_Croagunk[] = { + overworld_ascending_frames(gObjectEventPic_Croagunk, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_CroagunkF[] = { + overworld_ascending_frames(gObjectEventPic_CroagunkF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Toxicroak[] = { + overworld_ascending_frames(gObjectEventPic_Toxicroak, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_ToxicroakF[] = { + overworld_ascending_frames(gObjectEventPic_ToxicroakF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_CROAGUNK + +#if P_FAMILY_CARNIVINE +static const struct SpriteFrameImage sPicTable_Carnivine[] = { + overworld_ascending_frames(gObjectEventPic_Carnivine, 4, 4), +}; +#endif //P_FAMILY_CARNIVINE + +#if P_FAMILY_FINNEON +static const struct SpriteFrameImage sPicTable_Finneon[] = { + overworld_ascending_frames(gObjectEventPic_Finneon, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_FinneonF[] = { + overworld_ascending_frames(gObjectEventPic_FinneonF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Lumineon[] = { + overworld_ascending_frames(gObjectEventPic_Lumineon, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_LumineonF[] = { + overworld_ascending_frames(gObjectEventPic_LumineonF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_FINNEON + +#if P_FAMILY_SNOVER +static const struct SpriteFrameImage sPicTable_Snover[] = { + overworld_ascending_frames(gObjectEventPic_Snover, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_SnoverF[] = { + overworld_ascending_frames(gObjectEventPic_SnoverF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Abomasnow[] = { + overworld_ascending_frames(gObjectEventPic_Abomasnow, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_AbomasnowF[] = { + overworld_ascending_frames(gObjectEventPic_AbomasnowF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AbomasnowMega[] = { + overworld_ascending_frames(gObjectEventPic_AbomasnowMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_SNOVER + +#if P_FAMILY_ROTOM +static const struct SpriteFrameImage sPicTable_Rotom[] = { + overworld_ascending_frames(gObjectEventPic_Rotom, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RotomHeat[] = { + overworld_ascending_frames(gObjectEventPic_RotomHeat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RotomWash[] = { + overworld_ascending_frames(gObjectEventPic_RotomWash, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RotomFrost[] = { + overworld_ascending_frames(gObjectEventPic_RotomFrost, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RotomFan[] = { + overworld_ascending_frames(gObjectEventPic_RotomFan, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_RotomMow[] = { + overworld_ascending_frames(gObjectEventPic_RotomMow, 4, 4), +}; +#endif //P_FAMILY_ROTOM + +#if P_FAMILY_UXIE +static const struct SpriteFrameImage sPicTable_Uxie[] = { + overworld_ascending_frames(gObjectEventPic_Uxie, 4, 4), +}; +#endif //P_FAMILY_UXIE + +#if P_FAMILY_MESPRIT +static const struct SpriteFrameImage sPicTable_Mesprit[] = { + overworld_ascending_frames(gObjectEventPic_Mesprit, 4, 4), +}; +#endif //P_FAMILY_MESPRIT + +#if P_FAMILY_AZELF +static const struct SpriteFrameImage sPicTable_Azelf[] = { + overworld_ascending_frames(gObjectEventPic_Azelf, 4, 4), +}; +#endif //P_FAMILY_AZELF + +#if P_FAMILY_DIALGA +static const struct SpriteFrameImage sPicTable_Dialga[] = { + overworld_ascending_frames(gObjectEventPic_Dialga, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_DialgaOrigin[] = { + overworld_ascending_frames(gObjectEventPic_DialgaOrigin, 8, 8), +}; +#endif //P_FAMILY_DIALGA + +#if P_FAMILY_PALKIA +static const struct SpriteFrameImage sPicTable_Palkia[] = { + overworld_ascending_frames(gObjectEventPic_Palkia, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_PalkiaOrigin[] = { + overworld_ascending_frames(gObjectEventPic_PalkiaOrigin, 8, 8), +}; +#endif //P_FAMILY_PALKIA + +#if P_FAMILY_HEATRAN +static const struct SpriteFrameImage sPicTable_Heatran[] = { + overworld_ascending_frames(gObjectEventPic_Heatran, 4, 4), +}; +#endif //P_FAMILY_HEATRAN + +#if P_FAMILY_REGIGIGAS +static const struct SpriteFrameImage sPicTable_Regigigas[] = { + overworld_ascending_frames(gObjectEventPic_Regigigas, 8, 8), +}; +#endif //P_FAMILY_REGIGIGAS + +#if P_FAMILY_GIRATINA +static const struct SpriteFrameImage sPicTable_GiratinaAltered[] = { + overworld_ascending_frames(gObjectEventPic_GiratinaAltered, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_GiratinaOrigin[] = { + overworld_ascending_frames(gObjectEventPic_GiratinaOrigin, 8, 8), +}; +#endif //P_FAMILY_GIRATINA + +#if P_FAMILY_CRESSELIA +static const struct SpriteFrameImage sPicTable_Cresselia[] = { + overworld_ascending_frames(gObjectEventPic_Cresselia, 4, 4), +}; +#endif //P_FAMILY_CRESSELIA + +#if P_FAMILY_MANAPHY +static const struct SpriteFrameImage sPicTable_Phione[] = { + overworld_ascending_frames(gObjectEventPic_Phione, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Manaphy[] = { + overworld_ascending_frames(gObjectEventPic_Manaphy, 4, 4), +}; +#endif //P_FAMILY_MANAPHY + +#if P_FAMILY_DARKRAI +static const struct SpriteFrameImage sPicTable_Darkrai[] = { + overworld_ascending_frames(gObjectEventPic_Darkrai, 4, 4), +}; +#endif //P_FAMILY_DARKRAI + +#if P_FAMILY_SHAYMIN +static const struct SpriteFrameImage sPicTable_ShayminLand[] = { + overworld_ascending_frames(gObjectEventPic_ShayminLand, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ShayminSky[] = { + overworld_ascending_frames(gObjectEventPic_ShayminSky, 4, 4), +}; +#endif //P_FAMILY_SHAYMIN + +#if P_FAMILY_ARCEUS + +static const struct SpriteFrameImage sPicTable_ArceusNormal[] = { + overworld_ascending_frames(gObjectEventPic_ArceusNormal, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusFighting[] = { + overworld_ascending_frames(gObjectEventPic_ArceusFighting, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusFlying[] = { + overworld_ascending_frames(gObjectEventPic_ArceusFlying, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusPoison[] = { + overworld_ascending_frames(gObjectEventPic_ArceusPoison, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusGround[] = { + overworld_ascending_frames(gObjectEventPic_ArceusGround, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusRock[] = { + overworld_ascending_frames(gObjectEventPic_ArceusRock, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusBug[] = { + overworld_ascending_frames(gObjectEventPic_ArceusBug, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusGhost[] = { + overworld_ascending_frames(gObjectEventPic_ArceusGhost, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusSteel[] = { + overworld_ascending_frames(gObjectEventPic_ArceusSteel, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusFire[] = { + overworld_ascending_frames(gObjectEventPic_ArceusFire, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusWater[] = { + overworld_ascending_frames(gObjectEventPic_ArceusWater, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusGrass[] = { + overworld_ascending_frames(gObjectEventPic_ArceusGrass, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusElectric[] = { + overworld_ascending_frames(gObjectEventPic_ArceusElectric, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusPsychic[] = { + overworld_ascending_frames(gObjectEventPic_ArceusPsychic, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusIce[] = { + overworld_ascending_frames(gObjectEventPic_ArceusIce, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusDragon[] = { + overworld_ascending_frames(gObjectEventPic_ArceusDragon, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusDark[] = { + overworld_ascending_frames(gObjectEventPic_ArceusDark, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_ArceusFairy[] = { + overworld_ascending_frames(gObjectEventPic_ArceusFairy, 8, 8), +}; +#endif //P_FAMILY_ARCEUS + +#if P_FAMILY_VICTINI +static const struct SpriteFrameImage sPicTable_Victini[] = { + overworld_ascending_frames(gObjectEventPic_Victini, 4, 4), +}; +#endif //P_FAMILY_VICTINI + +#if P_FAMILY_SNIVY +static const struct SpriteFrameImage sPicTable_Snivy[] = { + overworld_ascending_frames(gObjectEventPic_Snivy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Servine[] = { + overworld_ascending_frames(gObjectEventPic_Servine, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Serperior[] = { + overworld_ascending_frames(gObjectEventPic_Serperior, 4, 4), +}; +#endif //P_FAMILY_SNIVY + +#if P_FAMILY_TEPIG +static const struct SpriteFrameImage sPicTable_Tepig[] = { + overworld_ascending_frames(gObjectEventPic_Tepig, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pignite[] = { + overworld_ascending_frames(gObjectEventPic_Pignite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Emboar[] = { + overworld_ascending_frames(gObjectEventPic_Emboar, 4, 4), +}; +#endif //P_FAMILY_TEPIG + +#if P_FAMILY_OSHAWOTT +static const struct SpriteFrameImage sPicTable_Oshawott[] = { + overworld_ascending_frames(gObjectEventPic_Oshawott, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dewott[] = { + overworld_ascending_frames(gObjectEventPic_Dewott, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Samurott[] = { + overworld_ascending_frames(gObjectEventPic_Samurott, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_SamurottHisui[] = { + overworld_ascending_frames(gObjectEventPic_SamurottHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_OSHAWOTT + +#if P_FAMILY_PATRAT +static const struct SpriteFrameImage sPicTable_Patrat[] = { + overworld_ascending_frames(gObjectEventPic_Patrat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Watchog[] = { + overworld_ascending_frames(gObjectEventPic_Watchog, 4, 4), +}; +#endif //P_FAMILY_PATRAT + +#if P_FAMILY_LILLIPUP +static const struct SpriteFrameImage sPicTable_Lillipup[] = { + overworld_ascending_frames(gObjectEventPic_Lillipup, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Herdier[] = { + overworld_ascending_frames(gObjectEventPic_Herdier, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Stoutland[] = { + overworld_ascending_frames(gObjectEventPic_Stoutland, 4, 4), +}; +#endif //P_FAMILY_LILLIPUP + +#if P_FAMILY_PURRLOIN +static const struct SpriteFrameImage sPicTable_Purrloin[] = { + overworld_ascending_frames(gObjectEventPic_Purrloin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Liepard[] = { + overworld_ascending_frames(gObjectEventPic_Liepard, 4, 4), +}; +#endif //P_FAMILY_PURRLOIN + +#if P_FAMILY_PANSAGE +static const struct SpriteFrameImage sPicTable_Pansage[] = { + overworld_ascending_frames(gObjectEventPic_Pansage, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Simisage[] = { + overworld_ascending_frames(gObjectEventPic_Simisage, 4, 4), +}; +#endif //P_FAMILY_PANSAGE + +#if P_FAMILY_PANSEAR +static const struct SpriteFrameImage sPicTable_Pansear[] = { + overworld_ascending_frames(gObjectEventPic_Pansear, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Simisear[] = { + overworld_ascending_frames(gObjectEventPic_Simisear, 4, 4), +}; +#endif //P_FAMILY_PANSEAR + +#if P_FAMILY_PANPOUR +static const struct SpriteFrameImage sPicTable_Panpour[] = { + overworld_ascending_frames(gObjectEventPic_Panpour, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Simipour[] = { + overworld_ascending_frames(gObjectEventPic_Simipour, 4, 4), +}; +#endif //P_FAMILY_PANPOUR + +#if P_FAMILY_MUNNA +static const struct SpriteFrameImage sPicTable_Munna[] = { + overworld_ascending_frames(gObjectEventPic_Munna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Musharna[] = { + overworld_ascending_frames(gObjectEventPic_Musharna, 4, 4), +}; +#endif //P_FAMILY_MUNNA + +#if P_FAMILY_PIDOVE +static const struct SpriteFrameImage sPicTable_Pidove[] = { + overworld_ascending_frames(gObjectEventPic_Pidove, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tranquill[] = { + overworld_ascending_frames(gObjectEventPic_Tranquill, 4, 4), +}; + +static const struct SpriteFrameImage sPicTable_Unfezant[] = { + overworld_ascending_frames(gObjectEventPic_Unfezant, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_UnfezantF[] = { + overworld_ascending_frames(gObjectEventPic_UnfezantF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_PIDOVE + +#if P_FAMILY_BLITZLE +static const struct SpriteFrameImage sPicTable_Blitzle[] = { + overworld_ascending_frames(gObjectEventPic_Blitzle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Zebstrika[] = { + overworld_ascending_frames(gObjectEventPic_Zebstrika, 4, 4), +}; +#endif //P_FAMILY_BLITZLE + +#if P_FAMILY_ROGGENROLA +static const struct SpriteFrameImage sPicTable_Roggenrola[] = { + overworld_ascending_frames(gObjectEventPic_Roggenrola, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Boldore[] = { + overworld_ascending_frames(gObjectEventPic_Boldore, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gigalith[] = { + overworld_ascending_frames(gObjectEventPic_Gigalith, 4, 4), +}; +#endif //P_FAMILY_ROGGENROLA + +#if P_FAMILY_WOOBAT +static const struct SpriteFrameImage sPicTable_Woobat[] = { + overworld_ascending_frames(gObjectEventPic_Woobat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Swoobat[] = { + overworld_ascending_frames(gObjectEventPic_Swoobat, 4, 4), +}; +#endif //P_FAMILY_WOOBAT + +#if P_FAMILY_DRILBUR +static const struct SpriteFrameImage sPicTable_Drilbur[] = { + overworld_ascending_frames(gObjectEventPic_Drilbur, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Excadrill[] = { + overworld_ascending_frames(gObjectEventPic_Excadrill, 4, 4), +}; +#endif //P_FAMILY_DRILBUR + +#if P_FAMILY_AUDINO +static const struct SpriteFrameImage sPicTable_Audino[] = { + overworld_ascending_frames(gObjectEventPic_Audino, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_AudinoMega[] = { + overworld_ascending_frames(gObjectEventPic_AudinoMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_AUDINO + +#if P_FAMILY_TIMBURR +static const struct SpriteFrameImage sPicTable_Timburr[] = { + overworld_ascending_frames(gObjectEventPic_Timburr, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gurdurr[] = { + overworld_ascending_frames(gObjectEventPic_Gurdurr, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Conkeldurr[] = { + overworld_ascending_frames(gObjectEventPic_Conkeldurr, 4, 4), +}; +#endif //P_FAMILY_TIMBURR + +#if P_FAMILY_TYMPOLE +static const struct SpriteFrameImage sPicTable_Tympole[] = { + overworld_ascending_frames(gObjectEventPic_Tympole, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Palpitoad[] = { + overworld_ascending_frames(gObjectEventPic_Palpitoad, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Seismitoad[] = { + overworld_ascending_frames(gObjectEventPic_Seismitoad, 4, 4), +}; +#endif //P_FAMILY_TYMPOLE + +#if P_FAMILY_THROH +static const struct SpriteFrameImage sPicTable_Throh[] = { + overworld_ascending_frames(gObjectEventPic_Throh, 4, 4), +}; +#endif //P_FAMILY_THROH + +#if P_FAMILY_SAWK +static const struct SpriteFrameImage sPicTable_Sawk[] = { + overworld_ascending_frames(gObjectEventPic_Sawk, 4, 4), +}; +#endif //P_FAMILY_SAWK + +#if P_FAMILY_SEWADDLE +static const struct SpriteFrameImage sPicTable_Sewaddle[] = { + overworld_ascending_frames(gObjectEventPic_Sewaddle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Swadloon[] = { + overworld_ascending_frames(gObjectEventPic_Swadloon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Leavanny[] = { + overworld_ascending_frames(gObjectEventPic_Leavanny, 4, 4), +}; +#endif //P_FAMILY_SEWADDLE + +#if P_FAMILY_VENIPEDE +static const struct SpriteFrameImage sPicTable_Venipede[] = { + overworld_ascending_frames(gObjectEventPic_Venipede, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Whirlipede[] = { + overworld_ascending_frames(gObjectEventPic_Whirlipede, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Scolipede[] = { + overworld_ascending_frames(gObjectEventPic_Scolipede, 4, 4), +}; +#endif //P_FAMILY_VENIPEDE + +#if P_FAMILY_COTTONEE +static const struct SpriteFrameImage sPicTable_Cottonee[] = { + overworld_ascending_frames(gObjectEventPic_Cottonee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Whimsicott[] = { + overworld_ascending_frames(gObjectEventPic_Whimsicott, 4, 4), +}; +#endif //P_FAMILY_COTTONEE + +#if P_FAMILY_PETILIL +static const struct SpriteFrameImage sPicTable_Petilil[] = { + overworld_ascending_frames(gObjectEventPic_Petilil, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lilligant[] = { + overworld_ascending_frames(gObjectEventPic_Lilligant, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_LilligantHisui[] = { + overworld_ascending_frames(gObjectEventPic_LilligantHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_PETILIL + +#if P_FAMILY_BASCULIN +static const struct SpriteFrameImage sPicTable_BasculinRedStriped[] = { + overworld_ascending_frames(gObjectEventPic_BasculinRedStriped, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_BasculinBlueStriped[] = { + overworld_ascending_frames(gObjectEventPic_BasculinBlueStriped, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_BasculinWhiteStriped[] = { + overworld_ascending_frames(gObjectEventPic_BasculinWhiteStriped, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_BasculegionM[] = { + overworld_ascending_frames(gObjectEventPic_BasculegionM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_BasculegionF[] = { + overworld_ascending_frames(gObjectEventPic_BasculegionF, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_BASCULIN + +#if P_FAMILY_SANDILE +static const struct SpriteFrameImage sPicTable_Sandile[] = { + overworld_ascending_frames(gObjectEventPic_Sandile, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Krokorok[] = { + overworld_ascending_frames(gObjectEventPic_Krokorok, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Krookodile[] = { + overworld_ascending_frames(gObjectEventPic_Krookodile, 4, 4), +}; +#endif //P_FAMILY_SANDILE + +#if P_FAMILY_DARUMAKA +static const struct SpriteFrameImage sPicTable_Darumaka[] = { + overworld_ascending_frames(gObjectEventPic_Darumaka, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DarmanitanStandard[] = { + overworld_ascending_frames(gObjectEventPic_DarmanitanStandard, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_DarmanitanZen[] = { + overworld_ascending_frames(gObjectEventPic_DarmanitanZen, 4, 4), +};*/ +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_DarumakaGalar[] = { + overworld_ascending_frames(gObjectEventPic_DarumakaGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DarmanitanGalarStandard[] = { + overworld_ascending_frames(gObjectEventPic_DarmanitanGalarStandard, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_DarmanitanGalarZen[] = { + overworld_ascending_frames(gObjectEventPic_DarmanitanGalarZen, 4, 4), +};*/ +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_DARUMAKA + +#if P_FAMILY_MARACTUS +static const struct SpriteFrameImage sPicTable_Maractus[] = { + overworld_ascending_frames(gObjectEventPic_Maractus, 4, 4), +}; +#endif //P_FAMILY_MARACTUS + +#if P_FAMILY_DWEBBLE +static const struct SpriteFrameImage sPicTable_Dwebble[] = { + overworld_ascending_frames(gObjectEventPic_Dwebble, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Crustle[] = { + overworld_ascending_frames(gObjectEventPic_Crustle, 4, 4), +}; +#endif //P_FAMILY_DWEBBLE + +#if P_FAMILY_SCRAGGY +static const struct SpriteFrameImage sPicTable_Scraggy[] = { + overworld_ascending_frames(gObjectEventPic_Scraggy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Scrafty[] = { + overworld_ascending_frames(gObjectEventPic_Scrafty, 4, 4), +}; +#endif //P_FAMILY_SCRAGGY + +#if P_FAMILY_SIGILYPH +static const struct SpriteFrameImage sPicTable_Sigilyph[] = { + overworld_ascending_frames(gObjectEventPic_Sigilyph, 4, 4), +}; +#endif //P_FAMILY_SIGILYPH + +#if P_FAMILY_YAMASK +static const struct SpriteFrameImage sPicTable_Yamask[] = { + overworld_ascending_frames(gObjectEventPic_Yamask, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cofagrigus[] = { + overworld_ascending_frames(gObjectEventPic_Cofagrigus, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_YamaskGalar[] = { + overworld_ascending_frames(gObjectEventPic_YamaskGalar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Runerigus[] = { + overworld_ascending_frames(gObjectEventPic_Runerigus, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_YAMASK + +#if P_FAMILY_TIRTOUGA +static const struct SpriteFrameImage sPicTable_Tirtouga[] = { + overworld_ascending_frames(gObjectEventPic_Tirtouga, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Carracosta[] = { + overworld_ascending_frames(gObjectEventPic_Carracosta, 4, 4), +}; +#endif //P_FAMILY_TIRTOUGA + +#if P_FAMILY_ARCHEN +static const struct SpriteFrameImage sPicTable_Archen[] = { + overworld_ascending_frames(gObjectEventPic_Archen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Archeops[] = { + overworld_ascending_frames(gObjectEventPic_Archeops, 4, 4), +}; +#endif //P_FAMILY_ARCHEN + +#if P_FAMILY_TRUBBISH +static const struct SpriteFrameImage sPicTable_Trubbish[] = { + overworld_ascending_frames(gObjectEventPic_Trubbish, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Garbodor[] = { + overworld_ascending_frames(gObjectEventPic_Garbodor, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_GarbodorGmax[] = { + overworld_ascending_frames(gObjectEventPic_GarbodorGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_TRUBBISH + +#if P_FAMILY_ZORUA +static const struct SpriteFrameImage sPicTable_Zorua[] = { + overworld_ascending_frames(gObjectEventPic_Zorua, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Zoroark[] = { + overworld_ascending_frames(gObjectEventPic_Zoroark, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_ZoruaHisui[] = { + overworld_ascending_frames(gObjectEventPic_ZoruaHisui, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZoroarkHisui[] = { + overworld_ascending_frames(gObjectEventPic_ZoroarkHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_ZORUA + +#if P_FAMILY_MINCCINO +static const struct SpriteFrameImage sPicTable_Minccino[] = { + overworld_ascending_frames(gObjectEventPic_Minccino, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cinccino[] = { + overworld_ascending_frames(gObjectEventPic_Cinccino, 4, 4), +}; +#endif //P_FAMILY_MINCCINO + +#if P_FAMILY_GOTHITA +static const struct SpriteFrameImage sPicTable_Gothita[] = { + overworld_ascending_frames(gObjectEventPic_Gothita, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gothorita[] = { + overworld_ascending_frames(gObjectEventPic_Gothorita, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gothitelle[] = { + overworld_ascending_frames(gObjectEventPic_Gothitelle, 4, 4), +}; +#endif //P_FAMILY_GOTHITA + +#if P_FAMILY_SOLOSIS +static const struct SpriteFrameImage sPicTable_Solosis[] = { + overworld_ascending_frames(gObjectEventPic_Solosis, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Duosion[] = { + overworld_ascending_frames(gObjectEventPic_Duosion, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Reuniclus[] = { + overworld_ascending_frames(gObjectEventPic_Reuniclus, 4, 4), +}; +#endif //P_FAMILY_SOLOSIS + +#if P_FAMILY_DUCKLETT +static const struct SpriteFrameImage sPicTable_Ducklett[] = { + overworld_ascending_frames(gObjectEventPic_Ducklett, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Swanna[] = { + overworld_ascending_frames(gObjectEventPic_Swanna, 4, 4), +}; +#endif //P_FAMILY_DUCKLETT + +#if P_FAMILY_VANILLITE +static const struct SpriteFrameImage sPicTable_Vanillite[] = { + overworld_ascending_frames(gObjectEventPic_Vanillite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Vanillish[] = { + overworld_ascending_frames(gObjectEventPic_Vanillish, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Vanilluxe[] = { + overworld_ascending_frames(gObjectEventPic_Vanilluxe, 4, 4), +}; +#endif //P_FAMILY_VANILLITE + +#if P_FAMILY_DEERLING + +static const struct SpriteFrameImage sPicTable_DeerlingSpring[] = { + overworld_ascending_frames(gObjectEventPic_DeerlingSpring, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeerlingSummer[] = { + overworld_ascending_frames(gObjectEventPic_DeerlingSummer, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeerlingAutumn[] = { + overworld_ascending_frames(gObjectEventPic_DeerlingAutumn, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_DeerlingWinter[] = { + overworld_ascending_frames(gObjectEventPic_DeerlingWinter, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SawsbuckSpring[] = { + overworld_ascending_frames(gObjectEventPic_SawsbuckSpring, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SawsbuckSummer[] = { + overworld_ascending_frames(gObjectEventPic_SawsbuckSummer, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SawsbuckAutumn[] = { + overworld_ascending_frames(gObjectEventPic_SawsbuckAutumn, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SawsbuckWinter[] = { + overworld_ascending_frames(gObjectEventPic_SawsbuckWinter, 4, 4), +}; +#endif //P_FAMILY_DEERLING + +#if P_FAMILY_EMOLGA +static const struct SpriteFrameImage sPicTable_Emolga[] = { + overworld_ascending_frames(gObjectEventPic_Emolga, 4, 4), +}; +#endif //P_FAMILY_EMOLGA + +#if P_FAMILY_KARRABLAST +static const struct SpriteFrameImage sPicTable_Karrablast[] = { + overworld_ascending_frames(gObjectEventPic_Karrablast, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Escavalier[] = { + overworld_ascending_frames(gObjectEventPic_Escavalier, 4, 4), +}; +#endif //P_FAMILY_KARRABLAST + +#if P_FAMILY_FOONGUS +static const struct SpriteFrameImage sPicTable_Foongus[] = { + overworld_ascending_frames(gObjectEventPic_Foongus, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Amoonguss[] = { + overworld_ascending_frames(gObjectEventPic_Amoonguss, 4, 4), +}; +#endif //P_FAMILY_FOONGUS + +#if P_FAMILY_FRILLISH +static const struct SpriteFrameImage sPicTable_Frillish[] = { + overworld_ascending_frames(gObjectEventPic_Frillish, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_FrillishF[] = { + overworld_ascending_frames(gObjectEventPic_FrillishF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_Jellicent[] = { + overworld_ascending_frames(gObjectEventPic_Jellicent, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_JellicentF[] = { + overworld_ascending_frames(gObjectEventPic_JellicentF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_FRILLISH + +#if P_FAMILY_ALOMOMOLA +static const struct SpriteFrameImage sPicTable_Alomomola[] = { + overworld_ascending_frames(gObjectEventPic_Alomomola, 4, 4), +}; +#endif //P_FAMILY_ALOMOMOLA + +#if P_FAMILY_JOLTIK +static const struct SpriteFrameImage sPicTable_Joltik[] = { + overworld_ascending_frames(gObjectEventPic_Joltik, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Galvantula[] = { + overworld_ascending_frames(gObjectEventPic_Galvantula, 4, 4), +}; +#endif //P_FAMILY_JOLTIK + +#if P_FAMILY_FERROSEED +static const struct SpriteFrameImage sPicTable_Ferroseed[] = { + overworld_ascending_frames(gObjectEventPic_Ferroseed, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ferrothorn[] = { + overworld_ascending_frames(gObjectEventPic_Ferrothorn, 4, 4), +}; +#endif //P_FAMILY_FERROSEED + +#if P_FAMILY_KLINK +static const struct SpriteFrameImage sPicTable_Klink[] = { + overworld_ascending_frames(gObjectEventPic_Klink, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Klang[] = { + overworld_ascending_frames(gObjectEventPic_Klang, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Klinklang[] = { + overworld_ascending_frames(gObjectEventPic_Klinklang, 4, 4), +}; +#endif //P_FAMILY_KLINK + +#if P_FAMILY_TYNAMO +static const struct SpriteFrameImage sPicTable_Tynamo[] = { + overworld_ascending_frames(gObjectEventPic_Tynamo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Eelektrik[] = { + overworld_ascending_frames(gObjectEventPic_Eelektrik, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Eelektross[] = { + overworld_ascending_frames(gObjectEventPic_Eelektross, 4, 4), +}; +#endif //P_FAMILY_TYNAMO + +#if P_FAMILY_ELGYEM +static const struct SpriteFrameImage sPicTable_Elgyem[] = { + overworld_ascending_frames(gObjectEventPic_Elgyem, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Beheeyem[] = { + overworld_ascending_frames(gObjectEventPic_Beheeyem, 4, 4), +}; +#endif //P_FAMILY_ELGYEM + +#if P_FAMILY_LITWICK +static const struct SpriteFrameImage sPicTable_Litwick[] = { + overworld_ascending_frames(gObjectEventPic_Litwick, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lampent[] = { + overworld_ascending_frames(gObjectEventPic_Lampent, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Chandelure[] = { + overworld_ascending_frames(gObjectEventPic_Chandelure, 4, 4), +}; +#endif //P_FAMILY_LITWICK + +#if P_FAMILY_AXEW +static const struct SpriteFrameImage sPicTable_Axew[] = { + overworld_ascending_frames(gObjectEventPic_Axew, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Fraxure[] = { + overworld_ascending_frames(gObjectEventPic_Fraxure, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Haxorus[] = { + overworld_ascending_frames(gObjectEventPic_Haxorus, 4, 4), +}; +#endif //P_FAMILY_AXEW + +#if P_FAMILY_CUBCHOO +static const struct SpriteFrameImage sPicTable_Cubchoo[] = { + overworld_ascending_frames(gObjectEventPic_Cubchoo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Beartic[] = { + overworld_ascending_frames(gObjectEventPic_Beartic, 4, 4), +}; +#endif //P_FAMILY_CUBCHOO + +#if P_FAMILY_CRYOGONAL +static const struct SpriteFrameImage sPicTable_Cryogonal[] = { + overworld_ascending_frames(gObjectEventPic_Cryogonal, 4, 4), +}; +#endif //P_FAMILY_CRYOGONAL + +#if P_FAMILY_SHELMET +static const struct SpriteFrameImage sPicTable_Shelmet[] = { + overworld_ascending_frames(gObjectEventPic_Shelmet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Accelgor[] = { + overworld_ascending_frames(gObjectEventPic_Accelgor, 4, 4), +}; +#endif //P_FAMILY_SHELMET + +#if P_FAMILY_STUNFISK +static const struct SpriteFrameImage sPicTable_Stunfisk[] = { + overworld_ascending_frames(gObjectEventPic_Stunfisk, 4, 4), +}; +#if P_GALARIAN_FORMS +static const struct SpriteFrameImage sPicTable_StunfiskGalar[] = { + overworld_ascending_frames(gObjectEventPic_StunfiskGalar, 4, 4), +}; +#endif //P_GALARIAN_FORMS +#endif //P_FAMILY_STUNFISK + +#if P_FAMILY_MIENFOO +static const struct SpriteFrameImage sPicTable_Mienfoo[] = { + overworld_ascending_frames(gObjectEventPic_Mienfoo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mienshao[] = { + overworld_ascending_frames(gObjectEventPic_Mienshao, 4, 4), +}; +#endif //P_FAMILY_MIENFOO + +#if P_FAMILY_DRUDDIGON +static const struct SpriteFrameImage sPicTable_Druddigon[] = { + overworld_ascending_frames(gObjectEventPic_Druddigon, 4, 4), +}; +#endif //P_FAMILY_DRUDDIGON + +#if P_FAMILY_GOLETT +static const struct SpriteFrameImage sPicTable_Golett[] = { + overworld_ascending_frames(gObjectEventPic_Golett, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Golurk[] = { + overworld_ascending_frames(gObjectEventPic_Golurk, 4, 4), +}; +#endif //P_FAMILY_GOLETT + +#if P_FAMILY_PAWNIARD +static const struct SpriteFrameImage sPicTable_Pawniard[] = { + overworld_ascending_frames(gObjectEventPic_Pawniard, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bisharp[] = { + overworld_ascending_frames(gObjectEventPic_Bisharp, 4, 4), +}; +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Kingambit[] = { + overworld_ascending_frames(gObjectEventPic_Kingambit, 8, 8), +}; +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_PAWNIARD + +#if P_FAMILY_BOUFFALANT +static const struct SpriteFrameImage sPicTable_Bouffalant[] = { + overworld_ascending_frames(gObjectEventPic_Bouffalant, 4, 4), +}; +#endif //P_FAMILY_BOUFFALANT + +#if P_FAMILY_RUFFLET +static const struct SpriteFrameImage sPicTable_Rufflet[] = { + overworld_ascending_frames(gObjectEventPic_Rufflet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Braviary[] = { + overworld_ascending_frames(gObjectEventPic_Braviary, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_BraviaryHisui[] = { + overworld_ascending_frames(gObjectEventPic_BraviaryHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_RUFFLET + +#if P_FAMILY_VULLABY +static const struct SpriteFrameImage sPicTable_Vullaby[] = { + overworld_ascending_frames(gObjectEventPic_Vullaby, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mandibuzz[] = { + overworld_ascending_frames(gObjectEventPic_Mandibuzz, 4, 4), +}; +#endif //P_FAMILY_VULLABY + +#if P_FAMILY_HEATMOR +static const struct SpriteFrameImage sPicTable_Heatmor[] = { + overworld_ascending_frames(gObjectEventPic_Heatmor, 4, 4), +}; +#endif //P_FAMILY_HEATMOR + +#if P_FAMILY_DURANT +static const struct SpriteFrameImage sPicTable_Durant[] = { + overworld_ascending_frames(gObjectEventPic_Durant, 4, 4), +}; +#endif //P_FAMILY_DURANT + +#if P_FAMILY_DEINO +static const struct SpriteFrameImage sPicTable_Deino[] = { + overworld_ascending_frames(gObjectEventPic_Deino, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Zweilous[] = { + overworld_ascending_frames(gObjectEventPic_Zweilous, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hydreigon[] = { + overworld_ascending_frames(gObjectEventPic_Hydreigon, 4, 4), +}; +#endif //P_FAMILY_DEINO + +#if P_FAMILY_LARVESTA +static const struct SpriteFrameImage sPicTable_Larvesta[] = { + overworld_ascending_frames(gObjectEventPic_Larvesta, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Volcarona[] = { + overworld_ascending_frames(gObjectEventPic_Volcarona, 4, 4), +}; +#endif //P_FAMILY_LARVESTA + +#if P_FAMILY_COBALION +static const struct SpriteFrameImage sPicTable_Cobalion[] = { + overworld_ascending_frames(gObjectEventPic_Cobalion, 4, 4), +}; +#endif //P_FAMILY_COBALION + +#if P_FAMILY_TERRAKION +static const struct SpriteFrameImage sPicTable_Terrakion[] = { + overworld_ascending_frames(gObjectEventPic_Terrakion, 4, 4), +}; +#endif //P_FAMILY_TERRAKION + +#if P_FAMILY_VIRIZION +static const struct SpriteFrameImage sPicTable_Virizion[] = { + overworld_ascending_frames(gObjectEventPic_Virizion, 4, 4), +}; +#endif //P_FAMILY_VIRIZION + +#if P_FAMILY_TORNADUS + +static const struct SpriteFrameImage sPicTable_TornadusIncarnate[] = { + overworld_ascending_frames(gObjectEventPic_TornadusIncarnate, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TornadusTherian[] = { + overworld_ascending_frames(gObjectEventPic_TornadusTherian, 8, 8), +}; +#endif //P_FAMILY_TORNADUS + +#if P_FAMILY_THUNDURUS + +static const struct SpriteFrameImage sPicTable_ThundurusIncarnate[] = { + overworld_ascending_frames(gObjectEventPic_ThundurusIncarnate, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ThundurusTherian[] = { + overworld_ascending_frames(gObjectEventPic_ThundurusTherian, 8, 8), +}; +#endif //P_FAMILY_THUNDURUS + +#if P_FAMILY_RESHIRAM +static const struct SpriteFrameImage sPicTable_Reshiram[] = { + overworld_ascending_frames(gObjectEventPic_Reshiram, 8, 8), +}; +#endif //P_FAMILY_RESHIRAM + +#if P_FAMILY_ZEKROM +static const struct SpriteFrameImage sPicTable_Zekrom[] = { + overworld_ascending_frames(gObjectEventPic_Zekrom, 8, 8), +}; +#endif //P_FAMILY_ZEKROM + +#if P_FAMILY_LANDORUS + +static const struct SpriteFrameImage sPicTable_LandorusIncarnate[] = { + overworld_ascending_frames(gObjectEventPic_LandorusIncarnate, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_LandorusTherian[] = { + overworld_ascending_frames(gObjectEventPic_LandorusTherian, 4, 4), +}; +#endif //P_FAMILY_LANDORUS + +#if P_FAMILY_ENAMORUS +static const struct SpriteFrameImage sPicTable_EnamorusIncarnate[] = { + overworld_ascending_frames(gObjectEventPic_EnamorusIncarnate, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_EnamorusTherian[] = { + overworld_ascending_frames(gObjectEventPic_EnamorusTherian, 8, 8), +}; +#endif //P_FAMILY_ENAMORUS + +#if P_FAMILY_KYUREM +static const struct SpriteFrameImage sPicTable_Kyurem[] = { + overworld_ascending_frames(gObjectEventPic_Kyurem, 8, 8), +}; +#if P_FUSION_FORMS +static const struct SpriteFrameImage sPicTable_KyuremWhite[] = { + overworld_ascending_frames(gObjectEventPic_KyuremWhite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_KyuremBlack[] = { + overworld_ascending_frames(gObjectEventPic_KyuremBlack, 4, 4), +}; +#endif //P_FUSION_FORMS +#endif //P_FAMILY_KYUREM + +#if P_FAMILY_KELDEO +static const struct SpriteFrameImage sPicTable_KeldeoOrdinary[] = { + overworld_ascending_frames(gObjectEventPic_KeldeoOrdinary, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_KeldeoResolute[] = { + overworld_ascending_frames(gObjectEventPic_KeldeoResolute, 4, 4), +};*/ +#endif //P_FAMILY_KELDEO + +#if P_FAMILY_MELOETTA +static const struct SpriteFrameImage sPicTable_MeloettaAria[] = { + overworld_ascending_frames(gObjectEventPic_MeloettaAria, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MeloettaPirouette[] = { + overworld_ascending_frames(gObjectEventPic_MeloettaPirouette, 4, 4), +}; +#endif //P_FAMILY_MELOETTA + +#if P_FAMILY_GENESECT +static const struct SpriteFrameImage sPicTable_Genesect[] = { + overworld_ascending_frames(gObjectEventPic_Genesect, 4, 4), +}; + + + + +#endif //P_FAMILY_GENESECT + +#if P_FAMILY_CHESPIN +static const struct SpriteFrameImage sPicTable_Chespin[] = { + overworld_ascending_frames(gObjectEventPic_Chespin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Quilladin[] = { + overworld_ascending_frames(gObjectEventPic_Quilladin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Chesnaught[] = { + overworld_ascending_frames(gObjectEventPic_Chesnaught, 4, 4), +}; +#endif //P_FAMILY_CHESPIN + +#if P_FAMILY_FENNEKIN +static const struct SpriteFrameImage sPicTable_Fennekin[] = { + overworld_ascending_frames(gObjectEventPic_Fennekin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Braixen[] = { + overworld_ascending_frames(gObjectEventPic_Braixen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Delphox[] = { + overworld_ascending_frames(gObjectEventPic_Delphox, 4, 4), +}; +#endif //P_FAMILY_FENNEKIN + +#if P_FAMILY_FROAKIE +static const struct SpriteFrameImage sPicTable_Froakie[] = { + overworld_ascending_frames(gObjectEventPic_Froakie, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Frogadier[] = { + overworld_ascending_frames(gObjectEventPic_Frogadier, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Greninja[] = { + overworld_ascending_frames(gObjectEventPic_Greninja, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_GreninjaAsh[] = { + overworld_ascending_frames(gObjectEventPic_GreninjaAsh, 4, 4), +};*/ +#endif //P_FAMILY_FROAKIE + +#if P_FAMILY_BUNNELBY +static const struct SpriteFrameImage sPicTable_Bunnelby[] = { + overworld_ascending_frames(gObjectEventPic_Bunnelby, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Diggersby[] = { + overworld_ascending_frames(gObjectEventPic_Diggersby, 4, 4), +}; +#endif //P_FAMILY_BUNNELBY + +#if P_FAMILY_FLETCHLING +static const struct SpriteFrameImage sPicTable_Fletchling[] = { + overworld_ascending_frames(gObjectEventPic_Fletchling, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Fletchinder[] = { + overworld_ascending_frames(gObjectEventPic_Fletchinder, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Talonflame[] = { + overworld_ascending_frames(gObjectEventPic_Talonflame, 4, 4), +}; +#endif //P_FAMILY_FLETCHLING + +#if P_FAMILY_SCATTERBUG +static const struct SpriteFrameImage sPicTable_Scatterbug[] = { + overworld_ascending_frames(gObjectEventPic_Scatterbug, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Spewpa[] = { + overworld_ascending_frames(gObjectEventPic_Spewpa, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonIcySnow[] = { + overworld_ascending_frames(gObjectEventPic_VivillonIcySnow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonPolar[] = { + overworld_ascending_frames(gObjectEventPic_VivillonPolar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonTundra[] = { + overworld_ascending_frames(gObjectEventPic_VivillonTundra, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonContinental[] = { + overworld_ascending_frames(gObjectEventPic_VivillonContinental, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonGarden[] = { + overworld_ascending_frames(gObjectEventPic_VivillonGarden, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonElegant[] = { + overworld_ascending_frames(gObjectEventPic_VivillonElegant, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonMeadow[] = { + overworld_ascending_frames(gObjectEventPic_VivillonMeadow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonModern[] = { + overworld_ascending_frames(gObjectEventPic_VivillonModern, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonMarine[] = { + overworld_ascending_frames(gObjectEventPic_VivillonMarine, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonArchipelago[] = { + overworld_ascending_frames(gObjectEventPic_VivillonArchipelago, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonHighPlains[] = { + overworld_ascending_frames(gObjectEventPic_VivillonHighPlains, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonSandstorm[] = { + overworld_ascending_frames(gObjectEventPic_VivillonSandstorm, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonRiver[] = { + overworld_ascending_frames(gObjectEventPic_VivillonRiver, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonMonsoon[] = { + overworld_ascending_frames(gObjectEventPic_VivillonMonsoon, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonSavanna[] = { + overworld_ascending_frames(gObjectEventPic_VivillonSavanna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonSun[] = { + overworld_ascending_frames(gObjectEventPic_VivillonSun, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonOcean[] = { + overworld_ascending_frames(gObjectEventPic_VivillonOcean, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonJungle[] = { + overworld_ascending_frames(gObjectEventPic_VivillonJungle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonFancy[] = { + overworld_ascending_frames(gObjectEventPic_VivillonFancy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_VivillonPokeBall[] = { + overworld_ascending_frames(gObjectEventPic_VivillonPokeBall, 4, 4), +}; +#endif //P_FAMILY_SCATTERBUG + +#if P_FAMILY_LITLEO +static const struct SpriteFrameImage sPicTable_Litleo[] = { + overworld_ascending_frames(gObjectEventPic_Litleo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pyroar[] = { + overworld_ascending_frames(gObjectEventPic_Pyroar, 4, 4), +}; +#if P_GENDER_DIFFERENCES +static const struct SpriteFrameImage sPicTable_PyroarF[] = { + overworld_ascending_frames(gObjectEventPic_PyroarF, 4, 4), +}; +#endif //P_GENDER_DIFFERENCES +#endif //P_FAMILY_LITLEO + +#if P_FAMILY_FLABEBE + +static const struct SpriteFrameImage sPicTable_FlabebeRed[] = { + overworld_ascending_frames(gObjectEventPic_FlabebeRed, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlabebeYellow[] = { + overworld_ascending_frames(gObjectEventPic_FlabebeYellow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlabebeOrange[] = { + overworld_ascending_frames(gObjectEventPic_FlabebeOrange, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlabebeBlue[] = { + overworld_ascending_frames(gObjectEventPic_FlabebeBlue, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlabebeWhite[] = { + overworld_ascending_frames(gObjectEventPic_FlabebeWhite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteRed[] = { + overworld_ascending_frames(gObjectEventPic_FloetteRed, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteYellow[] = { + overworld_ascending_frames(gObjectEventPic_FloetteYellow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteOrange[] = { + overworld_ascending_frames(gObjectEventPic_FloetteOrange, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteBlue[] = { + overworld_ascending_frames(gObjectEventPic_FloetteBlue, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteWhite[] = { + overworld_ascending_frames(gObjectEventPic_FloetteWhite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FloetteEternal[] = { + overworld_ascending_frames(gObjectEventPic_FloetteEternal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlorgesRed[] = { + overworld_ascending_frames(gObjectEventPic_FlorgesRed, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlorgesYellow[] = { + overworld_ascending_frames(gObjectEventPic_FlorgesYellow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlorgesOrange[] = { + overworld_ascending_frames(gObjectEventPic_FlorgesOrange, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlorgesBlue[] = { + overworld_ascending_frames(gObjectEventPic_FlorgesBlue, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FlorgesWhite[] = { + overworld_ascending_frames(gObjectEventPic_FlorgesWhite, 4, 4), +}; +#endif //P_FAMILY_FLABEBE + +#if P_FAMILY_SKIDDO +static const struct SpriteFrameImage sPicTable_Skiddo[] = { + overworld_ascending_frames(gObjectEventPic_Skiddo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gogoat[] = { + overworld_ascending_frames(gObjectEventPic_Gogoat, 4, 4), +}; +#endif //P_FAMILY_SKIDDO + +#if P_FAMILY_PANCHAM +static const struct SpriteFrameImage sPicTable_Pancham[] = { + overworld_ascending_frames(gObjectEventPic_Pancham, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pangoro[] = { + overworld_ascending_frames(gObjectEventPic_Pangoro, 4, 4), +}; +#endif //P_FAMILY_PANCHAM + +#if P_FAMILY_FURFROU +static const struct SpriteFrameImage sPicTable_FurfrouNatural[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouNatural, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouHeart[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouHeart, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouStar[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouStar, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouDiamond[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDiamond, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouDebutante[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDebutante, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouMatron[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouMatron, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouDandy[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDandy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouLaReine[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouLaReine, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouKabuki[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouKabuki, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_FurfrouPharaoh[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouPharaoh, 4, 4), +}; +#endif //P_FAMILY_FURFROU + +#if P_FAMILY_ESPURR +static const struct SpriteFrameImage sPicTable_Espurr[] = { + overworld_ascending_frames(gObjectEventPic_Espurr, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MeowsticM[] = { + overworld_ascending_frames(gObjectEventPic_MeowsticM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MeowsticF[] = { + overworld_ascending_frames(gObjectEventPic_MeowsticF, 4, 4), +}; +#endif //P_FAMILY_ESPURR + +#if P_FAMILY_HONEDGE +static const struct SpriteFrameImage sPicTable_Honedge[] = { + overworld_ascending_frames(gObjectEventPic_Honedge, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Doublade[] = { + overworld_ascending_frames(gObjectEventPic_Doublade, 4, 4), +}; + +static const struct SpriteFrameImage sPicTable_AegislashShield[] = { + overworld_ascending_frames(gObjectEventPic_AegislashShield, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_AegislashBlade[] = { + overworld_ascending_frames(gObjectEventPic_AegislashBlade, 4, 4), +};*/ +#endif //P_FAMILY_HONEDGE + +#if P_FAMILY_SPRITZEE +static const struct SpriteFrameImage sPicTable_Spritzee[] = { + overworld_ascending_frames(gObjectEventPic_Spritzee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Aromatisse[] = { + overworld_ascending_frames(gObjectEventPic_Aromatisse, 4, 4), +}; +#endif //P_FAMILY_SPRITZEE + +#if P_FAMILY_SWIRLIX +static const struct SpriteFrameImage sPicTable_Swirlix[] = { + overworld_ascending_frames(gObjectEventPic_Swirlix, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Slurpuff[] = { + overworld_ascending_frames(gObjectEventPic_Slurpuff, 4, 4), +}; +#endif //P_FAMILY_SWIRLIX + +#if P_FAMILY_INKAY +static const struct SpriteFrameImage sPicTable_Inkay[] = { + overworld_ascending_frames(gObjectEventPic_Inkay, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Malamar[] = { + overworld_ascending_frames(gObjectEventPic_Malamar, 4, 4), +}; +#endif //P_FAMILY_INKAY + +#if P_FAMILY_BINACLE +static const struct SpriteFrameImage sPicTable_Binacle[] = { + overworld_ascending_frames(gObjectEventPic_Binacle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Barbaracle[] = { + overworld_ascending_frames(gObjectEventPic_Barbaracle, 4, 4), +}; +#endif //P_FAMILY_BINACLE + +#if P_FAMILY_SKRELP +static const struct SpriteFrameImage sPicTable_Skrelp[] = { + overworld_ascending_frames(gObjectEventPic_Skrelp, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dragalge[] = { + overworld_ascending_frames(gObjectEventPic_Dragalge, 4, 4), +}; +#endif //P_FAMILY_SKRELP + +#if P_FAMILY_CLAUNCHER +static const struct SpriteFrameImage sPicTable_Clauncher[] = { + overworld_ascending_frames(gObjectEventPic_Clauncher, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Clawitzer[] = { + overworld_ascending_frames(gObjectEventPic_Clawitzer, 4, 4), +}; +#endif //P_FAMILY_CLAUNCHER + +#if P_FAMILY_HELIOPTILE +static const struct SpriteFrameImage sPicTable_Helioptile[] = { + overworld_ascending_frames(gObjectEventPic_Helioptile, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Heliolisk[] = { + overworld_ascending_frames(gObjectEventPic_Heliolisk, 4, 4), +}; +#endif //P_FAMILY_HELIOPTILE + +#if P_FAMILY_TYRUNT +static const struct SpriteFrameImage sPicTable_Tyrunt[] = { + overworld_ascending_frames(gObjectEventPic_Tyrunt, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tyrantrum[] = { + overworld_ascending_frames(gObjectEventPic_Tyrantrum, 4, 4), +}; +#endif //P_FAMILY_TYRUNT + +#if P_FAMILY_AMAURA +static const struct SpriteFrameImage sPicTable_Amaura[] = { + overworld_ascending_frames(gObjectEventPic_Amaura, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Aurorus[] = { + overworld_ascending_frames(gObjectEventPic_Aurorus, 4, 4), +}; +#endif //P_FAMILY_AMAURA + +#if P_FAMILY_HAWLUCHA +static const struct SpriteFrameImage sPicTable_Hawlucha[] = { + overworld_ascending_frames(gObjectEventPic_Hawlucha, 4, 4), +}; +#endif //P_FAMILY_HAWLUCHA + +#if P_FAMILY_DEDENNE +static const struct SpriteFrameImage sPicTable_Dedenne[] = { + overworld_ascending_frames(gObjectEventPic_Dedenne, 4, 4), +}; +#endif //P_FAMILY_DEDENNE + +#if P_FAMILY_CARBINK +static const struct SpriteFrameImage sPicTable_Carbink[] = { + overworld_ascending_frames(gObjectEventPic_Carbink, 4, 4), +}; +#endif //P_FAMILY_CARBINK + +#if P_FAMILY_GOOMY +static const struct SpriteFrameImage sPicTable_Goomy[] = { + overworld_ascending_frames(gObjectEventPic_Goomy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sliggoo[] = { + overworld_ascending_frames(gObjectEventPic_Sliggoo, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_SliggooHisui[] = { + overworld_ascending_frames(gObjectEventPic_SliggooHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS + +static const struct SpriteFrameImage sPicTable_Goodra[] = { + overworld_ascending_frames(gObjectEventPic_Goodra, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_GoodraHisui[] = { + overworld_ascending_frames(gObjectEventPic_GoodraHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_GOOMY + +#if P_FAMILY_KLEFKI +static const struct SpriteFrameImage sPicTable_Klefki[] = { + overworld_ascending_frames(gObjectEventPic_Klefki, 4, 4), +}; +#endif //P_FAMILY_KLEFKI + +#if P_FAMILY_PHANTUMP +static const struct SpriteFrameImage sPicTable_Phantump[] = { + overworld_ascending_frames(gObjectEventPic_Phantump, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Trevenant[] = { + overworld_ascending_frames(gObjectEventPic_Trevenant, 4, 4), +}; +#endif //P_FAMILY_PHANTUMP + +#if P_FAMILY_PUMPKABOO + +static const struct SpriteFrameImage sPicTable_PumpkabooAverage[] = { + overworld_ascending_frames(gObjectEventPic_PumpkabooAverage, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PumpkabooSmall[] = { + overworld_ascending_frames(gObjectEventPic_PumpkabooSmall, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PumpkabooLarge[] = { + overworld_ascending_frames(gObjectEventPic_PumpkabooLarge, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PumpkabooSuper[] = { + overworld_ascending_frames(gObjectEventPic_PumpkabooSuper, 4, 4), +}; + +static const struct SpriteFrameImage sPicTable_GourgeistAverage[] = { + overworld_ascending_frames(gObjectEventPic_GourgeistAverage, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GourgeistSmall[] = { + overworld_ascending_frames(gObjectEventPic_GourgeistSmall, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GourgeistLarge[] = { + overworld_ascending_frames(gObjectEventPic_GourgeistLarge, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_GourgeistSuper[] = { + overworld_ascending_frames(gObjectEventPic_GourgeistSuper, 4, 4), +}; +#endif //P_FAMILY_PUMPKABOO + +#if P_FAMILY_BERGMITE +static const struct SpriteFrameImage sPicTable_Bergmite[] = { + overworld_ascending_frames(gObjectEventPic_Bergmite, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Avalugg[] = { + overworld_ascending_frames(gObjectEventPic_Avalugg, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_AvaluggHisui[] = { + overworld_ascending_frames(gObjectEventPic_AvaluggHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_BERGMITE + +#if P_FAMILY_NOIBAT +static const struct SpriteFrameImage sPicTable_Noibat[] = { + overworld_ascending_frames(gObjectEventPic_Noibat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Noivern[] = { + overworld_ascending_frames(gObjectEventPic_Noivern, 4, 4), +}; +#endif //P_FAMILY_NOIBAT + +#if P_FAMILY_XERNEAS + +static const struct SpriteFrameImage sPicTable_XerneasNeutral[] = { + overworld_ascending_frames(gObjectEventPic_XerneasNeutral, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_XerneasActive[] = { + overworld_ascending_frames(gObjectEventPic_XerneasActive, 8, 8), +}; +#endif //P_FAMILY_XERNEAS + +#if P_FAMILY_YVELTAL +static const struct SpriteFrameImage sPicTable_Yveltal[] = { + overworld_ascending_frames(gObjectEventPic_Yveltal, 8, 8), +}; +#endif //P_FAMILY_YVELTAL + +#if P_FAMILY_ZYGARDE + +static const struct SpriteFrameImage sPicTable_Zygarde50[] = { + overworld_ascending_frames(gObjectEventPic_Zygarde50, 8, 8), +}; +static const struct SpriteFrameImage sPicTable_Zygarde10[] = { + overworld_ascending_frames(gObjectEventPic_Zygarde10, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZygardeComplete[] = { + overworld_ascending_frames(gObjectEventPic_ZygardeComplete, 4, 4), +}; + +#endif //P_FAMILY_ZYGARDE + +#if P_FAMILY_DIANCIE +static const struct SpriteFrameImage sPicTable_Diancie[] = { + overworld_ascending_frames(gObjectEventPic_Diancie, 4, 4), +}; +#if P_MEGA_EVOLUTIONS +static const struct SpriteFrameImage sPicTable_DiancieMega[] = { + overworld_ascending_frames(gObjectEventPic_DiancieMega, 4, 4), +}; +#endif //P_MEGA_EVOLUTIONS +#endif //P_FAMILY_DIANCIE + +#if P_FAMILY_HOOPA +static const struct SpriteFrameImage sPicTable_HoopaConfined[] = { + overworld_ascending_frames(gObjectEventPic_HoopaConfined, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_HoopaUnbound[] = { + overworld_ascending_frames(gObjectEventPic_HoopaUnbound, 8, 8), +}; +#endif //P_FAMILY_HOOPA + +#if P_FAMILY_VOLCANION +static const struct SpriteFrameImage sPicTable_Volcanion[] = { + overworld_ascending_frames(gObjectEventPic_Volcanion, 4, 4), +}; +#endif //P_FAMILY_VOLCANION + +#if P_FAMILY_ROWLET +static const struct SpriteFrameImage sPicTable_Rowlet[] = { + overworld_ascending_frames(gObjectEventPic_Rowlet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dartrix[] = { + overworld_ascending_frames(gObjectEventPic_Dartrix, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Decidueye[] = { + overworld_ascending_frames(gObjectEventPic_Decidueye, 4, 4), +}; +#if P_HISUIAN_FORMS +static const struct SpriteFrameImage sPicTable_DecidueyeHisui[] = { + overworld_ascending_frames(gObjectEventPic_DecidueyeHisui, 4, 4), +}; +#endif //P_HISUIAN_FORMS +#endif //P_FAMILY_ROWLET + +#if P_FAMILY_LITTEN +static const struct SpriteFrameImage sPicTable_Litten[] = { + overworld_ascending_frames(gObjectEventPic_Litten, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Torracat[] = { + overworld_ascending_frames(gObjectEventPic_Torracat, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Incineroar[] = { + overworld_ascending_frames(gObjectEventPic_Incineroar, 4, 4), +}; +#endif //P_FAMILY_LITTEN + +#if P_FAMILY_POPPLIO +static const struct SpriteFrameImage sPicTable_Popplio[] = { + overworld_ascending_frames(gObjectEventPic_Popplio, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Brionne[] = { + overworld_ascending_frames(gObjectEventPic_Brionne, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Primarina[] = { + overworld_ascending_frames(gObjectEventPic_Primarina, 4, 4), +}; +#endif //P_FAMILY_POPPLIO + +#if P_FAMILY_PIKIPEK +static const struct SpriteFrameImage sPicTable_Pikipek[] = { + overworld_ascending_frames(gObjectEventPic_Pikipek, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Trumbeak[] = { + overworld_ascending_frames(gObjectEventPic_Trumbeak, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Toucannon[] = { + overworld_ascending_frames(gObjectEventPic_Toucannon, 4, 4), +}; +#endif //P_FAMILY_PIKIPEK + +#if P_FAMILY_YUNGOOS +static const struct SpriteFrameImage sPicTable_Yungoos[] = { + overworld_ascending_frames(gObjectEventPic_Yungoos, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Gumshoos[] = { + overworld_ascending_frames(gObjectEventPic_Gumshoos, 4, 4), +}; +#endif //P_FAMILY_YUNGOOS + +#if P_FAMILY_GRUBBIN +static const struct SpriteFrameImage sPicTable_Grubbin[] = { + overworld_ascending_frames(gObjectEventPic_Grubbin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Charjabug[] = { + overworld_ascending_frames(gObjectEventPic_Charjabug, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Vikavolt[] = { + overworld_ascending_frames(gObjectEventPic_Vikavolt, 4, 4), +}; +#endif //P_FAMILY_GRUBBIN + +#if P_FAMILY_CRABRAWLER +static const struct SpriteFrameImage sPicTable_Crabrawler[] = { + overworld_ascending_frames(gObjectEventPic_Crabrawler, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Crabominable[] = { + overworld_ascending_frames(gObjectEventPic_Crabominable, 4, 4), +}; +#endif //P_FAMILY_CRABRAWLER + +#if P_FAMILY_ORICORIO + +static const struct SpriteFrameImage sPicTable_OricorioBaile[] = { + overworld_ascending_frames(gObjectEventPic_OricorioBaile, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OricorioPomPom[] = { + overworld_ascending_frames(gObjectEventPic_OricorioPomPom, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OricorioPau[] = { + overworld_ascending_frames(gObjectEventPic_OricorioPau, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OricorioSensu[] = { + overworld_ascending_frames(gObjectEventPic_OricorioSensu, 4, 4), +}; +#endif //P_FAMILY_ORICORIO + +#if P_FAMILY_CUTIEFLY +static const struct SpriteFrameImage sPicTable_Cutiefly[] = { + overworld_ascending_frames(gObjectEventPic_Cutiefly, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ribombee[] = { + overworld_ascending_frames(gObjectEventPic_Ribombee, 4, 4), +}; +#endif //P_FAMILY_CUTIEFLY + +#if P_FAMILY_ROCKRUFF +static const struct SpriteFrameImage sPicTable_Rockruff[] = { + overworld_ascending_frames(gObjectEventPic_Rockruff, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_LycanrocMidday[] = { + overworld_ascending_frames(gObjectEventPic_LycanrocMidday, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_LycanrocMidnight[] = { + overworld_ascending_frames(gObjectEventPic_LycanrocMidnight, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_LycanrocDusk[] = { + overworld_ascending_frames(gObjectEventPic_LycanrocDusk, 4, 4), +}; +#endif //P_FAMILY_ROCKRUFF + +#if P_FAMILY_WISHIWASHI + +static const struct SpriteFrameImage sPicTable_WishiwashiSolo[] = { + overworld_ascending_frames(gObjectEventPic_WishiwashiSolo, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_WishiwashiSchool[] = { + overworld_ascending_frames(gObjectEventPic_WishiwashiSchool, 4, 4), +};*/ +#endif //P_FAMILY_WISHIWASHI + +#if P_FAMILY_MAREANIE +static const struct SpriteFrameImage sPicTable_Mareanie[] = { + overworld_ascending_frames(gObjectEventPic_Mareanie, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Toxapex[] = { + overworld_ascending_frames(gObjectEventPic_Toxapex, 4, 4), +}; +#endif //P_FAMILY_MAREANIE + +#if P_FAMILY_MUDBRAY +static const struct SpriteFrameImage sPicTable_Mudbray[] = { + overworld_ascending_frames(gObjectEventPic_Mudbray, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mudsdale[] = { + overworld_ascending_frames(gObjectEventPic_Mudsdale, 4, 4), +}; +#endif //P_FAMILY_MUDBRAY + +#if P_FAMILY_DEWPIDER +static const struct SpriteFrameImage sPicTable_Dewpider[] = { + overworld_ascending_frames(gObjectEventPic_Dewpider, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Araquanid[] = { + overworld_ascending_frames(gObjectEventPic_Araquanid, 4, 4), +}; +#endif //P_FAMILY_DEWPIDER + +#if P_FAMILY_FOMANTIS +static const struct SpriteFrameImage sPicTable_Fomantis[] = { + overworld_ascending_frames(gObjectEventPic_Fomantis, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lurantis[] = { + overworld_ascending_frames(gObjectEventPic_Lurantis, 4, 4), +}; +#endif //P_FAMILY_FOMANTIS + +#if P_FAMILY_MORELULL +static const struct SpriteFrameImage sPicTable_Morelull[] = { + overworld_ascending_frames(gObjectEventPic_Morelull, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Shiinotic[] = { + overworld_ascending_frames(gObjectEventPic_Shiinotic, 4, 4), +}; +#endif //P_FAMILY_MORELULL + +#if P_FAMILY_SALANDIT +static const struct SpriteFrameImage sPicTable_Salandit[] = { + overworld_ascending_frames(gObjectEventPic_Salandit, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Salazzle[] = { + overworld_ascending_frames(gObjectEventPic_Salazzle, 4, 4), +}; +#endif //P_FAMILY_SALANDIT + +#if P_FAMILY_STUFFUL +static const struct SpriteFrameImage sPicTable_Stufful[] = { + overworld_ascending_frames(gObjectEventPic_Stufful, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bewear[] = { + overworld_ascending_frames(gObjectEventPic_Bewear, 4, 4), +}; +#endif //P_FAMILY_STUFFUL + +#if P_FAMILY_BOUNSWEET +static const struct SpriteFrameImage sPicTable_Bounsweet[] = { + overworld_ascending_frames(gObjectEventPic_Bounsweet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Steenee[] = { + overworld_ascending_frames(gObjectEventPic_Steenee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tsareena[] = { + overworld_ascending_frames(gObjectEventPic_Tsareena, 4, 4), +}; +#endif //P_FAMILY_BOUNSWEET + +#if P_FAMILY_COMFEY +static const struct SpriteFrameImage sPicTable_Comfey[] = { + overworld_ascending_frames(gObjectEventPic_Comfey, 4, 4), +}; +#endif //P_FAMILY_COMFEY + +#if P_FAMILY_ORANGURU +static const struct SpriteFrameImage sPicTable_Oranguru[] = { + overworld_ascending_frames(gObjectEventPic_Oranguru, 4, 4), +}; +#endif //P_FAMILY_ORANGURU + +#if P_FAMILY_PASSIMIAN +static const struct SpriteFrameImage sPicTable_Passimian[] = { + overworld_ascending_frames(gObjectEventPic_Passimian, 4, 4), +}; +#endif //P_FAMILY_PASSIMIAN + +#if P_FAMILY_WIMPOD +static const struct SpriteFrameImage sPicTable_Wimpod[] = { + overworld_ascending_frames(gObjectEventPic_Wimpod, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Golisopod[] = { + overworld_ascending_frames(gObjectEventPic_Golisopod, 4, 4), +}; +#endif //P_FAMILY_WIMPOD + +#if P_FAMILY_SANDYGAST +static const struct SpriteFrameImage sPicTable_Sandygast[] = { + overworld_ascending_frames(gObjectEventPic_Sandygast, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Palossand[] = { + overworld_ascending_frames(gObjectEventPic_Palossand, 4, 4), +}; +#endif //P_FAMILY_SANDYGAST + +#if P_FAMILY_PYUKUMUKU +static const struct SpriteFrameImage sPicTable_Pyukumuku[] = { + overworld_ascending_frames(gObjectEventPic_Pyukumuku, 4, 4), +}; +#endif //P_FAMILY_PYUKUMUKU + +#if P_FAMILY_TYPE_NULL +static const struct SpriteFrameImage sPicTable_TypeNull[] = { + overworld_ascending_frames(gObjectEventPic_TypeNull, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Silvally[] = { + overworld_ascending_frames(gObjectEventPic_Silvally, 4, 4), +}; +#endif //P_FAMILY_TYPE_NULL + +#if P_FAMILY_MINIOR +static const struct SpriteFrameImage sPicTable_MiniorMeteor[] = { + overworld_ascending_frames(gObjectEventPic_MiniorMeteor, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_MiniorCoreRed[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreRed, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreOrange[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreOrange, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreYellow[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreYellow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreGreen[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreGreen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreBlue[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreBlue, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreIndigo[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreIndigo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MiniorCoreViolet[] = { + overworld_ascending_frames(gObjectEventPic_MiniorCoreViolet, 4, 4), +};*/ +#endif //P_FAMILY_MINIOR + +#if P_FAMILY_KOMALA +static const struct SpriteFrameImage sPicTable_Komala[] = { + overworld_ascending_frames(gObjectEventPic_Komala, 4, 4), +}; +#endif //P_FAMILY_KOMALA + +#if P_FAMILY_TURTONATOR +static const struct SpriteFrameImage sPicTable_Turtonator[] = { + overworld_ascending_frames(gObjectEventPic_Turtonator, 4, 4), +}; +#endif //P_FAMILY_TURTONATOR + +#if P_FAMILY_TOGEDEMARU +static const struct SpriteFrameImage sPicTable_Togedemaru[] = { + overworld_ascending_frames(gObjectEventPic_Togedemaru, 4, 4), +}; +#endif //P_FAMILY_TOGEDEMARU + +#if P_FAMILY_MIMIKYU +static const struct SpriteFrameImage sPicTable_MimikyuDisguised[] = { + overworld_ascending_frames(gObjectEventPic_MimikyuDisguised, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_MimikyuBusted[] = { + overworld_ascending_frames(gObjectEventPic_MimikyuBusted, 4, 4), +};*/ +#endif //P_FAMILY_MIMIKYU + +#if P_FAMILY_BRUXISH +static const struct SpriteFrameImage sPicTable_Bruxish[] = { + overworld_ascending_frames(gObjectEventPic_Bruxish, 4, 4), +}; +#endif //P_FAMILY_BRUXISH + +#if P_FAMILY_DRAMPA +static const struct SpriteFrameImage sPicTable_Drampa[] = { + overworld_ascending_frames(gObjectEventPic_Drampa, 4, 4), +}; +#endif //P_FAMILY_DRAMPA + +#if P_FAMILY_DHELMISE +static const struct SpriteFrameImage sPicTable_Dhelmise[] = { + overworld_ascending_frames(gObjectEventPic_Dhelmise, 4, 4), +}; +#endif //P_FAMILY_DHELMISE + +#if P_FAMILY_JANGMO_O +static const struct SpriteFrameImage sPicTable_JangmoO[] = { + overworld_ascending_frames(gObjectEventPic_JangmoO, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_HakamoO[] = { + overworld_ascending_frames(gObjectEventPic_HakamoO, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_KommoO[] = { + overworld_ascending_frames(gObjectEventPic_KommoO, 4, 4), +}; +#endif //P_FAMILY_JANGMO_O + +#if P_FAMILY_TAPU_KOKO +static const struct SpriteFrameImage sPicTable_TapuKoko[] = { + overworld_ascending_frames(gObjectEventPic_TapuKoko, 4, 4), +}; +#endif //P_FAMILY_TAPU_KOKO + +#if P_FAMILY_TAPU_LELE +static const struct SpriteFrameImage sPicTable_TapuLele[] = { + overworld_ascending_frames(gObjectEventPic_TapuLele, 4, 4), +}; +#endif //P_FAMILY_TAPU_LELE + +#if P_FAMILY_TAPU_BULU +static const struct SpriteFrameImage sPicTable_TapuBulu[] = { + overworld_ascending_frames(gObjectEventPic_TapuBulu, 4, 4), +}; +#endif //P_FAMILY_TAPU_BULU + +#if P_FAMILY_TAPU_FINI +static const struct SpriteFrameImage sPicTable_TapuFini[] = { + overworld_ascending_frames(gObjectEventPic_TapuFini, 4, 4), +}; +#endif //P_FAMILY_TAPU_FINI + +#if P_FAMILY_COSMOG +static const struct SpriteFrameImage sPicTable_Cosmog[] = { + overworld_ascending_frames(gObjectEventPic_Cosmog, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cosmoem[] = { + overworld_ascending_frames(gObjectEventPic_Cosmoem, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Solgaleo[] = { + overworld_ascending_frames(gObjectEventPic_Solgaleo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lunala[] = { + overworld_ascending_frames(gObjectEventPic_Lunala, 4, 4), +}; +#endif //P_FAMILY_COSMOG + +#if P_FAMILY_NIHILEGO +static const struct SpriteFrameImage sPicTable_Nihilego[] = { + overworld_ascending_frames(gObjectEventPic_Nihilego, 4, 4), +}; +#endif //P_FAMILY_NIHILEGO + +#if P_FAMILY_BUZZWOLE +static const struct SpriteFrameImage sPicTable_Buzzwole[] = { + overworld_ascending_frames(gObjectEventPic_Buzzwole, 4, 4), +}; +#endif //P_FAMILY_BUZZWOLE + +#if P_FAMILY_PHEROMOSA +static const struct SpriteFrameImage sPicTable_Pheromosa[] = { + overworld_ascending_frames(gObjectEventPic_Pheromosa, 4, 4), +}; +#endif //P_FAMILY_PHEROMOSA + +#if P_FAMILY_XURKITREE +static const struct SpriteFrameImage sPicTable_Xurkitree[] = { + overworld_ascending_frames(gObjectEventPic_Xurkitree, 4, 4), +}; +#endif //P_FAMILY_XURKITREE + +#if P_FAMILY_CELESTEELA +static const struct SpriteFrameImage sPicTable_Celesteela[] = { + overworld_ascending_frames(gObjectEventPic_Celesteela, 4, 4), +}; +#endif //P_FAMILY_CELESTEELA + +#if P_FAMILY_KARTANA +static const struct SpriteFrameImage sPicTable_Kartana[] = { + overworld_ascending_frames(gObjectEventPic_Kartana, 4, 4), +}; +#endif //P_FAMILY_KARTANA + +#if P_FAMILY_GUZZLORD +static const struct SpriteFrameImage sPicTable_Guzzlord[] = { + overworld_ascending_frames(gObjectEventPic_Guzzlord, 4, 4), +}; +#endif //P_FAMILY_GUZZLORD + +#if P_FAMILY_NECROZMA +static const struct SpriteFrameImage sPicTable_Necrozma[] = { + overworld_ascending_frames(gObjectEventPic_Necrozma, 4, 4), +}; +#if P_FUSION_FORMS + +static const struct SpriteFrameImage sPicTable_NecrozmaDuskMane[] = { + overworld_ascending_frames(gObjectEventPic_NecrozmaDuskMane, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_NecrozmaDawnWings[] = { + overworld_ascending_frames(gObjectEventPic_NecrozmaDawnWings, 4, 4), +}; +#if P_ULTRA_BURST_FORMS +static const struct SpriteFrameImage sPicTable_NecrozmaUltra[] = { + overworld_ascending_frames(gObjectEventPic_NecrozmaUltra, 4, 4), +}; +#endif //P_ULTRA_BURST_FORMS +#endif //P_FUSION_FORMS +#endif //P_FAMILY_NECROZMA + +#if P_FAMILY_MAGEARNA +static const struct SpriteFrameImage sPicTable_Magearna[] = { + overworld_ascending_frames(gObjectEventPic_Magearna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MagearnaOriginal[] = { + overworld_ascending_frames(gObjectEventPic_MagearnaOriginal, 4, 4), +}; +#endif //P_FAMILY_MAGEARNA + +#if P_FAMILY_MARSHADOW +static const struct SpriteFrameImage sPicTable_Marshadow[] = { + overworld_ascending_frames(gObjectEventPic_Marshadow, 4, 4), +}; +#endif //P_FAMILY_MARSHADOW + +#if P_FAMILY_POIPOLE +static const struct SpriteFrameImage sPicTable_Poipole[] = { + overworld_ascending_frames(gObjectEventPic_Poipole, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Naganadel[] = { + overworld_ascending_frames(gObjectEventPic_Naganadel, 4, 4), +}; +#endif //P_FAMILY_POIPOLE + +#if P_FAMILY_STAKATAKA +static const struct SpriteFrameImage sPicTable_Stakataka[] = { + overworld_ascending_frames(gObjectEventPic_Stakataka, 4, 4), +}; +#endif //P_FAMILY_STAKATAKA + +#if P_FAMILY_BLACEPHALON +static const struct SpriteFrameImage sPicTable_Blacephalon[] = { + overworld_ascending_frames(gObjectEventPic_Blacephalon, 4, 4), +}; +#endif //P_FAMILY_BLACEPHALON + +#if P_FAMILY_ZERAORA +static const struct SpriteFrameImage sPicTable_Zeraora[] = { + overworld_ascending_frames(gObjectEventPic_Zeraora, 4, 4), +}; +#endif //P_FAMILY_ZERAORA + +#if P_FAMILY_MELTAN +static const struct SpriteFrameImage sPicTable_Meltan[] = { + overworld_ascending_frames(gObjectEventPic_Meltan, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Melmetal[] = { + overworld_ascending_frames(gObjectEventPic_Melmetal, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_MelmetalGmax[] = { + overworld_ascending_frames(gObjectEventPic_MelmetalGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_MELTAN + +#if P_FAMILY_GROOKEY +static const struct SpriteFrameImage sPicTable_Grookey[] = { + overworld_ascending_frames(gObjectEventPic_Grookey, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Thwackey[] = { + overworld_ascending_frames(gObjectEventPic_Thwackey, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Rillaboom[] = { + overworld_ascending_frames(gObjectEventPic_Rillaboom, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_RillaboomGmax[] = { + overworld_ascending_frames(gObjectEventPic_RillaboomGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_GROOKEY + +#if P_FAMILY_SCORBUNNY +static const struct SpriteFrameImage sPicTable_Scorbunny[] = { + overworld_ascending_frames(gObjectEventPic_Scorbunny, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Raboot[] = { + overworld_ascending_frames(gObjectEventPic_Raboot, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cinderace[] = { + overworld_ascending_frames(gObjectEventPic_Cinderace, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CinderaceGmax[] = { + overworld_ascending_frames(gObjectEventPic_CinderaceGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SCORBUNNY + +#if P_FAMILY_SOBBLE +static const struct SpriteFrameImage sPicTable_Sobble[] = { + overworld_ascending_frames(gObjectEventPic_Sobble, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Drizzile[] = { + overworld_ascending_frames(gObjectEventPic_Drizzile, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Inteleon[] = { + overworld_ascending_frames(gObjectEventPic_Inteleon, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_InteleonGmax[] = { + overworld_ascending_frames(gObjectEventPic_InteleonGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SOBBLE + +#if P_FAMILY_SKWOVET +static const struct SpriteFrameImage sPicTable_Skwovet[] = { + overworld_ascending_frames(gObjectEventPic_Skwovet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Greedent[] = { + overworld_ascending_frames(gObjectEventPic_Greedent, 4, 4), +}; +#endif //P_FAMILY_SKWOVET + +#if P_FAMILY_ROOKIDEE +static const struct SpriteFrameImage sPicTable_Rookidee[] = { + overworld_ascending_frames(gObjectEventPic_Rookidee, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Corvisquire[] = { + overworld_ascending_frames(gObjectEventPic_Corvisquire, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Corviknight[] = { + overworld_ascending_frames(gObjectEventPic_Corviknight, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CorviknightGmax[] = { + overworld_ascending_frames(gObjectEventPic_CorviknightGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_ROOKIDEE + +#if P_FAMILY_BLIPBUG +static const struct SpriteFrameImage sPicTable_Blipbug[] = { + overworld_ascending_frames(gObjectEventPic_Blipbug, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dottler[] = { + overworld_ascending_frames(gObjectEventPic_Dottler, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Orbeetle[] = { + overworld_ascending_frames(gObjectEventPic_Orbeetle, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_OrbeetleGmax[] = { + overworld_ascending_frames(gObjectEventPic_OrbeetleGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_BLIPBUG + +#if P_FAMILY_NICKIT +static const struct SpriteFrameImage sPicTable_Nickit[] = { + overworld_ascending_frames(gObjectEventPic_Nickit, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Thievul[] = { + overworld_ascending_frames(gObjectEventPic_Thievul, 4, 4), +}; +#endif //P_FAMILY_NICKIT + +#if P_FAMILY_GOSSIFLEUR +static const struct SpriteFrameImage sPicTable_Gossifleur[] = { + overworld_ascending_frames(gObjectEventPic_Gossifleur, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Eldegoss[] = { + overworld_ascending_frames(gObjectEventPic_Eldegoss, 4, 4), +}; +#endif //P_FAMILY_GOSSIFLEUR + +#if P_FAMILY_WOOLOO +static const struct SpriteFrameImage sPicTable_Wooloo[] = { + overworld_ascending_frames(gObjectEventPic_Wooloo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dubwool[] = { + overworld_ascending_frames(gObjectEventPic_Dubwool, 4, 4), +}; +#endif //P_FAMILY_WOOLOO + +#if P_FAMILY_CHEWTLE +static const struct SpriteFrameImage sPicTable_Chewtle[] = { + overworld_ascending_frames(gObjectEventPic_Chewtle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Drednaw[] = { + overworld_ascending_frames(gObjectEventPic_Drednaw, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_DrednawGmax[] = { + overworld_ascending_frames(gObjectEventPic_DrednawGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_CHEWTLE + +#if P_FAMILY_YAMPER +static const struct SpriteFrameImage sPicTable_Yamper[] = { + overworld_ascending_frames(gObjectEventPic_Yamper, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Boltund[] = { + overworld_ascending_frames(gObjectEventPic_Boltund, 4, 4), +}; +#endif //P_FAMILY_YAMPER + +#if P_FAMILY_ROLYCOLY +static const struct SpriteFrameImage sPicTable_Rolycoly[] = { + overworld_ascending_frames(gObjectEventPic_Rolycoly, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Carkol[] = { + overworld_ascending_frames(gObjectEventPic_Carkol, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Coalossal[] = { + overworld_ascending_frames(gObjectEventPic_Coalossal, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CoalossalGmax[] = { + overworld_ascending_frames(gObjectEventPic_CoalossalGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_ROLYCOLY + +#if P_FAMILY_APPLIN +static const struct SpriteFrameImage sPicTable_Applin[] = { + overworld_ascending_frames(gObjectEventPic_Applin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Flapple[] = { + overworld_ascending_frames(gObjectEventPic_Flapple, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_FlappleGmax[] = { + overworld_ascending_frames(gObjectEventPic_FlappleGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS + +static const struct SpriteFrameImage sPicTable_Appletun[] = { + overworld_ascending_frames(gObjectEventPic_Appletun, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_AppletunGmax[] = { + overworld_ascending_frames(gObjectEventPic_AppletunGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS + +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Dipplin[] = { + overworld_ascending_frames(gObjectEventPic_Dipplin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hydrapple[] = { + overworld_ascending_frames(gObjectEventPic_Hydrapple, 8, 8), +}; +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_APPLIN + +#if P_FAMILY_SILICOBRA +static const struct SpriteFrameImage sPicTable_Silicobra[] = { + overworld_ascending_frames(gObjectEventPic_Silicobra, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sandaconda[] = { + overworld_ascending_frames(gObjectEventPic_Sandaconda, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_SandacondaGmax[] = { + overworld_ascending_frames(gObjectEventPic_SandacondaGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SILICOBRA + +#if P_FAMILY_CRAMORANT +static const struct SpriteFrameImage sPicTable_Cramorant[] = { + overworld_ascending_frames(gObjectEventPic_Cramorant, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_CramorantGulping[] = { + overworld_ascending_frames(gObjectEventPic_CramorantGulping, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_CramorantGorging[] = { + overworld_ascending_frames(gObjectEventPic_CramorantGorging, 4, 4), +};*/ +#endif //P_FAMILY_CRAMORANT + +#if P_FAMILY_ARROKUDA +static const struct SpriteFrameImage sPicTable_Arrokuda[] = { + overworld_ascending_frames(gObjectEventPic_Arrokuda, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Barraskewda[] = { + overworld_ascending_frames(gObjectEventPic_Barraskewda, 4, 4), +}; +#endif //P_FAMILY_ARROKUDA + +#if P_FAMILY_TOXEL +static const struct SpriteFrameImage sPicTable_Toxel[] = { + overworld_ascending_frames(gObjectEventPic_Toxel, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ToxtricityAmped[] = { + overworld_ascending_frames(gObjectEventPic_ToxtricityAmped, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ToxtricityLowKey[] = { + overworld_ascending_frames(gObjectEventPic_ToxtricityLowKey, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_ToxtricityGmax[] = { + overworld_ascending_frames(gObjectEventPic_ToxtricityGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_TOXEL + +#if P_FAMILY_SIZZLIPEDE +static const struct SpriteFrameImage sPicTable_Sizzlipede[] = { + overworld_ascending_frames(gObjectEventPic_Sizzlipede, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Centiskorch[] = { + overworld_ascending_frames(gObjectEventPic_Centiskorch, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CentiskorchGmax[] = { + overworld_ascending_frames(gObjectEventPic_CentiskorchGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_SIZZLIPEDE + +#if P_FAMILY_CLOBBOPUS +static const struct SpriteFrameImage sPicTable_Clobbopus[] = { + overworld_ascending_frames(gObjectEventPic_Clobbopus, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grapploct[] = { + overworld_ascending_frames(gObjectEventPic_Grapploct, 4, 4), +}; +#endif //P_FAMILY_CLOBBOPUS + +#if P_FAMILY_SINISTEA +static const struct SpriteFrameImage sPicTable_Sinistea[] = { + overworld_ascending_frames(gObjectEventPic_Sinistea, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Polteageist[] = { + overworld_ascending_frames(gObjectEventPic_Polteageist, 4, 4), +}; +#endif //P_FAMILY_SINISTEA + +#if P_FAMILY_HATENNA +static const struct SpriteFrameImage sPicTable_Hatenna[] = { + overworld_ascending_frames(gObjectEventPic_Hatenna, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hattrem[] = { + overworld_ascending_frames(gObjectEventPic_Hattrem, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Hatterene[] = { + overworld_ascending_frames(gObjectEventPic_Hatterene, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_HattereneGmax[] = { + overworld_ascending_frames(gObjectEventPic_HattereneGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_HATENNA + +#if P_FAMILY_IMPIDIMP +static const struct SpriteFrameImage sPicTable_Impidimp[] = { + overworld_ascending_frames(gObjectEventPic_Impidimp, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Morgrem[] = { + overworld_ascending_frames(gObjectEventPic_Morgrem, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grimmsnarl[] = { + overworld_ascending_frames(gObjectEventPic_Grimmsnarl, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_GrimmsnarlGmax[] = { + overworld_ascending_frames(gObjectEventPic_GrimmsnarlGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_IMPIDIMP + +#if P_FAMILY_MILCERY +static const struct SpriteFrameImage sPicTable_Milcery[] = { + overworld_ascending_frames(gObjectEventPic_Milcery, 4, 4), +}; + +static const struct SpriteFrameImage sPicTable_AlcremieStrawberry[] = { + overworld_ascending_frames(gObjectEventPic_AlcremieStrawberry, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_AlcremieGmax[] = { + overworld_ascending_frames(gObjectEventPic_AlcremieGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_MILCERY + +#if P_FAMILY_FALINKS +static const struct SpriteFrameImage sPicTable_Falinks[] = { + overworld_ascending_frames(gObjectEventPic_Falinks, 4, 4), +}; +#endif //P_FAMILY_FALINKS + +#if P_FAMILY_PINCURCHIN +static const struct SpriteFrameImage sPicTable_Pincurchin[] = { + overworld_ascending_frames(gObjectEventPic_Pincurchin, 4, 4), +}; +#endif //P_FAMILY_PINCURCHIN + +#if P_FAMILY_SNOM +static const struct SpriteFrameImage sPicTable_Snom[] = { + overworld_ascending_frames(gObjectEventPic_Snom, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Frosmoth[] = { + overworld_ascending_frames(gObjectEventPic_Frosmoth, 4, 4), +}; +#endif //P_FAMILY_SNOM + +#if P_FAMILY_STONJOURNER +static const struct SpriteFrameImage sPicTable_Stonjourner[] = { + overworld_ascending_frames(gObjectEventPic_Stonjourner, 4, 4), +}; +#endif //P_FAMILY_STONJOURNER + +#if P_FAMILY_EISCUE +static const struct SpriteFrameImage sPicTable_EiscueIce[] = { + overworld_ascending_frames(gObjectEventPic_EiscueIce, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_EiscueNoice[] = { + overworld_ascending_frames(gObjectEventPic_EiscueNoice, 4, 4), +};*/ +#endif //P_FAMILY_EISCUE + +#if P_FAMILY_INDEEDEE +static const struct SpriteFrameImage sPicTable_IndeedeeM[] = { + overworld_ascending_frames(gObjectEventPic_IndeedeeM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_IndeedeeF[] = { + overworld_ascending_frames(gObjectEventPic_IndeedeeF, 4, 4), +}; +#endif //P_FAMILY_INDEEDEE + +#if P_FAMILY_MORPEKO +static const struct SpriteFrameImage sPicTable_MorpekoFullBelly[] = { + overworld_ascending_frames(gObjectEventPic_MorpekoFullBelly, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_MorpekoHangry[] = { + overworld_ascending_frames(gObjectEventPic_MorpekoHangry, 4, 4), +};*/ +#endif //P_FAMILY_MORPEKO + +#if P_FAMILY_CUFANT +static const struct SpriteFrameImage sPicTable_Cufant[] = { + overworld_ascending_frames(gObjectEventPic_Cufant, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Copperajah[] = { + overworld_ascending_frames(gObjectEventPic_Copperajah, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_CopperajahGmax[] = { + overworld_ascending_frames(gObjectEventPic_CopperajahGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_CUFANT + +#if P_FAMILY_DRACOZOLT +static const struct SpriteFrameImage sPicTable_Dracozolt[] = { + overworld_ascending_frames(gObjectEventPic_Dracozolt, 4, 4), +}; +#endif //P_FAMILY_DRACOZOLT + +#if P_FAMILY_ARCTOZOLT +static const struct SpriteFrameImage sPicTable_Arctozolt[] = { + overworld_ascending_frames(gObjectEventPic_Arctozolt, 4, 4), +}; +#endif //P_FAMILY_ARCTOZOLT + +#if P_FAMILY_DRACOVISH +static const struct SpriteFrameImage sPicTable_Dracovish[] = { + overworld_ascending_frames(gObjectEventPic_Dracovish, 4, 4), +}; +#endif //P_FAMILY_DRACOVISH + +#if P_FAMILY_ARCTOVISH +static const struct SpriteFrameImage sPicTable_Arctovish[] = { + overworld_ascending_frames(gObjectEventPic_Arctovish, 4, 4), +}; +#endif //P_FAMILY_ARCTOVISH + +#if P_FAMILY_DURALUDON +static const struct SpriteFrameImage sPicTable_Duraludon[] = { + overworld_ascending_frames(gObjectEventPic_Duraludon, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_DuraludonGmax[] = { + overworld_ascending_frames(gObjectEventPic_DuraludonGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS + +#if P_GEN_9_CROSS_EVOS +static const struct SpriteFrameImage sPicTable_Archaludon[] = { + overworld_ascending_frames(gObjectEventPic_Archaludon, 4, 4), +}; +#endif //P_GEN_9_CROSS_EVOS +#endif //P_FAMILY_DURALUDON + +#if P_FAMILY_DREEPY +static const struct SpriteFrameImage sPicTable_Dreepy[] = { + overworld_ascending_frames(gObjectEventPic_Dreepy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Drakloak[] = { + overworld_ascending_frames(gObjectEventPic_Drakloak, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dragapult[] = { + overworld_ascending_frames(gObjectEventPic_Dragapult, 4, 4), +}; +#endif //P_FAMILY_DREEPY + +#if P_FAMILY_ZACIAN +static const struct SpriteFrameImage sPicTable_ZacianHero[] = { + overworld_ascending_frames(gObjectEventPic_ZacianHero, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZacianCrowned[] = { + overworld_ascending_frames(gObjectEventPic_ZacianCrowned, 4, 4), +}; +#endif //P_FAMILY_ZACIAN + +#if P_FAMILY_ZAMAZENTA +static const struct SpriteFrameImage sPicTable_ZamazentaHero[] = { + overworld_ascending_frames(gObjectEventPic_ZamazentaHero, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZamazentaCrowned[] = { + overworld_ascending_frames(gObjectEventPic_ZamazentaCrowned, 4, 4), +}; +#endif //P_FAMILY_ZAMAZENTA + +#if P_FAMILY_ETERNATUS +static const struct SpriteFrameImage sPicTable_Eternatus[] = { + overworld_ascending_frames(gObjectEventPic_Eternatus, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_EternatusEternamax[] = { + overworld_ascending_frames(gObjectEventPic_EternatusEternamax, 4, 4), +};*/ +#endif //P_FAMILY_ETERNATUS + +#if P_FAMILY_KUBFU +static const struct SpriteFrameImage sPicTable_Kubfu[] = { + overworld_ascending_frames(gObjectEventPic_Kubfu, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Urshifu[] = { + overworld_ascending_frames(gObjectEventPic_Urshifu, 4, 4), +}; +#if P_GIGANTAMAX_FORMS +/*static const struct SpriteFrameImage sPicTable_UrshifuSingleStrikeGmax[] = { + overworld_ascending_frames(gObjectEventPic_UrshifuSingleStrikeGmax, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_UrshifuRapidStrikeGmax[] = { + overworld_ascending_frames(gObjectEventPic_UrshifuRapidStrikeGmax, 4, 4), +};*/ +#endif //P_GIGANTAMAX_FORMS +#endif //P_FAMILY_KUBFU + +#if P_FAMILY_ZARUDE + +static const struct SpriteFrameImage sPicTable_Zarude[] = { + overworld_ascending_frames(gObjectEventPic_Zarude, 4, 4), +}; +/*static const struct SpriteFrameImage sPicTable_ZarudeDada[] = { + overworld_ascending_frames(gObjectEventPic_ZarudeDada, 4, 4), +};*/ +#endif //P_FAMILY_ZARUDE + +#if P_FAMILY_REGIELEKI +static const struct SpriteFrameImage sPicTable_Regieleki[] = { + overworld_ascending_frames(gObjectEventPic_Regieleki, 4, 4), +}; +#endif //P_FAMILY_REGIELEKI + +#if P_FAMILY_REGIDRAGO +static const struct SpriteFrameImage sPicTable_Regidrago[] = { + overworld_ascending_frames(gObjectEventPic_Regidrago, 4, 4), +}; +#endif //P_FAMILY_REGIDRAGO + +#if P_FAMILY_GLASTRIER +static const struct SpriteFrameImage sPicTable_Glastrier[] = { + overworld_ascending_frames(gObjectEventPic_Glastrier, 4, 4), +}; +#endif //P_FAMILY_GLASTRIER + +#if P_FAMILY_SPECTRIER +static const struct SpriteFrameImage sPicTable_Spectrier[] = { + overworld_ascending_frames(gObjectEventPic_Spectrier, 4, 4), +}; +#endif //P_FAMILY_SPECTRIER + +#if P_FAMILY_CALYREX +static const struct SpriteFrameImage sPicTable_Calyrex[] = { + overworld_ascending_frames(gObjectEventPic_Calyrex, 4, 4), +}; +#if P_FUSION_FORMS +static const struct SpriteFrameImage sPicTable_CalyrexIce[] = { + overworld_ascending_frames(gObjectEventPic_CalyrexIce, 4, 4), +}; +#endif //P_FUSION_FORMS + +#if P_FUSION_FORMS +static const struct SpriteFrameImage sPicTable_CalyrexShadow[] = { + overworld_ascending_frames(gObjectEventPic_CalyrexShadow, 4, 4), +}; +#endif //P_FUSION_FORMS +#endif //P_FAMILY_CALYREX + +#if P_FAMILY_SPRIGATITO +static const struct SpriteFrameImage sPicTable_Sprigatito[] = { + overworld_ascending_frames(gObjectEventPic_Sprigatito, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Floragato[] = { + overworld_ascending_frames(gObjectEventPic_Floragato, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Meowscarada[] = { + overworld_ascending_frames(gObjectEventPic_Meowscarada, 4, 4), +}; +#endif //P_FAMILY_SPRIGATITO + +#if P_FAMILY_FUECOCO +static const struct SpriteFrameImage sPicTable_Fuecoco[] = { + overworld_ascending_frames(gObjectEventPic_Fuecoco, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Crocalor[] = { + overworld_ascending_frames(gObjectEventPic_Crocalor, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Skeledirge[] = { + overworld_ascending_frames(gObjectEventPic_Skeledirge, 4, 4), +}; +#endif //P_FAMILY_FUECOCO + +#if P_FAMILY_QUAXLY +static const struct SpriteFrameImage sPicTable_Quaxly[] = { + overworld_ascending_frames(gObjectEventPic_Quaxly, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Quaxwell[] = { + overworld_ascending_frames(gObjectEventPic_Quaxwell, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Quaquaval[] = { + overworld_ascending_frames(gObjectEventPic_Quaquaval, 4, 4), +}; +#endif //P_FAMILY_QUAXLY + +#if P_FAMILY_LECHONK +static const struct SpriteFrameImage sPicTable_Lechonk[] = { + overworld_ascending_frames(gObjectEventPic_Lechonk, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OinkologneM[] = { + overworld_ascending_frames(gObjectEventPic_OinkologneM, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OinkologneF[] = { + overworld_ascending_frames(gObjectEventPic_OinkologneF, 4, 4), +}; +#endif //P_FAMILY_LECHONK + +#if P_FAMILY_TAROUNTULA +static const struct SpriteFrameImage sPicTable_Tarountula[] = { + overworld_ascending_frames(gObjectEventPic_Tarountula, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Spidops[] = { + overworld_ascending_frames(gObjectEventPic_Spidops, 4, 4), +}; +#endif //P_FAMILY_TAROUNTULA + +#if P_FAMILY_NYMBLE +static const struct SpriteFrameImage sPicTable_Nymble[] = { + overworld_ascending_frames(gObjectEventPic_Nymble, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Lokix[] = { + overworld_ascending_frames(gObjectEventPic_Lokix, 4, 4), +}; +#endif //P_FAMILY_NYMBLE + +#if P_FAMILY_PAWMI +static const struct SpriteFrameImage sPicTable_Pawmi[] = { + overworld_ascending_frames(gObjectEventPic_Pawmi, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pawmo[] = { + overworld_ascending_frames(gObjectEventPic_Pawmo, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Pawmot[] = { + overworld_ascending_frames(gObjectEventPic_Pawmot, 4, 4), +}; +#endif //P_FAMILY_PAWMI + +#if P_FAMILY_TANDEMAUS +static const struct SpriteFrameImage sPicTable_Tandemaus[] = { + overworld_ascending_frames(gObjectEventPic_Tandemaus, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MausholdThree[] = { + overworld_ascending_frames(gObjectEventPic_MausholdThree, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_MausholdFour[] = { + overworld_ascending_frames(gObjectEventPic_MausholdFour, 4, 4), +}; +#endif //P_FAMILY_TANDEMAUS + +#if P_FAMILY_FIDOUGH +static const struct SpriteFrameImage sPicTable_Fidough[] = { + overworld_ascending_frames(gObjectEventPic_Fidough, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dachsbun[] = { + overworld_ascending_frames(gObjectEventPic_Dachsbun, 4, 4), +}; +#endif //P_FAMILY_FIDOUGH + +#if P_FAMILY_SMOLIV +static const struct SpriteFrameImage sPicTable_Smoliv[] = { + overworld_ascending_frames(gObjectEventPic_Smoliv, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Dolliv[] = { + overworld_ascending_frames(gObjectEventPic_Dolliv, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Arboliva[] = { + overworld_ascending_frames(gObjectEventPic_Arboliva, 4, 4), +}; +#endif //P_FAMILY_SMOLIV + +#if P_FAMILY_SQUAWKABILLY +static const struct SpriteFrameImage sPicTable_SquawkabillyGreen[] = { + overworld_ascending_frames(gObjectEventPic_SquawkabillyGreen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SquawkabillyBlue[] = { + overworld_ascending_frames(gObjectEventPic_SquawkabillyBlue, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SquawkabillyYellow[] = { + overworld_ascending_frames(gObjectEventPic_SquawkabillyYellow, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_SquawkabillyWhite[] = { + overworld_ascending_frames(gObjectEventPic_SquawkabillyWhite, 4, 4), +}; +#endif //P_FAMILY_SQUAWKABILLY + +#if P_FAMILY_NACLI +static const struct SpriteFrameImage sPicTable_Nacli[] = { + overworld_ascending_frames(gObjectEventPic_Nacli, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Naclstack[] = { + overworld_ascending_frames(gObjectEventPic_Naclstack, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Garganacl[] = { + overworld_ascending_frames(gObjectEventPic_Garganacl, 4, 4), +}; +#endif //P_FAMILY_NACLI + +#if P_FAMILY_CHARCADET +static const struct SpriteFrameImage sPicTable_Charcadet[] = { + overworld_ascending_frames(gObjectEventPic_Charcadet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Armarouge[] = { + overworld_ascending_frames(gObjectEventPic_Armarouge, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Ceruledge[] = { + overworld_ascending_frames(gObjectEventPic_Ceruledge, 4, 4), +}; +#endif //P_FAMILY_CHARCADET + +#if P_FAMILY_TADBULB +static const struct SpriteFrameImage sPicTable_Tadbulb[] = { + overworld_ascending_frames(gObjectEventPic_Tadbulb, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Bellibolt[] = { + overworld_ascending_frames(gObjectEventPic_Bellibolt, 4, 4), +}; +#endif //P_FAMILY_TADBULB + +#if P_FAMILY_WATTREL +static const struct SpriteFrameImage sPicTable_Wattrel[] = { + overworld_ascending_frames(gObjectEventPic_Wattrel, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Kilowattrel[] = { + overworld_ascending_frames(gObjectEventPic_Kilowattrel, 4, 4), +}; +#endif //P_FAMILY_WATTREL + +#if P_FAMILY_MASCHIFF +static const struct SpriteFrameImage sPicTable_Maschiff[] = { + overworld_ascending_frames(gObjectEventPic_Maschiff, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Mabosstiff[] = { + overworld_ascending_frames(gObjectEventPic_Mabosstiff, 4, 4), +}; +#endif //P_FAMILY_MASCHIFF + +#if P_FAMILY_SHROODLE +static const struct SpriteFrameImage sPicTable_Shroodle[] = { + overworld_ascending_frames(gObjectEventPic_Shroodle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Grafaiai[] = { + overworld_ascending_frames(gObjectEventPic_Grafaiai, 4, 4), +}; +#endif //P_FAMILY_SHROODLE + +#if P_FAMILY_BRAMBLIN +static const struct SpriteFrameImage sPicTable_Bramblin[] = { + overworld_ascending_frames(gObjectEventPic_Bramblin, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Brambleghast[] = { + overworld_ascending_frames(gObjectEventPic_Brambleghast, 4, 4), +}; +#endif //P_FAMILY_BRAMBLIN + +#if P_FAMILY_TOEDSCOOL +static const struct SpriteFrameImage sPicTable_Toedscool[] = { + overworld_ascending_frames(gObjectEventPic_Toedscool, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Toedscruel[] = { + overworld_ascending_frames(gObjectEventPic_Toedscruel, 4, 4), +}; +#endif //P_FAMILY_TOEDSCOOL + +#if P_FAMILY_KLAWF +static const struct SpriteFrameImage sPicTable_Klawf[] = { + overworld_ascending_frames(gObjectEventPic_Klawf, 4, 4), +}; +#endif //P_FAMILY_KLAWF + +#if P_FAMILY_CAPSAKID +static const struct SpriteFrameImage sPicTable_Capsakid[] = { + overworld_ascending_frames(gObjectEventPic_Capsakid, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Scovillain[] = { + overworld_ascending_frames(gObjectEventPic_Scovillain, 4, 4), +}; +#endif //P_FAMILY_CAPSAKID + +#if P_FAMILY_RELLOR +static const struct SpriteFrameImage sPicTable_Rellor[] = { + overworld_ascending_frames(gObjectEventPic_Rellor, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Rabsca[] = { + overworld_ascending_frames(gObjectEventPic_Rabsca, 4, 4), +}; +#endif //P_FAMILY_RELLOR + +#if P_FAMILY_FLITTLE +static const struct SpriteFrameImage sPicTable_Flittle[] = { + overworld_ascending_frames(gObjectEventPic_Flittle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Espathra[] = { + overworld_ascending_frames(gObjectEventPic_Espathra, 4, 4), +}; +#endif //P_FAMILY_FLITTLE + +#if P_FAMILY_TINKATINK +static const struct SpriteFrameImage sPicTable_Tinkatink[] = { + overworld_ascending_frames(gObjectEventPic_Tinkatink, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tinkatuff[] = { + overworld_ascending_frames(gObjectEventPic_Tinkatuff, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Tinkaton[] = { + overworld_ascending_frames(gObjectEventPic_Tinkaton, 4, 4), +}; +#endif //P_FAMILY_TINKATINK + +#if P_FAMILY_WIGLETT +static const struct SpriteFrameImage sPicTable_Wiglett[] = { + overworld_ascending_frames(gObjectEventPic_Wiglett, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Wugtrio[] = { + overworld_ascending_frames(gObjectEventPic_Wugtrio, 4, 4), +}; +#endif //P_FAMILY_WIGLETT + +#if P_FAMILY_BOMBIRDIER +static const struct SpriteFrameImage sPicTable_Bombirdier[] = { + overworld_ascending_frames(gObjectEventPic_Bombirdier, 4, 4), +}; +#endif //P_FAMILY_BOMBIRDIER + +#if P_FAMILY_FINIZEN +static const struct SpriteFrameImage sPicTable_Finizen[] = { + overworld_ascending_frames(gObjectEventPic_Finizen, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PalafinZero[] = { + overworld_ascending_frames(gObjectEventPic_PalafinZero, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_PalafinHero[] = { + overworld_ascending_frames(gObjectEventPic_PalafinHero, 4, 4), +}; +#endif //P_FAMILY_FINIZEN + +#if P_FAMILY_VAROOM +static const struct SpriteFrameImage sPicTable_Varoom[] = { + overworld_ascending_frames(gObjectEventPic_Varoom, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Revavroom[] = { + overworld_ascending_frames(gObjectEventPic_Revavroom, 4, 4), +}; +#endif //P_FAMILY_VAROOM + +#if P_FAMILY_CYCLIZAR +static const struct SpriteFrameImage sPicTable_Cyclizar[] = { + overworld_ascending_frames(gObjectEventPic_Cyclizar, 4, 4), +}; +#endif //P_FAMILY_CYCLIZAR + +#if P_FAMILY_ORTHWORM +static const struct SpriteFrameImage sPicTable_Orthworm[] = { + overworld_ascending_frames(gObjectEventPic_Orthworm, 4, 4), +}; +#endif //P_FAMILY_ORTHWORM + +#if P_FAMILY_GLIMMET +static const struct SpriteFrameImage sPicTable_Glimmet[] = { + overworld_ascending_frames(gObjectEventPic_Glimmet, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Glimmora[] = { + overworld_ascending_frames(gObjectEventPic_Glimmora, 4, 4), +}; +#endif //P_FAMILY_GLIMMET + +#if P_FAMILY_GREAVARD +static const struct SpriteFrameImage sPicTable_Greavard[] = { + overworld_ascending_frames(gObjectEventPic_Greavard, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Houndstone[] = { + overworld_ascending_frames(gObjectEventPic_Houndstone, 4, 4), +}; +#endif //P_FAMILY_GREAVARD + +#if P_FAMILY_FLAMIGO +static const struct SpriteFrameImage sPicTable_Flamigo[] = { + overworld_ascending_frames(gObjectEventPic_Flamigo, 4, 4), +}; +#endif //P_FAMILY_FLAMIGO + +#if P_FAMILY_CETODDLE +static const struct SpriteFrameImage sPicTable_Cetoddle[] = { + overworld_ascending_frames(gObjectEventPic_Cetoddle, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Cetitan[] = { + overworld_ascending_frames(gObjectEventPic_Cetitan, 4, 4), +}; +#endif //P_FAMILY_CETODDLE + +#if P_FAMILY_VELUZA +static const struct SpriteFrameImage sPicTable_Veluza[] = { + overworld_ascending_frames(gObjectEventPic_Veluza, 4, 4), +}; +#endif //P_FAMILY_VELUZA + +#if P_FAMILY_DONDOZO +static const struct SpriteFrameImage sPicTable_Dondozo[] = { + overworld_ascending_frames(gObjectEventPic_Dondozo, 8, 8), +}; +#endif //P_FAMILY_DONDOZO + +#if P_FAMILY_TATSUGIRI +static const struct SpriteFrameImage sPicTable_TatsugiriCurly[] = { + overworld_ascending_frames(gObjectEventPic_TatsugiriCurly, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TatsugiriDroopy[] = { + overworld_ascending_frames(gObjectEventPic_TatsugiriDroopy, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TatsugiriStretchy[] = { + overworld_ascending_frames(gObjectEventPic_TatsugiriStretchy, 4, 4), +}; +#endif //P_FAMILY_DONDOZO + +#if P_FAMILY_GREAT_TUSK +static const struct SpriteFrameImage sPicTable_GreatTusk[] = { + overworld_ascending_frames(gObjectEventPic_GreatTusk, 4, 4), +}; +#endif //P_FAMILY_GREAT_TUSK + +#if P_FAMILY_SCREAM_TAIL +static const struct SpriteFrameImage sPicTable_ScreamTail[] = { + overworld_ascending_frames(gObjectEventPic_ScreamTail, 4, 4), +}; +#endif //P_FAMILY_SCREAM_TAIL + +#if P_FAMILY_BRUTE_BONNET +static const struct SpriteFrameImage sPicTable_BruteBonnet[] = { + overworld_ascending_frames(gObjectEventPic_BruteBonnet, 4, 4), +}; +#endif //P_FAMILY_BRUTE_BONNET + +#if P_FAMILY_FLUTTER_MANE +static const struct SpriteFrameImage sPicTable_FlutterMane[] = { + overworld_ascending_frames(gObjectEventPic_FlutterMane, 4, 4), +}; +#endif //P_FAMILY_FLUTTER_MANE + +#if P_FAMILY_SLITHER_WING +static const struct SpriteFrameImage sPicTable_SlitherWing[] = { + overworld_ascending_frames(gObjectEventPic_SlitherWing, 4, 4), +}; +#endif //P_FAMILY_SLITHER_WING + +#if P_FAMILY_SANDY_SHOCKS +static const struct SpriteFrameImage sPicTable_SandyShocks[] = { + overworld_ascending_frames(gObjectEventPic_SandyShocks, 4, 4), +}; +#endif //P_FAMILY_SANDY_SHOCKS + +#if P_FAMILY_IRON_TREADS +static const struct SpriteFrameImage sPicTable_IronTreads[] = { + overworld_ascending_frames(gObjectEventPic_IronTreads, 4, 4), +}; +#endif //P_FAMILY_IRON_TREADS + +#if P_FAMILY_IRON_BUNDLE +static const struct SpriteFrameImage sPicTable_IronBundle[] = { + overworld_ascending_frames(gObjectEventPic_IronBundle, 4, 4), +}; +#endif //P_FAMILY_IRON_BUNDLE + +#if P_FAMILY_IRON_HANDS +static const struct SpriteFrameImage sPicTable_IronHands[] = { + overworld_ascending_frames(gObjectEventPic_IronHands, 4, 4), +}; +#endif //P_FAMILY_IRON_HANDS + +#if P_FAMILY_IRON_JUGULIS +static const struct SpriteFrameImage sPicTable_IronJugulis[] = { + overworld_ascending_frames(gObjectEventPic_IronJugulis, 4, 4), +}; +#endif //P_FAMILY_IRON_JUGULIS + +#if P_FAMILY_IRON_MOTH +static const struct SpriteFrameImage sPicTable_IronMoth[] = { + overworld_ascending_frames(gObjectEventPic_IronMoth, 4, 4), +}; +#endif //P_FAMILY_IRON_MOTH + +#if P_FAMILY_IRON_THORNS +static const struct SpriteFrameImage sPicTable_IronThorns[] = { + overworld_ascending_frames(gObjectEventPic_IronThorns, 4, 4), +}; +#endif //P_FAMILY_IRON_THORNS + +#if P_FAMILY_FRIGIBAX +static const struct SpriteFrameImage sPicTable_Frigibax[] = { + overworld_ascending_frames(gObjectEventPic_Frigibax, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Arctibax[] = { + overworld_ascending_frames(gObjectEventPic_Arctibax, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Baxcalibur[] = { + overworld_ascending_frames(gObjectEventPic_Baxcalibur, 4, 4), +}; +#endif //P_FAMILY_FRIGIBAX + +#if P_FAMILY_GIMMIGHOUL +static const struct SpriteFrameImage sPicTable_GimmighoulChest[] = { + overworld_ascending_frames(gObjectEventPic_GimmighoulChest, 4, 4), +}; +//static const struct SpriteFrameImage sPicTable_GimmighoulRoaming[] = { +// overworld_ascending_frames(gObjectEventPic_GimmighoulRoaming, 4, 4), +//}; +static const struct SpriteFrameImage sPicTable_Gholdengo[] = { + overworld_ascending_frames(gObjectEventPic_Gholdengo, 4, 4), +}; +#endif //P_FAMILY_GIMMIGHOUL + +#if P_FAMILY_WO_CHIEN +static const struct SpriteFrameImage sPicTable_WoChien[] = { + overworld_ascending_frames(gObjectEventPic_WoChien, 4, 4), +}; +#endif //P_FAMILY_WO_CHIEN + +#if P_FAMILY_CHIEN_PAO +static const struct SpriteFrameImage sPicTable_ChienPao[] = { + overworld_ascending_frames(gObjectEventPic_ChienPao, 4, 4), +}; +#endif //P_FAMILY_CHIEN_PAO + +#if P_FAMILY_TING_LU +static const struct SpriteFrameImage sPicTable_TingLu[] = { + overworld_ascending_frames(gObjectEventPic_TingLu, 4, 4), +}; +#endif //P_FAMILY_TING_LU + +#if P_FAMILY_CHI_YU +static const struct SpriteFrameImage sPicTable_ChiYu[] = { + overworld_ascending_frames(gObjectEventPic_ChiYu, 4, 4), +}; +#endif //P_FAMILY_CHI_YU + +#if P_FAMILY_ROARING_MOON +static const struct SpriteFrameImage sPicTable_RoaringMoon[] = { + overworld_ascending_frames(gObjectEventPic_RoaringMoon, 4, 4), +}; +#endif //P_FAMILY_ROARING_MOON + +#if P_FAMILY_IRON_VALIANT +static const struct SpriteFrameImage sPicTable_IronValiant[] = { + overworld_ascending_frames(gObjectEventPic_IronValiant, 4, 4), +}; +#endif //P_FAMILY_IRON_VALIANT + +#if P_FAMILY_KORAIDON +static const struct SpriteFrameImage sPicTable_Koraidon[] = { + overworld_ascending_frames(gObjectEventPic_Koraidon, 8, 8), +}; +#endif //P_FAMILY_KORAIDON + +#if P_FAMILY_MIRAIDON +static const struct SpriteFrameImage sPicTable_Miraidon[] = { + overworld_ascending_frames(gObjectEventPic_Miraidon, 8, 8), +}; +#endif //P_FAMILY_MIRAIDON + +#if P_FAMILY_WALKING_WAKE +static const struct SpriteFrameImage sPicTable_WalkingWake[] = { + overworld_ascending_frames(gObjectEventPic_WalkingWake, 4, 4), +}; +#endif //P_FAMILY_WALKING_WAKE + +#if P_FAMILY_IRON_LEAVES +static const struct SpriteFrameImage sPicTable_IronLeaves[] = { + overworld_ascending_frames(gObjectEventPic_IronLeaves, 4, 4), +}; +#endif //P_FAMILY_IRON_LEAVES + +#if P_FAMILY_POLTCHAGEIST +static const struct SpriteFrameImage sPicTable_Poltchageist[] = { + overworld_ascending_frames(gObjectEventPic_Poltchageist, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_Sinistcha[] = { + overworld_ascending_frames(gObjectEventPic_Sinistcha, 4, 4), +}; +#endif //P_FAMILY_POLTCHAGEIST + +#if P_FAMILY_OKIDOGI +static const struct SpriteFrameImage sPicTable_Okidogi[] = { + overworld_ascending_frames(gObjectEventPic_Okidogi, 4, 4), +}; +#endif //P_FAMILY_OKIDOGI + +#if P_FAMILY_MUNKIDORI +static const struct SpriteFrameImage sPicTable_Munkidori[] = { + overworld_ascending_frames(gObjectEventPic_Munkidori, 4, 4), +}; +#endif //P_FAMILY_MUNKIDORI + +#if P_FAMILY_FEZANDIPITI +static const struct SpriteFrameImage sPicTable_Fezandipiti[] = { + overworld_ascending_frames(gObjectEventPic_Fezandipiti, 4, 4), +}; +#endif //P_FAMILY_FEZANDIPITI + +#if P_FAMILY_OGERPON +static const struct SpriteFrameImage sPicTable_OgerponTeal[] = { + overworld_ascending_frames(gObjectEventPic_OgerponTeal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponWellspring[] = { + overworld_ascending_frames(gObjectEventPic_OgerponWellspring, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponHearthflame[] = { + overworld_ascending_frames(gObjectEventPic_OgerponHearthflame, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponCornerstone[] = { + overworld_ascending_frames(gObjectEventPic_OgerponCornerstone, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponTealTera[] = { + overworld_ascending_frames(gObjectEventPic_OgerponTeal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponWellspringTera[] = { + overworld_ascending_frames(gObjectEventPic_OgerponWellspring, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponHearthflameTera[] = { + overworld_ascending_frames(gObjectEventPic_OgerponHearthflame, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_OgerponCornerstoneTera[] = { + overworld_ascending_frames(gObjectEventPic_OgerponCornerstone, 4, 4), +}; +#endif //P_FAMILY_OGERPON + +#if P_FAMILY_GOUGING_FIRE +static const struct SpriteFrameImage sPicTable_GougingFire[] = { + overworld_ascending_frames(gObjectEventPic_GougingFire, 4, 4), +}; +#endif //P_FAMILY_GOUGING_FIRE + +#if P_FAMILY_RAGING_BOLT +static const struct SpriteFrameImage sPicTable_RagingBolt[] = { + overworld_ascending_frames(gObjectEventPic_RagingBolt, 8, 8), +}; +#endif //P_FAMILY_RAGING_BOLT + +#if P_FAMILY_IRON_BOULDER +static const struct SpriteFrameImage sPicTable_IronBoulder[] = { + overworld_ascending_frames(gObjectEventPic_IronBoulder, 4, 4), +}; +#endif //P_FAMILY_IRON_BOULDER + +#if P_FAMILY_IRON_CROWN +static const struct SpriteFrameImage sPicTable_IronCrown[] = { + overworld_ascending_frames(gObjectEventPic_IronCrown, 4, 4), +}; +#endif //P_FAMILY_IRON_CROWN + +#if P_FAMILY_TERAPAGOS +static const struct SpriteFrameImage sPicTable_TerapagosNormal[] = { + overworld_ascending_frames(gObjectEventPic_TerapagosNormal, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_TerapagosTerastal[] = { + overworld_ascending_frames(gObjectEventPic_TerapagosTerastal, 4, 4), +}; +//static const struct SpriteFrameImage sPicTable_TerapagosStellar[] = { +// overworld_ascending_frames(gObjectEventPic_TerapagosStellar, 4, 4), +//}; +#endif //P_FAMILY_TERAPAGOS + +#if P_FAMILY_PECHARUNT +static const struct SpriteFrameImage sPicTable_Pecharunt[] = { + overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4), +}; +#endif //P_FAMILY_PECHARUNT + +#endif //OW_POKEMON_OBJECT_EVENTS diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 9c2fc2450a..5b3d31786e 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -45,7 +45,7 @@ #define OVERWORLD_PAL_FEMALE(...) #endif //OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE -#define OVERWORLD_DATA(objEventPic, _size, shadow, _tracks, _anims) \ +#define OVERWORLD_DATA(picTable, _size, shadow, _tracks, _anims) \ { \ .tileTag = TAG_NONE, \ .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ @@ -61,7 +61,7 @@ .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ .anims = _anims, \ - .images = (const struct SpriteFrameImage[]) { overworld_ascending_frames(objEventPic, SIZE_32x32 ? 4 : 8, SIZE_32x32 ? 4 : 8), }, \ + .images = picTable, \ .affineAnims = gDummySpriteAffineAnimTable, \ } @@ -139,7 +139,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .oam = &gObjectEventBaseOam_32x32, .subspriteTables = sOamTables_32x32, .anims = sAnimTable_Following, - .images = (const struct SpriteFrameImage[]) { overworld_ascending_frames(gObjectEventPic_Substitute, 4, 4), }, + .images = sPicTable_Substitute, .affineAnims = gDummySpriteAffineAnimTable, }, #endif diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 21cc97cc91..05bad13974 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -58,7 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, -1, SHADOW_SIZE_S) FOOTPRINT(Bulbasaur) OVERWORLD( - gObjectEventPic_Bulbasaur, + sPicTable_Bulbasaur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -127,7 +127,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 3, SHADOW_SIZE_L) FOOTPRINT(Ivysaur) OVERWORLD( - gObjectEventPic_Ivysaur, + sPicTable_Ivysaur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -207,7 +207,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Venusaur) OVERWORLD( - gObjectEventPic_Venusaur, + sPicTable_Venusaur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -216,7 +216,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Venusaur ) OVERWORLD_FEMALE( - gObjectEventPic_VenusaurF, + sPicTable_VenusaurF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -280,7 +280,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Venusaur) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_VenusaurMega, + sPicTable_VenusaurMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -412,7 +412,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Charmander) OVERWORLD( - gObjectEventPic_Charmander, + sPicTable_Charmander, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -481,7 +481,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Charmeleon) OVERWORLD( - gObjectEventPic_Charmeleon, + sPicTable_Charmeleon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -553,7 +553,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 13, SHADOW_SIZE_L) FOOTPRINT(Charizard) OVERWORLD( - gObjectEventPic_Charizard, + sPicTable_Charizard, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -618,7 +618,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Charizard) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_CharizardMegaX, + sPicTable_CharizardMegaX, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -685,7 +685,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Charizard) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_CharizardMegaY, + sPicTable_CharizardMegaY, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -817,7 +817,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 2, SHADOW_SIZE_S) FOOTPRINT(Squirtle) OVERWORLD( - gObjectEventPic_Squirtle, + sPicTable_Squirtle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -886,7 +886,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 6, SHADOW_SIZE_M) FOOTPRINT(Wartortle) OVERWORLD( - gObjectEventPic_Wartortle, + sPicTable_Wartortle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -961,7 +961,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Blastoise) OVERWORLD( - gObjectEventPic_Blastoise, + sPicTable_Blastoise, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1027,7 +1027,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Blastoise) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_BlastoiseMega, + sPicTable_BlastoiseMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1163,7 +1163,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 1, SHADOW_SIZE_S) FOOTPRINT(Caterpie) OVERWORLD( - gObjectEventPic_Caterpie, + sPicTable_Caterpie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1230,7 +1230,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 0, SHADOW_SIZE_S) FOOTPRINT(Metapod) OVERWORLD( - gObjectEventPic_Metapod, + sPicTable_Metapod, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1327,7 +1327,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 13, SHADOW_SIZE_S) FOOTPRINT(Butterfree) OVERWORLD( - gObjectEventPic_Butterfree, + sPicTable_Butterfree, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1336,7 +1336,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Butterfree ) OVERWORLD_FEMALE( - gObjectEventPic_ButterfreeF, + sPicTable_ButterfreeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1470,7 +1470,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Weedle) OVERWORLD( - gObjectEventPic_Weedle, + sPicTable_Weedle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1547,7 +1547,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Kakuna) OVERWORLD( - gObjectEventPic_Kakuna, + sPicTable_Kakuna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 15, SHADOW_SIZE_M) FOOTPRINT(Beedrill) OVERWORLD( - gObjectEventPic_Beedrill, + sPicTable_Beedrill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1701,7 +1701,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Beedrill) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_BeedrillMega, + sPicTable_BeedrillMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1779,7 +1779,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, -1, SHADOW_SIZE_S) FOOTPRINT(Pidgey) OVERWORLD( - gObjectEventPic_Pidgey, + sPicTable_Pidgey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1854,7 +1854,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 6, SHADOW_SIZE_M) FOOTPRINT(Pidgeotto) OVERWORLD( - gObjectEventPic_Pidgeotto, + sPicTable_Pidgeotto, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1935,7 +1935,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-7, 14, SHADOW_SIZE_M) FOOTPRINT(Pidgeot) OVERWORLD( - gObjectEventPic_Pidgeot, + sPicTable_Pidgeot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2001,7 +2001,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Pidgeot) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_PidgeotMega, + sPicTable_PidgeotMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2081,7 +2081,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, -3, SHADOW_SIZE_S) FOOTPRINT(Rattata) OVERWORLD( - gObjectEventPic_Rattata, + sPicTable_Rattata, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2090,7 +2090,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Rattata ) OVERWORLD_FEMALE( - gObjectEventPic_RattataF, + sPicTable_RattataF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2172,7 +2172,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 8, SHADOW_SIZE_L) FOOTPRINT(Raticate) OVERWORLD( - gObjectEventPic_Raticate, + sPicTable_Raticate, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2181,7 +2181,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Raticate ) OVERWORLD_FEMALE( - gObjectEventPic_RaticateF, + sPicTable_RaticateF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2244,7 +2244,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 2, SHADOW_SIZE_S) FOOTPRINT(Rattata) OVERWORLD( - gObjectEventPic_RattataAlola, + sPicTable_RattataAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2308,7 +2308,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 3, SHADOW_SIZE_L) FOOTPRINT(Raticate) OVERWORLD( - gObjectEventPic_RaticateAlola, + sPicTable_RaticateAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2369,7 +2369,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 3, SHADOW_SIZE_L) FOOTPRINT(Raticate) OVERWORLD( - gObjectEventPic_RaticateAlola, + sPicTable_RaticateAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2444,7 +2444,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Spearow) OVERWORLD( - gObjectEventPic_Spearow, + sPicTable_Spearow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2520,7 +2520,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 17, SHADOW_SIZE_M) FOOTPRINT(Fearow) OVERWORLD( - gObjectEventPic_Fearow, + sPicTable_Fearow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2592,7 +2592,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Ekans) OVERWORLD( - gObjectEventPic_Ekans, + sPicTable_Ekans, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -2666,7 +2666,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Arbok) OVERWORLD( - gObjectEventPic_Arbok, + sPicTable_Arbok, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -2734,7 +2734,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Pichu) OVERWORLD( - gObjectEventPic_Pichu, + sPicTable_Pichu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2804,7 +2804,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Pichu) OVERWORLD( - gObjectEventPic_PichuSpikyEared, + sPicTable_PichuSpikyEared, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2889,7 +2889,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_GENDER_DIFFERENCES SHADOW(-3, 5, SHADOW_SIZE_M) OVERWORLD( - gObjectEventPic_Pikachu, + sPicTable_Pikachu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2898,7 +2898,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Pikachu ) OVERWORLD_FEMALE( - gObjectEventPic_PikachuF, + sPicTable_PikachuF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3791,7 +3791,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Pikachu) OVERWORLD( - gObjectEventPic_Pikachu, + sPicTable_Pikachu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3878,7 +3878,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 10, SHADOW_SIZE_M) FOOTPRINT(Raichu) OVERWORLD( - gObjectEventPic_Raichu, + sPicTable_Raichu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3887,7 +3887,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Raichu ) OVERWORLD_FEMALE( - gObjectEventPic_RaichuF, + sPicTable_RaichuF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3950,7 +3950,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 15, SHADOW_SIZE_M) FOOTPRINT(Raichu) OVERWORLD( - gObjectEventPic_RaichuAlola, + sPicTable_RaichuAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4024,7 +4024,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 1, SHADOW_SIZE_M) FOOTPRINT(Sandshrew) OVERWORLD( - gObjectEventPic_Sandshrew, + sPicTable_Sandshrew, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4096,7 +4096,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 4, SHADOW_SIZE_L) FOOTPRINT(Sandslash) OVERWORLD( - gObjectEventPic_Sandslash, + sPicTable_Sandslash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4161,7 +4161,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, -1, SHADOW_SIZE_M) FOOTPRINT(Sandshrew) OVERWORLD( - gObjectEventPic_SandshrewAlola, + sPicTable_SandshrewAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4228,7 +4228,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 9, SHADOW_SIZE_L) FOOTPRINT(Sandslash) OVERWORLD( - gObjectEventPic_SandslashAlola, + sPicTable_SandslashAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4310,7 +4310,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(NidoranF) OVERWORLD( - gObjectEventPic_NidoranF, + sPicTable_NidoranF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4381,7 +4381,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 5, SHADOW_SIZE_M) FOOTPRINT(Nidorina) OVERWORLD( - gObjectEventPic_Nidorina, + sPicTable_Nidorina, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4459,7 +4459,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Nidoqueen) OVERWORLD( - gObjectEventPic_Nidoqueen, + sPicTable_Nidoqueen, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4529,7 +4529,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(NidoranM) OVERWORLD( - gObjectEventPic_NidoranM, + sPicTable_NidoranM, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4601,7 +4601,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 1, SHADOW_SIZE_L) FOOTPRINT(Nidorino) OVERWORLD( - gObjectEventPic_Nidorino, + sPicTable_Nidorino, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4682,7 +4682,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Nidoking) OVERWORLD( - gObjectEventPic_Nidoking, + sPicTable_Nidoking, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4764,7 +4764,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -4, SHADOW_SIZE_S) FOOTPRINT(Cleffa) OVERWORLD( - gObjectEventPic_Cleffa, + sPicTable_Cleffa, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4839,7 +4839,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 1, SHADOW_SIZE_S) FOOTPRINT(Clefairy) OVERWORLD( - gObjectEventPic_Clefairy, + sPicTable_Clefairy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4920,7 +4920,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Clefable) OVERWORLD( - gObjectEventPic_Clefable, + sPicTable_Clefable, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4991,7 +4991,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Vulpix) OVERWORLD( - gObjectEventPic_Vulpix, + sPicTable_Vulpix, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5064,7 +5064,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Ninetales) OVERWORLD( - gObjectEventPic_Ninetales, + sPicTable_Ninetales, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5129,7 +5129,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 3, SHADOW_SIZE_M) FOOTPRINT(Vulpix) OVERWORLD( - gObjectEventPic_VulpixAlola, + sPicTable_VulpixAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5197,7 +5197,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Ninetales) OVERWORLD( - gObjectEventPic_NinetalesAlola, + sPicTable_NinetalesAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5282,7 +5282,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -3, SHADOW_SIZE_S) FOOTPRINT(Igglybuff) OVERWORLD( - gObjectEventPic_Igglybuff, + sPicTable_Igglybuff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5359,7 +5359,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, -1, SHADOW_SIZE_S) FOOTPRINT(Jigglypuff) OVERWORLD( - gObjectEventPic_Jigglypuff, + sPicTable_Jigglypuff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5442,7 +5442,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Wigglytuff) OVERWORLD( - gObjectEventPic_Wigglytuff, + sPicTable_Wigglytuff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5527,7 +5527,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 11, SHADOW_SIZE_S) FOOTPRINT(Zubat) OVERWORLD( - gObjectEventPic_Zubat, + sPicTable_Zubat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5536,7 +5536,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Zubat ) OVERWORLD_FEMALE( - gObjectEventPic_ZubatF, + sPicTable_ZubatF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5625,7 +5625,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 14, SHADOW_SIZE_M) FOOTPRINT(Golbat) OVERWORLD( - gObjectEventPic_Golbat, + sPicTable_Golbat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5634,7 +5634,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Golbat ) OVERWORLD_FEMALE( - gObjectEventPic_GolbatF, + sPicTable_GolbatF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5721,7 +5721,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 14, SHADOW_SIZE_M) FOOTPRINT(Crobat) OVERWORLD( - gObjectEventPic_Crobat, + sPicTable_Crobat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -5795,7 +5795,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -2, SHADOW_SIZE_S) FOOTPRINT(Oddish) OVERWORLD( - gObjectEventPic_Oddish, + sPicTable_Oddish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5871,7 +5871,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 3, SHADOW_SIZE_M) FOOTPRINT(Gloom) OVERWORLD( - gObjectEventPic_Gloom, + sPicTable_Gloom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5880,7 +5880,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Gloom ) OVERWORLD_FEMALE( - gObjectEventPic_GloomF, + sPicTable_GloomF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5960,7 +5960,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 7, SHADOW_SIZE_L) FOOTPRINT(Vileplume) OVERWORLD( - gObjectEventPic_Vileplume, + sPicTable_Vileplume, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5969,7 +5969,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Vileplume ) OVERWORLD_FEMALE( - gObjectEventPic_VileplumeF, + sPicTable_VileplumeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6056,7 +6056,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Bellossom) OVERWORLD( - gObjectEventPic_Bellossom, + sPicTable_Bellossom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6145,7 +6145,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(7, -11, SHADOW_SIZE_M) FOOTPRINT(Paras) OVERWORLD( - gObjectEventPic_Paras, + sPicTable_Paras, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -6224,7 +6224,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(5, 2, SHADOW_SIZE_L) FOOTPRINT(Parasect) OVERWORLD( - gObjectEventPic_Parasect, + sPicTable_Parasect, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -6300,7 +6300,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 5, SHADOW_SIZE_M) FOOTPRINT(Venonat) OVERWORLD( - gObjectEventPic_Venonat, + sPicTable_Venonat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6394,7 +6394,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-5, 18, SHADOW_SIZE_M) FOOTPRINT(Venomoth) OVERWORLD( - gObjectEventPic_Venomoth, + sPicTable_Venomoth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6475,7 +6475,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = NO_SHADOW FOOTPRINT(Diglett) OVERWORLD( - gObjectEventPic_Diglett, + sPicTable_Diglett, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6553,7 +6553,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = NO_SHADOW FOOTPRINT(Dugtrio) OVERWORLD( - gObjectEventPic_Dugtrio, + sPicTable_Dugtrio, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6618,7 +6618,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = NO_SHADOW FOOTPRINT(Diglett) OVERWORLD( - gObjectEventPic_DiglettAlola, + sPicTable_DiglettAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6686,7 +6686,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = NO_SHADOW FOOTPRINT(Dugtrio) OVERWORLD( - gObjectEventPic_DugtrioAlola, + sPicTable_DugtrioAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6766,7 +6766,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Meowth) OVERWORLD( - gObjectEventPic_Meowth, + sPicTable_Meowth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6841,7 +6841,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Persian) OVERWORLD( - gObjectEventPic_Persian, + sPicTable_Persian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6906,7 +6906,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 5, SHADOW_SIZE_M) FOOTPRINT(Meowth) OVERWORLD( - gObjectEventPic_MeowthAlola, + sPicTable_MeowthAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6973,7 +6973,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 9, SHADOW_SIZE_L) FOOTPRINT(Persian) OVERWORLD( - gObjectEventPic_PersianAlola, + sPicTable_PersianAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7039,7 +7039,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 4, SHADOW_SIZE_M) FOOTPRINT(Meowth) OVERWORLD( - gObjectEventPic_MeowthGalar, + sPicTable_MeowthGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7104,7 +7104,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Perrserker) OVERWORLD( - gObjectEventPic_Perrserker, + sPicTable_Perrserker, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7235,7 +7235,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 2, SHADOW_SIZE_M) FOOTPRINT(Psyduck) OVERWORLD( - gObjectEventPic_Psyduck, + sPicTable_Psyduck, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7305,7 +7305,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 6, SHADOW_SIZE_M) FOOTPRINT(Golduck) OVERWORLD( - gObjectEventPic_Golduck, + sPicTable_Golduck, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7381,7 +7381,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 1, SHADOW_SIZE_M) FOOTPRINT(Mankey) OVERWORLD( - gObjectEventPic_Mankey, + sPicTable_Mankey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7457,7 +7457,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 7, SHADOW_SIZE_L) FOOTPRINT(Primeape) OVERWORLD( - gObjectEventPic_Primeape, + sPicTable_Primeape, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7521,7 +7521,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Annihilape) OVERWORLD( - gObjectEventPic_Annihilape, + sPicTable_Annihilape, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7594,7 +7594,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 4, SHADOW_SIZE_M) FOOTPRINT(Growlithe) OVERWORLD( - gObjectEventPic_Growlithe, + sPicTable_Growlithe, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7663,7 +7663,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Arcanine) OVERWORLD( - gObjectEventPic_Arcanine, + sPicTable_Arcanine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7727,7 +7727,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, -2, SHADOW_SIZE_M) FOOTPRINT(Growlithe) OVERWORLD( - gObjectEventPic_GrowlitheHisui, + sPicTable_GrowlitheHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7792,7 +7792,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Arcanine) OVERWORLD( - gObjectEventPic_ArcanineHisui, + sPicTable_ArcanineHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7864,7 +7864,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 0, SHADOW_SIZE_S) FOOTPRINT(Poliwag) OVERWORLD( - gObjectEventPic_Poliwag, + sPicTable_Poliwag, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7937,7 +7937,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 4, SHADOW_SIZE_M) FOOTPRINT(Poliwhirl) OVERWORLD( - gObjectEventPic_Poliwhirl, + sPicTable_Poliwhirl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8015,7 +8015,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 7, SHADOW_SIZE_L) FOOTPRINT(Poliwrath) OVERWORLD( - gObjectEventPic_Poliwrath, + sPicTable_Poliwrath, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8100,7 +8100,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 9, SHADOW_SIZE_M) FOOTPRINT(Politoed) OVERWORLD( - gObjectEventPic_Politoed, + sPicTable_Politoed, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8109,7 +8109,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Politoed ) OVERWORLD_FEMALE( - gObjectEventPic_PolitoedF, + sPicTable_PolitoedF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8185,7 +8185,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_L) FOOTPRINT(Abra) OVERWORLD( - gObjectEventPic_Abra, + sPicTable_Abra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8261,7 +8261,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 6, SHADOW_SIZE_L) FOOTPRINT(Kadabra) OVERWORLD( - gObjectEventPic_Kadabra, + sPicTable_Kadabra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8270,7 +8270,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Kadabra ) OVERWORLD_FEMALE( - gObjectEventPic_KadabraF, + sPicTable_KadabraF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8353,7 +8353,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 9, SHADOW_SIZE_L) FOOTPRINT(Alakazam) OVERWORLD( - gObjectEventPic_Alakazam, + sPicTable_Alakazam, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8362,7 +8362,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Alakazam ) OVERWORLD_FEMALE( - gObjectEventPic_AlakazamF, + sPicTable_AlakazamF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8427,7 +8427,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Alakazam) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AlakazamMega, + sPicTable_AlakazamMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8513,7 +8513,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Machop) OVERWORLD( - gObjectEventPic_Machop, + sPicTable_Machop, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8587,7 +8587,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 9, SHADOW_SIZE_M) FOOTPRINT(Machoke) OVERWORLD( - gObjectEventPic_Machoke, + sPicTable_Machoke, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8672,7 +8672,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(7, 13, SHADOW_SIZE_L) FOOTPRINT(Machamp) OVERWORLD( - gObjectEventPic_Machamp, + sPicTable_Machamp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8805,7 +8805,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Bellsprout) OVERWORLD( - gObjectEventPic_Bellsprout, + sPicTable_Bellsprout, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8878,7 +8878,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 3, SHADOW_SIZE_M) FOOTPRINT(Weepinbell) OVERWORLD( - gObjectEventPic_Weepinbell, + sPicTable_Weepinbell, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -8957,7 +8957,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 8, SHADOW_SIZE_M) FOOTPRINT(Victreebel) OVERWORLD( - gObjectEventPic_Victreebel, + sPicTable_Victreebel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -9028,7 +9028,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 6, SHADOW_SIZE_M) FOOTPRINT(Tentacool) OVERWORLD( - gObjectEventPic_Tentacool, + sPicTable_Tentacool, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -9099,7 +9099,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tentacruel) OVERWORLD( - gObjectEventPic_Tentacruel, + sPicTable_Tentacruel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -9190,7 +9190,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 2, SHADOW_SIZE_M) FOOTPRINT(Geodude) OVERWORLD( - gObjectEventPic_Geodude, + sPicTable_Geodude, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -9262,7 +9262,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Graveler) OVERWORLD( - gObjectEventPic_Graveler, + sPicTable_Graveler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9334,7 +9334,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 5, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Golem) OVERWORLD( - gObjectEventPic_Golem, + sPicTable_Golem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9400,7 +9400,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 10, SHADOW_SIZE_M) FOOTPRINT(Geodude) OVERWORLD( - gObjectEventPic_GeodudeAlola, + sPicTable_GeodudeAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9467,7 +9467,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 5, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Graveler) OVERWORLD( - gObjectEventPic_GravelerAlola, + sPicTable_GravelerAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9534,7 +9534,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 11, SHADOW_SIZE_L) FOOTPRINT(Golem) OVERWORLD( - gObjectEventPic_GolemAlola, + sPicTable_GolemAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9605,7 +9605,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Ponyta) OVERWORLD( - gObjectEventPic_Ponyta, + sPicTable_Ponyta, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9674,7 +9674,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Rapidash) OVERWORLD( - gObjectEventPic_Rapidash, + sPicTable_Rapidash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9738,7 +9738,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-5, 5, SHADOW_SIZE_M) FOOTPRINT(Ponyta) OVERWORLD( - gObjectEventPic_PonytaGalar, + sPicTable_PonytaGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9804,7 +9804,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Rapidash) OVERWORLD( - gObjectEventPic_RapidashGalar, + sPicTable_RapidashGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9876,7 +9876,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, -5, SHADOW_SIZE_L) FOOTPRINT(Slowpoke) OVERWORLD( - gObjectEventPic_Slowpoke, + sPicTable_Slowpoke, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9947,7 +9947,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 8, SHADOW_SIZE_L) FOOTPRINT(Slowbro) OVERWORLD( - gObjectEventPic_Slowbro, + sPicTable_Slowbro, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10017,7 +10017,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Slowking) OVERWORLD( - gObjectEventPic_Slowking, + sPicTable_Slowking, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10084,7 +10084,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Slowbro) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SlowbroMega, + sPicTable_SlowbroMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10152,7 +10152,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, -8, SHADOW_SIZE_L) FOOTPRINT(Slowpoke) OVERWORLD( - gObjectEventPic_SlowpokeGalar, + sPicTable_SlowpokeGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10220,7 +10220,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-5, 9, SHADOW_SIZE_L) FOOTPRINT(Slowbro) OVERWORLD( - gObjectEventPic_SlowbroGalar, + sPicTable_SlowbroGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10285,7 +10285,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 12, SHADOW_SIZE_M) FOOTPRINT(Slowking) OVERWORLD( - gObjectEventPic_SlowkingGalar, + sPicTable_SlowkingGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10361,7 +10361,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 8, SHADOW_SIZE_S) FOOTPRINT(Magnemite) OVERWORLD( - gObjectEventPic_Magnemite, + sPicTable_Magnemite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -10434,7 +10434,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Magneton) OVERWORLD( - gObjectEventPic_Magneton, + sPicTable_Magneton, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -10513,7 +10513,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Magnezone) OVERWORLD( - gObjectEventPic_Magnezone, + sPicTable_Magnezone, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10602,7 +10602,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Farfetchd) OVERWORLD( - gObjectEventPic_Farfetchd, + sPicTable_Farfetchd, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -10668,7 +10668,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-7, 2, SHADOW_SIZE_L) FOOTPRINT(Farfetchd) OVERWORLD( - gObjectEventPic_FarfetchdGalar, + sPicTable_FarfetchdGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10735,7 +10735,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Sirfetchd) OVERWORLD( - gObjectEventPic_Sirfetchd, + sPicTable_Sirfetchd, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10813,7 +10813,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(6, 5, SHADOW_SIZE_M) FOOTPRINT(Doduo) OVERWORLD( - gObjectEventPic_Doduo, + sPicTable_Doduo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10822,7 +10822,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Doduo ) OVERWORLD_FEMALE( - gObjectEventPic_DoduoF, + sPicTable_DoduoF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10905,7 +10905,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 12, SHADOW_SIZE_L) FOOTPRINT(Dodrio) OVERWORLD( - gObjectEventPic_Dodrio, + sPicTable_Dodrio, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10914,7 +10914,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Dodrio ) OVERWORLD_FEMALE( - gObjectEventPic_DodrioF, + sPicTable_DodrioF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10985,7 +10985,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_L) FOOTPRINT(Seel) OVERWORLD( - gObjectEventPic_Seel, + sPicTable_Seel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -11057,7 +11057,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Dewgong) OVERWORLD( - gObjectEventPic_Dewgong, + sPicTable_Dewgong, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11128,7 +11128,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 3, SHADOW_SIZE_M) FOOTPRINT(Grimer) OVERWORLD( - gObjectEventPic_Grimer, + sPicTable_Grimer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -11202,7 +11202,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Muk) OVERWORLD( - gObjectEventPic_Muk, + sPicTable_Muk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -11267,7 +11267,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 1, SHADOW_SIZE_M) FOOTPRINT(Grimer) OVERWORLD( - gObjectEventPic_GrimerAlola, + sPicTable_GrimerAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11336,7 +11336,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 7, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Muk) OVERWORLD( - gObjectEventPic_MukAlola, + sPicTable_MukAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11415,7 +11415,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -4, SHADOW_SIZE_S) FOOTPRINT(Shellder) OVERWORLD( - gObjectEventPic_Shellder, + sPicTable_Shellder, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -11490,7 +11490,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 8, SHADOW_SIZE_M) FOOTPRINT(Cloyster) OVERWORLD( - gObjectEventPic_Cloyster, + sPicTable_Cloyster, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11563,7 +11563,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 11, SHADOW_SIZE_S) FOOTPRINT(Gastly) OVERWORLD( - gObjectEventPic_Gastly, + sPicTable_Gastly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11635,7 +11635,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Haunter) OVERWORLD( - gObjectEventPic_Haunter, + sPicTable_Haunter, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11715,7 +11715,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 5, SHADOW_SIZE_L) FOOTPRINT(Gengar) OVERWORLD( - gObjectEventPic_Gengar, + sPicTable_Gengar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11781,7 +11781,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Gengar) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GengarMega, + sPicTable_GengarMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11911,7 +11911,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Onix) OVERWORLD( - gObjectEventPic_Onix, + sPicTable_Onix, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -11991,7 +11991,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Steelix) OVERWORLD( - gObjectEventPic_Steelix, + sPicTable_Steelix, SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -12000,7 +12000,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Steelix ) OVERWORLD_FEMALE( - gObjectEventPic_SteelixF, + sPicTable_SteelixF, SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -12065,7 +12065,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Steelix) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SteelixMega, + sPicTable_SteelixMega, SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -12147,7 +12147,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 6, SHADOW_SIZE_M) FOOTPRINT(Drowzee) OVERWORLD( - gObjectEventPic_Drowzee, + sPicTable_Drowzee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12230,7 +12230,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 9, SHADOW_SIZE_L) FOOTPRINT(Hypno) OVERWORLD( - gObjectEventPic_Hypno, + sPicTable_Hypno, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12239,7 +12239,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Hypno ) OVERWORLD_FEMALE( - gObjectEventPic_HypnoF, + sPicTable_HypnoF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12308,7 +12308,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -1, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Krabby) OVERWORLD( - gObjectEventPic_Krabby, + sPicTable_Krabby, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12377,7 +12377,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 4, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kingler) OVERWORLD( - gObjectEventPic_Kingler, + sPicTable_Kingler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12517,7 +12517,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -2, SHADOW_SIZE_S) FOOTPRINT(Voltorb) OVERWORLD( - gObjectEventPic_Voltorb, + sPicTable_Voltorb, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -12587,7 +12587,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 2, SHADOW_SIZE_M) FOOTPRINT(Electrode) OVERWORLD( - gObjectEventPic_Electrode, + sPicTable_Electrode, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -12651,7 +12651,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, -4, SHADOW_SIZE_S) FOOTPRINT(Voltorb) OVERWORLD( - gObjectEventPic_VoltorbHisui, + sPicTable_VoltorbHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12716,7 +12716,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 4, SHADOW_SIZE_M) FOOTPRINT(Electrode) OVERWORLD( - gObjectEventPic_ElectrodeHisui, + sPicTable_ElectrodeHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12794,7 +12794,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -5, SHADOW_SIZE_L) FOOTPRINT(Exeggcute) OVERWORLD( - gObjectEventPic_Exeggcute, + sPicTable_Exeggcute, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -12872,7 +12872,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 13, SHADOW_SIZE_L) FOOTPRINT(Exeggutor) OVERWORLD( - gObjectEventPic_Exeggutor, + sPicTable_Exeggutor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12936,7 +12936,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(6, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Exeggutor) OVERWORLD( - gObjectEventPic_ExeggutorAlola, + sPicTable_ExeggutorAlola, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13012,7 +13012,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(Cubone) OVERWORLD( - gObjectEventPic_Cubone, + sPicTable_Cubone, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13086,7 +13086,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(6, 6, SHADOW_SIZE_M) FOOTPRINT(Marowak) OVERWORLD( - gObjectEventPic_Marowak, + sPicTable_Marowak, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13147,7 +13147,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Marowak) OVERWORLD( - gObjectEventPic_MarowakAlola, + sPicTable_MarowakAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13208,7 +13208,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Marowak) OVERWORLD( - gObjectEventPic_MarowakAlola, + sPicTable_MarowakAlola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13285,7 +13285,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Tyrogue) OVERWORLD( - gObjectEventPic_Tyrogue, + sPicTable_Tyrogue, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13360,7 +13360,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 8, SHADOW_SIZE_M) FOOTPRINT(Hitmonlee) OVERWORLD( - gObjectEventPic_Hitmonlee, + sPicTable_Hitmonlee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13438,7 +13438,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 9, SHADOW_SIZE_M) FOOTPRINT(Hitmonchan) OVERWORLD( - gObjectEventPic_Hitmonchan, + sPicTable_Hitmonchan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13511,7 +13511,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Hitmontop) OVERWORLD( - gObjectEventPic_Hitmontop, + sPicTable_Hitmontop, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13580,7 +13580,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 6, SHADOW_SIZE_M) FOOTPRINT(Lickitung) OVERWORLD( - gObjectEventPic_Lickitung, + sPicTable_Lickitung, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13656,7 +13656,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 11, SHADOW_SIZE_M) FOOTPRINT(Lickilicky) OVERWORLD( - gObjectEventPic_Lickilicky, + sPicTable_Lickilicky, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13733,7 +13733,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Koffing) OVERWORLD( - gObjectEventPic_Koffing, + sPicTable_Koffing, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -13811,7 +13811,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(5, 14, SHADOW_SIZE_M) FOOTPRINT(Weezing) OVERWORLD( - gObjectEventPic_Weezing, + sPicTable_Weezing, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -13878,7 +13878,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(7, 17, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Weezing) OVERWORLD( - gObjectEventPic_WeezingGalar, + sPicTable_WeezingGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13957,7 +13957,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_L) FOOTPRINT(Rhyhorn) OVERWORLD( - gObjectEventPic_Rhyhorn, + sPicTable_Rhyhorn, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13966,7 +13966,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Rhyhorn ) OVERWORLD_FEMALE( - gObjectEventPic_RhyhornF, + sPicTable_RhyhornF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14037,7 +14037,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Rhydon) OVERWORLD( - gObjectEventPic_Rhydon, + sPicTable_Rhydon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14046,7 +14046,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Rhydon ) OVERWORLD_FEMALE( - gObjectEventPic_RhydonF, + sPicTable_RhydonF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14127,7 +14127,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Rhyperior) OVERWORLD( - gObjectEventPic_Rhyperior, + sPicTable_Rhyperior, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14136,7 +14136,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Rhyperior ) OVERWORLD_FEMALE( - gObjectEventPic_RhyperiorF, + sPicTable_RhyperiorF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14205,7 +14205,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Happiny) OVERWORLD( - gObjectEventPic_Happiny, + sPicTable_Happiny, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14276,7 +14276,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 4, SHADOW_SIZE_L) FOOTPRINT(Chansey) OVERWORLD( - gObjectEventPic_Chansey, + sPicTable_Chansey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14346,7 +14346,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 8, SHADOW_SIZE_L) FOOTPRINT(Blissey) OVERWORLD( - gObjectEventPic_Blissey, + sPicTable_Blissey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14419,7 +14419,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 1, SHADOW_SIZE_M) FOOTPRINT(Tangela) OVERWORLD( - gObjectEventPic_Tangela, + sPicTable_Tangela, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14496,7 +14496,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tangrowth) OVERWORLD( - gObjectEventPic_Tangrowth, + sPicTable_Tangrowth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14505,7 +14505,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Tangrowth ) OVERWORLD_FEMALE( - gObjectEventPic_TangrowthF, + sPicTable_TangrowthF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14573,7 +14573,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kangaskhan) OVERWORLD( - gObjectEventPic_Kangaskhan, + sPicTable_Kangaskhan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14640,7 +14640,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Kangaskhan) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_KangaskhanMega, + sPicTable_KangaskhanMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -14721,7 +14721,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Horsea) OVERWORLD( - gObjectEventPic_Horsea, + sPicTable_Horsea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -14797,7 +14797,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 7, SHADOW_SIZE_M) FOOTPRINT(Seadra) OVERWORLD( - gObjectEventPic_Seadra, + sPicTable_Seadra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -14881,7 +14881,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 12, SHADOW_SIZE_M) FOOTPRINT(Kingdra) OVERWORLD( - gObjectEventPic_Kingdra, + sPicTable_Kingdra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -14963,7 +14963,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-6, 0, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Goldeen) OVERWORLD( - gObjectEventPic_Goldeen, + sPicTable_Goldeen, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -14972,7 +14972,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Goldeen ) OVERWORLD_FEMALE( - gObjectEventPic_GoldeenF, + sPicTable_GoldeenF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -15047,7 +15047,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Seaking) OVERWORLD( - gObjectEventPic_Seaking, + sPicTable_Seaking, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -15056,7 +15056,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Seaking ) OVERWORLD_FEMALE( - gObjectEventPic_SeakingF, + sPicTable_SeakingF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -15127,7 +15127,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 2, SHADOW_SIZE_M) FOOTPRINT(Staryu) OVERWORLD( - gObjectEventPic_Staryu, + sPicTable_Staryu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15198,7 +15198,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 7, SHADOW_SIZE_L) FOOTPRINT(Starmie) OVERWORLD( - gObjectEventPic_Starmie, + sPicTable_Starmie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15278,7 +15278,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-5, 4, SHADOW_SIZE_S) FOOTPRINT(MimeJr) OVERWORLD( - gObjectEventPic_MimeJr, + sPicTable_MimeJr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15355,7 +15355,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(MrMime) OVERWORLD( - gObjectEventPic_MrMime, + sPicTable_MrMime, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15420,7 +15420,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 6, SHADOW_SIZE_M) FOOTPRINT(MrMime) OVERWORLD( - gObjectEventPic_MrMimeGalar, + sPicTable_MrMimeGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15485,7 +15485,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 9, SHADOW_SIZE_L) FOOTPRINT(MrRime) OVERWORLD( - gObjectEventPic_MrRime, + sPicTable_MrRime, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15568,7 +15568,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 7, SHADOW_SIZE_L) FOOTPRINT(Scyther) OVERWORLD( - gObjectEventPic_Scyther, + sPicTable_Scyther, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15577,7 +15577,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Scyther ) OVERWORLD_FEMALE( - gObjectEventPic_ScytherF, + sPicTable_ScytherF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15654,7 +15654,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Scizor) OVERWORLD( - gObjectEventPic_Scizor, + sPicTable_Scizor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15663,7 +15663,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Scizor ) OVERWORLD_FEMALE( - gObjectEventPic_ScizorF, + sPicTable_ScizorF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15727,7 +15727,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Scizor) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_ScizorMega, + sPicTable_ScizorMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15796,7 +15796,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kleavor) OVERWORLD( - gObjectEventPic_Kleavor, + sPicTable_Kleavor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15870,7 +15870,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Smoochum) OVERWORLD( - gObjectEventPic_Smoochum, + sPicTable_Smoochum, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -15945,7 +15945,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_L) FOOTPRINT(Jynx) OVERWORLD( - gObjectEventPic_Jynx, + sPicTable_Jynx, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16016,7 +16016,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 1, SHADOW_SIZE_M) FOOTPRINT(Elekid) OVERWORLD( - gObjectEventPic_Elekid, + sPicTable_Elekid, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16089,7 +16089,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 9, SHADOW_SIZE_L) FOOTPRINT(Electabuzz) OVERWORLD( - gObjectEventPic_Electabuzz, + sPicTable_Electabuzz, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16165,7 +16165,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-3, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Electivire) OVERWORLD( - gObjectEventPic_Electivire, + sPicTable_Electivire, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16238,7 +16238,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Magby) OVERWORLD( - gObjectEventPic_Magby, + sPicTable_Magby, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16307,7 +16307,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 8, SHADOW_SIZE_L) FOOTPRINT(Magmar) OVERWORLD( - gObjectEventPic_Magmar, + sPicTable_Magmar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16383,7 +16383,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(4, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Magmortar) OVERWORLD( - gObjectEventPic_Magmortar, + sPicTable_Magmortar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16458,7 +16458,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(5, 7, SHADOW_SIZE_L) FOOTPRINT(Pinsir) OVERWORLD( - gObjectEventPic_Pinsir, + sPicTable_Pinsir, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16526,7 +16526,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Pinsir) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_PinsirMega, + sPicTable_PinsirMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16607,7 +16607,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Tauros) OVERWORLD( - gObjectEventPic_Tauros, + sPicTable_Tauros, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16671,7 +16671,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Tauros) OVERWORLD( - gObjectEventPic_TaurosPaldeaCombat, + sPicTable_TaurosPaldeaCombat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16736,7 +16736,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Tauros) OVERWORLD( - gObjectEventPic_TaurosPaldeaBlaze, + sPicTable_TaurosPaldeaBlaze, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16801,7 +16801,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Tauros) OVERWORLD( - gObjectEventPic_TaurosPaldeaAqua, + sPicTable_TaurosPaldeaAqua, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -16885,7 +16885,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 7, SHADOW_SIZE_M) FOOTPRINT(Magikarp) OVERWORLD( - gObjectEventPic_Magikarp, + sPicTable_Magikarp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -16894,7 +16894,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Magikarp ) OVERWORLD_FEMALE( - gObjectEventPic_MagikarpF, + sPicTable_MagikarpF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -16966,7 +16966,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(5, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gyarados) OVERWORLD( - gObjectEventPic_Gyarados, + sPicTable_Gyarados, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -16975,7 +16975,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Gyarados ) OVERWORLD_FEMALE( - gObjectEventPic_GyaradosF, + sPicTable_GyaradosF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -17040,7 +17040,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Gyarados) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GyaradosMega, + sPicTable_GyaradosMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -17114,7 +17114,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Lapras) OVERWORLD( - gObjectEventPic_Lapras, + sPicTable_Lapras, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -17249,7 +17249,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -4, SHADOW_SIZE_M) FOOTPRINT(Ditto) OVERWORLD( - gObjectEventPic_Ditto, + sPicTable_Ditto, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -17323,7 +17323,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Eevee) OVERWORLD( - gObjectEventPic_Eevee, + sPicTable_Eevee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17332,7 +17332,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Eevee ) OVERWORLD_FEMALE( - gObjectEventPic_EeveeF, + sPicTable_EeveeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17473,7 +17473,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Eevee) OVERWORLD( - gObjectEventPic_Eevee, + sPicTable_Eevee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17542,7 +17542,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-4, 3, SHADOW_SIZE_M) FOOTPRINT(Vaporeon) OVERWORLD( - gObjectEventPic_Vaporeon, + sPicTable_Vaporeon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17607,7 +17607,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Jolteon) OVERWORLD( - gObjectEventPic_Jolteon, + sPicTable_Jolteon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17672,7 +17672,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 1, SHADOW_SIZE_L) FOOTPRINT(Flareon) OVERWORLD( - gObjectEventPic_Flareon, + sPicTable_Flareon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17739,7 +17739,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 4, SHADOW_SIZE_M) FOOTPRINT(Espeon) OVERWORLD( - gObjectEventPic_Espeon, + sPicTable_Espeon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17804,7 +17804,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Umbreon) OVERWORLD( - gObjectEventPic_Umbreon, + sPicTable_Umbreon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17872,7 +17872,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 4, SHADOW_SIZE_M) FOOTPRINT(Leafeon) OVERWORLD( - gObjectEventPic_Leafeon, + sPicTable_Leafeon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -17938,7 +17938,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Glaceon) OVERWORLD( - gObjectEventPic_Glaceon, + sPicTable_Glaceon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18007,7 +18007,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, 9, SHADOW_SIZE_M) FOOTPRINT(Sylveon) OVERWORLD( - gObjectEventPic_Sylveon, + sPicTable_Sylveon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18081,7 +18081,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, -2, SHADOW_SIZE_S) FOOTPRINT(Porygon) OVERWORLD( - gObjectEventPic_Porygon, + sPicTable_Porygon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -18157,7 +18157,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Porygon2) OVERWORLD( - gObjectEventPic_Porygon2, + sPicTable_Porygon2, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -18234,7 +18234,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 17, SHADOW_SIZE_S) FOOTPRINT(PorygonZ) OVERWORLD( - gObjectEventPic_PorygonZ, + sPicTable_PorygonZ, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18315,7 +18315,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, -2, SHADOW_SIZE_S) FOOTPRINT(Omanyte) OVERWORLD( - gObjectEventPic_Omanyte, + sPicTable_Omanyte, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -18384,7 +18384,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 4, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Omastar) OVERWORLD( - gObjectEventPic_Omastar, + sPicTable_Omastar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18463,7 +18463,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(2, -3, SHADOW_SIZE_S) FOOTPRINT(Kabuto) OVERWORLD( - gObjectEventPic_Kabuto, + sPicTable_Kabuto, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -18538,7 +18538,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kabutops) OVERWORLD( - gObjectEventPic_Kabutops, + sPicTable_Kabutops, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18608,7 +18608,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 16, SHADOW_SIZE_M) FOOTPRINT(Aerodactyl) OVERWORLD( - gObjectEventPic_Aerodactyl, + sPicTable_Aerodactyl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -18675,7 +18675,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Aerodactyl) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AerodactylMega, + sPicTable_AerodactylMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -18752,7 +18752,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 2, SHADOW_SIZE_M) FOOTPRINT(Munchlax) OVERWORLD( - gObjectEventPic_Munchlax, + sPicTable_Munchlax, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18823,7 +18823,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Snorlax) OVERWORLD( - gObjectEventPic_Snorlax, + sPicTable_Snorlax, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -18963,7 +18963,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 10, SHADOW_SIZE_M) FOOTPRINT(Articuno) OVERWORLD( - gObjectEventPic_Articuno, + sPicTable_Articuno, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -19030,7 +19030,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 14, SHADOW_SIZE_M) FOOTPRINT(Articuno) OVERWORLD( - gObjectEventPic_ArticunoGalar, + sPicTable_ArticunoGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19115,7 +19115,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(1, 15, SHADOW_SIZE_M) FOOTPRINT(Zapdos) OVERWORLD( - gObjectEventPic_Zapdos, + sPicTable_Zapdos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -19181,7 +19181,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Zapdos) OVERWORLD( - gObjectEventPic_ZapdosGalar, + sPicTable_ZapdosGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19290,7 +19290,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(-1, 12, SHADOW_SIZE_M) FOOTPRINT(Moltres) OVERWORLD( - gObjectEventPic_Moltres, + sPicTable_Moltres, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -19356,7 +19356,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Moltres) OVERWORLD( - gObjectEventPic_MoltresGalar, + sPicTable_MoltresGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19430,7 +19430,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(3, 3, SHADOW_SIZE_L) FOOTPRINT(Dratini) OVERWORLD( - gObjectEventPic_Dratini, + sPicTable_Dratini, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -19500,7 +19500,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Dragonair) OVERWORLD( - gObjectEventPic_Dragonair, + sPicTable_Dragonair, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -19575,7 +19575,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Dragonite) OVERWORLD( - gObjectEventPic_Dragonite, + sPicTable_Dragonite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -19648,7 +19648,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(6, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Mewtwo) OVERWORLD( - gObjectEventPic_Mewtwo, + sPicTable_Mewtwo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19717,7 +19717,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Mewtwo) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_MewtwoMegaX, + sPicTable_MewtwoMegaX, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19788,7 +19788,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Mewtwo) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_MewtwoMegaY, + sPicTable_MewtwoMegaY, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -19873,7 +19873,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Mew) OVERWORLD( - gObjectEventPic_Mew, + sPicTable_Mew, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index a86367e3f7..fc12c19d46 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -58,7 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 2, SHADOW_SIZE_S) FOOTPRINT(Chikorita) OVERWORLD( - gObjectEventPic_Chikorita, + sPicTable_Chikorita, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -126,7 +126,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 10, SHADOW_SIZE_M) FOOTPRINT(Bayleef) OVERWORLD( - gObjectEventPic_Bayleef, + sPicTable_Bayleef, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -205,7 +205,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Meganium) OVERWORLD( - gObjectEventPic_Meganium, + sPicTable_Meganium, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -214,7 +214,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Meganium ) OVERWORLD_FEMALE( - gObjectEventPic_MeganiumF, + sPicTable_MeganiumF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -281,7 +281,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, -1, SHADOW_SIZE_S) FOOTPRINT(Cyndaquil) OVERWORLD( - gObjectEventPic_Cyndaquil, + sPicTable_Cyndaquil, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -349,7 +349,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Quilava) OVERWORLD( - gObjectEventPic_Quilava, + sPicTable_Quilava, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -425,7 +425,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(Typhlosion) OVERWORLD( - gObjectEventPic_Typhlosion, + sPicTable_Typhlosion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -489,7 +489,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 14, SHADOW_SIZE_L) FOOTPRINT(Typhlosion) OVERWORLD( - gObjectEventPic_TyphlosionHisui, + sPicTable_TyphlosionHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -563,7 +563,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Totodile) OVERWORLD( - gObjectEventPic_Totodile, + sPicTable_Totodile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -632,7 +632,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 8, SHADOW_SIZE_M) FOOTPRINT(Croconaw) OVERWORLD( - gObjectEventPic_Croconaw, + sPicTable_Croconaw, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -708,7 +708,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Feraligatr) OVERWORLD( - gObjectEventPic_Feraligatr, + sPicTable_Feraligatr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -777,7 +777,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 11, SHADOW_SIZE_S) FOOTPRINT(Sentret) OVERWORLD( - gObjectEventPic_Sentret, + sPicTable_Sentret, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -844,7 +844,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 9, SHADOW_SIZE_M) FOOTPRINT(Furret) OVERWORLD( - gObjectEventPic_Furret, + sPicTable_Furret, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -921,7 +921,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Hoothoot) OVERWORLD( - gObjectEventPic_Hoothoot, + sPicTable_Hoothoot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -994,7 +994,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 10, SHADOW_SIZE_S) FOOTPRINT(Noctowl) OVERWORLD( - gObjectEventPic_Noctowl, + sPicTable_Noctowl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1069,7 +1069,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 4, SHADOW_SIZE_M) FOOTPRINT(Ledyba) OVERWORLD( - gObjectEventPic_Ledyba, + sPicTable_Ledyba, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1078,7 +1078,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Ledyba ) OVERWORLD_FEMALE( - gObjectEventPic_LedybaF, + sPicTable_LedybaF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1152,7 +1152,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Ledian) OVERWORLD( - gObjectEventPic_Ledian, + sPicTable_Ledian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1161,7 +1161,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Ledian ) OVERWORLD_FEMALE( - gObjectEventPic_LedianF, + sPicTable_LedianF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1232,7 +1232,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, -8, SHADOW_SIZE_M) FOOTPRINT(Spinarak) OVERWORLD( - gObjectEventPic_Spinarak, + sPicTable_Spinarak, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1307,7 +1307,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 3, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Ariados) OVERWORLD( - gObjectEventPic_Ariados, + sPicTable_Ariados, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1378,7 +1378,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 1, SHADOW_SIZE_M) FOOTPRINT(Chinchou) OVERWORLD( - gObjectEventPic_Chinchou, + sPicTable_Chinchou, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1449,7 +1449,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(5, 4, SHADOW_SIZE_M) FOOTPRINT(Lanturn) OVERWORLD( - gObjectEventPic_Lanturn, + sPicTable_Lanturn, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -1519,7 +1519,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, -3, SHADOW_SIZE_S) FOOTPRINT(Togepi) OVERWORLD( - gObjectEventPic_Togepi, + sPicTable_Togepi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1587,7 +1587,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Togetic) OVERWORLD( - gObjectEventPic_Togetic, + sPicTable_Togetic, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1668,7 +1668,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(4, 15, SHADOW_SIZE_M) FOOTPRINT(Togekiss) OVERWORLD( - gObjectEventPic_Togekiss, + sPicTable_Togekiss, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1740,7 +1740,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, -4, SHADOW_SIZE_S) FOOTPRINT(Natu) OVERWORLD( - gObjectEventPic_Natu, + sPicTable_Natu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1817,7 +1817,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Xatu) OVERWORLD( - gObjectEventPic_Xatu, + sPicTable_Xatu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1826,7 +1826,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Xatu ) OVERWORLD_FEMALE( - gObjectEventPic_XatuF, + sPicTable_XatuF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1896,7 +1896,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 1, SHADOW_SIZE_M) FOOTPRINT(Mareep) OVERWORLD( - gObjectEventPic_Mareep, + sPicTable_Mareep, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1966,7 +1966,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Flaaffy) OVERWORLD( - gObjectEventPic_Flaaffy, + sPicTable_Flaaffy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2044,7 +2044,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 11, SHADOW_SIZE_M) FOOTPRINT(Ampharos) OVERWORLD( - gObjectEventPic_Ampharos, + sPicTable_Ampharos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2110,7 +2110,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = FOOTPRINT(Ampharos) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AmpharosMega, + sPicTable_AmpharosMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2192,7 +2192,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-4, 3, SHADOW_SIZE_S) FOOTPRINT(Azurill) OVERWORLD( - gObjectEventPic_Azurill, + sPicTable_Azurill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2265,7 +2265,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 0, SHADOW_SIZE_S) FOOTPRINT(Marill) OVERWORLD( - gObjectEventPic_Marill, + sPicTable_Marill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2347,7 +2347,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-4, 8, SHADOW_SIZE_S) FOOTPRINT(Azumarill) OVERWORLD( - gObjectEventPic_Azumarill, + sPicTable_Azumarill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2418,7 +2418,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-3, 4, SHADOW_SIZE_S) FOOTPRINT(Bonsly) OVERWORLD( - gObjectEventPic_Bonsly, + sPicTable_Bonsly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2496,7 +2496,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Sudowoodo) OVERWORLD( - gObjectEventPic_Sudowoodo, + sPicTable_Sudowoodo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2505,7 +2505,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Sudowoodo ) OVERWORLD_FEMALE( - gObjectEventPic_SudowoodoF, + sPicTable_SudowoodoF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2578,7 +2578,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-5, 12, SHADOW_SIZE_S) FOOTPRINT(Hoppip) OVERWORLD( - gObjectEventPic_Hoppip, + sPicTable_Hoppip, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2656,7 +2656,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 10, SHADOW_SIZE_S) FOOTPRINT(Skiploom) OVERWORLD( - gObjectEventPic_Skiploom, + sPicTable_Skiploom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2739,7 +2739,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 11, SHADOW_SIZE_S) FOOTPRINT(Jumpluff) OVERWORLD( - gObjectEventPic_Jumpluff, + sPicTable_Jumpluff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2812,7 +2812,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Aipom) OVERWORLD( - gObjectEventPic_Aipom, + sPicTable_Aipom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2821,7 +2821,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Aipom ) OVERWORLD_FEMALE( - gObjectEventPic_AipomF, + sPicTable_AipomF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2894,7 +2894,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Ambipom) OVERWORLD( - gObjectEventPic_Ambipom, + sPicTable_Ambipom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2903,7 +2903,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Ambipom ) OVERWORLD_FEMALE( - gObjectEventPic_AmbipomF, + sPicTable_AmbipomF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2977,7 +2977,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, -4, SHADOW_SIZE_S) FOOTPRINT(Sunkern) OVERWORLD( - gObjectEventPic_Sunkern, + sPicTable_Sunkern, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -3049,7 +3049,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 6, SHADOW_SIZE_S) FOOTPRINT(Sunflora) OVERWORLD( - gObjectEventPic_Sunflora, + sPicTable_Sunflora, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3138,7 +3138,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 10, SHADOW_SIZE_S) FOOTPRINT(Yanma) OVERWORLD( - gObjectEventPic_Yanma, + sPicTable_Yanma, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3232,7 +3232,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 12, SHADOW_SIZE_M) FOOTPRINT(Yanmega) OVERWORLD( - gObjectEventPic_Yanmega, + sPicTable_Yanmega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3307,7 +3307,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, -2, SHADOW_SIZE_S) FOOTPRINT(Wooper) OVERWORLD( - gObjectEventPic_Wooper, + sPicTable_Wooper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3316,7 +3316,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Wooper ) OVERWORLD_FEMALE( - gObjectEventPic_WooperF, + sPicTable_WooperF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3388,7 +3388,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 8, SHADOW_SIZE_M) FOOTPRINT(Quagsire) OVERWORLD( - gObjectEventPic_Quagsire, + sPicTable_Quagsire, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3397,7 +3397,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Quagsire ) OVERWORLD_FEMALE( - gObjectEventPic_QuagsireF, + sPicTable_QuagsireF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3458,7 +3458,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, -2, SHADOW_SIZE_S) FOOTPRINT(Wooper) OVERWORLD( - gObjectEventPic_WooperPaldea, + sPicTable_WooperPaldea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3524,7 +3524,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 3, SHADOW_SIZE_L) FOOTPRINT(Clodsire) OVERWORLD( - gObjectEventPic_Clodsire, + sPicTable_Clodsire, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3603,7 +3603,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 8, SHADOW_SIZE_S) FOOTPRINT(Murkrow) OVERWORLD( - gObjectEventPic_Murkrow, + sPicTable_Murkrow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3612,7 +3612,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Murkrow ) OVERWORLD_FEMALE( - gObjectEventPic_MurkrowF, + sPicTable_MurkrowF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3680,7 +3680,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(5, 7, SHADOW_SIZE_M) FOOTPRINT(Honchkrow) OVERWORLD( - gObjectEventPic_Honchkrow, + sPicTable_Honchkrow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3758,7 +3758,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 10, SHADOW_SIZE_S) FOOTPRINT(Misdreavus) OVERWORLD( - gObjectEventPic_Misdreavus, + sPicTable_Misdreavus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3836,7 +3836,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 11, SHADOW_SIZE_M) FOOTPRINT(Mismagius) OVERWORLD( - gObjectEventPic_Mismagius, + sPicTable_Mismagius, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3900,7 +3900,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 3, SHADOW_SIZE_S) \ FOOTPRINT(Unown) \ OVERWORLD( \ - gObjectEventPic_Unown ##letter, \ + sPicTable_Unown ##letter, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_NONE, \ @@ -4003,7 +4003,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 2, SHADOW_SIZE_S) FOOTPRINT(Wynaut) OVERWORLD( - gObjectEventPic_Wynaut, + sPicTable_Wynaut, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4084,7 +4084,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-3, 8, SHADOW_SIZE_M) FOOTPRINT(Wobbuffet) OVERWORLD( - gObjectEventPic_Wobbuffet, + sPicTable_Wobbuffet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4093,7 +4093,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Wobbuffet ) OVERWORLD_FEMALE( - gObjectEventPic_WobbuffetF, + sPicTable_WobbuffetF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4166,7 +4166,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 13, SHADOW_SIZE_M) FOOTPRINT(Girafarig) OVERWORLD( - gObjectEventPic_Girafarig, + sPicTable_Girafarig, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4175,7 +4175,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Girafarig ) OVERWORLD_FEMALE( - gObjectEventPic_GirafarigF, + sPicTable_GirafarigF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4238,7 +4238,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(11, 13, SHADOW_SIZE_L) FOOTPRINT(Farigiraf) OVERWORLD( - gObjectEventPic_Farigiraf, + sPicTable_Farigiraf, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4312,7 +4312,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Pineco) OVERWORLD( - gObjectEventPic_Pineco, + sPicTable_Pineco, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -4381,7 +4381,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 6, SHADOW_SIZE_L) FOOTPRINT(Forretress) OVERWORLD( - gObjectEventPic_Forretress, + sPicTable_Forretress, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -4457,7 +4457,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, -4, SHADOW_SIZE_M) FOOTPRINT(Dunsparce) OVERWORLD( - gObjectEventPic_Dunsparce, + sPicTable_Dunsparce, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -4523,7 +4523,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 5, SHADOW_SIZE_L) FOOTPRINT(Dudunsparce) OVERWORLD( - gObjectEventPic_DudunsparceTwoSegment, + sPicTable_DudunsparceTwoSegment, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -4586,7 +4586,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(4, 4, SHADOW_SIZE_L) FOOTPRINT(Dudunsparce) OVERWORLD( - gObjectEventPic_DudunsparceThreeSegment, + sPicTable_DudunsparceThreeSegment, SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -4662,7 +4662,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Gligar) OVERWORLD( - gObjectEventPic_Gligar, + sPicTable_Gligar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -4671,7 +4671,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Gligar ) OVERWORLD_FEMALE( - gObjectEventPic_GligarF, + sPicTable_GligarF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -4741,7 +4741,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Gliscor) OVERWORLD( - gObjectEventPic_Gliscor, + sPicTable_Gliscor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4813,7 +4813,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Snubbull) OVERWORLD( - gObjectEventPic_Snubbull, + sPicTable_Snubbull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4888,7 +4888,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 10, SHADOW_SIZE_L) FOOTPRINT(Granbull) OVERWORLD( - gObjectEventPic_Granbull, + sPicTable_Granbull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4971,7 +4971,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Qwilfish) OVERWORLD( - gObjectEventPic_Qwilfish, + sPicTable_Qwilfish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -5038,7 +5038,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-5, 4, SHADOW_SIZE_S) FOOTPRINT(Qwilfish) OVERWORLD( - gObjectEventPic_QwilfishHisui, + sPicTable_QwilfishHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5103,7 +5103,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Overqwil) OVERWORLD( - gObjectEventPic_Overqwil, + sPicTable_Overqwil, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5179,7 +5179,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 3, SHADOW_SIZE_M) FOOTPRINT(Shuckle) OVERWORLD( - gObjectEventPic_Shuckle, + sPicTable_Shuckle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5256,7 +5256,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 10, SHADOW_SIZE_M) FOOTPRINT(Heracross) OVERWORLD( - gObjectEventPic_Heracross, + sPicTable_Heracross, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5265,7 +5265,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Heracross ) OVERWORLD_FEMALE( - gObjectEventPic_HeracrossF, + sPicTable_HeracrossF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5330,7 +5330,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = FOOTPRINT(Heracross) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_HeracrossMega, + sPicTable_HeracrossMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5415,7 +5415,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Sneasel) OVERWORLD( - gObjectEventPic_Sneasel, + sPicTable_Sneasel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5424,7 +5424,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Sneasel ) OVERWORLD_FEMALE( - gObjectEventPic_SneaselF, + sPicTable_SneaselF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5500,7 +5500,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-4, 10, SHADOW_SIZE_M) FOOTPRINT(Weavile) OVERWORLD( - gObjectEventPic_Weavile, + sPicTable_Weavile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5509,7 +5509,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Weavile ) OVERWORLD_FEMALE( - gObjectEventPic_WeavileF, + sPicTable_WeavileF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5579,7 +5579,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Sneasel) OVERWORLD( - gObjectEventPic_SneaselHisui, + sPicTable_SneaselHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5588,7 +5588,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_SneaselHisui ) OVERWORLD_FEMALE( - gObjectEventPic_SneaselHisuiF, + sPicTable_SneaselHisuiF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5652,7 +5652,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Sneasler) OVERWORLD( - gObjectEventPic_Sneasler, + sPicTable_Sneasler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5726,7 +5726,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-2, 1, SHADOW_SIZE_S) FOOTPRINT(Teddiursa) OVERWORLD( - gObjectEventPic_Teddiursa, + sPicTable_Teddiursa, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5803,7 +5803,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 14, SHADOW_SIZE_L) FOOTPRINT(Ursaring) OVERWORLD( - gObjectEventPic_Ursaring, + sPicTable_Ursaring, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5812,7 +5812,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Ursaring ) OVERWORLD_FEMALE( - gObjectEventPic_UrsaringF, + sPicTable_UrsaringF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5874,7 +5874,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 4, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Ursaluna) OVERWORLD( - gObjectEventPic_Ursaluna, + sPicTable_Ursaluna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6000,7 +6000,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Slugma) OVERWORLD( - gObjectEventPic_Slugma, + sPicTable_Slugma, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6077,7 +6077,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Magcargo) OVERWORLD( - gObjectEventPic_Magcargo, + sPicTable_Magcargo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6150,7 +6150,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-3, -6, SHADOW_SIZE_S) FOOTPRINT(Swinub) OVERWORLD( - gObjectEventPic_Swinub, + sPicTable_Swinub, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6230,7 +6230,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 3, SHADOW_SIZE_M) FOOTPRINT(Piloswine) OVERWORLD( - gObjectEventPic_Piloswine, + sPicTable_Piloswine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6239,7 +6239,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Piloswine ) OVERWORLD_FEMALE( - gObjectEventPic_PiloswineF, + sPicTable_PiloswineF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6315,7 +6315,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(7, 7, SHADOW_SIZE_L) FOOTPRINT(Mamoswine) OVERWORLD( - gObjectEventPic_Mamoswine, + sPicTable_Mamoswine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6324,7 +6324,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Mamoswine ) OVERWORLD_FEMALE( - gObjectEventPic_MamoswineF, + sPicTable_MamoswineF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6405,7 +6405,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 1, SHADOW_SIZE_M) FOOTPRINT(Corsola) OVERWORLD( - gObjectEventPic_Corsola, + sPicTable_Corsola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6470,7 +6470,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Corsola) OVERWORLD( - gObjectEventPic_CorsolaGalar, + sPicTable_CorsolaGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6536,7 +6536,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-3, 13, SHADOW_SIZE_S) FOOTPRINT(Cursola) OVERWORLD( - gObjectEventPic_Cursola, + sPicTable_Cursola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6609,7 +6609,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Remoraid) OVERWORLD( - gObjectEventPic_Remoraid, + sPicTable_Remoraid, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -6690,7 +6690,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 4, SHADOW_SIZE_M) FOOTPRINT(Octillery) OVERWORLD( - gObjectEventPic_Octillery, + sPicTable_Octillery, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6699,7 +6699,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Octillery ) OVERWORLD_FEMALE( - gObjectEventPic_OctilleryF, + sPicTable_OctilleryF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6764,7 +6764,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Delibird) OVERWORLD( - gObjectEventPic_Delibird, + sPicTable_Delibird, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6835,7 +6835,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 3, SHADOW_SIZE_S) FOOTPRINT(Mantyke) OVERWORLD( - gObjectEventPic_Mantyke, + sPicTable_Mantyke, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6912,7 +6912,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Mantine) OVERWORLD( - gObjectEventPic_Mantine, + sPicTable_Mantine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6981,7 +6981,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 9, SHADOW_SIZE_M) FOOTPRINT(Skarmory) OVERWORLD( - gObjectEventPic_Skarmory, + sPicTable_Skarmory, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7049,7 +7049,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 4, SHADOW_SIZE_M) FOOTPRINT(Houndour) OVERWORLD( - gObjectEventPic_Houndour, + sPicTable_Houndour, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7122,7 +7122,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-5, 13, SHADOW_SIZE_L) FOOTPRINT(Houndoom) OVERWORLD( - gObjectEventPic_Houndoom, + sPicTable_Houndoom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7131,7 +7131,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Houndoom ) OVERWORLD_FEMALE( - gObjectEventPic_HoundoomF, + sPicTable_HoundoomF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7194,7 +7194,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = FOOTPRINT(Houndoom) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_HoundoomMega, + sPicTable_HoundoomMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7271,7 +7271,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, -2, SHADOW_SIZE_M) FOOTPRINT(Phanpy) OVERWORLD( - gObjectEventPic_Phanpy, + sPicTable_Phanpy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7346,7 +7346,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(7, 2, SHADOW_SIZE_L) FOOTPRINT(Donphan) OVERWORLD( - gObjectEventPic_Donphan, + sPicTable_Donphan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7355,7 +7355,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Donphan ) OVERWORLD_FEMALE( - gObjectEventPic_DonphanF, + sPicTable_DonphanF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7424,7 +7424,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 13, SHADOW_SIZE_M) FOOTPRINT(Stantler) OVERWORLD( - gObjectEventPic_Stantler, + sPicTable_Stantler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7490,7 +7490,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Wyrdeer) OVERWORLD( - gObjectEventPic_Wyrdeer, + sPicTable_Wyrdeer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7564,7 +7564,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(6, 7, SHADOW_SIZE_S) FOOTPRINT(Smeargle) OVERWORLD( - gObjectEventPic_Smeargle, + sPicTable_Smeargle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7638,7 +7638,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-3, 4, SHADOW_SIZE_M) FOOTPRINT(Miltank) OVERWORLD( - gObjectEventPic_Miltank, + sPicTable_Miltank, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7718,7 +7718,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-4, 7, SHADOW_SIZE_L) FOOTPRINT(Raikou) OVERWORLD( - gObjectEventPic_Raikou, + sPicTable_Raikou, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7798,7 +7798,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 8, SHADOW_SIZE_L) FOOTPRINT(Entei) OVERWORLD( - gObjectEventPic_Entei, + sPicTable_Entei, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7878,7 +7878,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Suicune) OVERWORLD( - gObjectEventPic_Suicune, + sPicTable_Suicune, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7949,7 +7949,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Larvitar) OVERWORLD( - gObjectEventPic_Larvitar, + sPicTable_Larvitar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8016,7 +8016,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(3, 3, SHADOW_SIZE_S) FOOTPRINT(Pupitar) OVERWORLD( - gObjectEventPic_Pupitar, + sPicTable_Pupitar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -8090,7 +8090,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(-1, 11, SHADOW_SIZE_L) FOOTPRINT(Tyranitar) OVERWORLD( - gObjectEventPic_Tyranitar, + sPicTable_Tyranitar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8156,7 +8156,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = FOOTPRINT(Tyranitar) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_TyranitarMega, + sPicTable_TyranitarMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8246,7 +8246,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(2, 17, SHADOW_SIZE_L) FOOTPRINT(Lugia) OVERWORLD( - gObjectEventPic_Lugia, + sPicTable_Lugia, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -8325,7 +8325,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(1, 17, SHADOW_SIZE_L) FOOTPRINT(HoOh) OVERWORLD( - gObjectEventPic_HoOh, + sPicTable_HoOh, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -8406,7 +8406,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SHADOW(0, 14, SHADOW_SIZE_S) FOOTPRINT(Celebi) OVERWORLD( - gObjectEventPic_Celebi, + sPicTable_Celebi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index ebdca44984..7b87415c76 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -60,7 +60,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 4, SHADOW_SIZE_S) FOOTPRINT(Treecko) OVERWORLD( - gObjectEventPic_Treecko, + sPicTable_Treecko, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -130,7 +130,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 7, SHADOW_SIZE_M) FOOTPRINT(Grovyle) OVERWORLD( - gObjectEventPic_Grovyle, + sPicTable_Grovyle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -203,7 +203,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 11, SHADOW_SIZE_L) FOOTPRINT(Sceptile) OVERWORLD( - gObjectEventPic_Sceptile, + sPicTable_Sceptile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -269,7 +269,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Sceptile) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SceptileMega, + sPicTable_SceptileMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -350,7 +350,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Torchic) OVERWORLD( - gObjectEventPic_Torchic, + sPicTable_Torchic, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -359,7 +359,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Torchic ) OVERWORLD_FEMALE( - gObjectEventPic_TorchicF, + sPicTable_TorchicF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -432,7 +432,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Combusken) OVERWORLD( - gObjectEventPic_Combusken, + sPicTable_Combusken, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -441,7 +441,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Combusken ) OVERWORLD_FEMALE( - gObjectEventPic_CombuskenF, + sPicTable_CombuskenF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -520,7 +520,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 8, SHADOW_SIZE_M) FOOTPRINT(Blaziken) OVERWORLD( - gObjectEventPic_Blaziken, + sPicTable_Blaziken, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -529,7 +529,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Blaziken ) OVERWORLD_FEMALE( - gObjectEventPic_BlazikenF, + sPicTable_BlazikenF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -593,7 +593,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Blaziken) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_BlazikenMega, + sPicTable_BlazikenMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -668,7 +668,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 1, SHADOW_SIZE_S) FOOTPRINT(Mudkip) OVERWORLD( - gObjectEventPic_Mudkip, + sPicTable_Mudkip, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -742,7 +742,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Marshtomp) OVERWORLD( - gObjectEventPic_Marshtomp, + sPicTable_Marshtomp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -817,7 +817,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(5, 7, SHADOW_SIZE_L) FOOTPRINT(Swampert) OVERWORLD( - gObjectEventPic_Swampert, + sPicTable_Swampert, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -883,7 +883,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Swampert) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SwampertMega, + sPicTable_SwampertMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -966,7 +966,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 2, SHADOW_SIZE_M) FOOTPRINT(Poochyena) OVERWORLD( - gObjectEventPic_Poochyena, + sPicTable_Poochyena, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1040,7 +1040,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 6, SHADOW_SIZE_L) FOOTPRINT(Mightyena) OVERWORLD( - gObjectEventPic_Mightyena, + sPicTable_Mightyena, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1124,7 +1124,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-4, 0, SHADOW_SIZE_M) FOOTPRINT(Zigzagoon) OVERWORLD( - gObjectEventPic_Zigzagoon, + sPicTable_Zigzagoon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1201,7 +1201,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-6, 0, SHADOW_SIZE_L) FOOTPRINT(Linoone) OVERWORLD( - gObjectEventPic_Linoone, + sPicTable_Linoone, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1265,7 +1265,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-5, 0, SHADOW_SIZE_M) FOOTPRINT(Zigzagoon) OVERWORLD( - gObjectEventPic_ZigzagoonGalar, + sPicTable_ZigzagoonGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1331,7 +1331,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-4, 0, SHADOW_SIZE_L) FOOTPRINT(Linoone) OVERWORLD( - gObjectEventPic_LinooneGalar, + sPicTable_LinooneGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1396,7 +1396,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 13, SHADOW_SIZE_M) FOOTPRINT(Obstagoon) OVERWORLD( - gObjectEventPic_Obstagoon, + sPicTable_Obstagoon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1473,7 +1473,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Wurmple) OVERWORLD( - gObjectEventPic_Wurmple, + sPicTable_Wurmple, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1542,7 +1542,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, -4, SHADOW_SIZE_M) FOOTPRINT(Silcoon) OVERWORLD( - gObjectEventPic_Silcoon, + sPicTable_Silcoon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-5, 12, SHADOW_SIZE_S) FOOTPRINT(Beautifly) OVERWORLD( - gObjectEventPic_Beautifly, + sPicTable_Beautifly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1641,7 +1641,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Beautifly ) OVERWORLD_FEMALE( - gObjectEventPic_BeautiflyF, + sPicTable_BeautiflyF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1713,7 +1713,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, -4, SHADOW_SIZE_M) FOOTPRINT(Cascoon) OVERWORLD( - gObjectEventPic_Cascoon, + sPicTable_Cascoon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -1811,7 +1811,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 11, SHADOW_SIZE_S) FOOTPRINT(Dustox) OVERWORLD( - gObjectEventPic_Dustox, + sPicTable_Dustox, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1820,7 +1820,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Dustox ) OVERWORLD_FEMALE( - gObjectEventPic_DustoxF, + sPicTable_DustoxF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -1887,7 +1887,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, -3, SHADOW_SIZE_S) FOOTPRINT(Lotad) OVERWORLD( - gObjectEventPic_Lotad, + sPicTable_Lotad, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1958,7 +1958,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 2, SHADOW_SIZE_S) FOOTPRINT(Lombre) OVERWORLD( - gObjectEventPic_Lombre, + sPicTable_Lombre, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2042,7 +2042,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 14, SHADOW_SIZE_M) FOOTPRINT(Ludicolo) OVERWORLD( - gObjectEventPic_Ludicolo, + sPicTable_Ludicolo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2051,7 +2051,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Ludicolo ) OVERWORLD_FEMALE( - gObjectEventPic_LudicoloF, + sPicTable_LudicoloF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2124,7 +2124,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Seedot) OVERWORLD( - gObjectEventPic_Seedot, + sPicTable_Seedot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2205,7 +2205,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 5, SHADOW_SIZE_S) FOOTPRINT(Nuzleaf) OVERWORLD( - gObjectEventPic_Nuzleaf, + sPicTable_Nuzleaf, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2214,7 +2214,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Nuzleaf ) OVERWORLD_FEMALE( - gObjectEventPic_NuzleafF, + sPicTable_NuzleafF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2296,7 +2296,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-5, 5, SHADOW_SIZE_M) FOOTPRINT(Shiftry) OVERWORLD( - gObjectEventPic_Shiftry, + sPicTable_Shiftry, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2305,7 +2305,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Shiftry ) OVERWORLD_FEMALE( - gObjectEventPic_ShiftryF, + sPicTable_ShiftryF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2377,7 +2377,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Taillow) OVERWORLD( - gObjectEventPic_Taillow, + sPicTable_Taillow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2451,7 +2451,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-7, 7, SHADOW_SIZE_M) FOOTPRINT(Swellow) OVERWORLD( - gObjectEventPic_Swellow, + sPicTable_Swellow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2525,7 +2525,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 15, SHADOW_SIZE_S) FOOTPRINT(Wingull) OVERWORLD( - gObjectEventPic_Wingull, + sPicTable_Wingull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2611,7 +2611,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 17, SHADOW_SIZE_M) FOOTPRINT(Pelipper) OVERWORLD( - gObjectEventPic_Pelipper, + sPicTable_Pelipper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2687,7 +2687,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Ralts) OVERWORLD( - gObjectEventPic_Ralts, + sPicTable_Ralts, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2755,7 +2755,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Kirlia) OVERWORLD( - gObjectEventPic_Kirlia, + sPicTable_Kirlia, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2829,7 +2829,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 14, SHADOW_SIZE_L) FOOTPRINT(Gardevoir) OVERWORLD( - gObjectEventPic_Gardevoir, + sPicTable_Gardevoir, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2895,7 +2895,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Gardevoir) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GardevoirMega, + sPicTable_GardevoirMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2976,7 +2976,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 13, SHADOW_SIZE_L) FOOTPRINT(Gallade) OVERWORLD( - gObjectEventPic_Gallade, + sPicTable_Gallade, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3042,7 +3042,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Gallade) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GalladeMega, + sPicTable_GalladeMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3119,7 +3119,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, -3, SHADOW_SIZE_S) FOOTPRINT(Surskit) OVERWORLD( - gObjectEventPic_Surskit, + sPicTable_Surskit, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -3202,7 +3202,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-4, 17, SHADOW_SIZE_M) FOOTPRINT(Masquerain) OVERWORLD( - gObjectEventPic_Masquerain, + sPicTable_Masquerain, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3284,7 +3284,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Shroomish) OVERWORLD( - gObjectEventPic_Shroomish, + sPicTable_Shroomish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3360,7 +3360,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-4, 9, SHADOW_SIZE_M) FOOTPRINT(Breloom) OVERWORLD( - gObjectEventPic_Breloom, + sPicTable_Breloom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3431,7 +3431,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, -4, SHADOW_SIZE_M) FOOTPRINT(Slakoth) OVERWORLD( - gObjectEventPic_Slakoth, + sPicTable_Slakoth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3503,7 +3503,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 6, SHADOW_SIZE_M) FOOTPRINT(Vigoroth) OVERWORLD( - gObjectEventPic_Vigoroth, + sPicTable_Vigoroth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3580,7 +3580,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Slaking) OVERWORLD( - gObjectEventPic_Slaking, + sPicTable_Slaking, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3651,7 +3651,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, -3, SHADOW_SIZE_M) FOOTPRINT(Nincada) OVERWORLD( - gObjectEventPic_Nincada, + sPicTable_Nincada, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -3736,7 +3736,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 10, SHADOW_SIZE_S) FOOTPRINT(Ninjask) OVERWORLD( - gObjectEventPic_Ninjask, + sPicTable_Ninjask, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3805,7 +3805,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 9, SHADOW_SIZE_S) FOOTPRINT(Shedinja) OVERWORLD( - gObjectEventPic_Shedinja, + sPicTable_Shedinja, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3880,7 +3880,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(Whismur) OVERWORLD( - gObjectEventPic_Whismur, + sPicTable_Whismur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3950,7 +3950,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 9, SHADOW_SIZE_M) FOOTPRINT(Loudred) OVERWORLD( - gObjectEventPic_Loudred, + sPicTable_Loudred, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4025,7 +4025,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 12, SHADOW_SIZE_L) FOOTPRINT(Exploud) OVERWORLD( - gObjectEventPic_Exploud, + sPicTable_Exploud, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4100,7 +4100,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 5, SHADOW_SIZE_M) FOOTPRINT(Makuhita) OVERWORLD( - gObjectEventPic_Makuhita, + sPicTable_Makuhita, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4170,7 +4170,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 9, SHADOW_SIZE_L) FOOTPRINT(Hariyama) OVERWORLD( - gObjectEventPic_Hariyama, + sPicTable_Hariyama, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4243,7 +4243,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 3, SHADOW_SIZE_M) FOOTPRINT(Nosepass) OVERWORLD( - gObjectEventPic_Nosepass, + sPicTable_Nosepass, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4318,7 +4318,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 13, SHADOW_SIZE_L) FOOTPRINT(Probopass) OVERWORLD( - gObjectEventPic_Probopass, + sPicTable_Probopass, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4391,7 +4391,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Skitty) OVERWORLD( - gObjectEventPic_Skitty, + sPicTable_Skitty, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4470,7 +4470,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Delcatty) OVERWORLD( - gObjectEventPic_Delcatty, + sPicTable_Delcatty, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4546,7 +4546,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 3, SHADOW_SIZE_S) FOOTPRINT(Sableye) OVERWORLD( - gObjectEventPic_Sableye, + sPicTable_Sableye, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4613,7 +4613,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Sableye) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SableyeMega, + sPicTable_SableyeMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4699,7 +4699,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 4, SHADOW_SIZE_L) FOOTPRINT(Mawile) OVERWORLD( - gObjectEventPic_Mawile, + sPicTable_Mawile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4767,7 +4767,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Mawile) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_MawileMega, + sPicTable_MawileMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4844,7 +4844,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, -3, SHADOW_SIZE_S) FOOTPRINT(Aron) OVERWORLD( - gObjectEventPic_Aron, + sPicTable_Aron, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4915,7 +4915,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 2, SHADOW_SIZE_L) FOOTPRINT(Lairon) OVERWORLD( - gObjectEventPic_Lairon, + sPicTable_Lairon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4989,7 +4989,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(5, 12, SHADOW_SIZE_L) FOOTPRINT(Aggron) OVERWORLD( - gObjectEventPic_Aggron, + sPicTable_Aggron, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5056,7 +5056,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Aggron) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AggronMega, + sPicTable_AggronMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5135,7 +5135,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Meditite) OVERWORLD( - gObjectEventPic_Meditite, + sPicTable_Meditite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5144,7 +5144,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Meditite ) OVERWORLD_FEMALE( - gObjectEventPic_MedititeF, + sPicTable_MedititeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5220,7 +5220,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 13, SHADOW_SIZE_S) FOOTPRINT(Medicham) OVERWORLD( - gObjectEventPic_Medicham, + sPicTable_Medicham, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5229,7 +5229,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Medicham ) OVERWORLD_FEMALE( - gObjectEventPic_MedichamF, + sPicTable_MedichamF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5293,7 +5293,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Medicham) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_MedichamMega, + sPicTable_MedichamMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5368,7 +5368,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(3, -1, SHADOW_SIZE_M) FOOTPRINT(Electrike) OVERWORLD( - gObjectEventPic_Electrike, + sPicTable_Electrike, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5438,7 +5438,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 10, SHADOW_SIZE_M) FOOTPRINT(Manectric) OVERWORLD( - gObjectEventPic_Manectric, + sPicTable_Manectric, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5503,7 +5503,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Manectric) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_ManectricMega, + sPicTable_ManectricMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5583,7 +5583,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 3, SHADOW_SIZE_S) FOOTPRINT(Plusle) OVERWORLD( - gObjectEventPic_Plusle, + sPicTable_Plusle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5659,7 +5659,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-4, 3, SHADOW_SIZE_S) FOOTPRINT(Minun) OVERWORLD( - gObjectEventPic_Minun, + sPicTable_Minun, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5739,7 +5739,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Volbeat) OVERWORLD( - gObjectEventPic_Volbeat, + sPicTable_Volbeat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -5819,7 +5819,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Illumise) OVERWORLD( - gObjectEventPic_Illumise, + sPicTable_Illumise, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -5891,7 +5891,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 0, SHADOW_SIZE_S) FOOTPRINT(Budew) OVERWORLD( - gObjectEventPic_Budew, + sPicTable_Budew, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5968,7 +5968,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Roselia) OVERWORLD( - gObjectEventPic_Roselia, + sPicTable_Roselia, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5977,7 +5977,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Roselia ) OVERWORLD_FEMALE( - gObjectEventPic_RoseliaF, + sPicTable_RoseliaF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6059,7 +6059,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Roserade) OVERWORLD( - gObjectEventPic_Roserade, + sPicTable_Roserade, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6068,7 +6068,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Roserade ) OVERWORLD_FEMALE( - gObjectEventPic_RoseradeF, + sPicTable_RoseradeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6145,7 +6145,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, -2, SHADOW_SIZE_S) FOOTPRINT(Gulpin) OVERWORLD( - gObjectEventPic_Gulpin, + sPicTable_Gulpin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -6154,7 +6154,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Gulpin ) OVERWORLD_FEMALE( - gObjectEventPic_GulpinF, + sPicTable_GulpinF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -6229,7 +6229,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 3, SHADOW_SIZE_L) FOOTPRINT(Swalot) OVERWORLD( - gObjectEventPic_Swalot, + sPicTable_Swalot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6238,7 +6238,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Swalot ) OVERWORLD_FEMALE( - gObjectEventPic_SwalotF, + sPicTable_SwalotF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6311,7 +6311,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 8, SHADOW_SIZE_S) FOOTPRINT(Carvanha) OVERWORLD( - gObjectEventPic_Carvanha, + sPicTable_Carvanha, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6386,7 +6386,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Sharpedo) OVERWORLD( - gObjectEventPic_Sharpedo, + sPicTable_Sharpedo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6454,7 +6454,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Sharpedo) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SharpedoMega, + sPicTable_SharpedoMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6531,7 +6531,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 3, SHADOW_SIZE_L) FOOTPRINT(Wailmer) OVERWORLD( - gObjectEventPic_Wailmer, + sPicTable_Wailmer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -6600,7 +6600,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 7, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Wailord) OVERWORLD( - gObjectEventPic_Wailord, + sPicTable_Wailord, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -6680,7 +6680,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 2, SHADOW_SIZE_S) FOOTPRINT(Numel) OVERWORLD( - gObjectEventPic_Numel, + sPicTable_Numel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6689,7 +6689,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Numel ) OVERWORLD_FEMALE( - gObjectEventPic_NumelF, + sPicTable_NumelF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6770,7 +6770,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 4, SHADOW_SIZE_L) FOOTPRINT(Camerupt) OVERWORLD( - gObjectEventPic_Camerupt, + sPicTable_Camerupt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6779,7 +6779,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Camerupt ) OVERWORLD_FEMALE( - gObjectEventPic_CameruptF, + sPicTable_CameruptF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6844,7 +6844,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Camerupt) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_CameruptMega, + sPicTable_CameruptMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6924,7 +6924,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 7, SHADOW_SIZE_L) FOOTPRINT(Torkoal) OVERWORLD( - gObjectEventPic_Torkoal, + sPicTable_Torkoal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7001,7 +7001,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Spoink) OVERWORLD( - gObjectEventPic_Spoink, + sPicTable_Spoink, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -7072,7 +7072,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Grumpig) OVERWORLD( - gObjectEventPic_Grumpig, + sPicTable_Grumpig, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7147,7 +7147,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 6, SHADOW_SIZE_S) FOOTPRINT(Spinda) OVERWORLD( - gObjectEventPic_Spinda, + sPicTable_Spinda, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7223,7 +7223,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, -1, SHADOW_SIZE_S) FOOTPRINT(Trapinch) OVERWORLD( - gObjectEventPic_Trapinch, + sPicTable_Trapinch, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7300,7 +7300,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 0, SHADOW_SIZE_L) FOOTPRINT(Vibrava) OVERWORLD( - gObjectEventPic_Vibrava, + sPicTable_Vibrava, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7383,7 +7383,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 17, SHADOW_SIZE_M) FOOTPRINT(Flygon) OVERWORLD( - gObjectEventPic_Flygon, + sPicTable_Flygon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7460,7 +7460,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Cacnea) OVERWORLD( - gObjectEventPic_Cacnea, + sPicTable_Cacnea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7536,7 +7536,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 14, SHADOW_SIZE_M) FOOTPRINT(Cacturne) OVERWORLD( - gObjectEventPic_Cacturne, + sPicTable_Cacturne, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7545,7 +7545,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Cacturne ) OVERWORLD_FEMALE( - gObjectEventPic_CacturneF, + sPicTable_CacturneF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7616,7 +7616,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 0, SHADOW_SIZE_S) FOOTPRINT(Swablu) OVERWORLD( - gObjectEventPic_Swablu, + sPicTable_Swablu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7687,7 +7687,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 14, SHADOW_SIZE_L) FOOTPRINT(Altaria) OVERWORLD( - gObjectEventPic_Altaria, + sPicTable_Altaria, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7754,7 +7754,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Altaria) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AltariaMega, + sPicTable_AltariaMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7833,7 +7833,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Zangoose) OVERWORLD( - gObjectEventPic_Zangoose, + sPicTable_Zangoose, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7909,7 +7909,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 7, SHADOW_SIZE_L) FOOTPRINT(Seviper) OVERWORLD( - gObjectEventPic_Seviper, + sPicTable_Seviper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BIKE_TIRE, @@ -7989,7 +7989,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Lunatone) OVERWORLD( - gObjectEventPic_Lunatone, + sPicTable_Lunatone, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8068,7 +8068,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 15, SHADOW_SIZE_M) FOOTPRINT(Solrock) OVERWORLD( - gObjectEventPic_Solrock, + sPicTable_Solrock, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8151,7 +8151,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Barboach) OVERWORLD( - gObjectEventPic_Barboach, + sPicTable_Barboach, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -8233,7 +8233,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 3, SHADOW_SIZE_L) FOOTPRINT(Whiscash) OVERWORLD( - gObjectEventPic_Whiscash, + sPicTable_Whiscash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8305,7 +8305,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 5, SHADOW_SIZE_M) FOOTPRINT(Corphish) OVERWORLD( - gObjectEventPic_Corphish, + sPicTable_Corphish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8375,7 +8375,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(6, 9, SHADOW_SIZE_M) FOOTPRINT(Crawdaunt) OVERWORLD( - gObjectEventPic_Crawdaunt, + sPicTable_Crawdaunt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8449,7 +8449,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 5, SHADOW_SIZE_S) FOOTPRINT(Baltoy) OVERWORLD( - gObjectEventPic_Baltoy, + sPicTable_Baltoy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -8522,7 +8522,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 18, SHADOW_SIZE_M) FOOTPRINT(Claydol) OVERWORLD( - gObjectEventPic_Claydol, + sPicTable_Claydol, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -8599,7 +8599,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Lileep) OVERWORLD( - gObjectEventPic_Lileep, + sPicTable_Lileep, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -8678,7 +8678,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Cradily) OVERWORLD( - gObjectEventPic_Cradily, + sPicTable_Cradily, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -8756,7 +8756,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Anorith) OVERWORLD( - gObjectEventPic_Anorith, + sPicTable_Anorith, SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, @@ -8832,7 +8832,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 11, SHADOW_SIZE_L) FOOTPRINT(Armaldo) OVERWORLD( - gObjectEventPic_Armaldo, + sPicTable_Armaldo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8908,7 +8908,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Feebas) OVERWORLD( - gObjectEventPic_Feebas, + sPicTable_Feebas, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -8993,7 +8993,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Milotic) OVERWORLD( - gObjectEventPic_Milotic, + sPicTable_Milotic, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -9002,7 +9002,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Milotic ) OVERWORLD_FEMALE( - gObjectEventPic_MiloticF, + sPicTable_MiloticF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -9073,7 +9073,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 10, SHADOW_SIZE_S) FOOTPRINT(Castform) OVERWORLD( - gObjectEventPic_CastformNormal, + sPicTable_CastformNormal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9149,7 +9149,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Castform) OVERWORLD( - gObjectEventPic_CastformSunny, + sPicTable_CastformSunny, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9223,7 +9223,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Castform) OVERWORLD( - gObjectEventPic_CastformRainy, + sPicTable_CastformRainy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9297,7 +9297,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 8, SHADOW_SIZE_S) FOOTPRINT(Castform) OVERWORLD( - gObjectEventPic_CastformSnowy, + sPicTable_CastformSnowy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9375,7 +9375,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 8, SHADOW_SIZE_S) FOOTPRINT(Kecleon) OVERWORLD( - gObjectEventPic_Kecleon, + sPicTable_Kecleon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9454,7 +9454,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 12, SHADOW_SIZE_S) FOOTPRINT(Shuppet) OVERWORLD( - gObjectEventPic_Shuppet, + sPicTable_Shuppet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9532,7 +9532,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Banette) OVERWORLD( - gObjectEventPic_Banette, + sPicTable_Banette, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9599,7 +9599,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Banette) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_BanetteMega, + sPicTable_BanetteMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9681,7 +9681,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 12, SHADOW_SIZE_S) FOOTPRINT(Duskull) OVERWORLD( - gObjectEventPic_Duskull, + sPicTable_Duskull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -9758,7 +9758,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Dusclops) OVERWORLD( - gObjectEventPic_Dusclops, + sPicTable_Dusclops, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9847,7 +9847,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(6, 13, SHADOW_SIZE_M) FOOTPRINT(Dusknoir) OVERWORLD( - gObjectEventPic_Dusknoir, + sPicTable_Dusknoir, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9922,7 +9922,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-6, 13, SHADOW_SIZE_L) FOOTPRINT(Tropius) OVERWORLD( - gObjectEventPic_Tropius, + sPicTable_Tropius, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9998,7 +9998,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, -2, SHADOW_SIZE_S) FOOTPRINT(Chingling) OVERWORLD( - gObjectEventPic_Chingling, + sPicTable_Chingling, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10082,7 +10082,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-3, 16, SHADOW_SIZE_S) FOOTPRINT(Chimecho) OVERWORLD( - gObjectEventPic_Chimecho, + sPicTable_Chimecho, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -10159,7 +10159,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 6, SHADOW_SIZE_L) FOOTPRINT(Absol) OVERWORLD( - gObjectEventPic_Absol, + sPicTable_Absol, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10227,7 +10227,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Absol) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AbsolMega, + sPicTable_AbsolMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10309,7 +10309,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Snorunt) OVERWORLD( - gObjectEventPic_Snorunt, + sPicTable_Snorunt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10385,7 +10385,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 15, SHADOW_SIZE_M) FOOTPRINT(Glalie) OVERWORLD( - gObjectEventPic_Glalie, + sPicTable_Glalie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10451,7 +10451,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Glalie) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GlalieMega, + sPicTable_GlalieMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10524,7 +10524,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 10, SHADOW_SIZE_S) FOOTPRINT(Froslass) OVERWORLD( - gObjectEventPic_Froslass, + sPicTable_Froslass, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10603,7 +10603,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Spheal) OVERWORLD( - gObjectEventPic_Spheal, + sPicTable_Spheal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10677,7 +10677,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 2, SHADOW_SIZE_L) FOOTPRINT(Sealeo) OVERWORLD( - gObjectEventPic_Sealeo, + sPicTable_Sealeo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10756,7 +10756,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 8, SHADOW_SIZE_L) FOOTPRINT(Walrein) OVERWORLD( - gObjectEventPic_Walrein, + sPicTable_Walrein, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10828,7 +10828,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 1, SHADOW_SIZE_M) FOOTPRINT(Clamperl) OVERWORLD( - gObjectEventPic_Clamperl, + sPicTable_Clamperl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -10903,7 +10903,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 7, SHADOW_SIZE_L) FOOTPRINT(Huntail) OVERWORLD( - gObjectEventPic_Huntail, + sPicTable_Huntail, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -10972,7 +10972,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 5, SHADOW_SIZE_M) FOOTPRINT(Gorebyss) OVERWORLD( - gObjectEventPic_Gorebyss, + sPicTable_Gorebyss, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -11050,7 +11050,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Relicanth) OVERWORLD( - gObjectEventPic_Relicanth, + sPicTable_Relicanth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11059,7 +11059,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Relicanth ) OVERWORLD_FEMALE( - gObjectEventPic_RelicanthF, + sPicTable_RelicanthF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11129,7 +11129,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Luvdisc) OVERWORLD( - gObjectEventPic_Luvdisc, + sPicTable_Luvdisc, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, @@ -11201,7 +11201,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 3, SHADOW_SIZE_S) FOOTPRINT(Bagon) OVERWORLD( - gObjectEventPic_Bagon, + sPicTable_Bagon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11272,7 +11272,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 2, SHADOW_SIZE_M) FOOTPRINT(Shelgon) OVERWORLD( - gObjectEventPic_Shelgon, + sPicTable_Shelgon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11349,7 +11349,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(3, 8, SHADOW_SIZE_L) FOOTPRINT(Salamence) OVERWORLD( - gObjectEventPic_Salamence, + sPicTable_Salamence, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11416,7 +11416,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Salamence) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_SalamenceMega, + sPicTable_SalamenceMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11493,7 +11493,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Beldum) OVERWORLD( - gObjectEventPic_Beldum, + sPicTable_Beldum, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11564,7 +11564,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 2, SHADOW_SIZE_M) FOOTPRINT(Metang) OVERWORLD( - gObjectEventPic_Metang, + sPicTable_Metang, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -11640,7 +11640,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, -2, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Metagross) OVERWORLD( - gObjectEventPic_Metagross, + sPicTable_Metagross, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11707,7 +11707,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Metagross) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_MetagrossMega, + sPicTable_MetagrossMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11789,7 +11789,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Regirock) OVERWORLD( - gObjectEventPic_Regirock, + sPicTable_Regirock, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11867,7 +11867,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Regice) OVERWORLD( - gObjectEventPic_Regice, + sPicTable_Regice, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11946,7 +11946,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(4, 8, SHADOW_SIZE_L) FOOTPRINT(Registeel) OVERWORLD( - gObjectEventPic_Registeel, + sPicTable_Registeel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12025,7 +12025,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(3, 15, SHADOW_SIZE_M) FOOTPRINT(Latias) OVERWORLD( - gObjectEventPic_Latias, + sPicTable_Latias, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -12094,7 +12094,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Latias) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_LatiasMega, + sPicTable_LatiasMega, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12178,7 +12178,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(1, 17, SHADOW_SIZE_M) FOOTPRINT(Latios) OVERWORLD( - gObjectEventPic_Latios, + sPicTable_Latios, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -12247,7 +12247,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Latios) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_LatiosMega, + sPicTable_LatiosMega, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12331,7 +12331,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(-1, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kyogre) OVERWORLD( - gObjectEventPic_Kyogre, + sPicTable_Kyogre, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12399,7 +12399,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Kyogre) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_KyogrePrimal, + sPicTable_KyogrePrimal, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12483,7 +12483,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(2, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Groudon) OVERWORLD( - gObjectEventPic_Groudon, + sPicTable_Groudon, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12552,7 +12552,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Groudon) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GroudonPrimal, + sPicTable_GroudonPrimal, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12639,7 +12639,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 17, SHADOW_SIZE_L) FOOTPRINT(Rayquaza) OVERWORLD( - gObjectEventPic_Rayquaza, + sPicTable_Rayquaza, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12710,7 +12710,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Rayquaza) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_RayquazaMega, + sPicTable_RayquazaMega, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -12802,7 +12802,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 12, SHADOW_SIZE_S) FOOTPRINT(Jirachi) OVERWORLD( - gObjectEventPic_Jirachi, + sPicTable_Jirachi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -12881,7 +12881,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 14, SHADOW_SIZE_M) FOOTPRINT(Deoxys) OVERWORLD( - gObjectEventPic_DeoxysNormal, + sPicTable_DeoxysNormal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12950,7 +12950,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(0, 14, SHADOW_SIZE_M) OVERWORLD( - gObjectEventPic_DeoxysAttack, + sPicTable_DeoxysAttack, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13020,7 +13020,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Deoxys) OVERWORLD( - gObjectEventPic_DeoxysDefense, + sPicTable_DeoxysDefense, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13090,7 +13090,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SHADOW(3, 13, SHADOW_SIZE_M) FOOTPRINT(Deoxys) OVERWORLD( - gObjectEventPic_DeoxysSpeed, + sPicTable_DeoxysSpeed, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index b51ab180a5..a6d6302012 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -58,7 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Turtwig) OVERWORLD( - gObjectEventPic_Turtwig, + sPicTable_Turtwig, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -127,7 +127,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 2, SHADOW_SIZE_L) FOOTPRINT(Grotle) OVERWORLD( - gObjectEventPic_Grotle, + sPicTable_Grotle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -201,7 +201,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Torterra) OVERWORLD( - gObjectEventPic_Torterra, + sPicTable_Torterra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -273,7 +273,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 3, SHADOW_SIZE_S) FOOTPRINT(Chimchar) OVERWORLD( - gObjectEventPic_Chimchar, + sPicTable_Chimchar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -345,7 +345,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-7, 6, SHADOW_SIZE_S) FOOTPRINT(Monferno) OVERWORLD( - gObjectEventPic_Monferno, + sPicTable_Monferno, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -420,7 +420,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 9, SHADOW_SIZE_L) FOOTPRINT(Infernape) OVERWORLD( - gObjectEventPic_Infernape, + sPicTable_Infernape, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -492,7 +492,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, -1, SHADOW_SIZE_S) FOOTPRINT(Piplup) OVERWORLD( - gObjectEventPic_Piplup, + sPicTable_Piplup, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -570,7 +570,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Prinplup) OVERWORLD( - gObjectEventPic_Prinplup, + sPicTable_Prinplup, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -647,7 +647,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 12, SHADOW_SIZE_M) FOOTPRINT(Empoleon) OVERWORLD( - gObjectEventPic_Empoleon, + sPicTable_Empoleon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -727,7 +727,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-2, 1, SHADOW_SIZE_S) FOOTPRINT(Starly) OVERWORLD( - gObjectEventPic_Starly, + sPicTable_Starly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -736,7 +736,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Starly ) OVERWORLD_FEMALE( - gObjectEventPic_StarlyF, + sPicTable_StarlyF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -807,7 +807,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Staravia) OVERWORLD( - gObjectEventPic_Staravia, + sPicTable_Staravia, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -816,7 +816,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Staravia ) OVERWORLD_FEMALE( - gObjectEventPic_StaraviaF, + sPicTable_StaraviaF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -892,7 +892,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 10, SHADOW_SIZE_M) FOOTPRINT(Staraptor) OVERWORLD( - gObjectEventPic_Staraptor, + sPicTable_Staraptor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -901,7 +901,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Staraptor ) OVERWORLD_FEMALE( - gObjectEventPic_StaraptorF, + sPicTable_StaraptorF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -977,7 +977,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 1, SHADOW_SIZE_M) FOOTPRINT(Bidoof) OVERWORLD( - gObjectEventPic_Bidoof, + sPicTable_Bidoof, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -986,7 +986,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Bidoof ) OVERWORLD_FEMALE( - gObjectEventPic_BidoofF, + sPicTable_BidoofF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1058,7 +1058,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-5, 5, SHADOW_SIZE_M) FOOTPRINT(Bibarel) OVERWORLD( - gObjectEventPic_Bibarel, + sPicTable_Bibarel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1067,7 +1067,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Bibarel ) OVERWORLD_FEMALE( - gObjectEventPic_BibarelF, + sPicTable_BibarelF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1153,7 +1153,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-5, 2, SHADOW_SIZE_S) FOOTPRINT(Kricketot) OVERWORLD( - gObjectEventPic_Kricketot, + sPicTable_Kricketot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1162,7 +1162,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Kricketot ) OVERWORLD_FEMALE( - gObjectEventPic_KricketotF, + sPicTable_KricketotF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1239,7 +1239,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-3, 6, SHADOW_SIZE_S) FOOTPRINT(Kricketune) OVERWORLD( - gObjectEventPic_Kricketune, + sPicTable_Kricketune, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1248,7 +1248,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Kricketune ) OVERWORLD_FEMALE( - gObjectEventPic_KricketuneF, + sPicTable_KricketuneF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1320,7 +1320,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Shinx) OVERWORLD( - gObjectEventPic_Shinx, + sPicTable_Shinx, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1329,7 +1329,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Shinx ) OVERWORLD_FEMALE( - gObjectEventPic_ShinxF, + sPicTable_ShinxF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1400,7 +1400,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-4, 2, SHADOW_SIZE_M) FOOTPRINT(Luxio) OVERWORLD( - gObjectEventPic_Luxio, + sPicTable_Luxio, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1409,7 +1409,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Luxio ) OVERWORLD_FEMALE( - gObjectEventPic_LuxioF, + sPicTable_LuxioF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1488,7 +1488,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 10, SHADOW_SIZE_L) FOOTPRINT(Luxray) OVERWORLD( - gObjectEventPic_Luxray, + sPicTable_Luxray, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1497,7 +1497,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Luxray ) OVERWORLD_FEMALE( - gObjectEventPic_LuxrayF, + sPicTable_LuxrayF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1562,7 +1562,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 4, SHADOW_SIZE_S) FOOTPRINT(Cranidos) OVERWORLD( - gObjectEventPic_Cranidos, + sPicTable_Cranidos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(7, 11, SHADOW_SIZE_L) FOOTPRINT(Rampardos) OVERWORLD( - gObjectEventPic_Rampardos, + sPicTable_Rampardos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1700,7 +1700,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, -1, SHADOW_SIZE_S) FOOTPRINT(Shieldon) OVERWORLD( - gObjectEventPic_Shieldon, + sPicTable_Shieldon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1768,7 +1768,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 6, SHADOW_SIZE_L) FOOTPRINT(Bastiodon) OVERWORLD( - gObjectEventPic_Bastiodon, + sPicTable_Bastiodon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1833,7 +1833,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 8, SHADOW_SIZE_S) FOOTPRINT(Burmy) OVERWORLD( - gObjectEventPic_BurmyPlant, + sPicTable_BurmyPlant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1901,7 +1901,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Burmy) OVERWORLD( - gObjectEventPic_BurmySandy, + sPicTable_BurmySandy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1969,7 +1969,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Burmy) OVERWORLD( - gObjectEventPic_BurmyTrash, + sPicTable_BurmyTrash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2038,7 +2038,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 9, SHADOW_SIZE_S) FOOTPRINT(Wormadam) OVERWORLD( - gObjectEventPic_WormadamPlant, + sPicTable_WormadamPlant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2103,7 +2103,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Wormadam) OVERWORLD( - gObjectEventPic_WormadamSandy, + sPicTable_WormadamSandy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2169,7 +2169,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 9, SHADOW_SIZE_S) FOOTPRINT(Wormadam) OVERWORLD( - gObjectEventPic_WormadamTrash, + sPicTable_WormadamTrash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2230,8 +2230,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 0, \ SHADOW(-1, 9, SHADOW_SIZE_S) \ FOOTPRINT(Mothim) \ - OVERWORLD( \ - gObjectEventPic_Mothim, \ + OVERWORLD( \ + sPicTable_Mothim, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -2314,7 +2314,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-4, 10, SHADOW_SIZE_S) FOOTPRINT(Combee) OVERWORLD( - gObjectEventPic_Combee, + sPicTable_Combee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2323,7 +2323,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Combee ) OVERWORLD_FEMALE( - gObjectEventPic_CombeeF, + sPicTable_CombeeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2398,7 +2398,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 11, SHADOW_SIZE_L) FOOTPRINT(Vespiquen) OVERWORLD( - gObjectEventPic_Vespiquen, + sPicTable_Vespiquen, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2476,7 +2476,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-2, 1, SHADOW_SIZE_S) FOOTPRINT(Pachirisu) OVERWORLD( - gObjectEventPic_Pachirisu, + sPicTable_Pachirisu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2485,7 +2485,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Pachirisu ) OVERWORLD_FEMALE( - gObjectEventPic_PachirisuF, + sPicTable_PachirisuF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2556,7 +2556,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 4, SHADOW_SIZE_S) FOOTPRINT(Buizel) OVERWORLD( - gObjectEventPic_Buizel, + sPicTable_Buizel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2565,7 +2565,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Buizel ) OVERWORLD_FEMALE( - gObjectEventPic_BuizelF, + sPicTable_BuizelF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2638,7 +2638,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-4, 10, SHADOW_SIZE_M) FOOTPRINT(Floatzel) OVERWORLD( - gObjectEventPic_Floatzel, + sPicTable_Floatzel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2647,7 +2647,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Floatzel ) OVERWORLD_FEMALE( - gObjectEventPic_FloatzelF, + sPicTable_FloatzelF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2720,7 +2720,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-4, -2, SHADOW_SIZE_S) FOOTPRINT(Cherubi) OVERWORLD( - gObjectEventPic_Cherubi, + sPicTable_Cherubi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2791,7 +2791,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Cherrim) OVERWORLD( - gObjectEventPic_CherrimOvercast, + sPicTable_CherrimOvercast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2920,7 +2920,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(Shellos) OVERWORLD( - gObjectEventPic_ShellosWestSea, + sPicTable_ShellosWestSea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2985,7 +2985,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, -1, SHADOW_SIZE_S) FOOTPRINT(Shellos) OVERWORLD( - gObjectEventPic_ShellosEast, + sPicTable_ShellosEast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3050,7 +3050,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 3, SHADOW_SIZE_M) FOOTPRINT(Gastrodon) OVERWORLD( - gObjectEventPic_GastrodonWestSea, + sPicTable_GastrodonWestSea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3113,7 +3113,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 4, SHADOW_SIZE_M) FOOTPRINT(Gastrodon) OVERWORLD( - gObjectEventPic_GastrodonEast, + sPicTable_GastrodonEast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3184,7 +3184,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 9, SHADOW_SIZE_S) FOOTPRINT(Drifloon) OVERWORLD( - gObjectEventPic_Drifloon, + sPicTable_Drifloon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3256,7 +3256,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 11, SHADOW_SIZE_M) FOOTPRINT(Drifblim) OVERWORLD( - gObjectEventPic_Drifblim, + sPicTable_Drifblim, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3323,7 +3323,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 5, SHADOW_SIZE_S) FOOTPRINT(Buneary) OVERWORLD( - gObjectEventPic_Buneary, + sPicTable_Buneary, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3391,7 +3391,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 10, SHADOW_SIZE_S) FOOTPRINT(Lopunny) OVERWORLD( - gObjectEventPic_Lopunny, + sPicTable_Lopunny, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3457,7 +3457,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = FOOTPRINT(Lopunny) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_LopunnyMega, + sPicTable_LopunnyMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3530,7 +3530,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-3, 6, SHADOW_SIZE_S) FOOTPRINT(Glameow) OVERWORLD( - gObjectEventPic_Glameow, + sPicTable_Glameow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3602,7 +3602,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 8, SHADOW_SIZE_L) FOOTPRINT(Purugly) OVERWORLD( - gObjectEventPic_Purugly, + sPicTable_Purugly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3672,7 +3672,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 0, SHADOW_SIZE_M) FOOTPRINT(Stunky) OVERWORLD( - gObjectEventPic_Stunky, + sPicTable_Stunky, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3740,7 +3740,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-3, 6, SHADOW_SIZE_L) FOOTPRINT(Skuntank) OVERWORLD( - gObjectEventPic_Skuntank, + sPicTable_Skuntank, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3817,7 +3817,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Bronzor) OVERWORLD( - gObjectEventPic_Bronzor, + sPicTable_Bronzor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3889,7 +3889,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(5, 12, SHADOW_SIZE_M) FOOTPRINT(Bronzong) OVERWORLD( - gObjectEventPic_Bronzong, + sPicTable_Bronzong, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3971,7 +3971,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 3, SHADOW_SIZE_S) FOOTPRINT(Chatot) OVERWORLD( - gObjectEventPic_Chatot, + sPicTable_Chatot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4040,7 +4040,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 7, SHADOW_SIZE_L) FOOTPRINT(Spiritomb) OVERWORLD( - gObjectEventPic_Spiritomb, + sPicTable_Spiritomb, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4115,7 +4115,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 5, SHADOW_SIZE_M) FOOTPRINT(Gible) OVERWORLD( - gObjectEventPic_Gible, + sPicTable_Gible, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4124,7 +4124,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Gible ) OVERWORLD_FEMALE( - gObjectEventPic_GibleF, + sPicTable_GibleF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4195,7 +4195,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 8, SHADOW_SIZE_M) FOOTPRINT(Gabite) OVERWORLD( - gObjectEventPic_Gabite, + sPicTable_Gabite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4204,7 +4204,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Gabite ) OVERWORLD_FEMALE( - gObjectEventPic_GabiteF, + sPicTable_GabiteF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4282,7 +4282,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(5, 11, SHADOW_SIZE_L) FOOTPRINT(Garchomp) OVERWORLD( - gObjectEventPic_Garchomp, + sPicTable_Garchomp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4291,7 +4291,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Garchomp ) OVERWORLD_FEMALE( - gObjectEventPic_GarchompF, + sPicTable_GarchompF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4355,7 +4355,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = FOOTPRINT(Garchomp) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_GarchompMega, + sPicTable_GarchompMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4429,7 +4429,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 3, SHADOW_SIZE_S) FOOTPRINT(Riolu) OVERWORLD( - gObjectEventPic_Riolu, + sPicTable_Riolu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4497,7 +4497,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Lucario) OVERWORLD( - gObjectEventPic_Lucario, + sPicTable_Lucario, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4564,7 +4564,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = FOOTPRINT(Lucario) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_LucarioMega, + sPicTable_LucarioMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4645,7 +4645,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, -1, SHADOW_SIZE_L) FOOTPRINT(Hippopotas) OVERWORLD( - gObjectEventPic_Hippopotas, + sPicTable_Hippopotas, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4654,7 +4654,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Hippopotas ) OVERWORLD_FEMALE( - gObjectEventPic_HippopotasF, + sPicTable_HippopotasF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4727,7 +4727,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = NO_SHADOW FOOTPRINT(Hippowdon) OVERWORLD( - gObjectEventPic_Hippowdon, + sPicTable_Hippowdon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4813,7 +4813,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Skorupi) OVERWORLD( - gObjectEventPic_Skorupi, + sPicTable_Skorupi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4888,7 +4888,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-3, 6, SHADOW_SIZE_L) FOOTPRINT(Drapion) OVERWORLD( - gObjectEventPic_Drapion, + sPicTable_Drapion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4964,7 +4964,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 4, SHADOW_SIZE_S) FOOTPRINT(Croagunk) OVERWORLD( - gObjectEventPic_Croagunk, + sPicTable_Croagunk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4973,7 +4973,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Croagunk ) OVERWORLD_FEMALE( - gObjectEventPic_CroagunkF, + sPicTable_CroagunkF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5048,7 +5048,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 7, SHADOW_SIZE_M) FOOTPRINT(Toxicroak) OVERWORLD( - gObjectEventPic_Toxicroak, + sPicTable_Toxicroak, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5057,7 +5057,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Toxicroak ) OVERWORLD_FEMALE( - gObjectEventPic_ToxicroakF, + sPicTable_ToxicroakF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5133,7 +5133,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Carnivine) OVERWORLD( - gObjectEventPic_Carnivine, + sPicTable_Carnivine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5213,7 +5213,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Finneon) OVERWORLD( - gObjectEventPic_Finneon, + sPicTable_Finneon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5222,7 +5222,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Finneon ) OVERWORLD_FEMALE( - gObjectEventPic_FinneonF, + sPicTable_FinneonF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5297,7 +5297,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Lumineon) OVERWORLD( - gObjectEventPic_Lumineon, + sPicTable_Lumineon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5306,7 +5306,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Lumineon ) OVERWORLD_FEMALE( - gObjectEventPic_LumineonF, + sPicTable_LumineonF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5379,7 +5379,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, 4, SHADOW_SIZE_M) FOOTPRINT(Snover) OVERWORLD( - gObjectEventPic_Snover, + sPicTable_Snover, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5388,7 +5388,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Snover ) OVERWORLD_FEMALE( - gObjectEventPic_SnoverF, + sPicTable_SnoverF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5460,7 +5460,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 11, SHADOW_SIZE_L) FOOTPRINT(Abomasnow) OVERWORLD( - gObjectEventPic_Abomasnow, + sPicTable_Abomasnow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5469,7 +5469,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Abomasnow ) OVERWORLD_FEMALE( - gObjectEventPic_AbomasnowF, + sPicTable_AbomasnowF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5535,7 +5535,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = FOOTPRINT(Abomasnow) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AbomasnowMega, + sPicTable_AbomasnowMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5612,7 +5612,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 10, SHADOW_SIZE_S) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_Rotom, + sPicTable_Rotom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5690,7 +5690,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_RotomHeat, + sPicTable_RotomHeat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5761,7 +5761,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 10, SHADOW_SIZE_M) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_RotomWash, + sPicTable_RotomWash, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5830,7 +5830,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_RotomFrost, + sPicTable_RotomFrost, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5924,7 +5924,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 9, SHADOW_SIZE_S) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_RotomFan, + sPicTable_RotomFan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5996,7 +5996,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 14, SHADOW_SIZE_M) FOOTPRINT(Rotom) OVERWORLD( - gObjectEventPic_RotomMow, + sPicTable_RotomMow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6074,7 +6074,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 11, SHADOW_SIZE_S) FOOTPRINT(Uxie) OVERWORLD( - gObjectEventPic_Uxie, + sPicTable_Uxie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6158,7 +6158,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Mesprit) OVERWORLD( - gObjectEventPic_Mesprit, + sPicTable_Mesprit, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6236,7 +6236,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 17, SHADOW_SIZE_S) FOOTPRINT(Azelf) OVERWORLD( - gObjectEventPic_Azelf, + sPicTable_Azelf, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6313,7 +6313,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 12, SHADOW_SIZE_L) FOOTPRINT(Dialga) OVERWORLD( - gObjectEventPic_Dialga, + sPicTable_Dialga, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6380,7 +6380,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 11, SHADOW_SIZE_L) FOOTPRINT(Dialga) OVERWORLD( - gObjectEventPic_DialgaOrigin, + sPicTable_DialgaOrigin, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -6460,7 +6460,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 10, SHADOW_SIZE_L) FOOTPRINT(Palkia) OVERWORLD( - gObjectEventPic_Palkia, + sPicTable_Palkia, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6527,7 +6527,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-3, 14, SHADOW_SIZE_L) FOOTPRINT(Palkia) OVERWORLD( - gObjectEventPic_PalkiaOrigin, + sPicTable_PalkiaOrigin, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -6606,7 +6606,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(2, 2, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Heatran) OVERWORLD( - gObjectEventPic_Heatran, + sPicTable_Heatran, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6681,7 +6681,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Regigigas) OVERWORLD( - gObjectEventPic_Regigigas, + sPicTable_Regigigas, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6759,7 +6759,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 11, SHADOW_SIZE_L) FOOTPRINT(GiratinaAltered) OVERWORLD( - gObjectEventPic_GiratinaAltered, + sPicTable_GiratinaAltered, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6833,7 +6833,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 18, SHADOW_SIZE_L) FOOTPRINT(GiratinaOrigin) OVERWORLD( - gObjectEventPic_GiratinaOrigin, + sPicTable_GiratinaOrigin, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6916,7 +6916,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-2, 12, SHADOW_SIZE_M) FOOTPRINT(Cresselia) OVERWORLD( - gObjectEventPic_Cresselia, + sPicTable_Cresselia, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6993,7 +6993,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Phione) OVERWORLD( - gObjectEventPic_Phione, + sPicTable_Phione, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7069,7 +7069,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-5, 8, SHADOW_SIZE_S) FOOTPRINT(Manaphy) OVERWORLD( - gObjectEventPic_Manaphy, + sPicTable_Manaphy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7148,7 +7148,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(4, 12, SHADOW_SIZE_M) FOOTPRINT(Darkrai) OVERWORLD( - gObjectEventPic_Darkrai, + sPicTable_Darkrai, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7229,7 +7229,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(1, -3, SHADOW_SIZE_S) FOOTPRINT(Shaymin) OVERWORLD( - gObjectEventPic_ShayminLand, + sPicTable_ShayminLand, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7307,7 +7307,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(3, 7, SHADOW_SIZE_M) FOOTPRINT(Shaymin) OVERWORLD( - gObjectEventPic_ShayminSky, + sPicTable_ShayminSky, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7388,7 +7388,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SHADOW(-1, 15, SHADOW_SIZE_XL_BATTLE_ONLY) \ FOOTPRINT(Arceus) \ OVERWORLD( \ - gObjectEventPic_Arceus ##typeName, \ + sPicTable_Arceus ##typeName, \ SIZE_64x64, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index f914259f18..d55a7bf1d0 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -58,7 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 4, SHADOW_SIZE_S) FOOTPRINT(Victini) OVERWORLD( - gObjectEventPic_Victini, + sPicTable_Victini, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -129,7 +129,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Snivy) OVERWORLD( - gObjectEventPic_Snivy, + sPicTable_Snivy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -201,7 +201,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Servine) OVERWORLD( - gObjectEventPic_Servine, + sPicTable_Servine, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -270,7 +270,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Serperior) OVERWORLD( - gObjectEventPic_Serperior, + sPicTable_Serperior, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -340,7 +340,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -2, SHADOW_SIZE_S) FOOTPRINT(Tepig) OVERWORLD( - gObjectEventPic_Tepig, + sPicTable_Tepig, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -408,7 +408,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 6, SHADOW_SIZE_M) FOOTPRINT(Pignite) OVERWORLD( - gObjectEventPic_Pignite, + sPicTable_Pignite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -495,7 +495,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 12, SHADOW_SIZE_L) FOOTPRINT(Emboar) OVERWORLD( - gObjectEventPic_Emboar, + sPicTable_Emboar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -567,7 +567,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 0, SHADOW_SIZE_S) FOOTPRINT(Oshawott) OVERWORLD( - gObjectEventPic_Oshawott, + sPicTable_Oshawott, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -637,7 +637,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 6, SHADOW_SIZE_S) FOOTPRINT(Dewott) OVERWORLD( - gObjectEventPic_Dewott, + sPicTable_Dewott, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -704,7 +704,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 13, SHADOW_SIZE_L) FOOTPRINT(Samurott) OVERWORLD( - gObjectEventPic_Samurott, + sPicTable_Samurott, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -768,7 +768,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 13, SHADOW_SIZE_L) FOOTPRINT(Samurott) OVERWORLD( - gObjectEventPic_SamurottHisui, + sPicTable_SamurottHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -838,7 +838,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Patrat) OVERWORLD( - gObjectEventPic_Patrat, + sPicTable_Patrat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -910,7 +910,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-4, 11, SHADOW_SIZE_S) FOOTPRINT(Watchog) OVERWORLD( - gObjectEventPic_Watchog, + sPicTable_Watchog, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -982,7 +982,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 1, SHADOW_SIZE_S) FOOTPRINT(Lillipup) OVERWORLD( - gObjectEventPic_Lillipup, + sPicTable_Lillipup, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1053,7 +1053,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 5, SHADOW_SIZE_M) FOOTPRINT(Herdier) OVERWORLD( - gObjectEventPic_Herdier, + sPicTable_Herdier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1128,7 +1128,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-4, 9, SHADOW_SIZE_L) FOOTPRINT(Stoutland) OVERWORLD( - gObjectEventPic_Stoutland, + sPicTable_Stoutland, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1196,7 +1196,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Purrloin) OVERWORLD( - gObjectEventPic_Purrloin, + sPicTable_Purrloin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1264,7 +1264,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 11, SHADOW_SIZE_M) FOOTPRINT(Liepard) OVERWORLD( - gObjectEventPic_Liepard, + sPicTable_Liepard, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1334,7 +1334,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Pansage) OVERWORLD( - gObjectEventPic_Pansage, + sPicTable_Pansage, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1402,7 +1402,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 12, SHADOW_SIZE_M) FOOTPRINT(Simisage) OVERWORLD( - gObjectEventPic_Simisage, + sPicTable_Simisage, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1470,7 +1470,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 3, SHADOW_SIZE_S) FOOTPRINT(Pansear) OVERWORLD( - gObjectEventPic_Pansear, + sPicTable_Pansear, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1541,7 +1541,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Simisear) OVERWORLD( - gObjectEventPic_Simisear, + sPicTable_Simisear, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1609,7 +1609,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 4, SHADOW_SIZE_S) FOOTPRINT(Panpour) OVERWORLD( - gObjectEventPic_Panpour, + sPicTable_Panpour, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1676,7 +1676,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Simipour) OVERWORLD( - gObjectEventPic_Simipour, + sPicTable_Simipour, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1750,7 +1750,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Munna) OVERWORLD( - gObjectEventPic_Munna, + sPicTable_Munna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1821,7 +1821,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(6, 10, SHADOW_SIZE_M) FOOTPRINT(Musharna) OVERWORLD( - gObjectEventPic_Musharna, + sPicTable_Musharna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1889,7 +1889,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 1, SHADOW_SIZE_S) FOOTPRINT(Pidove) OVERWORLD( - gObjectEventPic_Pidove, + sPicTable_Pidove, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1957,7 +1957,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Tranquill) OVERWORLD( - gObjectEventPic_Tranquill, + sPicTable_Tranquill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2040,7 +2040,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 12, SHADOW_SIZE_M) FOOTPRINT(Unfezant) OVERWORLD( - gObjectEventPic_Unfezant, + sPicTable_Unfezant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2049,7 +2049,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Unfezant ) OVERWORLD_FEMALE( - gObjectEventPic_UnfezantF, + sPicTable_UnfezantF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2120,7 +2120,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 9, SHADOW_SIZE_M) FOOTPRINT(Blitzle) OVERWORLD( - gObjectEventPic_Blitzle, + sPicTable_Blitzle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2188,7 +2188,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 13, SHADOW_SIZE_M) FOOTPRINT(Zebstrika) OVERWORLD( - gObjectEventPic_Zebstrika, + sPicTable_Zebstrika, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2262,7 +2262,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Roggenrola) OVERWORLD( - gObjectEventPic_Roggenrola, + sPicTable_Roggenrola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2340,7 +2340,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 3, SHADOW_SIZE_L) FOOTPRINT(Boldore) OVERWORLD( - gObjectEventPic_Boldore, + sPicTable_Boldore, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2420,7 +2420,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gigalith) OVERWORLD( - gObjectEventPic_Gigalith, + sPicTable_Gigalith, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2505,7 +2505,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 14, SHADOW_SIZE_S) FOOTPRINT(Woobat) OVERWORLD( - gObjectEventPic_Woobat, + sPicTable_Woobat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2577,7 +2577,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 17, SHADOW_SIZE_M) FOOTPRINT(Swoobat) OVERWORLD( - gObjectEventPic_Swoobat, + sPicTable_Swoobat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2648,7 +2648,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Drilbur) OVERWORLD( - gObjectEventPic_Drilbur, + sPicTable_Drilbur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2718,7 +2718,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 8, SHADOW_SIZE_L) FOOTPRINT(Excadrill) OVERWORLD( - gObjectEventPic_Excadrill, + sPicTable_Excadrill, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2788,7 +2788,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 6, SHADOW_SIZE_S) FOOTPRINT(Audino) OVERWORLD( - gObjectEventPic_Audino, + sPicTable_Audino, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2857,7 +2857,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = FOOTPRINT(Audino) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_AudinoMega, + sPicTable_AudinoMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2931,7 +2931,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-4, 2, SHADOW_SIZE_S) FOOTPRINT(Timburr) OVERWORLD( - gObjectEventPic_Timburr, + sPicTable_Timburr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3003,7 +3003,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Gurdurr) OVERWORLD( - gObjectEventPic_Gurdurr, + sPicTable_Gurdurr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3070,7 +3070,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 3, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Conkeldurr) OVERWORLD( - gObjectEventPic_Conkeldurr, + sPicTable_Conkeldurr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3137,7 +3137,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Tympole) OVERWORLD( - gObjectEventPic_Tympole, + sPicTable_Tympole, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3207,7 +3207,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 3, SHADOW_SIZE_S) FOOTPRINT(Palpitoad) OVERWORLD( - gObjectEventPic_Palpitoad, + sPicTable_Palpitoad, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3284,7 +3284,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, 10, SHADOW_SIZE_L) FOOTPRINT(Seismitoad) OVERWORLD( - gObjectEventPic_Seismitoad, + sPicTable_Seismitoad, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3354,7 +3354,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 4, SHADOW_SIZE_M) FOOTPRINT(Throh) OVERWORLD( - gObjectEventPic_Throh, + sPicTable_Throh, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3423,7 +3423,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 6, SHADOW_SIZE_M) FOOTPRINT(Sawk) OVERWORLD( - gObjectEventPic_Sawk, + sPicTable_Sawk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3494,7 +3494,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 0, SHADOW_SIZE_S) FOOTPRINT(Sewaddle) OVERWORLD( - gObjectEventPic_Sewaddle, + sPicTable_Sewaddle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3564,7 +3564,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 1, SHADOW_SIZE_L) FOOTPRINT(Swadloon) OVERWORLD( - gObjectEventPic_Swadloon, + sPicTable_Swadloon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3638,7 +3638,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 14, SHADOW_SIZE_S) FOOTPRINT(Leavanny) OVERWORLD( - gObjectEventPic_Leavanny, + sPicTable_Leavanny, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3715,7 +3715,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, -3, SHADOW_SIZE_M) FOOTPRINT(Venipede) OVERWORLD( - gObjectEventPic_Venipede, + sPicTable_Venipede, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3791,7 +3791,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Whirlipede) OVERWORLD( - gObjectEventPic_Whirlipede, + sPicTable_Whirlipede, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3868,7 +3868,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 12, SHADOW_SIZE_L) FOOTPRINT(Scolipede) OVERWORLD( - gObjectEventPic_Scolipede, + sPicTable_Scolipede, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3949,7 +3949,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, -5, SHADOW_SIZE_M) FOOTPRINT(Cottonee) OVERWORLD( - gObjectEventPic_Cottonee, + sPicTable_Cottonee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4018,7 +4018,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Whimsicott) OVERWORLD( - gObjectEventPic_Whimsicott, + sPicTable_Whimsicott, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4090,7 +4090,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 6, SHADOW_SIZE_S) FOOTPRINT(Petilil) OVERWORLD( - gObjectEventPic_Petilil, + sPicTable_Petilil, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4161,7 +4161,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 13, SHADOW_SIZE_M) FOOTPRINT(Lilligant) OVERWORLD( - gObjectEventPic_Lilligant, + sPicTable_Lilligant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4228,7 +4228,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 13, SHADOW_SIZE_S) FOOTPRINT(Lilligant) OVERWORLD( - gObjectEventPic_LilligantHisui, + sPicTable_LilligantHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4297,7 +4297,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Basculin) OVERWORLD( - gObjectEventPic_BasculinRedStriped, + sPicTable_BasculinRedStriped, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4363,7 +4363,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Basculin) OVERWORLD( - gObjectEventPic_BasculinBlueStriped, + sPicTable_BasculinBlueStriped, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4430,7 +4430,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 5, SHADOW_SIZE_S) FOOTPRINT(Basculin) OVERWORLD( - gObjectEventPic_BasculinWhiteStriped, + sPicTable_BasculinWhiteStriped, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4496,7 +4496,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 16, SHADOW_SIZE_M) FOOTPRINT(Basculegion) OVERWORLD( - gObjectEventPic_BasculegionM, + sPicTable_BasculegionM, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4559,7 +4559,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 16, SHADOW_SIZE_M) FOOTPRINT(Basculegion) OVERWORLD( - gObjectEventPic_BasculegionF, + sPicTable_BasculegionF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4630,7 +4630,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, -5, SHADOW_SIZE_M) FOOTPRINT(Sandile) OVERWORLD( - gObjectEventPic_Sandile, + sPicTable_Sandile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4698,7 +4698,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Krokorok) OVERWORLD( - gObjectEventPic_Krokorok, + sPicTable_Krokorok, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4774,7 +4774,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 12, SHADOW_SIZE_L) FOOTPRINT(Krookodile) OVERWORLD( - gObjectEventPic_Krookodile, + sPicTable_Krookodile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4842,7 +4842,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Darumaka) OVERWORLD( - gObjectEventPic_Darumaka, + sPicTable_Darumaka, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4912,7 +4912,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 5, SHADOW_SIZE_L) FOOTPRINT(Darmanitan) OVERWORLD( - gObjectEventPic_DarmanitanStandard, + sPicTable_DarmanitanStandard, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5034,7 +5034,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, -1, SHADOW_SIZE_S) FOOTPRINT(Darumaka) OVERWORLD( - gObjectEventPic_DarumakaGalar, + sPicTable_DarumakaGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5100,7 +5100,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, 8, SHADOW_SIZE_L) FOOTPRINT(Darmanitan) OVERWORLD( - gObjectEventPic_DarmanitanGalarStandard, + sPicTable_DarmanitanGalarStandard, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5233,7 +5233,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Maractus) OVERWORLD( - gObjectEventPic_Maractus, + sPicTable_Maractus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5309,7 +5309,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, -2, SHADOW_SIZE_S) FOOTPRINT(Dwebble) OVERWORLD( - gObjectEventPic_Dwebble, + sPicTable_Dwebble, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5381,7 +5381,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 8, SHADOW_SIZE_L) FOOTPRINT(Crustle) OVERWORLD( - gObjectEventPic_Crustle, + sPicTable_Crustle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5450,7 +5450,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-4, 2, SHADOW_SIZE_S) FOOTPRINT(Scraggy) OVERWORLD( - gObjectEventPic_Scraggy, + sPicTable_Scraggy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5520,7 +5520,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 9, SHADOW_SIZE_M) FOOTPRINT(Scrafty) OVERWORLD( - gObjectEventPic_Scrafty, + sPicTable_Scrafty, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5594,7 +5594,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 18, SHADOW_SIZE_S) FOOTPRINT(Sigilyph) OVERWORLD( - gObjectEventPic_Sigilyph, + sPicTable_Sigilyph, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5667,7 +5667,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 6, SHADOW_SIZE_S) FOOTPRINT(Yamask) OVERWORLD( - gObjectEventPic_Yamask, + sPicTable_Yamask, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5737,7 +5737,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(6, 12, SHADOW_SIZE_M) FOOTPRINT(Cofagrigus) OVERWORLD( - gObjectEventPic_Cofagrigus, + sPicTable_Cofagrigus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5801,7 +5801,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Yamask) OVERWORLD( - gObjectEventPic_YamaskGalar, + sPicTable_YamaskGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5867,7 +5867,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(14, 14, SHADOW_SIZE_M) FOOTPRINT(Runerigus) OVERWORLD( - gObjectEventPic_Runerigus, + sPicTable_Runerigus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5937,7 +5937,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -3, SHADOW_SIZE_M) FOOTPRINT(Tirtouga) OVERWORLD( - gObjectEventPic_Tirtouga, + sPicTable_Tirtouga, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6012,7 +6012,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, 8, SHADOW_SIZE_L) FOOTPRINT(Carracosta) OVERWORLD( - gObjectEventPic_Carracosta, + sPicTable_Carracosta, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6080,7 +6080,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, -2, SHADOW_SIZE_S) FOOTPRINT(Archen) OVERWORLD( - gObjectEventPic_Archen, + sPicTable_Archen, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6154,7 +6154,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 18, SHADOW_SIZE_M) FOOTPRINT(Archeops) OVERWORLD( - gObjectEventPic_Archeops, + sPicTable_Archeops, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6223,7 +6223,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, -1, SHADOW_SIZE_S) FOOTPRINT(Trubbish) OVERWORLD( - gObjectEventPic_Trubbish, + sPicTable_Trubbish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6294,7 +6294,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Garbodor) OVERWORLD( - gObjectEventPic_Garbodor, + sPicTable_Garbodor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6427,7 +6427,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Zorua) OVERWORLD( - gObjectEventPic_Zorua, + sPicTable_Zorua, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6498,7 +6498,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 8, SHADOW_SIZE_L) FOOTPRINT(Zoroark) OVERWORLD( - gObjectEventPic_Zoroark, + sPicTable_Zoroark, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6562,7 +6562,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 12, SHADOW_SIZE_S) FOOTPRINT(Zorua) OVERWORLD( - gObjectEventPic_ZoruaHisui, + sPicTable_ZoruaHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6627,7 +6627,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(11, 13, SHADOW_SIZE_L) FOOTPRINT(Zoroark) OVERWORLD( - gObjectEventPic_ZoroarkHisui, + sPicTable_ZoroarkHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6698,7 +6698,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 3, SHADOW_SIZE_S) FOOTPRINT(Minccino) OVERWORLD( - gObjectEventPic_Minccino, + sPicTable_Minccino, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6769,7 +6769,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 6, SHADOW_SIZE_M) FOOTPRINT(Cinccino) OVERWORLD( - gObjectEventPic_Cinccino, + sPicTable_Cinccino, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6842,7 +6842,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 2, SHADOW_SIZE_S) FOOTPRINT(Gothita) OVERWORLD( - gObjectEventPic_Gothita, + sPicTable_Gothita, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6916,7 +6916,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Gothorita) OVERWORLD( - gObjectEventPic_Gothorita, + sPicTable_Gothorita, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6988,7 +6988,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Gothitelle) OVERWORLD( - gObjectEventPic_Gothitelle, + sPicTable_Gothitelle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7059,7 +7059,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 8, SHADOW_SIZE_S) FOOTPRINT(Solosis) OVERWORLD( - gObjectEventPic_Solosis, + sPicTable_Solosis, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7129,7 +7129,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 6, SHADOW_SIZE_M) FOOTPRINT(Duosion) OVERWORLD( - gObjectEventPic_Duosion, + sPicTable_Duosion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7199,7 +7199,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 8, SHADOW_SIZE_M) FOOTPRINT(Reuniclus) OVERWORLD( - gObjectEventPic_Reuniclus, + sPicTable_Reuniclus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7271,7 +7271,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 2, SHADOW_SIZE_S) FOOTPRINT(Ducklett) OVERWORLD( - gObjectEventPic_Ducklett, + sPicTable_Ducklett, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7338,7 +7338,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Swanna) OVERWORLD( - gObjectEventPic_Swanna, + sPicTable_Swanna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7413,7 +7413,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Vanillite) OVERWORLD( - gObjectEventPic_Vanillite, + sPicTable_Vanillite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7486,7 +7486,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 9, SHADOW_SIZE_S) FOOTPRINT(Vanillish) OVERWORLD( - gObjectEventPic_Vanillish, + sPicTable_Vanillish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7558,7 +7558,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 10, SHADOW_SIZE_M) FOOTPRINT(Vanilluxe) OVERWORLD( - gObjectEventPic_Vanilluxe, + sPicTable_Vanilluxe, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7622,7 +7622,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Deerling) OVERWORLD( - gObjectEventPic_DeerlingSpring, + sPicTable_DeerlingSpring, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7687,7 +7687,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Deerling) OVERWORLD( - gObjectEventPic_DeerlingSummer, + sPicTable_DeerlingSummer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7752,7 +7752,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Deerling) OVERWORLD( - gObjectEventPic_DeerlingAutumn, + sPicTable_DeerlingAutumn, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7817,7 +7817,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Deerling) OVERWORLD( - gObjectEventPic_DeerlingWinter, + sPicTable_DeerlingWinter, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7882,7 +7882,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(7, 13, SHADOW_SIZE_M) FOOTPRINT(Sawsbuck) OVERWORLD( - gObjectEventPic_SawsbuckSpring, + sPicTable_SawsbuckSpring, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7945,7 +7945,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(7, 13, SHADOW_SIZE_M) FOOTPRINT(Sawsbuck) OVERWORLD( - gObjectEventPic_SawsbuckSummer, + sPicTable_SawsbuckSummer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8008,7 +8008,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(7, 13, SHADOW_SIZE_M) FOOTPRINT(Sawsbuck) OVERWORLD( - gObjectEventPic_SawsbuckAutumn, + sPicTable_SawsbuckAutumn, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8071,7 +8071,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(7, 13, SHADOW_SIZE_M) FOOTPRINT(Sawsbuck) OVERWORLD( - gObjectEventPic_SawsbuckWinter, + sPicTable_SawsbuckWinter, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8143,7 +8143,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Emolga) OVERWORLD( - gObjectEventPic_Emolga, + sPicTable_Emolga, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8211,7 +8211,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 0, SHADOW_SIZE_S) FOOTPRINT(Karrablast) OVERWORLD( - gObjectEventPic_Karrablast, + sPicTable_Karrablast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8279,7 +8279,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 11, SHADOW_SIZE_M) FOOTPRINT(Escavalier) OVERWORLD( - gObjectEventPic_Escavalier, + sPicTable_Escavalier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8351,7 +8351,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, -3, SHADOW_SIZE_S) FOOTPRINT(Foongus) OVERWORLD( - gObjectEventPic_Foongus, + sPicTable_Foongus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8425,7 +8425,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 5, SHADOW_SIZE_M) FOOTPRINT(Amoonguss) OVERWORLD( - gObjectEventPic_Amoonguss, + sPicTable_Amoonguss, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8504,7 +8504,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Frillish) OVERWORLD( - gObjectEventPic_Frillish, + sPicTable_Frillish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8513,7 +8513,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Frillish ) OVERWORLD_FEMALE( - gObjectEventPic_FrillishF, + sPicTable_FrillishF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8593,7 +8593,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 11, SHADOW_SIZE_M) FOOTPRINT(Jellicent) OVERWORLD( - gObjectEventPic_Jellicent, + sPicTable_Jellicent, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8602,7 +8602,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Jellicent ) OVERWORLD_FEMALE( - gObjectEventPic_JellicentF, + sPicTable_JellicentF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8670,7 +8670,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 15, SHADOW_SIZE_S) FOOTPRINT(Alomomola) OVERWORLD( - gObjectEventPic_Alomomola, + sPicTable_Alomomola, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8741,7 +8741,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -5, SHADOW_SIZE_S) FOOTPRINT(Joltik) OVERWORLD( - gObjectEventPic_Joltik, + sPicTable_Joltik, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8814,7 +8814,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -2, SHADOW_SIZE_L) FOOTPRINT(Galvantula) OVERWORLD( - gObjectEventPic_Galvantula, + sPicTable_Galvantula, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8885,7 +8885,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Ferroseed) OVERWORLD( - gObjectEventPic_Ferroseed, + sPicTable_Ferroseed, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8961,7 +8961,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 17, SHADOW_SIZE_M) FOOTPRINT(Ferrothorn) OVERWORLD( - gObjectEventPic_Ferrothorn, + sPicTable_Ferrothorn, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9032,7 +9032,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 11, SHADOW_SIZE_S) FOOTPRINT(Klink) OVERWORLD( - gObjectEventPic_Klink, + sPicTable_Klink, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9102,7 +9102,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 12, SHADOW_SIZE_M) FOOTPRINT(Klang) OVERWORLD( - gObjectEventPic_Klang, + sPicTable_Klang, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9172,7 +9172,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Klinklang) OVERWORLD( - gObjectEventPic_Klinklang, + sPicTable_Klinklang, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9254,7 +9254,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-3, 5, SHADOW_SIZE_S) FOOTPRINT(Tynamo) OVERWORLD( - gObjectEventPic_Tynamo, + sPicTable_Tynamo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9325,7 +9325,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Eelektrik) OVERWORLD( - gObjectEventPic_Eelektrik, + sPicTable_Eelektrik, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9396,7 +9396,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 13, SHADOW_SIZE_M) FOOTPRINT(Eelektross) OVERWORLD( - gObjectEventPic_Eelektross, + sPicTable_Eelektross, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9469,7 +9469,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Elgyem) OVERWORLD( - gObjectEventPic_Elgyem, + sPicTable_Elgyem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9536,7 +9536,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 10, SHADOW_SIZE_M) FOOTPRINT(Beheeyem) OVERWORLD( - gObjectEventPic_Beheeyem, + sPicTable_Beheeyem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9610,7 +9610,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, -1, SHADOW_SIZE_S) FOOTPRINT(Litwick) OVERWORLD( - gObjectEventPic_Litwick, + sPicTable_Litwick, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9684,7 +9684,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 9, SHADOW_SIZE_S) FOOTPRINT(Lampent) OVERWORLD( - gObjectEventPic_Lampent, + sPicTable_Lampent, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9756,7 +9756,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 13, SHADOW_SIZE_S) FOOTPRINT(Chandelure) OVERWORLD( - gObjectEventPic_Chandelure, + sPicTable_Chandelure, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9823,7 +9823,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 1, SHADOW_SIZE_S) FOOTPRINT(Axew) OVERWORLD( - gObjectEventPic_Axew, + sPicTable_Axew, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9890,7 +9890,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 8, SHADOW_SIZE_L) FOOTPRINT(Fraxure) OVERWORLD( - gObjectEventPic_Fraxure, + sPicTable_Fraxure, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -9958,7 +9958,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 9, SHADOW_SIZE_L) FOOTPRINT(Haxorus) OVERWORLD( - gObjectEventPic_Haxorus, + sPicTable_Haxorus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10030,7 +10030,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 0, SHADOW_SIZE_S) FOOTPRINT(Cubchoo) OVERWORLD( - gObjectEventPic_Cubchoo, + sPicTable_Cubchoo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10103,7 +10103,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 13, SHADOW_SIZE_L) FOOTPRINT(Beartic) OVERWORLD( - gObjectEventPic_Beartic, + sPicTable_Beartic, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10175,7 +10175,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 14, SHADOW_SIZE_M) FOOTPRINT(Cryogonal) OVERWORLD( - gObjectEventPic_Cryogonal, + sPicTable_Cryogonal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10245,7 +10245,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -1, SHADOW_SIZE_S) FOOTPRINT(Shelmet) OVERWORLD( - gObjectEventPic_Shelmet, + sPicTable_Shelmet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10312,7 +10312,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-14, 8, SHADOW_SIZE_S) FOOTPRINT(Accelgor) OVERWORLD( - gObjectEventPic_Accelgor, + sPicTable_Accelgor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10380,7 +10380,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Stunfisk) OVERWORLD( - gObjectEventPic_Stunfisk, + sPicTable_Stunfisk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10445,7 +10445,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Stunfisk) OVERWORLD( - gObjectEventPic_StunfiskGalar, + sPicTable_StunfiskGalar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10516,7 +10516,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Mienfoo) OVERWORLD( - gObjectEventPic_Mienfoo, + sPicTable_Mienfoo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10588,7 +10588,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 8, SHADOW_SIZE_M) FOOTPRINT(Mienshao) OVERWORLD( - gObjectEventPic_Mienshao, + sPicTable_Mienshao, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10661,7 +10661,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 9, SHADOW_SIZE_M) FOOTPRINT(Druddigon) OVERWORLD( - gObjectEventPic_Druddigon, + sPicTable_Druddigon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10732,7 +10732,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Golett) OVERWORLD( - gObjectEventPic_Golett, + sPicTable_Golett, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10800,7 +10800,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 14, SHADOW_SIZE_L) FOOTPRINT(Golurk) OVERWORLD( - gObjectEventPic_Golurk, + sPicTable_Golurk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10873,7 +10873,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, 4, SHADOW_SIZE_S) FOOTPRINT(Pawniard) OVERWORLD( - gObjectEventPic_Pawniard, + sPicTable_Pawniard, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -10941,7 +10941,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Bisharp) OVERWORLD( - gObjectEventPic_Bisharp, + sPicTable_Bisharp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11005,7 +11005,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Kingambit) OVERWORLD( - gObjectEventPic_Kingambit, + sPicTable_Kingambit, SIZE_64x64, SHADOW_SIZE_L, TRACKS_NONE, @@ -11074,7 +11074,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(8, 7, SHADOW_SIZE_M) FOOTPRINT(Bouffalant) OVERWORLD( - gObjectEventPic_Bouffalant, + sPicTable_Bouffalant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11145,7 +11145,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Rufflet) OVERWORLD( - gObjectEventPic_Rufflet, + sPicTable_Rufflet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11214,7 +11214,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 16, SHADOW_SIZE_M) FOOTPRINT(Braviary) OVERWORLD( - gObjectEventPic_Braviary, + sPicTable_Braviary, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11278,7 +11278,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 14, SHADOW_SIZE_M) FOOTPRINT(Braviary) OVERWORLD( - gObjectEventPic_BraviaryHisui, + sPicTable_BraviaryHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11349,7 +11349,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 9, SHADOW_SIZE_M) FOOTPRINT(Vullaby) OVERWORLD( - gObjectEventPic_Vullaby, + sPicTable_Vullaby, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11417,7 +11417,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Mandibuzz) OVERWORLD( - gObjectEventPic_Mandibuzz, + sPicTable_Mandibuzz, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11484,7 +11484,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(5, 7, SHADOW_SIZE_L) FOOTPRINT(Heatmor) OVERWORLD( - gObjectEventPic_Heatmor, + sPicTable_Heatmor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11567,7 +11567,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, -3, SHADOW_SIZE_L) FOOTPRINT(Durant) OVERWORLD( - gObjectEventPic_Durant, + sPicTable_Durant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11636,7 +11636,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 3, SHADOW_SIZE_S) FOOTPRINT(Deino) OVERWORLD( - gObjectEventPic_Deino, + sPicTable_Deino, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11703,7 +11703,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 6, SHADOW_SIZE_L) FOOTPRINT(Zweilous) OVERWORLD( - gObjectEventPic_Zweilous, + sPicTable_Zweilous, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11776,7 +11776,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 16, SHADOW_SIZE_M) FOOTPRINT(Hydreigon) OVERWORLD( - gObjectEventPic_Hydreigon, + sPicTable_Hydreigon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11852,7 +11852,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Larvesta) OVERWORLD( - gObjectEventPic_Larvesta, + sPicTable_Larvesta, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11924,7 +11924,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-4, 14, SHADOW_SIZE_M) FOOTPRINT(Volcarona) OVERWORLD( - gObjectEventPic_Volcarona, + sPicTable_Volcarona, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -11992,7 +11992,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 14, SHADOW_SIZE_M) FOOTPRINT(Cobalion) OVERWORLD( - gObjectEventPic_Cobalion, + sPicTable_Cobalion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12066,7 +12066,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(3, 6, SHADOW_SIZE_L) FOOTPRINT(Terrakion) OVERWORLD( - gObjectEventPic_Terrakion, + sPicTable_Terrakion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12135,7 +12135,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Virizion) OVERWORLD( - gObjectEventPic_Virizion, + sPicTable_Virizion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12225,7 +12225,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 17, SHADOW_SIZE_M) FOOTPRINT(Tornadus) OVERWORLD( - gObjectEventPic_TornadusIncarnate, + sPicTable_TornadusIncarnate, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12297,7 +12297,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-5, 12, SHADOW_SIZE_L) FOOTPRINT(Tornadus) OVERWORLD( - gObjectEventPic_TornadusTherian, + sPicTable_TornadusTherian, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12389,7 +12389,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 17, SHADOW_SIZE_M) FOOTPRINT(Thundurus) OVERWORLD( - gObjectEventPic_ThundurusIncarnate, + sPicTable_ThundurusIncarnate, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12473,7 +12473,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(5, 16, SHADOW_SIZE_M) FOOTPRINT(Thundurus) OVERWORLD( - gObjectEventPic_ThundurusTherian, + sPicTable_ThundurusTherian, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12544,7 +12544,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 12, SHADOW_SIZE_L) FOOTPRINT(Reshiram) OVERWORLD( - gObjectEventPic_Reshiram, + sPicTable_Reshiram, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12614,7 +12614,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 14, SHADOW_SIZE_L) FOOTPRINT(Zekrom) OVERWORLD( - gObjectEventPic_Zekrom, + sPicTable_Zekrom, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12705,7 +12705,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(2, 17, SHADOW_SIZE_M) FOOTPRINT(Landorus) OVERWORLD( - gObjectEventPic_LandorusIncarnate, + sPicTable_LandorusIncarnate, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12777,7 +12777,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Landorus) OVERWORLD( - gObjectEventPic_LandorusTherian, + sPicTable_LandorusTherian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12853,7 +12853,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 8, SHADOW_SIZE_L) FOOTPRINT(Kyurem) OVERWORLD( - gObjectEventPic_Kyurem, + sPicTable_Kyurem, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -12930,7 +12930,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-8, 14, SHADOW_SIZE_L) FOOTPRINT(Kyurem) OVERWORLD( - gObjectEventPic_KyuremWhite, + sPicTable_KyuremWhite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13007,7 +13007,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(Kyurem) OVERWORLD( - gObjectEventPic_KyuremBlack, + sPicTable_KyuremBlack, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13080,7 +13080,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Keldeo) OVERWORLD( - gObjectEventPic_KeldeoOrdinary, + sPicTable_KeldeoOrdinary, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13226,7 +13226,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(-1, 10, SHADOW_SIZE_S) FOOTPRINT(Meloetta) OVERWORLD( - gObjectEventPic_MeloettaAria, + sPicTable_MeloettaAria, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13305,7 +13305,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(0, 16, SHADOW_SIZE_S) FOOTPRINT(Meloetta) OVERWORLD( - gObjectEventPic_MeloettaPirouette, + sPicTable_MeloettaPirouette, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -13372,7 +13372,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SHADOW(5, 13, SHADOW_SIZE_L) \ FOOTPRINT(Genesect) \ OVERWORLD( \ - gObjectEventPic_Genesect, \ + sPicTable_Genesect, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 8568bd901d..b42696983e 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -60,7 +60,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 3, SHADOW_SIZE_S) FOOTPRINT(Chespin) OVERWORLD( - gObjectEventPic_Chespin, + sPicTable_Chespin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -130,7 +130,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 4, SHADOW_SIZE_M) FOOTPRINT(Quilladin) OVERWORLD( - gObjectEventPic_Quilladin, + sPicTable_Quilladin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -197,7 +197,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 10, SHADOW_SIZE_L) FOOTPRINT(Chesnaught) OVERWORLD( - gObjectEventPic_Chesnaught, + sPicTable_Chesnaught, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -269,7 +269,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 4, SHADOW_SIZE_S) FOOTPRINT(Fennekin) OVERWORLD( - gObjectEventPic_Fennekin, + sPicTable_Fennekin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -337,7 +337,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 10, SHADOW_SIZE_M) FOOTPRINT(Braixen) OVERWORLD( - gObjectEventPic_Braixen, + sPicTable_Braixen, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -408,7 +408,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(7, 14, SHADOW_SIZE_M) FOOTPRINT(Delphox) OVERWORLD( - gObjectEventPic_Delphox, + sPicTable_Delphox, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -480,7 +480,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Froakie) OVERWORLD( - gObjectEventPic_Froakie, + sPicTable_Froakie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -547,7 +547,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Frogadier) OVERWORLD( - gObjectEventPic_Frogadier, + sPicTable_Frogadier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -607,7 +607,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 6, SHADOW_SIZE_L) FOOTPRINT(Greninja) OVERWORLD( - gObjectEventPic_Greninja, + sPicTable_Greninja, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -667,7 +667,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 6, SHADOW_SIZE_L) FOOTPRINT(Greninja) OVERWORLD( - gObjectEventPic_Greninja, + sPicTable_Greninja, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -794,7 +794,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 9, SHADOW_SIZE_S) FOOTPRINT(Bunnelby) OVERWORLD( - gObjectEventPic_Bunnelby, + sPicTable_Bunnelby, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -861,7 +861,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(8, 10, SHADOW_SIZE_M) FOOTPRINT(Diggersby) OVERWORLD( - gObjectEventPic_Diggersby, + sPicTable_Diggersby, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -932,7 +932,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 0, SHADOW_SIZE_S) FOOTPRINT(Fletchling) OVERWORLD( - gObjectEventPic_Fletchling, + sPicTable_Fletchling, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1006,7 +1006,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 12, SHADOW_SIZE_S) FOOTPRINT(Fletchinder) OVERWORLD( - gObjectEventPic_Fletchinder, + sPicTable_Fletchinder, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1073,7 +1073,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 17, SHADOW_SIZE_M) FOOTPRINT(Talonflame) OVERWORLD( - gObjectEventPic_Talonflame, + sPicTable_Talonflame, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1133,7 +1133,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 1, SHADOW_SIZE_S) \ FOOTPRINT(Scatterbug) \ OVERWORLD( \ - gObjectEventPic_Scatterbug, \ + sPicTable_Scatterbug, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -1216,7 +1216,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 2, SHADOW_SIZE_M) \ FOOTPRINT(Spewpa) \ OVERWORLD( \ - gObjectEventPic_Spewpa, \ + sPicTable_Spewpa, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -1299,7 +1299,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 20, SHADOW_SIZE_M) \ FOOTPRINT(Vivillon) \ OVERWORLD( \ - gObjectEventPic_Vivillon ##form, \ + sPicTable_Vivillon ##form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -1548,7 +1548,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 3, SHADOW_SIZE_S) FOOTPRINT(Litleo) OVERWORLD( - gObjectEventPic_Litleo, + sPicTable_Litleo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1623,7 +1623,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Pyroar) OVERWORLD( - gObjectEventPic_Pyroar, + sPicTable_Pyroar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gShinyOverworldPalette_Pyroar ) OVERWORLD_FEMALE( - gObjectEventPic_PyroarF, + sPicTable_PyroarF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1689,11 +1689,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 11, SHADOW_SIZE_S) \ FOOTPRINT(Flabebe) \ OVERWORLD( \ - gObjectEventPic_Flabebe##Form, \ + sPicTable_Flabebe##Form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ - sAnimTable_Following, \ + sAnimTable_Following, \ gOverworldPalette_Flabebe##Form, \ gShinyOverworldPalette_Flabebe##Form \ ) \ @@ -1778,7 +1778,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-3, 12, SHADOW_SIZE_S) \ FOOTPRINT(Floette) \ OVERWORLD( \ - gObjectEventPic_Floette ##form, \ + sPicTable_Floette ##form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -1927,7 +1927,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-5, 15, SHADOW_SIZE_M) \ FOOTPRINT(Florges) \ OVERWORLD( \ - gObjectEventPic_Florges ##Form, \ + sPicTable_Florges ##Form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -2039,7 +2039,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 7, SHADOW_SIZE_M) FOOTPRINT(Skiddo) OVERWORLD( - gObjectEventPic_Skiddo, + sPicTable_Skiddo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2107,7 +2107,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gogoat) OVERWORLD( - gObjectEventPic_Gogoat, + sPicTable_Gogoat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2179,7 +2179,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Pancham) OVERWORLD( - gObjectEventPic_Pancham, + sPicTable_Pancham, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2251,7 +2251,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Pangoro) OVERWORLD( - gObjectEventPic_Pangoro, + sPicTable_Pangoro, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2312,7 +2312,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) \ FOOTPRINT(Furfrou) \ OVERWORLD( \ - gObjectEventPic_Furfrou##_form, \ + sPicTable_Furfrou##_form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -2398,7 +2398,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 4, SHADOW_SIZE_S) FOOTPRINT(Espurr) OVERWORLD( - gObjectEventPic_Espurr, + sPicTable_Espurr, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2463,7 +2463,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 11, SHADOW_SIZE_S) FOOTPRINT(Meowstic) OVERWORLD( - gObjectEventPic_MeowsticM, + sPicTable_MeowsticM, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2526,7 +2526,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 12, SHADOW_SIZE_S) FOOTPRINT(Meowstic) OVERWORLD( - gObjectEventPic_MeowsticF, + sPicTable_MeowsticF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2596,7 +2596,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-10, 11, SHADOW_SIZE_S) FOOTPRINT(Honedge) OVERWORLD( - gObjectEventPic_Honedge, + sPicTable_Honedge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2667,7 +2667,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(8, 11, SHADOW_SIZE_M) FOOTPRINT(Doublade) OVERWORLD( - gObjectEventPic_Doublade, + sPicTable_Doublade, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2740,7 +2740,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 14, SHADOW_SIZE_M) FOOTPRINT(Aegislash) OVERWORLD( - gObjectEventPic_AegislashShield, + sPicTable_AegislashShield, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2882,7 +2882,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Spritzee) OVERWORLD( - gObjectEventPic_Spritzee, + sPicTable_Spritzee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2950,7 +2950,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 10, SHADOW_SIZE_M) FOOTPRINT(Aromatisse) OVERWORLD( - gObjectEventPic_Aromatisse, + sPicTable_Aromatisse, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3022,7 +3022,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, -1, SHADOW_SIZE_S) FOOTPRINT(Swirlix) OVERWORLD( - gObjectEventPic_Swirlix, + sPicTable_Swirlix, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3093,7 +3093,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 6, SHADOW_SIZE_M) FOOTPRINT(Slurpuff) OVERWORLD( - gObjectEventPic_Slurpuff, + sPicTable_Slurpuff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3163,7 +3163,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 11, SHADOW_SIZE_S) FOOTPRINT(Inkay) OVERWORLD( - gObjectEventPic_Inkay, + sPicTable_Inkay, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3232,7 +3232,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(5, 14, SHADOW_SIZE_M) FOOTPRINT(Malamar) OVERWORLD( - gObjectEventPic_Malamar, + sPicTable_Malamar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3303,7 +3303,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Binacle) OVERWORLD( - gObjectEventPic_Binacle, + sPicTable_Binacle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3371,7 +3371,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(Barbaracle) OVERWORLD( - gObjectEventPic_Barbaracle, + sPicTable_Barbaracle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3444,7 +3444,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 5, SHADOW_SIZE_S) FOOTPRINT(Skrelp) OVERWORLD( - gObjectEventPic_Skrelp, + sPicTable_Skrelp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3513,7 +3513,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-3, 14, SHADOW_SIZE_M) FOOTPRINT(Dragalge) OVERWORLD( - gObjectEventPic_Dragalge, + sPicTable_Dragalge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3584,7 +3584,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, -6, SHADOW_SIZE_M) FOOTPRINT(Clauncher) OVERWORLD( - gObjectEventPic_Clauncher, + sPicTable_Clauncher, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3658,7 +3658,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(6, 1, SHADOW_SIZE_L) FOOTPRINT(Clawitzer) OVERWORLD( - gObjectEventPic_Clawitzer, + sPicTable_Clawitzer, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3726,7 +3726,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Helioptile) OVERWORLD( - gObjectEventPic_Helioptile, + sPicTable_Helioptile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3795,7 +3795,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 10, SHADOW_SIZE_M) FOOTPRINT(Heliolisk) OVERWORLD( - gObjectEventPic_Heliolisk, + sPicTable_Heliolisk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3864,7 +3864,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 2, SHADOW_SIZE_M) FOOTPRINT(Tyrunt) OVERWORLD( - gObjectEventPic_Tyrunt, + sPicTable_Tyrunt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3931,7 +3931,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 14, SHADOW_SIZE_L) FOOTPRINT(Tyrantrum) OVERWORLD( - gObjectEventPic_Tyrantrum, + sPicTable_Tyrantrum, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4006,7 +4006,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 8, SHADOW_SIZE_S) FOOTPRINT(Amaura) OVERWORLD( - gObjectEventPic_Amaura, + sPicTable_Amaura, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4073,7 +4073,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-6, 14, SHADOW_SIZE_L) FOOTPRINT(Aurorus) OVERWORLD( - gObjectEventPic_Aurorus, + sPicTable_Aurorus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4146,7 +4146,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 6, SHADOW_SIZE_S) FOOTPRINT(Hawlucha) OVERWORLD( - gObjectEventPic_Hawlucha, + sPicTable_Hawlucha, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4215,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 1, SHADOW_SIZE_S) FOOTPRINT(Dedenne) OVERWORLD( - gObjectEventPic_Dedenne, + sPicTable_Dedenne, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4292,7 +4292,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Carbink) OVERWORLD( - gObjectEventPic_Carbink, + sPicTable_Carbink, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4361,7 +4361,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, -1, SHADOW_SIZE_S) FOOTPRINT(Goomy) OVERWORLD( - gObjectEventPic_Goomy, + sPicTable_Goomy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4431,7 +4431,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 6, SHADOW_SIZE_S) FOOTPRINT(Sliggoo) OVERWORLD( - gObjectEventPic_Sliggoo, + sPicTable_Sliggoo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4502,7 +4502,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Goodra) OVERWORLD( - gObjectEventPic_Goodra, + sPicTable_Goodra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4567,7 +4567,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 6, SHADOW_SIZE_M) FOOTPRINT(Sliggoo) OVERWORLD( - gObjectEventPic_SliggooHisui, + sPicTable_SliggooHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4633,7 +4633,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Goodra) OVERWORLD( - gObjectEventPic_GoodraHisui, + sPicTable_GoodraHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4712,7 +4712,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Klefki) OVERWORLD( - gObjectEventPic_Klefki, + sPicTable_Klefki, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4782,7 +4782,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Phantump) OVERWORLD( - gObjectEventPic_Phantump, + sPicTable_Phantump, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4854,7 +4854,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Trevenant) OVERWORLD( - gObjectEventPic_Trevenant, + sPicTable_Trevenant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4918,7 +4918,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) OVERWORLD( - gObjectEventPic_PumpkabooAverage, + sPicTable_PumpkabooAverage, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4983,7 +4983,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-1, -1, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) OVERWORLD( - gObjectEventPic_PumpkabooSmall, + sPicTable_PumpkabooSmall, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5048,7 +5048,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) OVERWORLD( - gObjectEventPic_PumpkabooLarge, + sPicTable_PumpkabooLarge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5115,7 +5115,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 4, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) OVERWORLD( - gObjectEventPic_PumpkabooSuper, + sPicTable_PumpkabooSuper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5181,7 +5181,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 10, SHADOW_SIZE_M) FOOTPRINT(Gourgeist) OVERWORLD( - gObjectEventPic_GourgeistAverage, + sPicTable_GourgeistAverage, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5244,7 +5244,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 9, SHADOW_SIZE_S) FOOTPRINT(Gourgeist) OVERWORLD( - gObjectEventPic_GourgeistSmall, + sPicTable_GourgeistSmall, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5307,7 +5307,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 12, SHADOW_SIZE_M) FOOTPRINT(Gourgeist) OVERWORLD( - gObjectEventPic_GourgeistLarge, + sPicTable_GourgeistLarge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5372,7 +5372,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(4, 14, SHADOW_SIZE_M) FOOTPRINT(Gourgeist) OVERWORLD( - gObjectEventPic_GourgeistSuper, + sPicTable_GourgeistSuper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5449,7 +5449,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, -1, SHADOW_SIZE_S) FOOTPRINT(Bergmite) OVERWORLD( - gObjectEventPic_Bergmite, + sPicTable_Bergmite, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5519,7 +5519,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, -1, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Avalugg) OVERWORLD( - gObjectEventPic_Avalugg, + sPicTable_Avalugg, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5582,7 +5582,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, -2, SHADOW_SIZE_L) FOOTPRINT(Avalugg) OVERWORLD( - gObjectEventPic_AvaluggHisui, + sPicTable_AvaluggHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5663,7 +5663,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(2, 11, SHADOW_SIZE_L) FOOTPRINT(Noibat) OVERWORLD( - gObjectEventPic_Noibat, + sPicTable_Noibat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5734,7 +5734,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(5, 10, SHADOW_SIZE_L) FOOTPRINT(Noivern) OVERWORLD( - gObjectEventPic_Noivern, + sPicTable_Noivern, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5794,7 +5794,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 14, SHADOW_SIZE_M) FOOTPRINT(Xerneas) OVERWORLD( - gObjectEventPic_XerneasNeutral, + sPicTable_XerneasNeutral, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5857,7 +5857,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(3, 14, SHADOW_SIZE_M) FOOTPRINT(Xerneas) OVERWORLD( - gObjectEventPic_XerneasActive, + sPicTable_XerneasActive, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5932,7 +5932,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 16, SHADOW_SIZE_L) FOOTPRINT(Yveltal) OVERWORLD( - gObjectEventPic_Yveltal, + sPicTable_Yveltal, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5996,7 +5996,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Zygarde) OVERWORLD( - gObjectEventPic_Zygarde50, + sPicTable_Zygarde50, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6059,7 +6059,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Zygarde) OVERWORLD( - gObjectEventPic_Zygarde50, + sPicTable_Zygarde50, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6122,7 +6122,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Zygarde) OVERWORLD( - gObjectEventPic_Zygarde10, + sPicTable_Zygarde10, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6186,7 +6186,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Zygarde) OVERWORLD( - gObjectEventPic_Zygarde10, + sPicTable_Zygarde10, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6258,7 +6258,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(-3, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Zygarde) OVERWORLD( - gObjectEventPic_ZygardeComplete, + sPicTable_ZygardeComplete, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6332,7 +6332,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Diancie) OVERWORLD( - gObjectEventPic_Diancie, + sPicTable_Diancie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6402,7 +6402,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = FOOTPRINT(Diancie) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_DiancieMega, + sPicTable_DiancieMega, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6485,7 +6485,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Hoopa) OVERWORLD( - gObjectEventPic_HoopaConfined, + sPicTable_HoopaConfined, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6556,7 +6556,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(1, 14, SHADOW_SIZE_L) FOOTPRINT(Hoopa) OVERWORLD( - gObjectEventPic_HoopaUnbound, + sPicTable_HoopaUnbound, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6628,7 +6628,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SHADOW(0, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Volcanion) OVERWORLD( - gObjectEventPic_Volcanion, + sPicTable_Volcanion, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index d2c9dfada6..fb97530b74 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -57,7 +57,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 1, SHADOW_SIZE_S) FOOTPRINT(Rowlet) OVERWORLD( - gObjectEventPic_Rowlet, + sPicTable_Rowlet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -125,7 +125,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Dartrix) OVERWORLD( - gObjectEventPic_Dartrix, + sPicTable_Dartrix, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -192,7 +192,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Decidueye) OVERWORLD( - gObjectEventPic_Decidueye, + sPicTable_Decidueye, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -256,7 +256,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 14, SHADOW_SIZE_L) FOOTPRINT(Decidueye) OVERWORLD( - gObjectEventPic_DecidueyeHisui, + sPicTable_DecidueyeHisui, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -323,7 +323,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 1, SHADOW_SIZE_S) FOOTPRINT(Litten) OVERWORLD( - gObjectEventPic_Litten, + sPicTable_Litten, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -387,7 +387,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 7, SHADOW_SIZE_M) FOOTPRINT(Torracat) OVERWORLD( - gObjectEventPic_Torracat, + sPicTable_Torracat, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -450,7 +450,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(Incineroar) OVERWORLD( - gObjectEventPic_Incineroar, + sPicTable_Incineroar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -514,7 +514,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Popplio) OVERWORLD( - gObjectEventPic_Popplio, + sPicTable_Popplio, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -578,7 +578,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-5, 6, SHADOW_SIZE_M) FOOTPRINT(Brionne) OVERWORLD( - gObjectEventPic_Brionne, + sPicTable_Brionne, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -641,7 +641,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-6, 11, SHADOW_SIZE_L) FOOTPRINT(Primarina) OVERWORLD( - gObjectEventPic_Primarina, + sPicTable_Primarina, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -710,7 +710,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Pikipek) OVERWORLD( - gObjectEventPic_Pikipek, + sPicTable_Pikipek, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -780,7 +780,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 8, SHADOW_SIZE_S) FOOTPRINT(Trumbeak) OVERWORLD( - gObjectEventPic_Trumbeak, + sPicTable_Trumbeak, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -847,7 +847,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(9, 12, SHADOW_SIZE_M) FOOTPRINT(Toucannon) OVERWORLD( - gObjectEventPic_Toucannon, + sPicTable_Toucannon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -912,7 +912,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-9, 1, SHADOW_SIZE_M) FOOTPRINT(Yungoos) OVERWORLD( - gObjectEventPic_Yungoos, + sPicTable_Yungoos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -973,7 +973,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Gumshoos) OVERWORLD( - gObjectEventPic_Gumshoos, + sPicTable_Gumshoos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1033,7 +1033,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 8, SHADOW_SIZE_M) FOOTPRINT(Gumshoos) OVERWORLD( - gObjectEventPic_Gumshoos, + sPicTable_Gumshoos, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1100,7 +1100,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, -4, SHADOW_SIZE_M) FOOTPRINT(Grubbin) OVERWORLD( - gObjectEventPic_Grubbin, + sPicTable_Grubbin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1169,7 +1169,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = NO_SHADOW FOOTPRINT(Charjabug) OVERWORLD( - gObjectEventPic_Charjabug, + sPicTable_Charjabug, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1231,7 +1231,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 16, SHADOW_SIZE_S) FOOTPRINT(Vikavolt) OVERWORLD( - gObjectEventPic_Vikavolt, + sPicTable_Vikavolt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1299,7 +1299,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 16, SHADOW_SIZE_S) FOOTPRINT(Vikavolt) OVERWORLD( - gObjectEventPic_Vikavolt, + sPicTable_Vikavolt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1367,7 +1367,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(7, 6, SHADOW_SIZE_M) FOOTPRINT(Crabrawler) OVERWORLD( - gObjectEventPic_Crabrawler, + sPicTable_Crabrawler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1433,7 +1433,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 14, SHADOW_SIZE_L) FOOTPRINT(Crabominable) OVERWORLD( - gObjectEventPic_Crabominable, + sPicTable_Crabominable, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1498,7 +1498,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, 9, SHADOW_SIZE_S) FOOTPRINT(Oricorio) OVERWORLD( - gObjectEventPic_OricorioBaile, + sPicTable_OricorioBaile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1564,7 +1564,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 8, SHADOW_SIZE_S) FOOTPRINT(Oricorio) OVERWORLD( - gObjectEventPic_OricorioPomPom, + sPicTable_OricorioPomPom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1630,7 +1630,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, 11, SHADOW_SIZE_S) FOOTPRINT(Oricorio) OVERWORLD( - gObjectEventPic_OricorioPau, + sPicTable_OricorioPau, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1696,7 +1696,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(7, 10, SHADOW_SIZE_S) FOOTPRINT(Oricorio) OVERWORLD( - gObjectEventPic_OricorioSensu, + sPicTable_OricorioSensu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1798,7 +1798,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Cutiefly) OVERWORLD( - gObjectEventPic_Cutiefly, + sPicTable_Cutiefly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1861,7 +1861,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Ribombee) OVERWORLD( - gObjectEventPic_Ribombee, + sPicTable_Ribombee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1922,7 +1922,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Ribombee) OVERWORLD( - gObjectEventPic_Ribombee, + sPicTable_Ribombee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1985,7 +1985,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Rockruff) OVERWORLD( - gObjectEventPic_Rockruff, + sPicTable_Rockruff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2047,7 +2047,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Rockruff) OVERWORLD( - gObjectEventPic_Rockruff, + sPicTable_Rockruff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2115,7 +2115,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 7, SHADOW_SIZE_L) FOOTPRINT(Lycanroc) OVERWORLD( - gObjectEventPic_LycanrocMidday, + sPicTable_LycanrocMidday, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2181,7 +2181,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 13, SHADOW_SIZE_L) FOOTPRINT(Lycanroc) OVERWORLD( - gObjectEventPic_LycanrocMidnight, + sPicTable_LycanrocMidnight, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2247,7 +2247,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 7, SHADOW_SIZE_L) FOOTPRINT(Lycanroc) OVERWORLD( - gObjectEventPic_LycanrocDusk, + sPicTable_LycanrocDusk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2313,7 +2313,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 3, SHADOW_SIZE_S) FOOTPRINT(Wishiwashi) OVERWORLD( - gObjectEventPic_WishiwashiSolo, + sPicTable_WishiwashiSolo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2437,7 +2437,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Mareanie) OVERWORLD( - gObjectEventPic_Mareanie, + sPicTable_Mareanie, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2502,7 +2502,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Toxapex) OVERWORLD( - gObjectEventPic_Toxapex, + sPicTable_Toxapex, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2567,7 +2567,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(2, 6, SHADOW_SIZE_M) FOOTPRINT(Mudbray) OVERWORLD( - gObjectEventPic_Mudbray, + sPicTable_Mudbray, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2632,7 +2632,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(4, 13, SHADOW_SIZE_L) FOOTPRINT(Mudsdale) OVERWORLD( - gObjectEventPic_Mudsdale, + sPicTable_Mudsdale, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2704,7 +2704,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 2, SHADOW_SIZE_S) FOOTPRINT(Dewpider) OVERWORLD( - gObjectEventPic_Dewpider, + sPicTable_Dewpider, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2766,7 +2766,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-6, 9, SHADOW_SIZE_M) FOOTPRINT(Araquanid) OVERWORLD( - gObjectEventPic_Araquanid, + sPicTable_Araquanid, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2826,7 +2826,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-6, 9, SHADOW_SIZE_S) FOOTPRINT(Araquanid) OVERWORLD( - gObjectEventPic_Araquanid, + sPicTable_Araquanid, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2894,7 +2894,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 3, SHADOW_SIZE_S) FOOTPRINT(Fomantis) OVERWORLD( - gObjectEventPic_Fomantis, + sPicTable_Fomantis, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2956,7 +2956,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Lurantis) OVERWORLD( - gObjectEventPic_Lurantis, + sPicTable_Lurantis, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3016,7 +3016,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Lurantis) OVERWORLD( - gObjectEventPic_Lurantis, + sPicTable_Lurantis, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3085,7 +3085,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 4, SHADOW_SIZE_S) FOOTPRINT(Morelull) OVERWORLD( - gObjectEventPic_Morelull, + sPicTable_Morelull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3151,7 +3151,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 10, SHADOW_SIZE_S) FOOTPRINT(Shiinotic) OVERWORLD( - gObjectEventPic_Shiinotic, + sPicTable_Shiinotic, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3220,7 +3220,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(3, 1, SHADOW_SIZE_M) FOOTPRINT(Salandit) OVERWORLD( - gObjectEventPic_Salandit, + sPicTable_Salandit, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3282,7 +3282,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Salazzle) OVERWORLD( - gObjectEventPic_Salazzle, + sPicTable_Salazzle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3342,7 +3342,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Salazzle) OVERWORLD( - gObjectEventPic_Salazzle, + sPicTable_Salazzle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3413,7 +3413,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Stufful) OVERWORLD( - gObjectEventPic_Stufful, + sPicTable_Stufful, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3481,7 +3481,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Bewear) OVERWORLD( - gObjectEventPic_Bewear, + sPicTable_Bewear, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3546,7 +3546,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, -3, SHADOW_SIZE_S) FOOTPRINT(Bounsweet) OVERWORLD( - gObjectEventPic_Bounsweet, + sPicTable_Bounsweet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3612,7 +3612,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 7, SHADOW_SIZE_S) FOOTPRINT(Steenee) OVERWORLD( - gObjectEventPic_Steenee, + sPicTable_Steenee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3677,7 +3677,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 13, SHADOW_SIZE_M) FOOTPRINT(Tsareena) OVERWORLD( - gObjectEventPic_Tsareena, + sPicTable_Tsareena, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3744,7 +3744,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 10, SHADOW_SIZE_M) FOOTPRINT(Comfey) OVERWORLD( - gObjectEventPic_Comfey, + sPicTable_Comfey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3812,7 +3812,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 6, SHADOW_SIZE_M) FOOTPRINT(Oranguru) OVERWORLD( - gObjectEventPic_Oranguru, + sPicTable_Oranguru, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3880,7 +3880,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, 12, SHADOW_SIZE_L) FOOTPRINT(Passimian) OVERWORLD( - gObjectEventPic_Passimian, + sPicTable_Passimian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3949,7 +3949,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, -3, SHADOW_SIZE_S) FOOTPRINT(Wimpod) OVERWORLD( - gObjectEventPic_Wimpod, + sPicTable_Wimpod, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4017,7 +4017,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(2, 13, SHADOW_SIZE_L) FOOTPRINT(Golisopod) OVERWORLD( - gObjectEventPic_Golisopod, + sPicTable_Golisopod, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4082,7 +4082,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = NO_SHADOW FOOTPRINT(Sandygast) OVERWORLD( - gObjectEventPic_Sandygast, + sPicTable_Sandygast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4147,7 +4147,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = NO_SHADOW FOOTPRINT(Palossand) OVERWORLD( - gObjectEventPic_Palossand, + sPicTable_Palossand, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4215,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, -3, SHADOW_SIZE_S) FOOTPRINT(Pyukumuku) OVERWORLD( - gObjectEventPic_Pyukumuku, + sPicTable_Pyukumuku, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4280,7 +4280,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Type_Null) OVERWORLD( - gObjectEventPic_TypeNull, + sPicTable_TypeNull, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4343,7 +4343,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 13, SHADOW_SIZE_L) \ FOOTPRINT(Silvally) \ OVERWORLD( \ - gObjectEventPic_Silvally, \ + sPicTable_Silvally, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -4435,7 +4435,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 0, \ SHADOW(0, 14, SHADOW_SIZE_S) \ OVERWORLD( \ - gObjectEventPic_MiniorMeteor, \ + sPicTable_MiniorMeteor, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -4543,7 +4543,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-4, 0, SHADOW_SIZE_S) FOOTPRINT(Komala) OVERWORLD( - gObjectEventPic_Komala, + sPicTable_Komala, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4613,7 +4613,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, 12, SHADOW_SIZE_L) FOOTPRINT(Turtonator) OVERWORLD( - gObjectEventPic_Turtonator, + sPicTable_Turtonator, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4675,7 +4675,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 4, SHADOW_SIZE_S) FOOTPRINT(Togedemaru) OVERWORLD( - gObjectEventPic_Togedemaru, + sPicTable_Togedemaru, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4736,7 +4736,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 4, SHADOW_SIZE_S) FOOTPRINT(Togedemaru) OVERWORLD( - gObjectEventPic_Togedemaru, + sPicTable_Togedemaru, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4801,7 +4801,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Mimikyu) OVERWORLD( - gObjectEventPic_MimikyuDisguised, + sPicTable_MimikyuDisguised, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4916,7 +4916,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Mimikyu) OVERWORLD( - gObjectEventPic_MimikyuDisguised, + sPicTable_MimikyuDisguised, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5041,7 +5041,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Bruxish) OVERWORLD( - gObjectEventPic_Bruxish, + sPicTable_Bruxish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5110,7 +5110,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(5, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Drampa) OVERWORLD( - gObjectEventPic_Drampa, + sPicTable_Drampa, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5177,7 +5177,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_M) FOOTPRINT(Dhelmise) OVERWORLD( - gObjectEventPic_Dhelmise, + sPicTable_Dhelmise, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5245,7 +5245,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(JangmoO) OVERWORLD( - gObjectEventPic_JangmoO, + sPicTable_JangmoO, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5313,7 +5313,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 12, SHADOW_SIZE_M) FOOTPRINT(HakamoO) OVERWORLD( - gObjectEventPic_HakamoO, + sPicTable_HakamoO, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5374,7 +5374,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(KommoO) OVERWORLD( - gObjectEventPic_KommoO, + sPicTable_KommoO, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5440,7 +5440,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(KommoO) OVERWORLD( - gObjectEventPic_KommoO, + sPicTable_KommoO, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5516,7 +5516,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 19, SHADOW_SIZE_M) FOOTPRINT(TapuKoko) OVERWORLD( - gObjectEventPic_TapuKoko, + sPicTable_TapuKoko, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5587,7 +5587,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(TapuLele) OVERWORLD( - gObjectEventPic_TapuLele, + sPicTable_TapuLele, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5660,7 +5660,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(4, 16, SHADOW_SIZE_M) FOOTPRINT(TapuBulu) OVERWORLD( - gObjectEventPic_TapuBulu, + sPicTable_TapuBulu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5732,7 +5732,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(1, 15, SHADOW_SIZE_M) FOOTPRINT(TapuFini) OVERWORLD( - gObjectEventPic_TapuFini, + sPicTable_TapuFini, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5799,7 +5799,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 8, SHADOW_SIZE_S) FOOTPRINT(Cosmog) OVERWORLD( - gObjectEventPic_Cosmog, + sPicTable_Cosmog, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5868,7 +5868,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Cosmoem) OVERWORLD( - gObjectEventPic_Cosmoem, + sPicTable_Cosmoem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5936,7 +5936,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Solgaleo) OVERWORLD( - gObjectEventPic_Solgaleo, + sPicTable_Solgaleo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6002,7 +6002,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(4, 17, SHADOW_SIZE_L) FOOTPRINT(Lunala) OVERWORLD( - gObjectEventPic_Lunala, + sPicTable_Lunala, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6070,7 +6070,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 14, SHADOW_SIZE_S) FOOTPRINT(Nihilego) OVERWORLD( - gObjectEventPic_Nihilego, + sPicTable_Nihilego, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6137,7 +6137,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Buzzwole) OVERWORLD( - gObjectEventPic_Buzzwole, + sPicTable_Buzzwole, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6203,7 +6203,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Pheromosa) OVERWORLD( - gObjectEventPic_Pheromosa, + sPicTable_Pheromosa, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6269,7 +6269,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Xurkitree) OVERWORLD( - gObjectEventPic_Xurkitree, + sPicTable_Xurkitree, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6337,7 +6337,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 13, SHADOW_SIZE_M) FOOTPRINT(Celesteela) OVERWORLD( - gObjectEventPic_Celesteela, + sPicTable_Celesteela, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6404,7 +6404,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(2, 14, SHADOW_SIZE_M) FOOTPRINT(Kartana) OVERWORLD( - gObjectEventPic_Kartana, + sPicTable_Kartana, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6470,7 +6470,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(4, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Guzzlord) OVERWORLD( - gObjectEventPic_Guzzlord, + sPicTable_Guzzlord, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6539,7 +6539,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 15, SHADOW_SIZE_M) FOOTPRINT(Necrozma) OVERWORLD( - gObjectEventPic_Necrozma, + sPicTable_Necrozma, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6607,7 +6607,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-3, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Necrozma) OVERWORLD( - gObjectEventPic_NecrozmaDuskMane, + sPicTable_NecrozmaDuskMane, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6677,7 +6677,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(3, 17, SHADOW_SIZE_L) FOOTPRINT(Necrozma) OVERWORLD( - gObjectEventPic_NecrozmaDawnWings, + sPicTable_NecrozmaDawnWings, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6751,7 +6751,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = FOOTPRINT(Necrozma) #if OW_BATTLE_ONLY_FORMS OVERWORLD( - gObjectEventPic_NecrozmaUltra, + sPicTable_NecrozmaUltra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6824,7 +6824,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Magearna) OVERWORLD( - gObjectEventPic_Magearna, + sPicTable_Magearna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6889,7 +6889,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Magearna) OVERWORLD( - gObjectEventPic_MagearnaOriginal, + sPicTable_MagearnaOriginal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6963,7 +6963,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Marshadow) OVERWORLD( - gObjectEventPic_Marshadow, + sPicTable_Marshadow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7030,7 +7030,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Poipole) OVERWORLD( - gObjectEventPic_Poipole, + sPicTable_Poipole, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7095,7 +7095,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(7, 17, SHADOW_SIZE_M) FOOTPRINT(Naganadel) OVERWORLD( - gObjectEventPic_Naganadel, + sPicTable_Naganadel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7161,7 +7161,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(2, 15, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Stakataka) OVERWORLD( - gObjectEventPic_Stakataka, + sPicTable_Stakataka, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7227,7 +7227,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Blacephalon) OVERWORLD( - gObjectEventPic_Blacephalon, + sPicTable_Blacephalon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7292,7 +7292,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Zeraora) OVERWORLD( - gObjectEventPic_Zeraora, + sPicTable_Zeraora, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7358,7 +7358,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(-1, 2, SHADOW_SIZE_S) FOOTPRINT(Meltan) OVERWORLD( - gObjectEventPic_Meltan, + sPicTable_Meltan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7422,7 +7422,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SHADOW(3, 10, SHADOW_SIZE_L) FOOTPRINT(Melmetal) OVERWORLD( - gObjectEventPic_Melmetal, + sPicTable_Melmetal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 9898b4da9d..ee3a17dfe9 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -54,7 +54,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 1, SHADOW_SIZE_S) FOOTPRINT(Grookey) OVERWORLD( - gObjectEventPic_Grookey, + sPicTable_Grookey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -117,7 +117,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(5, 6, SHADOW_SIZE_M) FOOTPRINT(Thwackey) OVERWORLD( - gObjectEventPic_Thwackey, + sPicTable_Thwackey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -179,7 +179,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 8, SHADOW_SIZE_L) FOOTPRINT(Rillaboom) OVERWORLD( - gObjectEventPic_Rillaboom, + sPicTable_Rillaboom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -302,7 +302,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 6, SHADOW_SIZE_S) FOOTPRINT(Scorbunny) OVERWORLD( - gObjectEventPic_Scorbunny, + sPicTable_Scorbunny, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -365,7 +365,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-4, 5, SHADOW_SIZE_S) FOOTPRINT(Raboot) OVERWORLD( - gObjectEventPic_Raboot, + sPicTable_Raboot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -428,7 +428,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 14, SHADOW_SIZE_M) FOOTPRINT(Cinderace) OVERWORLD( - gObjectEventPic_Cinderace, + sPicTable_Cinderace, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -553,7 +553,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-3, 3, SHADOW_SIZE_S) FOOTPRINT(Sobble) OVERWORLD( - gObjectEventPic_Sobble, + sPicTable_Sobble, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -616,7 +616,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 5, SHADOW_SIZE_M) FOOTPRINT(Drizzile) OVERWORLD( - gObjectEventPic_Drizzile, + sPicTable_Drizzile, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -679,7 +679,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-5, 12, SHADOW_SIZE_S) FOOTPRINT(Inteleon) OVERWORLD( - gObjectEventPic_Inteleon, + sPicTable_Inteleon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -803,7 +803,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-7, 5, SHADOW_SIZE_S) FOOTPRINT(Skwovet) OVERWORLD( - gObjectEventPic_Skwovet, + sPicTable_Skwovet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -868,7 +868,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-11, 10, SHADOW_SIZE_M) FOOTPRINT(Greedent) OVERWORLD( - gObjectEventPic_Greedent, + sPicTable_Greedent, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -940,7 +940,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, -3, SHADOW_SIZE_S) FOOTPRINT(Rookidee) OVERWORLD( - gObjectEventPic_Rookidee, + sPicTable_Rookidee, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1013,7 +1013,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 16, SHADOW_SIZE_S) FOOTPRINT(Corvisquire) OVERWORLD( - gObjectEventPic_Corvisquire, + sPicTable_Corvisquire, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1080,7 +1080,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 9, SHADOW_SIZE_L) FOOTPRINT(Corviknight) OVERWORLD( - gObjectEventPic_Corviknight, + sPicTable_Corviknight, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1203,7 +1203,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 1, SHADOW_SIZE_S) FOOTPRINT(Blipbug) OVERWORLD( - gObjectEventPic_Blipbug, + sPicTable_Blipbug, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1269,7 +1269,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 0, SHADOW_SIZE_M) FOOTPRINT(Dottler) OVERWORLD( - gObjectEventPic_Dottler, + sPicTable_Dottler, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1334,7 +1334,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 15, SHADOW_SIZE_M) FOOTPRINT(Orbeetle) OVERWORLD( - gObjectEventPic_Orbeetle, + sPicTable_Orbeetle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1459,7 +1459,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 4, SHADOW_SIZE_M) FOOTPRINT(Nickit) OVERWORLD( - gObjectEventPic_Nickit, + sPicTable_Nickit, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1523,7 +1523,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-9, 7, SHADOW_SIZE_M) FOOTPRINT(Thievul) OVERWORLD( - gObjectEventPic_Thievul, + sPicTable_Thievul, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1587,7 +1587,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Gossifleur) OVERWORLD( - gObjectEventPic_Gossifleur, + sPicTable_Gossifleur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1651,7 +1651,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, 8, SHADOW_SIZE_S) FOOTPRINT(Eldegoss) OVERWORLD( - gObjectEventPic_Eldegoss, + sPicTable_Eldegoss, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1715,7 +1715,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 1, SHADOW_SIZE_S) FOOTPRINT(Wooloo) OVERWORLD( - gObjectEventPic_Wooloo, + sPicTable_Wooloo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1779,7 +1779,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 8, SHADOW_SIZE_M) FOOTPRINT(Dubwool) OVERWORLD( - gObjectEventPic_Dubwool, + sPicTable_Dubwool, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1846,7 +1846,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(3, 1, SHADOW_SIZE_S) FOOTPRINT(Chewtle) OVERWORLD( - gObjectEventPic_Chewtle, + sPicTable_Chewtle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1913,7 +1913,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, 4, SHADOW_SIZE_L) FOOTPRINT(Drednaw) OVERWORLD( - gObjectEventPic_Drednaw, + sPicTable_Drednaw, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2037,7 +2037,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 2, SHADOW_SIZE_M) FOOTPRINT(Yamper) OVERWORLD( - gObjectEventPic_Yamper, + sPicTable_Yamper, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2101,7 +2101,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Boltund) OVERWORLD( - gObjectEventPic_Boltund, + sPicTable_Boltund, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2165,7 +2165,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, -3, SHADOW_SIZE_S) FOOTPRINT(Rolycoly) OVERWORLD( - gObjectEventPic_Rolycoly, + sPicTable_Rolycoly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2228,7 +2228,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 3, SHADOW_SIZE_M) FOOTPRINT(Carkol) OVERWORLD( - gObjectEventPic_Carkol, + sPicTable_Carkol, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2291,7 +2291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 12, SHADOW_SIZE_L) FOOTPRINT(Coalossal) OVERWORLD( - gObjectEventPic_Coalossal, + sPicTable_Coalossal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2415,7 +2415,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, -3, SHADOW_SIZE_S) FOOTPRINT(Applin) OVERWORLD( - gObjectEventPic_Applin, + sPicTable_Applin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2482,7 +2482,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-6, 11, SHADOW_SIZE_S) FOOTPRINT(Flapple) OVERWORLD( - gObjectEventPic_Flapple, + sPicTable_Flapple, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2603,7 +2603,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(5, 6, SHADOW_SIZE_L) FOOTPRINT(Appletun) OVERWORLD( - gObjectEventPic_Appletun, + sPicTable_Appletun, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2725,7 +2725,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-4, 8, SHADOW_SIZE_S) FOOTPRINT(Dipplin) OVERWORLD( - gObjectEventPic_Dipplin, + sPicTable_Dipplin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2788,7 +2788,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 12, SHADOW_SIZE_L) FOOTPRINT(Hydrapple) OVERWORLD( - gObjectEventPic_Hydrapple, + sPicTable_Hydrapple, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2852,7 +2852,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(3, 1, SHADOW_SIZE_M) FOOTPRINT(Silicobra) OVERWORLD( - gObjectEventPic_Silicobra, + sPicTable_Silicobra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2916,7 +2916,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, -1, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Sandaconda) OVERWORLD( - gObjectEventPic_Sandaconda, + sPicTable_Sandaconda, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3039,7 +3039,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(5, 14, SHADOW_SIZE_M) FOOTPRINT(Cramorant) OVERWORLD( - gObjectEventPic_Cramorant, + sPicTable_Cramorant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3218,7 +3218,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, -5, SHADOW_SIZE_S) FOOTPRINT(Arrokuda) OVERWORLD( - gObjectEventPic_Arrokuda, + sPicTable_Arrokuda, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3282,7 +3282,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(4, 5, SHADOW_SIZE_M) FOOTPRINT(Barraskewda) OVERWORLD( - gObjectEventPic_Barraskewda, + sPicTable_Barraskewda, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3346,7 +3346,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, 1, SHADOW_SIZE_M) FOOTPRINT(Toxel) OVERWORLD( - gObjectEventPic_Toxel, + sPicTable_Toxel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3411,7 +3411,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-6, 13, SHADOW_SIZE_M) FOOTPRINT(Toxtricity) OVERWORLD( - gObjectEventPic_ToxtricityAmped, + sPicTable_ToxtricityAmped, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3528,7 +3528,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Toxtricity) OVERWORLD( - gObjectEventPic_ToxtricityLowKey, + sPicTable_ToxtricityLowKey, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3651,7 +3651,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(6, -4, SHADOW_SIZE_S) FOOTPRINT(Sizzlipede) OVERWORLD( - gObjectEventPic_Sizzlipede, + sPicTable_Sizzlipede, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3719,7 +3719,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-3, 7, SHADOW_SIZE_M) FOOTPRINT(Centiskorch) OVERWORLD( - gObjectEventPic_Centiskorch, + sPicTable_Centiskorch, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3843,7 +3843,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, -2, SHADOW_SIZE_S) FOOTPRINT(Clobbopus) OVERWORLD( - gObjectEventPic_Clobbopus, + sPicTable_Clobbopus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3906,7 +3906,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(4, 9, SHADOW_SIZE_M) FOOTPRINT(Grapploct) OVERWORLD( - gObjectEventPic_Grapploct, + sPicTable_Grapploct, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3970,7 +3970,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(3, 3, SHADOW_SIZE_S) FOOTPRINT(Sinistea) OVERWORLD( - gObjectEventPic_Sinistea, + sPicTable_Sinistea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4035,7 +4035,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(3, 4, SHADOW_SIZE_S) FOOTPRINT(Sinistea) OVERWORLD( - gObjectEventPic_Sinistea, + sPicTable_Sinistea, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4099,7 +4099,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 12, SHADOW_SIZE_S) FOOTPRINT(Polteageist) OVERWORLD( - gObjectEventPic_Polteageist, + sPicTable_Polteageist, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4163,7 +4163,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 11, SHADOW_SIZE_S) FOOTPRINT(Polteageist) OVERWORLD( - gObjectEventPic_Polteageist, + sPicTable_Polteageist, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4228,7 +4228,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 1, SHADOW_SIZE_M) FOOTPRINT(Hatenna) OVERWORLD( - gObjectEventPic_Hatenna, + sPicTable_Hatenna, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4291,7 +4291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Hattrem) OVERWORLD( - gObjectEventPic_Hattrem, + sPicTable_Hattrem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4353,7 +4353,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(6, 13, SHADOW_SIZE_S) FOOTPRINT(Hatterene) OVERWORLD( - gObjectEventPic_Hatterene, + sPicTable_Hatterene, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4477,7 +4477,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Impidimp) OVERWORLD( - gObjectEventPic_Impidimp, + sPicTable_Impidimp, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4540,7 +4540,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Morgrem) OVERWORLD( - gObjectEventPic_Morgrem, + sPicTable_Morgrem, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4603,7 +4603,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Grimmsnarl) OVERWORLD( - gObjectEventPic_Grimmsnarl, + sPicTable_Grimmsnarl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4727,7 +4727,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 6, SHADOW_SIZE_S) FOOTPRINT(Milcery) OVERWORLD( - gObjectEventPic_Milcery, + sPicTable_Milcery, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4798,7 +4798,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 5, SHADOW_SIZE_S) \ FOOTPRINT(Alcremie) \ OVERWORLD( \ - gObjectEventPic_AlcremieStrawberry, /*Alcremie ##sweet*/ \ + sPicTable_AlcremieStrawberry, /*Alcremie ##sweet*/ \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ @@ -4968,7 +4968,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-7, 5, SHADOW_SIZE_S) FOOTPRINT(Falinks) OVERWORLD( - gObjectEventPic_Falinks, + sPicTable_Falinks, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5031,7 +5031,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, -4, SHADOW_SIZE_S) FOOTPRINT(Pincurchin) OVERWORLD( - gObjectEventPic_Pincurchin, + sPicTable_Pincurchin, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5097,7 +5097,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, -7, SHADOW_SIZE_S) FOOTPRINT(Snom) OVERWORLD( - gObjectEventPic_Snom, + sPicTable_Snom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5162,7 +5162,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-7, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Frosmoth) OVERWORLD( - gObjectEventPic_Frosmoth, + sPicTable_Frosmoth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5226,7 +5226,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 10, SHADOW_SIZE_L) FOOTPRINT(Stonjourner) OVERWORLD( - gObjectEventPic_Stonjourner, + sPicTable_Stonjourner, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5291,7 +5291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 13, SHADOW_SIZE_S) FOOTPRINT(Eiscue) OVERWORLD( - gObjectEventPic_EiscueIce, + sPicTable_EiscueIce, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5414,7 +5414,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 4, SHADOW_SIZE_S) FOOTPRINT(Indeedee) OVERWORLD( - gObjectEventPic_IndeedeeM, + sPicTable_IndeedeeM, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5477,7 +5477,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 4, SHADOW_SIZE_S) FOOTPRINT(Indeedee) OVERWORLD( - gObjectEventPic_IndeedeeF, + sPicTable_IndeedeeF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5543,7 +5543,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 0, SHADOW_SIZE_S) FOOTPRINT(Morpeko) OVERWORLD( - gObjectEventPic_MorpekoFullBelly, + sPicTable_MorpekoFullBelly, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5667,7 +5667,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(5, 2, SHADOW_SIZE_M) FOOTPRINT(Cufant) OVERWORLD( - gObjectEventPic_Cufant, + sPicTable_Cufant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5731,7 +5731,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(6, 7, SHADOW_SIZE_L) FOOTPRINT(Copperajah) OVERWORLD( - gObjectEventPic_Copperajah, + sPicTable_Copperajah, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5856,7 +5856,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-4, 10, SHADOW_SIZE_L) FOOTPRINT(Dracozolt) OVERWORLD( - gObjectEventPic_Dracozolt, + sPicTable_Dracozolt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5919,7 +5919,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Arctozolt) OVERWORLD( - gObjectEventPic_Arctozolt, + sPicTable_Arctozolt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5983,7 +5983,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Dracovish) OVERWORLD( - gObjectEventPic_Dracovish, + sPicTable_Dracovish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6047,7 +6047,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 11, SHADOW_SIZE_L) FOOTPRINT(Arctovish) OVERWORLD( - gObjectEventPic_Arctovish, + sPicTable_Arctovish, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6114,7 +6114,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 11, SHADOW_SIZE_L) FOOTPRINT(Duraludon) OVERWORLD( - gObjectEventPic_Duraludon, + sPicTable_Duraludon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6240,7 +6240,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(4, 14, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Archaludon) OVERWORLD( - gObjectEventPic_Archaludon, + sPicTable_Archaludon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6306,7 +6306,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Dreepy) OVERWORLD( - gObjectEventPic_Dreepy, + sPicTable_Dreepy, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6370,7 +6370,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 9, SHADOW_SIZE_M) FOOTPRINT(Drakloak) OVERWORLD( - gObjectEventPic_Drakloak, + sPicTable_Drakloak, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6434,7 +6434,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Dragapult) OVERWORLD( - gObjectEventPic_Dragapult, + sPicTable_Dragapult, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6497,7 +6497,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 9, SHADOW_SIZE_L) FOOTPRINT(Zacian) OVERWORLD( - gObjectEventPic_ZacianHero, + sPicTable_ZacianHero, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6564,7 +6564,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-3, 12, SHADOW_SIZE_L) FOOTPRINT(Zacian) OVERWORLD( - gObjectEventPic_ZacianCrowned, + sPicTable_ZacianCrowned, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6633,7 +6633,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 12, SHADOW_SIZE_L) FOOTPRINT(Zamazenta) OVERWORLD( - gObjectEventPic_ZamazentaHero, + sPicTable_ZamazentaHero, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6700,7 +6700,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 12, SHADOW_SIZE_L) FOOTPRINT(Zamazenta) OVERWORLD( - gObjectEventPic_ZamazentaCrowned, + sPicTable_ZamazentaCrowned, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6770,7 +6770,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 14, SHADOW_SIZE_L) FOOTPRINT(Eternatus) OVERWORLD( - gObjectEventPic_Eternatus, + sPicTable_Eternatus, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6895,7 +6895,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-2, 5, SHADOW_SIZE_S) FOOTPRINT(Kubfu) OVERWORLD( - gObjectEventPic_Kubfu, + sPicTable_Kubfu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6963,7 +6963,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 14, SHADOW_SIZE_L) FOOTPRINT(Urshifu) OVERWORLD( - gObjectEventPic_Urshifu, + sPicTable_Urshifu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7088,7 +7088,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(4, 14, SHADOW_SIZE_M) FOOTPRINT(Urshifu) OVERWORLD( - gObjectEventPic_Urshifu, + sPicTable_Urshifu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7216,7 +7216,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(5, 11, SHADOW_SIZE_L) FOOTPRINT(Zarude) OVERWORLD( - gObjectEventPic_Zarude, + sPicTable_Zarude, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7341,7 +7341,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-3, 14, SHADOW_SIZE_S) FOOTPRINT(Regieleki) OVERWORLD( - gObjectEventPic_Regieleki, + sPicTable_Regieleki, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7408,7 +7408,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(0, 13, SHADOW_SIZE_M) FOOTPRINT(Regidrago) OVERWORLD( - gObjectEventPic_Regidrago, + sPicTable_Regidrago, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7473,7 +7473,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-5, 11, SHADOW_SIZE_L) FOOTPRINT(Glastrier) OVERWORLD( - gObjectEventPic_Glastrier, + sPicTable_Glastrier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7539,7 +7539,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-6, 12, SHADOW_SIZE_L) FOOTPRINT(Spectrier) OVERWORLD( - gObjectEventPic_Spectrier, + sPicTable_Spectrier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7605,7 +7605,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-1, 12, SHADOW_SIZE_S) FOOTPRINT(Calyrex) OVERWORLD( - gObjectEventPic_Calyrex, + sPicTable_Calyrex, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7672,7 +7672,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-5, 11, SHADOW_SIZE_L) FOOTPRINT(Calyrex) OVERWORLD( - gObjectEventPic_CalyrexIce, + sPicTable_CalyrexIce, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7739,7 +7739,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-5, 12, SHADOW_SIZE_L) FOOTPRINT(Calyrex) OVERWORLD( - gObjectEventPic_CalyrexShadow, + sPicTable_CalyrexShadow, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7810,7 +7810,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(-3, 19, SHADOW_SIZE_M) FOOTPRINT(Enamorus) OVERWORLD( - gObjectEventPic_EnamorusIncarnate, + sPicTable_EnamorusIncarnate, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -7876,7 +7876,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SHADOW(2, 8, SHADOW_SIZE_L) FOOTPRINT(Enamorus) OVERWORLD( - gObjectEventPic_EnamorusTherian, + sPicTable_EnamorusTherian, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 020ec03ac0..f4f76eec33 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -54,7 +54,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 5, SHADOW_SIZE_S) FOOTPRINT(Sprigatito) OVERWORLD( - gObjectEventPic_Sprigatito, + sPicTable_Sprigatito, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -118,7 +118,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 11, SHADOW_SIZE_M) FOOTPRINT(Floragato) OVERWORLD( - gObjectEventPic_Floragato, + sPicTable_Floragato, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -181,7 +181,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 14, SHADOW_SIZE_S) FOOTPRINT(Meowscarada) OVERWORLD( - gObjectEventPic_Meowscarada, + sPicTable_Meowscarada, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -245,7 +245,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 5, SHADOW_SIZE_S) FOOTPRINT(Fuecoco) OVERWORLD( - gObjectEventPic_Fuecoco, + sPicTable_Fuecoco, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -309,7 +309,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 8, SHADOW_SIZE_M) FOOTPRINT(Crocalor) OVERWORLD( - gObjectEventPic_Crocalor, + sPicTable_Crocalor, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -372,7 +372,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(6, 7, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Skeledirge) OVERWORLD( - gObjectEventPic_Skeledirge, + sPicTable_Skeledirge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -436,7 +436,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 5, SHADOW_SIZE_S) FOOTPRINT(Quaxly) OVERWORLD( - gObjectEventPic_Quaxly, + sPicTable_Quaxly, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -500,7 +500,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 10, SHADOW_SIZE_S) FOOTPRINT(Quaxwell) OVERWORLD( - gObjectEventPic_Quaxwell, + sPicTable_Quaxwell, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -563,7 +563,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-7, 13, SHADOW_SIZE_M) FOOTPRINT(Quaquaval) OVERWORLD( - gObjectEventPic_Quaquaval, + sPicTable_Quaquaval, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -627,7 +627,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 1, SHADOW_SIZE_S) FOOTPRINT(Lechonk) OVERWORLD( - gObjectEventPic_Lechonk, + sPicTable_Lechonk, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -691,7 +691,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 6, SHADOW_SIZE_M) FOOTPRINT(Oinkologne) OVERWORLD( - gObjectEventPic_OinkologneM, + sPicTable_OinkologneM, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -754,7 +754,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 7, SHADOW_SIZE_M) FOOTPRINT(Oinkologne) OVERWORLD( - gObjectEventPic_OinkologneF, + sPicTable_OinkologneF, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -819,7 +819,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 2, SHADOW_SIZE_M) FOOTPRINT(Tarountula) OVERWORLD( - gObjectEventPic_Tarountula, + sPicTable_Tarountula, SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, @@ -883,7 +883,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(6, 8, SHADOW_SIZE_L) FOOTPRINT(Spidops) OVERWORLD( - gObjectEventPic_Spidops, + sPicTable_Spidops, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -947,7 +947,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 3, SHADOW_SIZE_M) FOOTPRINT(Nymble) OVERWORLD( - gObjectEventPic_Nymble, + sPicTable_Nymble, SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, @@ -1011,7 +1011,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 11, SHADOW_SIZE_M) FOOTPRINT(Lokix) OVERWORLD( - gObjectEventPic_Lokix, + sPicTable_Lokix, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1075,7 +1075,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 4, SHADOW_SIZE_M) FOOTPRINT(Pawmi) OVERWORLD( - gObjectEventPic_Pawmi, + sPicTable_Pawmi, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1139,7 +1139,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 10, SHADOW_SIZE_S) FOOTPRINT(Pawmo) OVERWORLD( - gObjectEventPic_Pawmo, + sPicTable_Pawmo, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1202,7 +1202,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 11, SHADOW_SIZE_M) FOOTPRINT(Pawmot) OVERWORLD( - gObjectEventPic_Pawmot, + sPicTable_Pawmot, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1266,7 +1266,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, -1, SHADOW_SIZE_M) FOOTPRINT(Tandemaus) OVERWORLD( - gObjectEventPic_Tandemaus, + sPicTable_Tandemaus, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1331,7 +1331,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, -1, SHADOW_SIZE_L) FOOTPRINT(MausholdThree) OVERWORLD( - gObjectEventPic_MausholdThree, + sPicTable_MausholdThree, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1393,7 +1393,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, -1, SHADOW_SIZE_L) FOOTPRINT(MausholdFour) OVERWORLD( - gObjectEventPic_MausholdFour, + sPicTable_MausholdFour, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1458,7 +1458,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 0, SHADOW_SIZE_S) FOOTPRINT(Fidough) OVERWORLD( - gObjectEventPic_Fidough, + sPicTable_Fidough, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1522,7 +1522,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 7, SHADOW_SIZE_L) FOOTPRINT(Dachsbun) OVERWORLD( - gObjectEventPic_Dachsbun, + sPicTable_Dachsbun, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1586,7 +1586,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, -2, SHADOW_SIZE_S) FOOTPRINT(Smoliv) OVERWORLD( - gObjectEventPic_Smoliv, + sPicTable_Smoliv, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1650,7 +1650,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 9, SHADOW_SIZE_M) FOOTPRINT(Dolliv) OVERWORLD( - gObjectEventPic_Dolliv, + sPicTable_Dolliv, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -1713,7 +1713,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 13, SHADOW_SIZE_L) FOOTPRINT(Arboliva) OVERWORLD( - gObjectEventPic_Arboliva, + sPicTable_Arboliva, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -1777,7 +1777,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-6, 9, SHADOW_SIZE_M) FOOTPRINT(Squawkabilly) OVERWORLD( - gObjectEventPic_SquawkabillyGreen, + sPicTable_SquawkabillyGreen, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -1841,7 +1841,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-6, 9, SHADOW_SIZE_M) FOOTPRINT(Squawkabilly) OVERWORLD( - gObjectEventPic_SquawkabillyBlue, + sPicTable_SquawkabillyBlue, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -1905,7 +1905,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-6, 9, SHADOW_SIZE_M) FOOTPRINT(Squawkabilly) OVERWORLD( - gObjectEventPic_SquawkabillyYellow, + sPicTable_SquawkabillyYellow, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -1969,7 +1969,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-6, 9, SHADOW_SIZE_M) FOOTPRINT(Squawkabilly) OVERWORLD( - gObjectEventPic_SquawkabillyWhite, + sPicTable_SquawkabillyWhite, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -2035,7 +2035,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Nacli) OVERWORLD( - gObjectEventPic_Nacli, + sPicTable_Nacli, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -2099,7 +2099,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 5, SHADOW_SIZE_L) FOOTPRINT(Naclstack) OVERWORLD( - gObjectEventPic_Naclstack, + sPicTable_Naclstack, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2162,7 +2162,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Garganacl) OVERWORLD( - gObjectEventPic_Garganacl, + sPicTable_Garganacl, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2226,7 +2226,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 5, SHADOW_SIZE_S) FOOTPRINT(Charcadet) OVERWORLD( - gObjectEventPic_Charcadet, + sPicTable_Charcadet, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -2291,7 +2291,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 14, SHADOW_SIZE_L) FOOTPRINT(Armarouge) OVERWORLD( - gObjectEventPic_Armarouge, + sPicTable_Armarouge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2353,7 +2353,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(9, 14, SHADOW_SIZE_L) FOOTPRINT(Ceruledge) OVERWORLD( - gObjectEventPic_Ceruledge, + sPicTable_Ceruledge, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2418,7 +2418,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 19, SHADOW_SIZE_S) FOOTPRINT(Tadbulb) OVERWORLD( - gObjectEventPic_Tadbulb, + sPicTable_Tadbulb, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -2482,7 +2482,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(Bellibolt) OVERWORLD( - gObjectEventPic_Bellibolt, + sPicTable_Bellibolt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2546,7 +2546,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 0, SHADOW_SIZE_S) FOOTPRINT(Wattrel) OVERWORLD( - gObjectEventPic_Wattrel, + sPicTable_Wattrel, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -2610,7 +2610,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-6, 6, SHADOW_SIZE_M) FOOTPRINT(Kilowattrel) OVERWORLD( - gObjectEventPic_Kilowattrel, + sPicTable_Kilowattrel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -2674,7 +2674,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 5, SHADOW_SIZE_L) FOOTPRINT(Maschiff) OVERWORLD( - gObjectEventPic_Maschiff, + sPicTable_Maschiff, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -2738,7 +2738,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 5, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Mabosstiff) OVERWORLD( - gObjectEventPic_Mabosstiff, + sPicTable_Mabosstiff, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2802,7 +2802,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, -6, SHADOW_SIZE_S) FOOTPRINT(Shroodle) OVERWORLD( - gObjectEventPic_Shroodle, + sPicTable_Shroodle, SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, @@ -2866,7 +2866,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 5, SHADOW_SIZE_S) FOOTPRINT(Grafaiai) OVERWORLD( - gObjectEventPic_Grafaiai, + sPicTable_Grafaiai, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -2930,7 +2930,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Bramblin) OVERWORLD( - gObjectEventPic_Bramblin, + sPicTable_Bramblin, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -2994,7 +2994,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 6, SHADOW_SIZE_M) FOOTPRINT(Brambleghast) OVERWORLD( - gObjectEventPic_Brambleghast, + sPicTable_Brambleghast, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -3060,7 +3060,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 10, SHADOW_SIZE_M) FOOTPRINT(Toedscool) OVERWORLD( - gObjectEventPic_Toedscool, + sPicTable_Toedscool, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -3126,7 +3126,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 8, SHADOW_SIZE_L) FOOTPRINT(Toedscruel) OVERWORLD( - gObjectEventPic_Toedscruel, + sPicTable_Toedscruel, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3190,7 +3190,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 0, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Klawf) OVERWORLD( - gObjectEventPic_Klawf, + sPicTable_Klawf, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3255,7 +3255,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Capsakid) OVERWORLD( - gObjectEventPic_Capsakid, + sPicTable_Capsakid, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -3319,7 +3319,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(6, 11, SHADOW_SIZE_M) FOOTPRINT(Scovillain) OVERWORLD( - gObjectEventPic_Scovillain, + sPicTable_Scovillain, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3383,7 +3383,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, -3, SHADOW_SIZE_L) FOOTPRINT(Rellor) OVERWORLD( - gObjectEventPic_Rellor, + sPicTable_Rellor, SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, @@ -3447,7 +3447,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Rabsca) OVERWORLD( - gObjectEventPic_Rabsca, + sPicTable_Rabsca, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -3511,7 +3511,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Flittle) OVERWORLD( - gObjectEventPic_Flittle, + sPicTable_Flittle, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -3575,7 +3575,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-5, 10, SHADOW_SIZE_M) FOOTPRINT(Espathra) OVERWORLD( - gObjectEventPic_Espathra, + sPicTable_Espathra, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3639,7 +3639,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Tinkatink) OVERWORLD( - gObjectEventPic_Tinkatink, + sPicTable_Tinkatink, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -3703,7 +3703,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-4, 5, SHADOW_SIZE_L) FOOTPRINT(Tinkatuff) OVERWORLD( - gObjectEventPic_Tinkatuff, + sPicTable_Tinkatuff, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -3766,7 +3766,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-5, 15, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tinkaton) OVERWORLD( - gObjectEventPic_Tinkaton, + sPicTable_Tinkaton, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -3829,7 +3829,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = NO_SHADOW FOOTPRINT(Wiglett) OVERWORLD( - gObjectEventPic_Wiglett, + sPicTable_Wiglett, SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, @@ -3892,7 +3892,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = NO_SHADOW FOOTPRINT(Wugtrio) OVERWORLD( - gObjectEventPic_Wugtrio, + sPicTable_Wugtrio, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -3957,7 +3957,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 18, SHADOW_SIZE_M) FOOTPRINT(Bombirdier) OVERWORLD( - gObjectEventPic_Bombirdier, + sPicTable_Bombirdier, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -4021,7 +4021,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Finizen) OVERWORLD( - gObjectEventPic_Finizen, + sPicTable_Finizen, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -4085,7 +4085,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Palafin) OVERWORLD( - gObjectEventPic_PalafinZero, + sPicTable_PalafinZero, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -4149,7 +4149,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 13, SHADOW_SIZE_M) FOOTPRINT(Palafin) OVERWORLD( - gObjectEventPic_PalafinHero, + sPicTable_PalafinHero, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -4215,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 0, SHADOW_SIZE_M) FOOTPRINT(Varoom) OVERWORLD( - gObjectEventPic_Varoom, + sPicTable_Varoom, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -4279,7 +4279,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_L) FOOTPRINT(Revavroom) OVERWORLD( - gObjectEventPic_Revavroom, + sPicTable_Revavroom, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -4343,7 +4343,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 9, SHADOW_SIZE_M) FOOTPRINT(Cyclizar) OVERWORLD( - gObjectEventPic_Cyclizar, + sPicTable_Cyclizar, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4408,7 +4408,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(6, 10, SHADOW_SIZE_L) FOOTPRINT(Orthworm) OVERWORLD( - gObjectEventPic_Orthworm, + sPicTable_Orthworm, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -4474,7 +4474,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 6, SHADOW_SIZE_S) FOOTPRINT(Glimmet) OVERWORLD( - gObjectEventPic_Glimmet, + sPicTable_Glimmet, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -4539,7 +4539,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 17, SHADOW_SIZE_M) FOOTPRINT(Glimmora) OVERWORLD( - gObjectEventPic_Glimmora, + sPicTable_Glimmora, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -4603,7 +4603,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 2, SHADOW_SIZE_M) FOOTPRINT(Greavard) OVERWORLD( - gObjectEventPic_Greavard, + sPicTable_Greavard, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -4667,7 +4667,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 6, SHADOW_SIZE_L) FOOTPRINT(Houndstone) OVERWORLD( - gObjectEventPic_Houndstone, + sPicTable_Houndstone, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4731,7 +4731,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 12, SHADOW_SIZE_S) FOOTPRINT(Flamigo) OVERWORLD( - gObjectEventPic_Flamigo, + sPicTable_Flamigo, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -4796,7 +4796,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 0, SHADOW_SIZE_M) FOOTPRINT(Cetoddle) OVERWORLD( - gObjectEventPic_Cetoddle, + sPicTable_Cetoddle, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -4860,7 +4860,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Cetitan) OVERWORLD( - gObjectEventPic_Cetitan, + sPicTable_Cetitan, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -4925,7 +4925,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 5, SHADOW_SIZE_M) FOOTPRINT(Veluza) OVERWORLD( - gObjectEventPic_Veluza, + sPicTable_Veluza, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -4991,7 +4991,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Dondozo) OVERWORLD( - gObjectEventPic_Dondozo, + sPicTable_Dondozo, SIZE_64x64, SHADOW_SIZE_L, TRACKS_NONE, @@ -5056,7 +5056,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, -1, SHADOW_SIZE_S) FOOTPRINT(Tatsugiri) OVERWORLD( - gObjectEventPic_TatsugiriCurly, + sPicTable_TatsugiriCurly, SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, @@ -5119,7 +5119,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, -1, SHADOW_SIZE_S) FOOTPRINT(Tatsugiri) OVERWORLD( - gObjectEventPic_TatsugiriDroopy, + sPicTable_TatsugiriDroopy, SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, @@ -5182,7 +5182,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, -1, SHADOW_SIZE_S) FOOTPRINT(Tatsugiri) OVERWORLD( - gObjectEventPic_TatsugiriStretchy, + sPicTable_TatsugiriStretchy, SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, @@ -5249,7 +5249,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 6, SHADOW_SIZE_L) FOOTPRINT(GreatTusk) OVERWORLD( - gObjectEventPic_GreatTusk, + sPicTable_GreatTusk, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5315,7 +5315,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 3, SHADOW_SIZE_L) FOOTPRINT(ScreamTail) OVERWORLD( - gObjectEventPic_ScreamTail, + sPicTable_ScreamTail, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5381,7 +5381,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 7, SHADOW_SIZE_L) FOOTPRINT(BruteBonnet) OVERWORLD( - gObjectEventPic_BruteBonnet, + sPicTable_BruteBonnet, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5450,7 +5450,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 20, SHADOW_SIZE_S) FOOTPRINT(FlutterMane) OVERWORLD( - gObjectEventPic_FlutterMane, + sPicTable_FlutterMane, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -5515,7 +5515,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-5, 13, SHADOW_SIZE_M) FOOTPRINT(SlitherWing) OVERWORLD( - gObjectEventPic_SlitherWing, + sPicTable_SlitherWing, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -5581,7 +5581,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(SandyShocks) OVERWORLD( - gObjectEventPic_SandyShocks, + sPicTable_SandyShocks, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5647,7 +5647,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 3, SHADOW_SIZE_L) FOOTPRINT(IronTreads) OVERWORLD( - gObjectEventPic_IronTreads, + sPicTable_IronTreads, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5713,7 +5713,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 6, SHADOW_SIZE_M) FOOTPRINT(IronBundle) OVERWORLD( - gObjectEventPic_IronBundle, + sPicTable_IronBundle, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5779,7 +5779,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-2, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(IronHands) OVERWORLD( - gObjectEventPic_IronHands, + sPicTable_IronHands, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5846,7 +5846,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 15, SHADOW_SIZE_M) FOOTPRINT(IronJugulis) OVERWORLD( - gObjectEventPic_IronJugulis, + sPicTable_IronJugulis, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -5913,7 +5913,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-4, 14, SHADOW_SIZE_M) FOOTPRINT(IronMoth) OVERWORLD( - gObjectEventPic_IronMoth, + sPicTable_IronMoth, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -5979,7 +5979,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-9, 12, SHADOW_SIZE_L) FOOTPRINT(IronThorns) OVERWORLD( - gObjectEventPic_IronThorns, + sPicTable_IronThorns, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6044,7 +6044,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_S) FOOTPRINT(Frigibax) OVERWORLD( - gObjectEventPic_Frigibax, + sPicTable_Frigibax, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -6108,7 +6108,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 8, SHADOW_SIZE_M) FOOTPRINT(Arctibax) OVERWORLD( - gObjectEventPic_Arctibax, + sPicTable_Arctibax, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, @@ -6171,7 +6171,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(5, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Baxcalibur) OVERWORLD( - gObjectEventPic_Baxcalibur, + sPicTable_Baxcalibur, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6235,7 +6235,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 7, SHADOW_SIZE_M) FOOTPRINT(GimmighoulChest) OVERWORLD( - gObjectEventPic_GimmighoulChest, + sPicTable_GimmighoulChest, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -6354,7 +6354,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 13, SHADOW_SIZE_M) FOOTPRINT(Gholdengo) OVERWORLD( - gObjectEventPic_Gholdengo, + sPicTable_Gholdengo, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6418,7 +6418,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(WoChien) OVERWORLD( - gObjectEventPic_WoChien, + sPicTable_WoChien, SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, @@ -6484,7 +6484,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-4, 8, SHADOW_SIZE_L) FOOTPRINT(ChienPao) OVERWORLD( - gObjectEventPic_ChienPao, + sPicTable_ChienPao, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6550,7 +6550,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(12, 13, SHADOW_SIZE_L) FOOTPRINT(TingLu) OVERWORLD( - gObjectEventPic_TingLu, + sPicTable_TingLu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6617,7 +6617,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 16, SHADOW_SIZE_S) FOOTPRINT(ChiYu) OVERWORLD( - gObjectEventPic_ChiYu, + sPicTable_ChiYu, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -6685,7 +6685,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(RoaringMoon) OVERWORLD( - gObjectEventPic_RoaringMoon, + sPicTable_RoaringMoon, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6750,7 +6750,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 14, SHADOW_SIZE_L) FOOTPRINT(IronValiant) OVERWORLD( - gObjectEventPic_IronValiant, + sPicTable_IronValiant, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -6815,7 +6815,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Koraidon) OVERWORLD( - gObjectEventPic_Koraidon, + sPicTable_Koraidon, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -6882,7 +6882,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(10, 14, SHADOW_SIZE_L) FOOTPRINT(Miraidon) OVERWORLD( - gObjectEventPic_Miraidon, + sPicTable_Miraidon, SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, @@ -6949,7 +6949,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 13, SHADOW_SIZE_L) FOOTPRINT(WalkingWake) OVERWORLD( - gObjectEventPic_WalkingWake, + sPicTable_WalkingWake, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7014,7 +7014,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(IronLeaves) OVERWORLD( - gObjectEventPic_IronLeaves, + sPicTable_IronLeaves, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7080,7 +7080,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 14, SHADOW_SIZE_S) FOOTPRINT(Poltchageist) OVERWORLD( - gObjectEventPic_Poltchageist, + sPicTable_Poltchageist, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -7144,7 +7144,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 14, SHADOW_SIZE_S) FOOTPRINT(Poltchageist) OVERWORLD( - gObjectEventPic_Poltchageist, + sPicTable_Poltchageist, SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, @@ -7209,7 +7209,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 11, SHADOW_SIZE_M) FOOTPRINT(Sinistcha) OVERWORLD( - gObjectEventPic_Sinistcha, + sPicTable_Sinistcha, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7272,7 +7272,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 11, SHADOW_SIZE_M) FOOTPRINT(Sinistcha) OVERWORLD( - gObjectEventPic_Sinistcha, + sPicTable_Sinistcha, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, @@ -7337,7 +7337,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 11, SHADOW_SIZE_L) FOOTPRINT(Okidogi) OVERWORLD( - gObjectEventPic_Okidogi, + sPicTable_Okidogi, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7403,7 +7403,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(1, 8, SHADOW_SIZE_S) FOOTPRINT(Munkidori) OVERWORLD( - gObjectEventPic_Munkidori, + sPicTable_Munkidori, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7469,7 +7469,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-3, 10, SHADOW_SIZE_M) FOOTPRINT(Fezandipiti) OVERWORLD( - gObjectEventPic_Fezandipiti, + sPicTable_Fezandipiti, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7485,68 +7485,68 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = #endif //P_FAMILY_FEZANDIPITI #if P_FAMILY_OGERPON -#define OGERPON_SPECIES_INFO(Form1, Form2, type, ability, color, frontYOffset, backYOffset, iconpalette, isTeraform) \ - { \ - .baseHP = 80, \ - .baseAttack = 120, \ - .baseDefense = 84, \ - .baseSpeed = 110, \ - .baseSpAttack = 60, \ - .baseSpDefense = 96, \ - .types = MON_TYPES(TYPE_GRASS, type), \ - .forceTeraType = type, \ - .catchRate = 5, \ - .expYield = 275, \ - .evYield_Attack = 3, \ - .genderRatio = MON_FEMALE, \ - .eggCycles = 10, \ - .friendship = STANDARD_FRIENDSHIP, \ - .growthRate = GROWTH_SLOW, \ - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ - .abilities = { ability, ABILITY_NONE }, \ - .bodyColor = color, \ - .speciesName = _("Ogerpon"), \ - .cryId = CRY_OGERPON, \ - .natDexNum = NATIONAL_DEX_OGERPON, \ - .categoryName = _("Mask"), \ - .height = 12, \ - .weight = 398, \ - .description = gOgerpon##Form1##MaskPokedexText, \ - .pokemonScale = 356, \ - .pokemonOffset = 17, \ - .trainerScale = 256, \ - .trainerOffset = 0, \ - .frontPic = gMonFrontPic_Ogerpon##Form2, \ - .frontPicSize = MON_COORDS_SIZE(64, 64), \ - .frontPicYOffset = frontYOffset, \ - .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ - /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ \ - .backPic = gMonBackPic_Ogerpon##Form2, \ - .backPicSize = MON_COORDS_SIZE(64, 64), \ - .backPicYOffset = backYOffset, \ - /*.backAnimId = BACK_ANIM_NONE,*/ \ - .palette = gMonPalette_Ogerpon##Form2, \ - .shinyPalette = gMonShinyPalette_Ogerpon##Form2, \ - .iconSprite = gMonIcon_Ogerpon##Form1, \ - .iconPalIndex = iconpalette, \ - SHADOW(7, 13, SHADOW_SIZE_L) \ - FOOTPRINT(Ogerpon) \ - OVERWORLD( \ - gObjectEventPic_Ogerpon##Form2, \ - SIZE_32x32, \ - SHADOW_SIZE_M, \ - TRACKS_FOOT, \ - sAnimTable_Following, \ - gOverworldPalette_Ogerpon##Form2, \ - gShinyOverworldPalette_Ogerpon##Form2 \ - ) \ - .levelUpLearnset = sOgerponLevelUpLearnset, \ - .teachableLearnset = sOgerponTeachableLearnset, \ - .formSpeciesIdTable = sOgerponFormSpeciesIdTable, \ - .formChangeTable = sOgerponFormChangeTable, \ - .isLegendary = TRUE, \ - .isTeraForm = isTeraform, \ - .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ +#define OGERPON_SPECIES_INFO(Form1, Form2, type, ability, color, frontYOffset, backYOffset, iconpalette, isTeraform) \ + { \ + .baseHP = 80, \ + .baseAttack = 120, \ + .baseDefense = 84, \ + .baseSpeed = 110, \ + .baseSpAttack = 60, \ + .baseSpDefense = 96, \ + .types = MON_TYPES(TYPE_GRASS, type), \ + .forceTeraType = type, \ + .catchRate = 5, \ + .expYield = 275, \ + .evYield_Attack = 3, \ + .genderRatio = MON_FEMALE, \ + .eggCycles = 10, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ + .abilities = { ability, ABILITY_NONE }, \ + .bodyColor = color, \ + .speciesName = _("Ogerpon"), \ + .cryId = CRY_OGERPON, \ + .natDexNum = NATIONAL_DEX_OGERPON, \ + .categoryName = _("Mask"), \ + .height = 12, \ + .weight = 398, \ + .description = gOgerpon##Form1##MaskPokedexText, \ + .pokemonScale = 356, \ + .pokemonOffset = 17, \ + .trainerScale = 256, \ + .trainerOffset = 0, \ + .frontPic = gMonFrontPic_Ogerpon##Form2, \ + .frontPicSize = MON_COORDS_SIZE(64, 64), \ + .frontPicYOffset = frontYOffset, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ + /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ \ + .backPic = gMonBackPic_Ogerpon##Form2, \ + .backPicSize = MON_COORDS_SIZE(64, 64), \ + .backPicYOffset = backYOffset, \ + /*.backAnimId = BACK_ANIM_NONE,*/ \ + .palette = gMonPalette_Ogerpon##Form2, \ + .shinyPalette = gMonShinyPalette_Ogerpon##Form2, \ + .iconSprite = gMonIcon_Ogerpon##Form1, \ + .iconPalIndex = iconpalette, \ + SHADOW(7, 13, SHADOW_SIZE_L) \ + FOOTPRINT(Ogerpon) \ + OVERWORLD( \ + sPicTable_Ogerpon##Form2, \ + SIZE_32x32, \ + SHADOW_SIZE_M, \ + TRACKS_FOOT, \ + sAnimTable_Following, \ + gOverworldPalette_Ogerpon##Form2, \ + gShinyOverworldPalette_Ogerpon##Form2 \ + ) \ + .levelUpLearnset = sOgerponLevelUpLearnset, \ + .teachableLearnset = sOgerponTeachableLearnset, \ + .formSpeciesIdTable = sOgerponFormSpeciesIdTable, \ + .formChangeTable = sOgerponFormChangeTable, \ + .isLegendary = TRUE, \ + .isTeraForm = isTeraform, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } [SPECIES_OGERPON_TEAL] = OGERPON_SPECIES_INFO(Teal, Teal, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, 7, 1, FALSE), @@ -7614,7 +7614,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-1, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(GougingFire) OVERWORLD( - gObjectEventPic_GougingFire, + sPicTable_GougingFire, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7680,7 +7680,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(RagingBolt) OVERWORLD( - gObjectEventPic_RagingBolt, + sPicTable_RagingBolt, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7745,7 +7745,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(4, 7, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(IronBoulder) OVERWORLD( - gObjectEventPic_IronBoulder, + sPicTable_IronBoulder, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7811,7 +7811,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(0, 14, SHADOW_SIZE_L) FOOTPRINT(IronCrown) OVERWORLD( - gObjectEventPic_IronCrown, + sPicTable_IronCrown, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7878,7 +7878,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(3, 13, SHADOW_SIZE_L) FOOTPRINT(TerapagosNormal) OVERWORLD( - gObjectEventPic_TerapagosNormal, + sPicTable_TerapagosNormal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -7948,7 +7948,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(-4, 4, SHADOW_SIZE_L) FOOTPRINT(TerapagosTerastal) OVERWORLD( - gObjectEventPic_TerapagosTerastal, + sPicTable_TerapagosTerastal, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, @@ -8077,7 +8077,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SHADOW(2, 1, SHADOW_SIZE_L) FOOTPRINT(Pecharunt) OVERWORLD( - gObjectEventPic_Pecharunt, + sPicTable_Pecharunt, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, diff --git a/src/pokemon.c b/src/pokemon.c index 38bbda8c11..2483d636a3 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -37,7 +37,6 @@ #include "recorded_battle.h" #include "rtc.h" #include "sound.h" -#include "sprite.h" #include "string_util.h" #include "strings.h" #include "task.h" @@ -707,6 +706,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = #include "data/pokemon/form_species_tables.h" #include "data/pokemon/form_change_tables.h" #include "data/pokemon/form_change_table_pointers.h" +#include "data/object_events/object_event_pic_tables_followers.h" #include "data/pokemon/species_info.h" From d695c74e39365da6e42fa9e90d7c02feff0b9f64 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:50:03 +0100 Subject: [PATCH 123/125] Fixes inconsistency for Kings rock. (#6302) --- src/battle_util.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 4dc362cb3a..9220513dcf 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8145,9 +8145,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) atkHoldEffectParam *= 2; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) atkHoldEffectParam *= 2; - if (gBattleStruct->moveDamage[battler] != 0 // Need to have done damage - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && !MoveIgnoresKingsRock(gCurrentMove) && gBattleMons[gBattlerTarget].hp && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, atkHoldEffectParam) From 750098d5c91955ac0a4c24191543207ee582d11c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 20 Feb 2025 10:14:54 +0100 Subject: [PATCH 124/125] Fixes Shell Bell for Spread Moves (#6303) --- src/battle_util.c | 2 +- test/battle/hold_effect/shell_bell.c | 91 ++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 9220513dcf..3fadae9c00 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8179,7 +8179,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { case HOLD_EFFECT_SHELL_BELL: if (gBattleScripting.savedDmg > 0 - && !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget && !IsBattlerAtMaxHp(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker) diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index b0ed83d540..f669c55081 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -198,5 +198,96 @@ SINGLE_BATTLE_TEST("Shell Bell does not activate on Future Sight if the original } } +DOUBLE_BATTLE_TEST("Shell Bell heals accumulated damage for spread moves") +{ + s16 opponentLeftDamage; + s16 opponentRightDamage; + s16 playerRightDamage; + s16 shellBellHeal; + + const u16 maxHp = 200; + const u16 initHp = 1; + GIVEN { + ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_ARIADOS) { MaxHP(maxHp); HP(initHp); Item(ITEM_SHELL_BELL); } + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_GYARADOS) {} + OPPONENT(SPECIES_CHANSEY) {} + } WHEN { + TURN { + MOVE(playerLeft, MOVE_DISCHARGE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDamage); + HP_BAR(playerRight, captureDamage: &playerRightDamage); + HP_BAR(opponentRight, captureDamage: &opponentRightDamage); + + HP_BAR(playerLeft, captureDamage: &shellBellHeal); + } THEN { + const s16 totalDamage = opponentLeftDamage + + playerRightDamage + opponentRightDamage; + EXPECT_EQ(shellBellHeal, -totalDamage / 8); + EXPECT_EQ(playerLeft->hp, initHp + (totalDamage / 8)); + } +} + +SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP at move end, one strike") +{ + const u16 maxHp = 200; + u16 hp, opponentHp; + u16 hpGainFromDamage, hpGainActual; + + PARAMETRIZE { hp = maxHp; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp - 1; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp / 2; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp - 1; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp / 2; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp; opponentHp = 1; } + PARAMETRIZE { hp = maxHp - 1; opponentHp = 1; } + PARAMETRIZE { hp = maxHp / 2; opponentHp = 1; } + + hpGainFromDamage = max(1, min(40, opponentHp) / 8); + hpGainActual = min(maxHp - hp, hpGainFromDamage); + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(hp); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(opponentHp); } + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, player); + HP_BAR(opponent); + if (hp < maxHp) { + HP_BAR(player, damage: -hpGainActual); + } else { + NOT HP_BAR(player); + } + } THEN { + EXPECT_EQ(player->hp, hp + hpGainActual); + } +} + +SINGLE_BATTLE_TEST("Shell Bell recovers only 1 damage if the move only did 1 damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + + } THEN { + EXPECT_EQ(player->hp, 2); + } +} + TO_DO_BATTLE_TEST("If a Pokémon steals a Shell Bell with Thief or Covet, it will recover HP for the use of that move that stole the Shell Bell") TO_DO_BATTLE_TEST("If a Pokémon steals a Shell Bell with Magician, it will recover HP for the use of that move that stole the Shell Bell") From 82f6d477b6b848b507b6136ee19c87503086a24b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:03:01 +0100 Subject: [PATCH 125/125] Fix padding amount in MoveInfo (#6307) --- include/move.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/move.h b/include/move.h index d5f14078d6..5537840703 100644 --- a/include/move.h +++ b/include/move.h @@ -106,7 +106,7 @@ struct MoveInfo bool32 sketchBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:18; + u32 padding:3; // end of word union {