diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..54f7faa471 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,4 @@ +725252905baf28dbb9298dd5fa0daaf0e804a455 +afbb88d77ada8a636a318ec32b61b4ea849d85ab +f861504cfc50941768286c0703d24ab0aaceb88e +ebbcb7d025cff716eec5008b5dd2b7d55aa8c3f3 \ No newline at end of file diff --git a/README.md b/README.md index 0dde7185fb..07427e2bd5 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,21 @@ This fork tries to maintain vanilla compatibility whenever possible. It doesn't There are several branches, each with one main feature (and sometimes some extra stuff): **followers** branch: -* [HGSS-style pokémon followers](https://bulbapedia.bulbagarden.net/wiki/Walking_Pok%C3%A9mon#Pok.C3.A9mon_HeartGold_and_SoulSilver) for all 386 pokémon, including emotes, the 28 Unown forms and a majority of follower messages. -* Dynamic overworld palettes & reflections compatible with vanilla berry trees. -* PID (but not legitimacy) preserving Pokémon nature-changing function -* Function to detect modern emulators/GBA hardware. +* [HGSS-style pokémon followers](https://bulbapedia.bulbagarden.net/wiki/Walking_Pok%C3%A9mon#Pok.C3.A9mon_HeartGold_and_SoulSilver) for all 386 pokémon (including forms & shinies) +* Includes follower emotes and a majority of the HGSS messages +* Custom pokeball sprites for Gen 1-7 pokéballs +* Followers can use field moves in the overworld +* Overworld form changes for Ditto, Mew, Castform, etc. +* Asymmetrical & 64x64 OW support +* Dynamic Overworld Palette System (DOWP) & reflections compatible with berry trees, etc. > Note: Unless you have a specific need for it, you should probably use `followers-expanded-id` over this. +![Pokeball](https://i.imgur.com/OMbS67Q.gif) +![Messages](https://i.imgur.com/sTbGVEY.gif) +![Forms](https://i.imgur.com/wDhFNf4.gif) +![HM](https://i.imgur.com/lnXJGHd.gif) + **icons** branch: * Everything from the **followers** branch. * All pokemon icons updated to Gen 6, based on [this repo](https://github.com/msikma/pokesprite/tree/master/icons/pokemon/regular) @@ -32,7 +40,7 @@ There are several branches, each with one main feature (and sometimes some extra **just-lighting** branch: * `lighting-expanded-id` but with following pokémon code & assets completely removed. (This allows for more than 255 OW graphics) -* Saves with following pokémon can safely be loaded. +* Saves with following pokémon can still safely be loaded. **followers-expanded-id** branch: * Like `followers`, but includes expands OW graphicsIds to 16-bits @@ -45,6 +53,12 @@ Additional branches to mention: To set up the repository, see [INSTALL.md](INSTALL.md). +**guillotine** branch: +* ~~Decapitates~~ Decapitalizes **all** text at runtime, with some exceptions (see the [FAQ](#guillotine-q-how-can-i-keep-my-strings-from-being-decapped)) +* Future-proof, does not require mass-replacing strings + +To set up the repository, see [INSTALL.md](INSTALL.md). + ## FAQ ### `(followers*)` Q: Where are the config settings? A: Configuration for the follower system is mostly in [event_objects.h](include/constants/event_objects.h): @@ -57,6 +71,10 @@ A: Configuration for the follower system is mostly in [event_objects.h](include/ // to OW code so that large (48x48, 64x64) OWs // will display correctly under bridges, etc. #define LARGE_OW_SUPPORT TRUE + +// Followers will emerge from the pokeball they are stored in, +// instead of a normal pokeball +#define OW_MON_POKEBALLS TRUE ``` ### `(lighting)` Q: How do I mark certain colors in a palette as light-blended? @@ -76,6 +94,35 @@ on separate lines to mark those colors as being light-blended, i.e: You might have to `make mostlyclean` or change the `.pal` file to pick up the changes. +### `(guillotine)` Q: How can I keep my string(s) from being decapped? +A: There are a number of ways to make a string "fixed case" so that it will not be decapitalized when displayed: + +C strings: Replace the `_` with `_C`: +```c +// _C = fixed (C)ase string! +const u8 gText_IDNumber[] = _C("IDNo."); +``` +ASM strings: Replace `.string` with `.fixstr`: +```arm +gText_SavingDontTurnOff:: + @ Lasts until the string terminator '$' + .fixstr "SAVING…\n" + .string "DON'T TURN OFF THE POWER.$" +``` +You can fix-case/unfix parts of a string like so: +```arm + .string "{FIXED_CASE}WARNING!{UNFIX_CASE}\p" +``` +For a placeholder (only the placeholder will be fixed-case): +```arm + .string "{STR_VAR_2_FIXED} was transferred to\n" + .string "BOX “{STR_VAR_1}.”$" +``` +See also the configuration in [text.h](gflib/text.h). + +There's also special handling for "separated bigrams"; basically, two letter words. +This includes: `"TM01", "PC", "EV"`, any two uppercase characters surrounded by digits, whitespace, or the start/end of a string. These will not be decapped. + ## See also For contacts and other pret projects, see [pret.github.io](https://pret.github.io/). diff --git a/data/event_scripts.s b/data/event_scripts.s index fcf4b454bb..f7efaa2ea6 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1054,7 +1054,7 @@ Common_EventScript_LegendaryFlewAway:: .include "data/scripts/move_tutors.inc" .include "data/scripts/trainer_hill.inc" .include "data/scripts/test_signpost.inc" - .include "data/scripts/follower.inc" + .include "data/scripts/follower.inc" .include "data/text/frontier_brain.inc" .include "data/text/save.inc" .include "data/text/birch_speech.inc" diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 117ae710ca..c1890358d5 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -72,7 +72,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT .4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK .4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK - .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER + .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER .4byte gFieldEffectScript_TracksBug @ FLDEFF_TRACKS_BUG .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT diff --git a/data/maps/AncientTomb/scripts.inc b/data/maps/AncientTomb/scripts.inc index ca9464f7ee..906d64ecf5 100644 --- a/data/maps/AncientTomb/scripts.inc +++ b/data/maps/AncientTomb/scripts.inc @@ -55,7 +55,7 @@ AncientTomb_EventScript_CaveEntranceSide:: end AncientTomb_EventScript_Registeel:: - bufferspeciesname 0, SPECIES_REGISTEEL + bufferspeciesname 0, SPECIES_REGISTEEL lock faceplayer waitse @@ -84,3 +84,4 @@ AncientTomb_EventScript_RanFromRegisteel:: setvar VAR_0x8004, SPECIES_REGISTEEL goto Common_EventScript_LegendaryFlewAway end + diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 08e749b4a6..61dcb79e99 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -75,7 +75,7 @@ BattleFrontier_BattleArenaLobby_EventScript_SaveAfterChallenge:: frontier_checkairshow special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon arena_save 0 playse SE_SAVE waitse @@ -134,7 +134,7 @@ BattleFrontier_BattleArenaLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleArenaLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -196,7 +196,7 @@ BattleFrontier_BattleArenaLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleArenaLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleArenaLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleArenaLobby_Text_AwaitAnotherChallenge, MSGBOX_DEFAULT BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge:: diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index cdd08fc777..edede9d737 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -17,7 +17,7 @@ BattleFrontier_BattleDomeBattleRoom_MapScripts:: .byte 0 BattleFrontier_BattleDomeBattleRoom_OnTransition: - setflag FLAG_TEMP_HIDE_FOLLOWER + setflag FLAG_TEMP_HIDE_FOLLOWER dome_setopponentgfx frontier_get FRONTIER_DATA_BATTLE_NUM copyvar VAR_TEMP_F, VAR_RESULT diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index edc651287c..fb28b7ad75 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -68,7 +68,7 @@ BattleFrontier_BattleDomeLobby_EventScript_GiveBattlePoints:: dome_set DOME_DATA_WIN_STREAK_ACTIVE, TRUE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon goto BattleFrontier_BattleDomeLobby_EventScript_AskRecordBattle BattleFrontier_BattleDomeLobby_EventScript_LostChallenge:: @@ -83,7 +83,7 @@ BattleFrontier_BattleDomeLobby_EventScript_LostChallenge:: dome_set DOME_DATA_ATTEMPTED_CHALLENGE, TRUE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleDomeLobby_EventScript_AskRecordBattle:: dome_save 0 playse SE_SAVE @@ -162,7 +162,7 @@ BattleFrontier_BattleDomeLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleDomeLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -225,7 +225,7 @@ BattleFrontier_BattleDomeLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleDomeLobby_EventScript_LoadPartyCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleDomeLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleDomeLobby_Text_HopeToSeeYouAgain, MSGBOX_DEFAULT BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge:: diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc index d41741d13b..5475fc146f 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_GiveBattlePoints:: waitmessage frontier_checkairshow special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon factory_save 0 playse SE_SAVE waitse @@ -72,7 +72,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_LostChallenge:: waitmessage frontier_checkairshow special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon factory_set FACTORY_DATA_WIN_STREAK_ACTIVE, FALSE factory_save 0 playse SE_SAVE @@ -198,7 +198,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleFactoryLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleFactoryLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleFactoryLobby_Text_LookForwardToNextVisit, MSGBOX_DEFAULT release diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index 9f80421e14..33d3735884 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -76,7 +76,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_SaveAfterChallenge:: frontier_checkairshow special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon palace_save 0 playse SE_SAVE waitse @@ -152,7 +152,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePalaceLobby_Text_NowSelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -217,7 +217,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePalaceLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative LoadPlayerParty + callnative LoadPlayerParty BattleFrontier_BattlePalaceLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePalaceLobby_Text_ReturnWhenFortified, MSGBOX_DEFAULT BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge:: @@ -650,3 +650,4 @@ BattleFrontier_BattlePalaceLobby_Text_ExplainRulesWhenInDanger: .string "nature when it is in trouble.\p" .string "If a POKéMON begins behaving oddly\n" .string "in a pinch, watch it carefully.$" + diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 0b7cd130e6..b37100bc0a 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattlePikeLobby_EventScript_GiveBattlePoints:: pike_set PIKE_DATA_TOTAL_STREAKS, VAR_RESULT special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon pike_resethelditems message BattleFrontier_BattlePikeLobby_Text_ShallRecordResults waitmessage @@ -81,7 +81,7 @@ BattleFrontier_BattlePikeLobby_EventScript_LostChallenge:: pike_set PIKE_DATA_WIN_STREAK_ACTIVE, FALSE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon pike_resethelditems pike_save 0 playse SE_SAVE @@ -121,7 +121,7 @@ BattleFrontier_BattlePikeLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePikeLobby_Text_PleaseChooseThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -186,7 +186,7 @@ BattleFrontier_BattlePikeLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePikeLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattlePikeLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePikeLobby_Text_LookForwardToSeeingYou, MSGBOX_DEFAULT BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge:: @@ -434,3 +434,4 @@ BattleFrontier_BattlePikeLobby_Text_ExplainMonOrderRules: .string "changed.\p" .string "The sequence must be set before\n" .string "starting your challenge.$" + diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index 12734a2947..1768411616 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_GiveBattlePoints:: special LoadPlayerParty pyramid_clearhelditems special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon message BattleFrontier_BattlePyramidLobby_Text_UsedBattleBagWillBeKept waitmessage playse SE_EXP_MAX @@ -84,7 +84,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_LostChallenge:: special LoadPlayerParty pyramid_clearhelditems special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon lockall message BattleFrontier_BattlePyramidLobby_Text_DisappointingHereIsBag waitmessage @@ -134,7 +134,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePyramidLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -199,7 +199,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePyramidLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattlePyramidLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePyramidLobby_Text_AwaitFutureChallenge, MSGBOX_DEFAULT BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge:: @@ -904,3 +904,4 @@ BattleFrontier_BattlePyramidLobby_Text_ExplainBagRules: .string "of ten kinds of items.\p" .string "The contents of the BATTLE BAG are\n" .string "lost if you fail in your quest.$" + diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 27591cc6b4..d18e2629a1 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -202,7 +202,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterSinglesChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -266,7 +266,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterDoublesChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectFourMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_DOUBLES_PARTY_SIZE @@ -331,7 +331,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterMultisChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectTwoMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_MULTI_PARTY_SIZE @@ -395,7 +395,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterLinkMultisChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectTwoMons2, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_MULTI_PARTY_SIZE @@ -588,7 +588,7 @@ BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleTowerLobby_EventScript_LoadPartyCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleTowerLobby_EventScript_CancelChallenge:: special CloseLink msgbox BattleFrontier_BattleTowerLobby_Text_LookForwardToAnotherChallenge, MSGBOX_DEFAULT diff --git a/data/maps/DesertRuins/scripts.inc b/data/maps/DesertRuins/scripts.inc index c5759ea52d..913eb497c8 100644 --- a/data/maps/DesertRuins/scripts.inc +++ b/data/maps/DesertRuins/scripts.inc @@ -55,7 +55,7 @@ DesertRuins_EventScript_CaveEntranceSide:: end DesertRuins_EventScript_Regirock:: - bufferspeciesname 0, SPECIES_REGIROCK + bufferspeciesname 0, SPECIES_REGIROCK lock faceplayer waitse @@ -84,3 +84,4 @@ DesertRuins_EventScript_RanFromRegirock:: setvar VAR_0x8004, SPECIES_REGIROCK goto Common_EventScript_LegendaryFlewAway end + diff --git a/data/maps/FortreeCity_Gym/scripts.inc b/data/maps/FortreeCity_Gym/scripts.inc index 6812dc4345..1c9a2756d4 100644 --- a/data/maps/FortreeCity_Gym/scripts.inc +++ b/data/maps/FortreeCity_Gym/scripts.inc @@ -5,7 +5,7 @@ FortreeCity_Gym_MapScripts:: FortreeCity_Gym_OnTransition: special RotatingGate_InitPuzzle - setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower bc of rotating gates + setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower bc of rotating gates end FortreeCity_Gym_OnWarp: diff --git a/data/maps/IslandCave/scripts.inc b/data/maps/IslandCave/scripts.inc index 1fe8ae22cf..e2fb2534ba 100644 --- a/data/maps/IslandCave/scripts.inc +++ b/data/maps/IslandCave/scripts.inc @@ -88,7 +88,7 @@ IslandCave_EventScript_ClearSteps:: return IslandCave_EventScript_Regice:: - bufferspeciesname 0, SPECIES_REGICE + bufferspeciesname 0, SPECIES_REGICE lock faceplayer waitse diff --git a/data/maps/MossdeepCity_Gym/scripts.inc b/data/maps/MossdeepCity_Gym/scripts.inc index 5033bc6e57..a7b6aaa2bd 100644 --- a/data/maps/MossdeepCity_Gym/scripts.inc +++ b/data/maps/MossdeepCity_Gym/scripts.inc @@ -1,13 +1,13 @@ MossdeepCity_Gym_MapScripts:: - map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_Gym_OnTransition + map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_Gym_OnTransition map_script MAP_SCRIPT_ON_LOAD, MossdeepCity_Gym_OnLoad .byte 0 @ NOTE: Mossdeep Gym was redesigned between R/S and E. Leftover (and now functionally unused) scripts are commented below MossdeepCity_Gym_OnTransition: - setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower since it can collide with moving statues - end + setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower since it can collide with moving statues + end @ All the below checks are leftover from RS. FLAG_MOSSDEEP_GYM_SWITCH_X is never set MossdeepCity_Gym_OnLoad: diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index f0dd37805f..7c6100a009 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -530,3 +530,4 @@ RusturfTunnel_Text_MikePostBattle: .string "They halted development here to\n" .string "protect POKéMON, right?\l" .string "There's a feel-good story!$" + diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc index cf3767d0ed..541cb68db9 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc @@ -79,7 +79,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: playfanfare MUS_HEAL waitfanfare special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon removeobject LOCALID_CAPT_STERN setflag FLAG_HIDE_ROUTE_110_TEAM_AQUA call_if_eq VAR_REGISTER_BIRCH_STATE, 0, SlateportCity_OceanicMuseum_2F_EventScript_ReadyRegisterBirch @@ -438,3 +438,4 @@ SlateportCity_OceanicMuseum_2F_Text_SSAnneReplica: .string "“S.S. ANNE\p" .string "“A replica of the luxury liner that\n" .string "circles the globe.”$" + diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 5b72e77be5..938fd96c69 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -495,7 +495,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - hideobjectat LOCALID_RAYQUAZA, MAP_SOOTOPOLIS_CITY + hideobjectat LOCALID_RAYQUAZA, MAP_SOOTOPOLIS_CITY setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate diff --git a/data/maps/TrainerHill_Entrance/scripts.inc b/data/maps/TrainerHill_Entrance/scripts.inc index 75e2619d9e..2a208f9139 100644 --- a/data/maps/TrainerHill_Entrance/scripts.inc +++ b/data/maps/TrainerHill_Entrance/scripts.inc @@ -96,7 +96,7 @@ TrainerHill_Entrance_EventScript_PlayerExitChallenge:: waitmovement 0 setvar VAR_TRAINER_HILL_IS_ACTIVE, 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon releaseall TrainerHill_Entrance_EventScript_EndExitChallenge:: end @@ -162,7 +162,7 @@ TrainerHill_Entrance_EventScript_ChooseChallenge:: setvar VAR_TRAINER_HILL_IS_ACTIVE, 1 setvar VAR_TEMP_5, 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon msgbox TrainerHill_Entrance_Text_TimeProgessGetSetGo, MSGBOX_DEFAULT trainerhill_start releaseall diff --git a/data/scripts/battle_pike.inc b/data/scripts/battle_pike.inc index e0a8c3feb1..3393f808d3 100644 --- a/data/scripts/battle_pike.inc +++ b/data/scripts/battle_pike.inc @@ -133,7 +133,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePikeRoomNormal_EventScript_SetEnteredRoom:: @@ -147,7 +147,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePikeRoomNormal_EventScript_Exit:: @@ -216,7 +216,7 @@ BattleFrontier_BattlePikeRoomWildMons_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePike_EventScript_Retire:: diff --git a/data/scripts/day_care.inc b/data/scripts/day_care.inc index 32a1b18922..ce5c02a935 100644 --- a/data/scripts/day_care.inc +++ b/data/scripts/day_care.inc @@ -103,7 +103,7 @@ Route117_PokemonDayCare_EventScript_GiveMonToRaise:: msgbox Route117_PokemonDayCare_Text_WellRaiseYourMon, MSGBOX_DEFAULT waitmoncry special StoreSelectedPokemonInDaycare - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon incrementgamestat GAME_STAT_USED_DAYCARE specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, Route117_PokemonDayCare_EventScript_CanRaiseOneMore diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index ead669c6b2..b2c5dc84d4 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -18,7 +18,7 @@ EventScript_CutTreeCommon: dofieldeffect FLDEFF_USE_CUT_ON_TREE waitstate EventScript_CutTreeDown:: @ fallthrough - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT call_if_eq VAR_0x8004, TRUE, EventScript_FollowerFieldMove applymovement VAR_LAST_TALKED, Movement_CutTreeDown waitmovement 0 diff --git a/data/scripts/flash.inc b/data/scripts/flash.inc index 7444dcd5ea..5e8d7160a9 100644 --- a/data/scripts/flash.inc +++ b/data/scripts/flash.inc @@ -1,5 +1,5 @@ EventScript_UseFlash:: animateflash 1 setflashlevel 1 - releaseall + releaseall end diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc index 3a81e6fabf..f0ef6dbb3b 100644 --- a/data/scripts/follower.inc +++ b/data/scripts/follower.inc @@ -1,14 +1,14 @@ gText_FollowerLovesYou:: - .string "123456789012345678901234567890123\n$" + .string "123456789012345678901234567890123\n$" gText_FollowerLostInThought:: - .string "{STR_VAR_1} seems lost in thought.$" + .string "{STR_VAR_1} seems lost in thought.$" gText_FollowerDefault:: - .string "ERROR 404: Script not found.$" + .string "ERROR 404: Script not found.$" gText_WantsToFly:: - .string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$" + .string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$" .macro playfirstmoncry callfunc ScrFunc_playfirstmoncry @@ -26,649 +26,638 @@ callfunc ScrFunc_emote .endm EventScript_Follower:: - lock - bufferlivemonnickname 0 - playfirstmoncry - callfunc ScrFunc_getfolloweraction - checkpartymove MOVE_FLY - compare VAR_RESULT 6 - goto_if_eq EventScript_FollowerEnd - bufferlivemonnickname 0 - msgbox gText_WantsToFly, MSGBOX_YESNO - switch VAR_RESULT - case NO, EventScript_FollowerEnd - case YES, EventScript_FollowerFly - case MULTI_B_PRESSED, EventScript_FollowerEnd -EventScript_FollowerFly:: - callfunc ScrFunc_followerfly + lock + bufferlivemonnickname 0 + playfirstmoncry + callfunc ScrFunc_getfolloweraction EventScript_FollowerEnd:: - waitfieldeffect FLDEFF_EMOTE - release - end + waitfieldeffect FLDEFF_EMOTE + release + end EventScript_FollowerLovesYou:: - applymovement 0xFE ContestHall_Movement_Heart - waitmovement 0xFE - waitmoncry - msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT - return + applymovement 0xFE ContestHall_Movement_Heart + waitmovement 0xFE + waitmoncry + msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT + return @ Message address must be loaded into bank 0 EventScript_FollowerGeneric:: @ similar to Std_MsgboxDefault - faceplayer + faceplayer EventScript_FollowerGenericSkipFace: - waitfieldeffect FLDEFF_EMOTE - message 0x0 - waitmessage - waitbuttonpress - return + waitfieldeffect FLDEFF_EMOTE + message 0x0 + waitmessage + waitbuttonpress + return EventScript_FollowerJump:: - faceplayer - applymovement 0xFE FollowerSplashMovement - waitmovement 0xFE - waitfieldeffect FLDEFF_EMOTE - message 0x0 - waitmessage - waitbuttonpress - return + faceplayer + applymovement 0xFE FollowerSplashMovement + waitmovement 0xFE + waitfieldeffect FLDEFF_EMOTE + message 0x0 + waitmessage + waitbuttonpress + return EnterPokeballMovement:: - enter_pokeball - step_end + enter_pokeball + step_end @ Movement scripts below, movements are defined in movement.inc FollowerSplashMovement:: - jump_in_place_down - delay_4 - jump_in_place_down - face_player - step_end + jump_in_place_down + delay_4 + jump_in_place_down + face_player + step_end FollowerShiverVerticalMovement: - lock_facing_direction - slide_left - slide_right - slide_right - slide_left - unlock_facing_direction - step_end + lock_facing_direction + slide_left + slide_right + slide_right + slide_left + unlock_facing_direction + step_end FollowerShiverHorizontalMovement: - lock_facing_direction - slide_up - slide_down - slide_down - slide_up - unlock_facing_direction - step_end + lock_facing_direction + slide_up + slide_down + slide_down + slide_up + unlock_facing_direction + step_end FollowerNostalgiaMovement: - face_away_player - lock_facing_direction - jump_in_place_down - jump_in_place_down - jump_in_place_down - unlock_facing_direction - face_player - lock_facing_direction - jump_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + jump_in_place_down + jump_in_place_down + jump_in_place_down + unlock_facing_direction + face_player + lock_facing_direction + jump_in_place_down + unlock_facing_direction + step_end FollowerSkippingMovement: - lock_facing_direction - jump_in_place_down - delay_4 - jump_in_place_down - unlock_facing_direction - step_end + lock_facing_direction + jump_in_place_down + delay_4 + jump_in_place_down + unlock_facing_direction + step_end FollowerJumpOnPlayerNorth: - jump_up - delay_4 - lock_facing_direction - walk_fast_down - unlock_facing_direction - step_end + jump_up + delay_4 + lock_facing_direction + walk_fast_down + unlock_facing_direction + step_end FollowerJumpOnPlayerSouth: - jump_down - delay_4 - lock_facing_direction - walk_fast_up - unlock_facing_direction - step_end + jump_down + delay_4 + lock_facing_direction + walk_fast_up + unlock_facing_direction + step_end FollowerJumpOnPlayerEast: - jump_right - delay_4 - lock_facing_direction - walk_fast_left - unlock_facing_direction - step_end + jump_right + delay_4 + lock_facing_direction + walk_fast_left + unlock_facing_direction + step_end FollowerJumpOnPlayerWest: - jump_left - delay_4 - lock_facing_direction - walk_fast_right - unlock_facing_direction - step_end + jump_left + delay_4 + lock_facing_direction + walk_fast_right + unlock_facing_direction + step_end FollowerCuddlingNorth: - face_left - lock_facing_direction - walk_up - walk_in_place_left - walk_in_place_left - unlock_facing_direction - walk_down - face_player - step_end + face_left + lock_facing_direction + walk_up + walk_in_place_left + walk_in_place_left + unlock_facing_direction + walk_down + face_player + step_end FollowerCuddlingSouth: - face_right - lock_facing_direction - walk_down - walk_in_place_right - walk_in_place_right - unlock_facing_direction - walk_up - face_player - step_end + face_right + lock_facing_direction + walk_down + walk_in_place_right + walk_in_place_right + unlock_facing_direction + walk_up + face_player + step_end FollowerCuddlingEast: - face_down - lock_facing_direction - walk_right - walk_in_place_down - walk_in_place_down - unlock_facing_direction - walk_left - face_player - step_end + face_down + lock_facing_direction + walk_right + walk_in_place_down + walk_in_place_down + unlock_facing_direction + walk_left + face_player + step_end FollowerCuddlingWest: - face_down - lock_facing_direction - walk_left - walk_in_place_down - walk_in_place_down - unlock_facing_direction - walk_right - face_player - step_end + face_down + lock_facing_direction + walk_left + walk_in_place_down + walk_in_place_down + unlock_facing_direction + walk_right + face_player + step_end FollowerGetCloserNorth: - walk_up - delay_16 - lock_facing_direction - walk_down - unlock_facing_direction - step_end + walk_up + delay_16 + lock_facing_direction + walk_down + unlock_facing_direction + step_end FollowerGetCloserSouth: - walk_down - delay_16 - lock_facing_direction - walk_up - unlock_facing_direction - step_end + walk_down + delay_16 + lock_facing_direction + walk_up + unlock_facing_direction + step_end FollowerGetCloserEast: - walk_right - delay_16 - lock_facing_direction - walk_left - unlock_facing_direction - step_end + walk_right + delay_16 + lock_facing_direction + walk_left + unlock_facing_direction + step_end FollowerGetCloserWest: - walk_left - delay_16 - lock_facing_direction - walk_right - unlock_facing_direction - step_end + walk_left + delay_16 + lock_facing_direction + walk_right + unlock_facing_direction + step_end FollowerPokeNorth: - walk_faster_up - delay_8 - lock_facing_direction - walk_faster_down - delay_4 - walk_faster_up - delay_4 - walk_faster_down - unlock_facing_direction - step_end + walk_faster_up + delay_8 + lock_facing_direction + walk_faster_down + delay_4 + walk_faster_up + delay_4 + walk_faster_down + unlock_facing_direction + step_end FollowerPokeSouth: - walk_faster_down - delay_8 - lock_facing_direction - walk_faster_up - delay_4 - walk_faster_down - delay_4 - walk_faster_up - unlock_facing_direction - step_end + walk_faster_down + delay_8 + lock_facing_direction + walk_faster_up + delay_4 + walk_faster_down + delay_4 + walk_faster_up + unlock_facing_direction + step_end FollowerPokeEast: - walk_faster_right - delay_8 - lock_facing_direction - walk_faster_left - delay_4 - walk_faster_right - delay_4 - walk_faster_left - unlock_facing_direction - step_end + walk_faster_right + delay_8 + lock_facing_direction + walk_faster_left + delay_4 + walk_faster_right + delay_4 + walk_faster_left + unlock_facing_direction + step_end FollowerPokeWest: - walk_faster_left - delay_8 - lock_facing_direction - walk_faster_right - delay_4 - walk_faster_left - delay_4 - walk_faster_right - unlock_facing_direction - step_end + walk_faster_left + delay_8 + lock_facing_direction + walk_faster_right + delay_4 + walk_faster_left + delay_4 + walk_faster_right + unlock_facing_direction + step_end FollowerLookAround: - face_away_player - delay_16 - delay_16 - face_left - delay_16 - delay_16 - face_up - delay_16 - delay_16 - face_down - delay_16 - delay_16 - step_end + face_away_player + delay_16 + delay_16 + face_left + delay_16 + delay_16 + face_up + delay_16 + delay_16 + face_down + delay_16 + delay_16 + step_end FollowerLookAway: - face_away_player - delay_16 - delay_16 - step_end + face_away_player + delay_16 + delay_16 + step_end FollowerLookAwayBark: - face_away_player - lock_facing_direction - jump_in_place_down - jump_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + jump_in_place_down + jump_in_place_down + unlock_facing_direction + step_end FollowerLookAwayPokeG: - face_away_player - lock_facing_direction - walk_in_place_down - walk_in_place_down - walk_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + walk_in_place_down + walk_in_place_down + walk_in_place_down + unlock_facing_direction + step_end FollowerPokeGround: - lock_facing_direction - walk_in_place_down - walk_in_place_down - walk_in_place_down - unlock_facing_direction - step_end + lock_facing_direction + walk_in_place_down + walk_in_place_down + walk_in_place_down + unlock_facing_direction + step_end FollowerStartled: - face_away_player - lock_facing_direction - jump_in_place_down - unlock_facing_direction - face_player - step_end + face_away_player + lock_facing_direction + jump_in_place_down + unlock_facing_direction + face_player + step_end FollowerHopFast: - jump_in_place_up - jump_in_place_down - jump_in_place_left - jump_in_place_right - face_player - step_end + jump_in_place_up + jump_in_place_down + jump_in_place_left + jump_in_place_right + face_player + step_end FollowerDizzy: - walk_in_place_left - walk_in_place_fast_right - walk_in_place_slow_up - walk_in_place_fast_down - delay_4 - face_away_player - step_end + walk_in_place_left + walk_in_place_fast_right + walk_in_place_slow_up + walk_in_place_fast_down + delay_4 + face_away_player + step_end FollowerLookAroundScared: - face_up - delay_16 - face_down - delay_16 - face_left - delay_16 - face_right - delay_16 - face_up - delay_16 - face_down - delay_16 - face_left - delay_16 - face_right - delay_16 - face_player - step_end + face_up + delay_16 + face_down + delay_16 + face_left + delay_16 + face_right + delay_16 + face_up + delay_16 + face_down + delay_16 + face_left + delay_16 + face_right + delay_16 + face_player + step_end FollowerDance: - lock_facing_direction - jump_in_place_up - unlock_facing_direction - walk_in_place_fast_up - walk_in_place_fast_left - walk_in_place_fast_down - walk_in_place_fast_right - walk_in_place_fast_up - walk_in_place_fast_left - walk_in_place_fast_down - walk_in_place_fast_right - jump_in_place_up - jump_in_place_down - jump_in_place_up - face_player - step_end + lock_facing_direction + jump_in_place_up + unlock_facing_direction + walk_in_place_fast_up + walk_in_place_fast_left + walk_in_place_fast_down + walk_in_place_fast_right + walk_in_place_fast_up + walk_in_place_fast_left + walk_in_place_fast_down + walk_in_place_fast_right + jump_in_place_up + jump_in_place_down + jump_in_place_up + face_player + step_end @ Movement scripts EventScript_FollowerIsShivering:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq ShiverVertical - compare VAR_FACING, DIR_SOUTH - call_if_eq ShiverVertical - compare VAR_FACING, DIR_WEST - call_if_eq ShiverHorizontal - compare VAR_FACING, DIR_EAST - call_if_eq ShiverHorizontal - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq ShiverVertical + compare VAR_FACING, DIR_SOUTH + call_if_eq ShiverVertical + compare VAR_FACING, DIR_WEST + call_if_eq ShiverHorizontal + compare VAR_FACING, DIR_EAST + call_if_eq ShiverHorizontal + goto EventScript_FollowerGeneric ShiverVertical: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + return ShiverHorizontal: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + return EventScript_FollowerNostalgia:: - applymovement 0xFE FollowerNostalgiaMovement - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerNostalgiaMovement + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerHopping:: - faceplayer - applymovement 0xFE FollowerSkippingMovement - waitmovement 0xFE - goto EventScript_FollowerGeneric + faceplayer + applymovement 0xFE FollowerSkippingMovement + waitmovement 0xFE + goto EventScript_FollowerGeneric JumpOnN: - applymovement 0xFE FollowerJumpOnPlayerNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerNorth + waitmovement 0xFE + return JumpOnS: - applymovement 0xFE FollowerJumpOnPlayerSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerSouth + waitmovement 0xFE + return JumpOnE: - applymovement 0xFE FollowerJumpOnPlayerEast - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerEast + waitmovement 0xFE + return JumpOnW: - applymovement 0xFE FollowerJumpOnPlayerWest - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerWest + waitmovement 0xFE + return EventScript_FollowerJumpOnPlayer:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq JumpOnS - compare VAR_FACING, DIR_SOUTH - call_if_eq JumpOnN - compare VAR_FACING, DIR_WEST - call_if_eq JumpOnE - compare VAR_FACING, DIR_EAST - call_if_eq JumpOnW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq JumpOnS + compare VAR_FACING, DIR_SOUTH + call_if_eq JumpOnN + compare VAR_FACING, DIR_WEST + call_if_eq JumpOnE + compare VAR_FACING, DIR_EAST + call_if_eq JumpOnW + goto EventScript_FollowerGeneric CuddleN: - applymovement 0xFE FollowerCuddlingNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingNorth + waitmovement 0xFE + return CuddleS: - applymovement 0xFE FollowerCuddlingSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingSouth + waitmovement 0xFE + return CuddleE: - applymovement 0xFE FollowerCuddlingEast - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingEast + waitmovement 0xFE + return CuddleW: - applymovement 0xFE FollowerCuddlingWest - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingWest + waitmovement 0xFE + return EventScript_FollowerCuddling:: @ similar to Std_MsgboxDefault - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq CuddleS - compare VAR_FACING, DIR_SOUTH - call_if_eq CuddleN - compare VAR_FACING, DIR_WEST - call_if_eq CuddleE - compare VAR_FACING, DIR_EAST - call_if_eq CuddleW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq CuddleS + compare VAR_FACING, DIR_SOUTH + call_if_eq CuddleN + compare VAR_FACING, DIR_WEST + call_if_eq CuddleE + compare VAR_FACING, DIR_EAST + call_if_eq CuddleW + goto EventScript_FollowerGeneric ShCuddleN: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingNorth + waitmovement 0xFE + return ShCuddleS: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingSouth + waitmovement 0xFE + return ShCuddleE: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingEast - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingEast + waitmovement 0xFE + return ShCuddleW: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingWest - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingWest + waitmovement 0xFE + return EventScript_FollowerShiverCuddling:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq ShCuddleS - compare VAR_FACING, DIR_SOUTH - call_if_eq ShCuddleN - compare VAR_FACING, DIR_WEST - call_if_eq ShCuddleE - compare VAR_FACING, DIR_EAST - call_if_eq ShCuddleW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq ShCuddleS + compare VAR_FACING, DIR_SOUTH + call_if_eq ShCuddleN + compare VAR_FACING, DIR_WEST + call_if_eq ShCuddleE + compare VAR_FACING, DIR_EAST + call_if_eq ShCuddleW + goto EventScript_FollowerGeneric CreepCloserN: - applymovement 0xFE FollowerGetCloserNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserNorth + waitmovement 0xFE + return CreepCloserS: - applymovement 0xFE FollowerGetCloserSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserSouth + waitmovement 0xFE + return CreepCloserE: - applymovement 0xFE FollowerGetCloserEast - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserEast + waitmovement 0xFE + return CreepCloserW: - applymovement 0xFE FollowerGetCloserWest - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserWest + waitmovement 0xFE + return EventScript_FollowerGetCloser:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq CreepCloserS - compare VAR_FACING, DIR_SOUTH - call_if_eq CreepCloserN - compare VAR_FACING, DIR_WEST - call_if_eq CreepCloserE - compare VAR_FACING, DIR_EAST - call_if_eq CreepCloserW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq CreepCloserS + compare VAR_FACING, DIR_SOUTH + call_if_eq CreepCloserN + compare VAR_FACING, DIR_WEST + call_if_eq CreepCloserE + compare VAR_FACING, DIR_EAST + call_if_eq CreepCloserW + goto EventScript_FollowerGeneric PokePlayerN: - applymovement 0xFE FollowerGetCloserNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserNorth + waitmovement 0xFE + return PokePlayerS: - applymovement 0xFE FollowerGetCloserSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserSouth + waitmovement 0xFE + return PokePlayerE: - applymovement 0xFE FollowerGetCloserEast - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserEast + waitmovement 0xFE + return PokePlayerW: - applymovement 0xFE FollowerGetCloserWest - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserWest + waitmovement 0xFE + return EventScript_FollowerPokingPlayer:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq PokePlayerS - compare VAR_FACING, DIR_SOUTH - call_if_eq PokePlayerN - compare VAR_FACING, DIR_WEST - call_if_eq PokePlayerE - compare VAR_FACING, DIR_EAST - call_if_eq PokePlayerW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq PokePlayerS + compare VAR_FACING, DIR_SOUTH + call_if_eq PokePlayerN + compare VAR_FACING, DIR_WEST + call_if_eq PokePlayerE + compare VAR_FACING, DIR_EAST + call_if_eq PokePlayerW + goto EventScript_FollowerGeneric EventScript_FollowerLookAround:: - applymovement 0xFE FollowerLookAround - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerLookAround + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerLookAway:: - applymovement 0xFE FollowerLookAway - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAway + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAwayBark:: - applymovement 0xFE FollowerLookAwayBark - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAwayBark + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAwayPoke:: - applymovement 0xFE FollowerLookAwayPokeG - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAwayPokeG + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerPokeGround:: - faceplayer - applymovement 0xFE FollowerPokeGround - waitmovement 0xFE - goto EventScript_FollowerGeneric + faceplayer + applymovement 0xFE FollowerPokeGround + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerStartled:: - applymovement 0xFE FollowerStartled - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerStartled + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFastHopping:: - applymovement 0xFE FollowerHopFast - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerHopFast + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerDizzy:: - applymovement 0xFE FollowerDizzy - waitmovement 0 - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerDizzy + waitmovement 0 + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAroundScared:: - applymovement 0xFE FollowerLookAroundScared - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerLookAroundScared + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerDance:: - faceplayer - applymovement 0xFE FollowerDance - waitmovement 0 - goto EventScript_FollowerGenericSkipFace + faceplayer + applymovement 0xFE FollowerDance + waitmovement 0 + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceUp:: - applymovement 0xFE Common_Movement_FaceUp - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceUp + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceResult:: @ Face towards direction in VAR_RESULT - switch VAR_RESULT - case DIR_SOUTH, EventScript_FollowerFaceDown + switch VAR_RESULT + case DIR_SOUTH, EventScript_FollowerFaceDown case DIR_NORTH, EventScript_FollowerFaceUp case DIR_WEST, EventScript_FollowerFaceLeft case DIR_EAST, EventScript_FollowerFaceRight - goto EventScript_FollowerGeneric + goto EventScript_FollowerGeneric EventScript_FollowerFaceDown: - applymovement 0xFE Common_Movement_FaceDown - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceDown + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceLeft: - applymovement 0xFE Common_Movement_FaceLeft - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceLeft + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceRight: - applymovement 0xFE Common_Movement_FaceRight - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceRight + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace diff --git a/data/scripts/pkmn_center_nurse.inc b/data/scripts/pkmn_center_nurse.inc index 925666a275..c0fe80a994 100644 --- a/data/scripts/pkmn_center_nurse.inc +++ b/data/scripts/pkmn_center_nurse.inc @@ -40,7 +40,7 @@ EventScript_PkmnCenterNurse_TakeAndHealPkmn:: applymovement VAR_0x800B, Common_Movement_WalkInPlaceFasterDown waitmovement 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon return EventScript_PkmnCenterNurse_CheckTrainerHillAndUnionRoom:: diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc index 17801e85a0..9a6fd77253 100644 --- a/data/scripts/secret_base.inc +++ b/data/scripts/secret_base.inc @@ -646,7 +646,7 @@ SecretBase_EventScript_BattleTrainer:: call_if_eq VAR_RESULT, B_OUTCOME_WON, SecretBase_EventScript_WonSecretBaseBattle call_if_eq VAR_RESULT, B_OUTCOME_LOST, SecretBase_EventScript_LostSecretBaseBattle special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon release end diff --git a/data/scripts/trainer_battle.inc b/data/scripts/trainer_battle.inc index cbbdaac291..900e5da8f8 100644 --- a/data/scripts/trainer_battle.inc +++ b/data/scripts/trainer_battle.inc @@ -10,7 +10,7 @@ EventScript_TrainerApproach:: EventScript_TryDoNormalTrainerBattle:: lock faceplayer - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT @@ -46,7 +46,7 @@ EventScript_NoDoubleTrainerBattle:: gotopostbattlescript EventScript_DoNoIntroTrainerBattle:: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT @@ -97,7 +97,7 @@ EventScript_NotEnoughMonsForDoubleRematchBattle:: end EventScript_RevealTrainer:: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT diff --git a/gflib/sprite.c b/gflib/sprite.c index 0be8eb1020..8c3bb292c6 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -56,7 +56,6 @@ static void AddSpritesToOamBuffer(void); static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); static void ResetOamMatrices(void); static void ResetSprite(struct Sprite *sprite); -static s16 AllocSpriteTiles(u16 tileCount); static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); static void ResetAllSprites(void); static void BeginAnim(struct Sprite *sprite); diff --git a/gflib/sprite.h b/gflib/sprite.h index 0ec8c1a461..e3767a3a50 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -298,6 +298,7 @@ void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotat u16 LoadSpriteSheet(const struct SpriteSheet *sheet); u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame); void LoadSpriteSheets(const struct SpriteSheet *sheets); +s16 AllocSpriteTiles(u16 tileCount); u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet); void AllocTilesForSpriteSheets(struct SpriteSheet *sheets); void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet); diff --git a/graphics/object_events/pics/misc/animated_ball.png b/graphics/object_events/pics/misc/animated_ball.png index 534e66c7b4..03216113ba 100644 Binary files a/graphics/object_events/pics/misc/animated_ball.png and b/graphics/object_events/pics/misc/animated_ball.png differ diff --git a/graphics/object_events/pics/misc/ball_beast.png b/graphics/object_events/pics/misc/ball_beast.png new file mode 100644 index 0000000000..f3733d11ae Binary files /dev/null and b/graphics/object_events/pics/misc/ball_beast.png differ diff --git a/graphics/object_events/pics/misc/ball_cherish.png b/graphics/object_events/pics/misc/ball_cherish.png new file mode 100644 index 0000000000..a93cab30c5 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_cherish.png differ diff --git a/graphics/object_events/pics/misc/ball_dive.png b/graphics/object_events/pics/misc/ball_dive.png new file mode 100644 index 0000000000..1349ffa3ff Binary files /dev/null and b/graphics/object_events/pics/misc/ball_dive.png differ diff --git a/graphics/object_events/pics/misc/ball_dream.png b/graphics/object_events/pics/misc/ball_dream.png new file mode 100644 index 0000000000..875e72a702 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_dream.png differ diff --git a/graphics/object_events/pics/misc/ball_dusk.png b/graphics/object_events/pics/misc/ball_dusk.png new file mode 100644 index 0000000000..824557003d Binary files /dev/null and b/graphics/object_events/pics/misc/ball_dusk.png differ diff --git a/graphics/object_events/pics/misc/ball_fast.png b/graphics/object_events/pics/misc/ball_fast.png new file mode 100644 index 0000000000..3e3ca467ea Binary files /dev/null and b/graphics/object_events/pics/misc/ball_fast.png differ diff --git a/graphics/object_events/pics/misc/ball_friend.png b/graphics/object_events/pics/misc/ball_friend.png new file mode 100644 index 0000000000..f22d7f78a2 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_friend.png differ diff --git a/graphics/object_events/pics/misc/ball_great.png b/graphics/object_events/pics/misc/ball_great.png new file mode 100644 index 0000000000..5a70a505fe Binary files /dev/null and b/graphics/object_events/pics/misc/ball_great.png differ diff --git a/graphics/object_events/pics/misc/ball_heal.png b/graphics/object_events/pics/misc/ball_heal.png new file mode 100644 index 0000000000..bcb2272e51 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_heal.png differ diff --git a/graphics/object_events/pics/misc/ball_heavy.png b/graphics/object_events/pics/misc/ball_heavy.png new file mode 100644 index 0000000000..5b28410694 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_heavy.png differ diff --git a/graphics/object_events/pics/misc/ball_level.png b/graphics/object_events/pics/misc/ball_level.png new file mode 100644 index 0000000000..9050ad5588 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_level.png differ diff --git a/graphics/object_events/pics/misc/ball_love.png b/graphics/object_events/pics/misc/ball_love.png new file mode 100644 index 0000000000..9584b6c797 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_love.png differ diff --git a/graphics/object_events/pics/misc/ball_lure.png b/graphics/object_events/pics/misc/ball_lure.png new file mode 100644 index 0000000000..f3f6c1ffd9 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_lure.png differ diff --git a/graphics/object_events/pics/misc/ball_luxury.png b/graphics/object_events/pics/misc/ball_luxury.png new file mode 100644 index 0000000000..f04e816cb3 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_luxury.png differ diff --git a/graphics/object_events/pics/misc/ball_master.png b/graphics/object_events/pics/misc/ball_master.png new file mode 100644 index 0000000000..1db9b71fba Binary files /dev/null and b/graphics/object_events/pics/misc/ball_master.png differ diff --git a/graphics/object_events/pics/misc/ball_moon.png b/graphics/object_events/pics/misc/ball_moon.png new file mode 100644 index 0000000000..f13f34e769 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_moon.png differ diff --git a/graphics/object_events/pics/misc/ball_nest.png b/graphics/object_events/pics/misc/ball_nest.png new file mode 100644 index 0000000000..48a409183b Binary files /dev/null and b/graphics/object_events/pics/misc/ball_nest.png differ diff --git a/graphics/object_events/pics/misc/ball_net.png b/graphics/object_events/pics/misc/ball_net.png new file mode 100644 index 0000000000..186d76650e Binary files /dev/null and b/graphics/object_events/pics/misc/ball_net.png differ diff --git a/graphics/object_events/pics/misc/ball_park.png b/graphics/object_events/pics/misc/ball_park.png new file mode 100644 index 0000000000..5cc3f1a9b0 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_park.png differ diff --git a/graphics/object_events/pics/misc/ball_premier.png b/graphics/object_events/pics/misc/ball_premier.png new file mode 100644 index 0000000000..8876cfe22d Binary files /dev/null and b/graphics/object_events/pics/misc/ball_premier.png differ diff --git a/graphics/object_events/pics/misc/ball_quick.png b/graphics/object_events/pics/misc/ball_quick.png new file mode 100644 index 0000000000..0f6c64b1b1 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_quick.png differ diff --git a/graphics/object_events/pics/misc/ball_repeat.png b/graphics/object_events/pics/misc/ball_repeat.png new file mode 100644 index 0000000000..36186b094c Binary files /dev/null and b/graphics/object_events/pics/misc/ball_repeat.png differ diff --git a/graphics/object_events/pics/misc/ball_safari.png b/graphics/object_events/pics/misc/ball_safari.png new file mode 100644 index 0000000000..f73846a9b8 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_safari.png differ diff --git a/graphics/object_events/pics/misc/ball_sport.png b/graphics/object_events/pics/misc/ball_sport.png new file mode 100644 index 0000000000..1c32d2609c Binary files /dev/null and b/graphics/object_events/pics/misc/ball_sport.png differ diff --git a/graphics/object_events/pics/misc/ball_strange.png b/graphics/object_events/pics/misc/ball_strange.png new file mode 100644 index 0000000000..ee09679dc2 Binary files /dev/null and b/graphics/object_events/pics/misc/ball_strange.png differ diff --git a/graphics/object_events/pics/misc/ball_timer.png b/graphics/object_events/pics/misc/ball_timer.png new file mode 100644 index 0000000000..878d6ea5ba Binary files /dev/null and b/graphics/object_events/pics/misc/ball_timer.png differ diff --git a/graphics/object_events/pics/misc/ball_ultra.png b/graphics/object_events/pics/misc/ball_ultra.png new file mode 100644 index 0000000000..171281666f Binary files /dev/null and b/graphics/object_events/pics/misc/ball_ultra.png differ diff --git a/graphics/object_events/pics/pokemon/substitute.png b/graphics/object_events/pics/pokemon/substitute.png new file mode 100644 index 0000000000..6be1e2ddcb Binary files /dev/null and b/graphics/object_events/pics/pokemon/substitute.png differ diff --git a/graphics/object_events/pics/pokemon/wailord.png b/graphics/object_events/pics/pokemon/wailord.png index a1fc3a087a..a7032a856a 100644 Binary files a/graphics/object_events/pics/pokemon/wailord.png and b/graphics/object_events/pics/pokemon/wailord.png differ diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index f7c2d36284..cac4333689 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -276,6 +276,11 @@ #define ANIM_RUN_WEST (ANIM_STD_COUNT + 2) #define ANIM_RUN_EAST (ANIM_STD_COUNT + 3) +#define ANIM_EXIT_POKEBALL_FAST_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_EXIT_POKEBALL_FAST_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_EXIT_POKEBALL_FAST_WEST (ANIM_STD_COUNT + 2) +#define ANIM_EXIT_POKEBALL_FAST_EAST (ANIM_STD_COUNT + 3) + #define ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 0) #define ANIM_BUNNY_HOP_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 1) #define ANIM_BUNNY_HOP_BACK_WHEEL_WEST (ANIM_STD_COUNT + 2) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 85aa0eb4b4..41196f5fc5 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -286,6 +286,10 @@ // will display correctly under bridges, etc. #define LARGE_OW_SUPPORT TRUE +// Followers will emerge from the pokeball they are stored in, +// instead of a normal pokeball +#define OW_MON_POKEBALLS TRUE + #define SHADOW_SIZE_S 0 #define SHADOW_SIZE_M 1 #define SHADOW_SIZE_L 2 diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 25edea1af9..5b27ea2b5a 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -110,7 +110,6 @@ #define FLDEFFOBJ_BUBBLES 34 #define FLDEFFOBJ_SMALL_SPARKLE 35 #define FLDEFFOBJ_RAYQUAZA 36 - #define FLDEFFOBJ_TRACKS_SLITHER 37 #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 @@ -136,9 +135,9 @@ #define FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE 0x1403 // Duplicates of event_object_movement tags -#define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY -#define FLDEFF_PAL_TAG_BRENDAN 0x1100 // OBJ_EVENT_PAL_TAG_BRENDAN -#define FLDEFF_PAL_TAG_NPC_1 0x1103 // OBJ_EVENT_PAL_TAG_NPC_1 -#define FLDEFF_PAL_TAG_NPC_2 0x1104 // OBJ_EVENT_PAL_TAG_NPC_2 +#define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY +#define FLDEFF_PAL_TAG_BRENDAN 0x1100 // OBJ_EVENT_PAL_TAG_BRENDAN +#define FLDEFF_PAL_TAG_NPC_1 0x1103 // OBJ_EVENT_PAL_TAG_NPC_1 +#define FLDEFF_PAL_TAG_NPC_2 0x1104 // OBJ_EVENT_PAL_TAG_NPC_2 #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/include/decompress.h b/include/decompress.h index 18340d54b2..6c66b738f9 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -8,6 +8,8 @@ extern u8 ALIGNED(4) gDecompressionBuffer[0x4000]; void LZDecompressWram(const u32 *src, void *dest); void LZDecompressVram(const u32 *src, void *dest); +bool32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize); + u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer); bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src); diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 537c018b80..409501eea9 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -292,6 +292,7 @@ void MovementType_FollowPlayer(struct Sprite *); u8 GetSlideMovementAction(u32); u8 GetJumpMovementAction(u32); u8 GetJump2MovementAction(u32); +u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 71920d22f5..22dcb119a4 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -20,9 +20,9 @@ void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); bool8 UpdateRevealDisguise(struct ObjectEvent *); void StartRevealDisguise(struct ObjectEvent *); void StartAshFieldEffect(s16, s16, u16, s16); -void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8); -void SetUpShadow(struct ObjectEvent*, struct Sprite*); -u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*); +void SetUpReflection(struct ObjectEvent *, struct Sprite *, u8); +void SetUpShadow(struct ObjectEvent *, struct Sprite *); +u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void UpdateRayquazaSpotlightEffect(struct Sprite *); void UpdateShadowFieldEffect(struct Sprite *); diff --git a/include/follower_helper.h b/include/follower_helper.h index a03e08b5d3..86ac018d11 100644 --- a/include/follower_helper.h +++ b/include/follower_helper.h @@ -16,81 +16,67 @@ enum { FOLLOWER_EMOTION_LENGTH, }; -// This struct is optimized for size -// Each "section" can be used to combine multiple conditions, -// i.e, species and map -// Just set the flags accordingly and use the right union member -struct __attribute__((packed)) FollowerMsgInfoExtended { +// Can be either 3 bytes, a u16 and a byte, or a 24-bit value +union __attribute__((packed)) MsgConditionData { + u8 bytes[3]; + struct __attribute__((packed)) { + u16 hw; + u8 b; + } split; + u32 raw:24; +}; // size = 0x3 + +struct __attribute__((packed)) MsgCondition { + u32 type:8; + union MsgConditionData data; +}; // size = 0x4 + +struct FollowerMsgInfoExtended { const u8 *text; const u8 *script; - union __attribute__((packed)) { - u16 species:10; - struct __attribute__((packed)) { - u16 type1:5; - u16 type2:5; // if >= NUMBER_OF_MON_TYPES, inverts checking for type1 - } types; - u16 status:10; - } st; - u16 stFlags:2; // 0 = no matching, 1 = species matching, 2 = type matching, 3 = status - u16 emotion:4; // emotion for this message - - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 mapSec:8; - } mapSec; - struct __attribute__((packed)) { - u16 mapNum:8; - u16 mapGroup:6; - } map; - struct __attribute__((packed)) { - u16 behavior1:8; - u16 behavior2:6; // not full; only goes up to 0x3F - } mb; - } mm; - u16 mmFlags:2; // 1 = map sec, 2 = map, 3 = metatile behavior - - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 weather1:5; - u16 weather2:5; - } weather; - u16 song:10; - u16 timeOfDay:10; - } wt; - u16 wtFlags:2; // 1 = weather matching, 2 = song, 3 = time - u16 weight:3; + u32 emotion:4; + u32 weight:3; // if set, `text` is treated as an array of up to 4 texts instead - u16 textSpread:1; + // which one is displayed is chosen at random + u32 textSpread:1; + u32 orFlag:1; // if set, *any* condition can match, rather than all - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 behavior:8; - u16 distance:6; - } mb; - } near; - u16 nearFlags:2; // 1 = mb within '+'-shaped distance away -}; + struct MsgCondition conditions[5]; +}; // size = 8 + 4 + 5*4 = 32, 0x20 -enum { - ST_FLAGS_SPECIES = 1, - ST_FLAGS_TYPE, - ST_FLAGS_STATUS, -}; +// Follower message conditions +#define MSG_COND_NONE 0 +#define MSG_COND_SPECIES 1 +#define MSG_COND_TYPE 2 +#define MSG_COND_STATUS 3 +#define MSG_COND_MAPSEC 4 +#define MSG_COND_MAP 5 +#define MSG_COND_ON_MB 6 +#define MSG_COND_WEATHER 7 +#define MSG_COND_MUSIC 8 +#define MSG_COND_TIME_OF_DAY 9 +#define MSG_COND_NEAR_MB 10 -enum { - MM_FLAGS_MAPSEC = 1, - MM_FLAGS_MAP, - MM_FLAGS_MB, // (m)etatile (b)ehavior -}; +#define MATCH_U24(type, value) {type, {.raw = value}} +#define MATCH_U16(type, value1, value2) {type, {.split = {.hw = value1, .b = value2}}} +#define MATCH_U8(type, v1, v2, v3) {type, {.bytes = {v1, v2, v3}}} -enum { - WT_FLAGS_WEATHER = 1, - WT_FLAGS_MUSIC, - WT_FLAGS_TIME, -}; - -#define NEAR_FLAGS_MB 1 +#define MATCH_SPECIES(species) MATCH_U24(MSG_COND_SPECIES, species) +#define MATCH_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, 0) +// Checks that follower has *neither* of the two types +#define MATCH_NOT_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, TYPE_NONE) +#define MATCH_STATUS(status) MATCH_U24(MSG_COND_STATUS, status) +#define MATCH_MAPSEC(mapsec) MATCH_U24(MSG_COND_MAPSEC, mapsec) +#define MATCH_MAP_RAW(mapGroup, mapNum) MATCH_U8(MSG_COND_MAP, mapGroup, mapNum, 0) +#define MATCH_MAP(map) MATCH_U8(MSG_COND_MAP, MAP_GROUP(map), MAP_NUM(map), 0) +// Matches one of two metatile behaviors follower is standing on +#define MATCH_ON_MB(mb1, mb2) MATCH_U8(MSG_COND_ON_MB, mb1, mb2, 0) +#define MATCH_WEATHER(weather1, weather2) MATCH_U8(MSG_COND_WEATHER, weather1, weather2, 0) +#define MATCH_MUSIC(song) MATCH_U24(MSG_COND_MUSIC, song) +#define MATCH_TIME_OF_DAY(time) MATCH_U24(MSG_COND_TIME_OF_DAY, time) +// Matches metatile behavior within a '+' shape of size `distance` +#define MATCH_NEAR_MB(mb, distance) MATCH_U8(MSG_COND_NEAR_MB, mb, distance, 0) enum { COND_MSG_CELEBI, @@ -127,5 +113,6 @@ enum { }; extern const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT]; +extern const struct FollowerMessagePool gFollowerBasicMessages[FOLLOWER_EMOTION_LENGTH]; #endif //GUARD_FOLLOWER_HELPER_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 99d1d26b21..e6b08a2a70 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -275,6 +275,11 @@ enum { #define PLAYER_AVATAR_FLAG_FORCED_MOVE (1 << 6) #define PLAYER_AVATAR_FLAG_DASH (1 << 7) +#define PLAYER_AVATAR_FLAG_BIKE (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE) +// Player avatar flags for which follower pokemon are hidden +#define FOLLOWER_INVISIBLE_FLAGS (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_UNDERWATER | \ + PLAYER_AVATAR_FLAG_BIKE | PLAYER_AVATAR_FLAG_FORCED_MOVE) + enum { ACRO_BIKE_NORMAL, diff --git a/include/global.h b/include/global.h index ecf1823e8d..c986b24805 100644 --- a/include/global.h +++ b/include/global.h @@ -538,7 +538,6 @@ struct SaveBlock2 extern struct SaveBlock2 *gSaveBlock2Ptr; extern u8 UpdateSpritePaletteWithTime(u8); -extern bool8 IsAccurateGBA(void); struct SecretBaseParty { diff --git a/remote_build.sh b/remote_build.sh index 03e3e54b1a..835520290d 100644 --- a/remote_build.sh +++ b/remote_build.sh @@ -11,7 +11,23 @@ remote_path=$(git remote get-url build | sed -nr -e "s/ssh:\/\/\w+@?\w*://p") # make_cmd=$(git config --local remake.make) make_product=$(git config --local remake.src) make_dest=$(git config --local remake.dest) -set -x +old_head=$(git rev-parse --short @) +set +e +# Make a temp commit for unstaged changes +temp_commit_msg="temp build" +git commit -aem "$temp_commit_msg" +retVal=$? +set -e +# set -x git push build --force-with-lease -ssh $remote_host "cd $remote_path && git reset --hard && git checkout $git_branch && $make_cmd" -scp "$remote_host:$remote_path/$make_product" $make_dest +# { set +x; } 2>/dev/null +# Reset temp commit +if [[ $retVal -eq 0 ]]; then + commit_msg=$(git log -1 --pretty=%B) + if [[ "$commit_msg" == "$temp_commit_msg" ]]; then + git reset "$old_head" &>/dev/null + fi +fi +set -x +ssh -o "VisualHostKey=no" $remote_host "cd $remote_path && git reset --hard && git checkout $git_branch && $make_cmd" +scp -o "VisualHostKey=no" "$remote_host:$remote_path/$make_product" $make_dest diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 438f517c97..5eb25228a7 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -687,6 +687,9 @@ $(FLDEFFGFXDIR)/secret_power_tree.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/record_mix_lights.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 1 +$(OBJEVENTGFXDIR)/pokemon/substitute.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(OBJEVENTGFXDIR)/pokemon/bulbasaur.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1938,5 +1941,8 @@ $(OBJEVENTGFXDIR)/pokemon/deoxys.4bpp: %.4bpp: %.png $(MISCGFXDIR)/emotes.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 +# All pokeballs are 16x32 +$(OBJEVENTGFXDIR)/misc/ball_%.4bpp: $(OBJEVENTGFXDIR)/misc/ball_%.png ; $(GFX) $< $@ -mwidth 2 -mheight 4 + graphics/door_anims/battle_tower_multi_corridor.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 diff --git a/src/bike.c b/src/bike.c index b2680d103e..ae9dfd3e91 100644 --- a/src/bike.c +++ b/src/bike.c @@ -1053,7 +1053,7 @@ void Bike_HandleBumpySlopeJump(void) bool32 IsRunningDisallowed(u8 metatile) { - if (IsRunningDisallowedByMetatile(metatile) == TRUE) + if (!gMapHeader.allowRunning || IsRunningDisallowedByMetatile(metatile) == TRUE) return TRUE; else return FALSE; diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index 8bb579e01b..1faf48e759 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -217,6 +217,12 @@ static const union AnimCmd sAnim_FaceEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_FaceEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 16), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoSouth[] = { ANIMCMD_FRAME(3, 8), @@ -246,11 +252,11 @@ static const union AnimCmd sAnim_GoNorth[] = static const union AnimCmd sAnim_GoNorth2F[] = { - ANIMCMD_FRAME(2, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(2, 6), - ANIMCMD_JUMP(0), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoWest[] = @@ -289,6 +295,15 @@ static const union AnimCmd sAnim_GoEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_GoEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_FRAME(6, 6), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastSouth[] = { ANIMCMD_FRAME(3, 4), @@ -361,6 +376,15 @@ static const union AnimCmd sAnim_GoFastEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_GoFastEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFasterSouth[] = { ANIMCMD_FRAME(3, 2), @@ -422,6 +446,19 @@ static const union AnimCmd sAnim_ExitPokeballEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_ExitPokeballEast_Asym[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_EnterSouth[] = { ANIMCMD_FRAME(0, 8), @@ -497,6 +534,18 @@ static const union AnimCmd sAnim_EnterEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_EnterEast_Asym[] = +{ + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(0, 3), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastestSouth[] = { ANIMCMD_FRAME(3, 1), @@ -554,6 +603,18 @@ static const union AnimCmd sAnim_ExitPokeballFastEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_ExitPokeballFastEast_Asym[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(6, 1), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastestNorth[] = { ANIMCMD_FRAME(5, 1), @@ -1084,31 +1145,59 @@ static const union AnimCmd *const sAnimTable_Standard[] = { }; static const union AnimCmd *const sAnimTable_Following[] = { - sAnim_FaceSouth, - sAnim_FaceNorth2F, - sAnim_FaceWest2F, - sAnim_FaceEast2F, - sAnim_GoSouth2F, - sAnim_GoNorth2F, - sAnim_GoWest2F, - sAnim_GoEast2F, - sAnim_GoFastSouth2F, - sAnim_GoFastNorth2F, - sAnim_GoFastWest2F, - sAnim_GoFastEast2F, - sAnim_EnterSouth, - sAnim_EnterNorth, - sAnim_EnterWest, - sAnim_EnterEast, - sAnim_ExitPokeballSouth, - sAnim_ExitPokeballNorth, - sAnim_ExitPokeballWest, - sAnim_ExitPokeballEast, - // ANIM_STD_COUNT = - sAnim_ExitPokeballFastSouth, - sAnim_ExitPokeballFastNorth, - sAnim_ExitPokeballFastWest, - sAnim_ExitPokeballFastEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast2F, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth2F, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth2F, + [ANIM_STD_GO_WEST] = sAnim_GoWest2F, + [ANIM_STD_GO_EAST] = sAnim_GoEast2F, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth2F, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth2F, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest2F, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast2F, + // 'Faster' and above used for entering/exiting pokeball + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_EnterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_EnterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_EnterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_EnterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_ExitPokeballSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_ExitPokeballNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_ExitPokeballWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_ExitPokeballEast, + [ANIM_EXIT_POKEBALL_FAST_SOUTH] = sAnim_ExitPokeballFastSouth, + [ANIM_EXIT_POKEBALL_FAST_NORTH] = sAnim_ExitPokeballFastNorth, + [ANIM_EXIT_POKEBALL_FAST_WEST] = sAnim_ExitPokeballFastWest, + [ANIM_EXIT_POKEBALL_FAST_EAST] = sAnim_ExitPokeballFastEast, +}; + +// Like the above, but has separate frames for facing right +static const union AnimCmd *const sAnimTable_Following_Asym[] = { + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast2F_Asym, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth2F, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth2F, + [ANIM_STD_GO_WEST] = sAnim_GoWest2F, + [ANIM_STD_GO_EAST] = sAnim_GoEast2F_Asym, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth2F, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth2F, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest2F, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast2F_Asym, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_EnterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_EnterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_EnterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_EnterEast_Asym, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_ExitPokeballSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_ExitPokeballNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_ExitPokeballWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_ExitPokeballEast_Asym, + [ANIM_EXIT_POKEBALL_FAST_SOUTH] = sAnim_ExitPokeballFastSouth, + [ANIM_EXIT_POKEBALL_FAST_NORTH] = sAnim_ExitPokeballFastNorth, + [ANIM_EXIT_POKEBALL_FAST_WEST] = sAnim_ExitPokeballFastWest, + [ANIM_EXIT_POKEBALL_FAST_EAST] = sAnim_ExitPokeballFastEast_Asym, }; static const union AnimCmd *const sAnimTable_HoOh[] = { diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 968dec9f2f..7b7cbc46e6 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -346,6 +346,56 @@ const u32 gObjectEventPic_Noland[] = INCBIN_U32("graphics/object_events/pics/peo const u32 gObjectEventPic_Lucy[] = INCBIN_U32("graphics/object_events/pics/people/frontier_brains/lucy.4bpp"); const u32 gObjectEventPic_Brandon[] = INCBIN_U32("graphics/object_events/pics/people/frontier_brains/brandon.4bpp"); const u32 gObjectEventPic_AnimatedBall[] = INCBIN_U32("graphics/object_events/pics/misc/animated_ball.4bpp"); + +#if OW_MON_POKEBALLS +// Vanilla +const u32 gObjectEventPic_MasterBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_master.4bpp"); +const u32 gObjectEventPic_UltraBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_ultra.4bpp"); +const u32 gObjectEventPic_GreatBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_great.4bpp"); +const u32 gObjectEventPic_SafariBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_safari.4bpp"); +const u32 gObjectEventPic_NetBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_net.4bpp"); +const u32 gObjectEventPic_DiveBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dive.4bpp"); +const u32 gObjectEventPic_NestBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_nest.4bpp"); +const u32 gObjectEventPic_RepeatBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_repeat.4bpp"); +const u32 gObjectEventPic_TimerBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_timer.4bpp"); +const u32 gObjectEventPic_LuxuryBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_luxury.4bpp"); +const u32 gObjectEventPic_PremierBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_premier.4bpp"); +// Gen IV/Sinnoh +#ifdef ITEM_DUSK_BALL +const u32 gObjectEventPic_DuskBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dusk.4bpp"); +const u32 gObjectEventPic_HealBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_heal.4bpp"); +const u32 gObjectEventPic_QuickBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_quick.4bpp"); +const u32 gObjectEventPic_CherishBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_cherish.4bpp"); +#endif +#ifdef ITEM_PARK_BALL +const u32 gObjectEventPic_ParkBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_park.4bpp"); +#endif +// Gen II/Johto Apricorns +#ifdef ITEM_FAST_BALL +const u32 gObjectEventPic_FastBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_fast.4bpp"); +const u32 gObjectEventPic_LevelBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_level.4bpp"); +const u32 gObjectEventPic_LureBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_lure.4bpp"); +const u32 gObjectEventPic_HeavyBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_heavy.4bpp"); +const u32 gObjectEventPic_LoveBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_love.4bpp"); +const u32 gObjectEventPic_FriendBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_friend.4bpp"); +const u32 gObjectEventPic_MoonBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_moon.4bpp"); +const u32 gObjectEventPic_SportBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_sport.4bpp"); +#endif +// Gen V +#ifdef ITEM_DREAM_BALL +const u32 gObjectEventPic_DreamBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dream.4bpp"); +#endif +// Gen VII +#ifdef ITEM_BEAST_BALL +const u32 gObjectEventPic_BeastBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_beast.4bpp"); +#endif +// Gen VIII +#ifdef ITEM_STRANGE_BALL +const u32 gObjectEventPic_StrangeBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_strange.4bpp"); +#endif +#endif + +const u32 gObjectEventPic_Substitute[] = INCBIN_U32("graphics/object_events/pics/pokemon/substitute.4bpp"); const u32 gObjectEventPic_Bulbasaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/bulbasaur.4bpp"); const u32 gObjectEventPic_Ivysaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/ivysaur.4bpp"); const u32 gObjectEventPic_Venusaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/venusaur.4bpp"); @@ -792,5 +842,44 @@ const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/ const u16 gObjectEventPaletteLight[] = INCBIN_U16("graphics/object_events/palettes/light.gbapal"); const u16 gObjectEventPaletteLight2[] = INCBIN_U16("graphics/object_events/palettes/light2.gbapal"); +const u16 gObjectEventPal_Substitute[] = INCBIN_U16("graphics/object_events/pics/pokemon/substitute.gbapal"); + const u16 gObjectEventPaletteEmotes[] = INCBIN_U16("graphics/misc/emotes.gbapal"); const u16 gObjectEventPaletteNeonLight[] = INCBIN_U16("graphics/object_events/palettes/neon_light.gbapal"); + +#if OW_MON_POKEBALLS +// Palettes are small, so always include all of the palettes (no #ifdef) +// Vanilla +const u16 gObjectEventPal_MasterBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_master.gbapal"); +const u16 gObjectEventPal_UltraBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_ultra.gbapal"); +const u16 gObjectEventPal_GreatBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_great.gbapal"); +const u16 gObjectEventPal_SafariBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_safari.gbapal"); +const u16 gObjectEventPal_NetBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_net.gbapal"); +const u16 gObjectEventPal_DiveBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dive.gbapal"); +const u16 gObjectEventPal_NestBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_nest.gbapal"); +const u16 gObjectEventPal_RepeatBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_repeat.gbapal"); +const u16 gObjectEventPal_TimerBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_timer.gbapal"); +const u16 gObjectEventPal_LuxuryBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_luxury.gbapal"); +const u16 gObjectEventPal_PremierBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_premier.gbapal"); +// Gen IV/Sinnoh +const u16 gObjectEventPal_DuskBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dusk.gbapal"); +const u16 gObjectEventPal_HealBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_heal.gbapal"); +const u16 gObjectEventPal_QuickBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_quick.gbapal"); +const u16 gObjectEventPal_CherishBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_cherish.gbapal"); +const u16 gObjectEventPal_ParkBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_park.gbapal"); +// Gen II/Johto Apricorns +const u16 gObjectEventPal_FastBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_fast.gbapal"); +const u16 gObjectEventPal_LevelBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_level.gbapal"); +const u16 gObjectEventPal_LureBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_lure.gbapal"); +const u16 gObjectEventPal_HeavyBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_heavy.gbapal"); +const u16 gObjectEventPal_LoveBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_love.gbapal"); +const u16 gObjectEventPal_FriendBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_friend.gbapal"); +const u16 gObjectEventPal_MoonBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_moon.gbapal"); +const u16 gObjectEventPal_SportBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_sport.gbapal"); +// Gen V +const u16 gObjectEventPal_DreamBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dream.gbapal"); +// Gen VII +const u16 gObjectEventPal_BeastBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_beast.gbapal"); +// Gen VIII +const u16 gObjectEventPal_StrangeBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_strange.gbapal"); +#endif diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index eb53f60d2c..f0ccf078b9 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -1,424 +1,506 @@ // Species-indexed pokemon object event table const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { - [SPECIES_BULBASAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bulbasaur, gDummySpriteAffineAnimTable}, - [SPECIES_IVYSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ivysaur, gDummySpriteAffineAnimTable}, - [SPECIES_VENUSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venusaur, gDummySpriteAffineAnimTable}, - [SPECIES_CHARMANDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmander, gDummySpriteAffineAnimTable}, - [SPECIES_CHARMELEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmeleon, gDummySpriteAffineAnimTable}, - [SPECIES_CHARIZARD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charizard, gDummySpriteAffineAnimTable}, - [SPECIES_SQUIRTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Squirtle, gDummySpriteAffineAnimTable}, - [SPECIES_WARTORTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wartortle, gDummySpriteAffineAnimTable}, - [SPECIES_BLASTOISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blastoise, gDummySpriteAffineAnimTable}, - [SPECIES_CATERPIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Caterpie, gDummySpriteAffineAnimTable}, - [SPECIES_METAPOD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metapod, gDummySpriteAffineAnimTable}, - [SPECIES_BUTTERFREE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Butterfree, gDummySpriteAffineAnimTable}, - [SPECIES_WEEDLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weedle, gDummySpriteAffineAnimTable}, - [SPECIES_KAKUNA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kakuna, gDummySpriteAffineAnimTable}, - [SPECIES_BEEDRILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beedrill, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgey, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEOTTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeotto, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeot, gDummySpriteAffineAnimTable}, - [SPECIES_RATTATA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rattata, gDummySpriteAffineAnimTable}, - [SPECIES_RATICATE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raticate, gDummySpriteAffineAnimTable}, - [SPECIES_SPEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spearow, gDummySpriteAffineAnimTable}, - [SPECIES_FEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Fearow, gDummySpriteAffineAnimTable}, - [SPECIES_EKANS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ekans, gDummySpriteAffineAnimTable}, - [SPECIES_ARBOK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arbok, gDummySpriteAffineAnimTable}, - [SPECIES_PIKACHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pikachu, gDummySpriteAffineAnimTable}, - [SPECIES_RAICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raichu, gDummySpriteAffineAnimTable}, - [SPECIES_SANDSHREW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandshrew, gDummySpriteAffineAnimTable}, - [SPECIES_SANDSLASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandslash, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORAN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_f, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORINA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorina, gDummySpriteAffineAnimTable}, - [SPECIES_NIDOQUEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoqueen, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORAN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_m, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORINO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorino, gDummySpriteAffineAnimTable}, - [SPECIES_NIDOKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoking, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFAIRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefairy, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFABLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefable, gDummySpriteAffineAnimTable}, - [SPECIES_VULPIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vulpix, gDummySpriteAffineAnimTable}, - [SPECIES_NINETALES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninetales, gDummySpriteAffineAnimTable}, - [SPECIES_JIGGLYPUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jigglypuff, gDummySpriteAffineAnimTable}, - [SPECIES_WIGGLYTUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wigglytuff, gDummySpriteAffineAnimTable}, - [SPECIES_ZUBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zubat, gDummySpriteAffineAnimTable}, - [SPECIES_GOLBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golbat, gDummySpriteAffineAnimTable}, - [SPECIES_ODDISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Oddish, gDummySpriteAffineAnimTable}, - [SPECIES_GLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gloom, gDummySpriteAffineAnimTable}, - [SPECIES_VILEPLUME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vileplume, gDummySpriteAffineAnimTable}, - [SPECIES_PARAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Paras, gDummySpriteAffineAnimTable}, - [SPECIES_PARASECT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Parasect, gDummySpriteAffineAnimTable}, - [SPECIES_VENONAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venonat, gDummySpriteAffineAnimTable}, - [SPECIES_VENOMOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venomoth, gDummySpriteAffineAnimTable}, - [SPECIES_DIGLETT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Diglett, gDummySpriteAffineAnimTable}, - [SPECIES_DUGTRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dugtrio, gDummySpriteAffineAnimTable}, - [SPECIES_MEOWTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meowth, gDummySpriteAffineAnimTable}, - [SPECIES_PERSIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Persian, gDummySpriteAffineAnimTable}, - [SPECIES_PSYDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Psyduck, gDummySpriteAffineAnimTable}, - [SPECIES_GOLDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golduck, gDummySpriteAffineAnimTable}, - [SPECIES_MANKEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mankey, gDummySpriteAffineAnimTable}, - [SPECIES_PRIMEAPE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Primeape, gDummySpriteAffineAnimTable}, - [SPECIES_GROWLITHE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Growlithe, gDummySpriteAffineAnimTable}, - [SPECIES_ARCANINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arcanine, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWAG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwag, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWHIRL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwhirl, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWRATH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwrath, gDummySpriteAffineAnimTable}, - [SPECIES_ABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Abra, gDummySpriteAffineAnimTable}, - [SPECIES_KADABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kadabra, gDummySpriteAffineAnimTable}, - [SPECIES_ALAKAZAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Alakazam, gDummySpriteAffineAnimTable}, - [SPECIES_MACHOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machop, gDummySpriteAffineAnimTable}, - [SPECIES_MACHOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machoke, gDummySpriteAffineAnimTable}, - [SPECIES_MACHAMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machamp, gDummySpriteAffineAnimTable}, - [SPECIES_BELLSPROUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellsprout, gDummySpriteAffineAnimTable}, - [SPECIES_WEEPINBELL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weepinbell, gDummySpriteAffineAnimTable}, - [SPECIES_VICTREEBEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Victreebel, gDummySpriteAffineAnimTable}, - [SPECIES_TENTACOOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacool, gDummySpriteAffineAnimTable}, - [SPECIES_TENTACRUEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacruel, gDummySpriteAffineAnimTable}, - [SPECIES_GEODUDE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Geodude, gDummySpriteAffineAnimTable}, - [SPECIES_GRAVELER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Graveler, gDummySpriteAffineAnimTable}, - [SPECIES_GOLEM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golem, gDummySpriteAffineAnimTable}, - [SPECIES_PONYTA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ponyta, gDummySpriteAffineAnimTable}, - [SPECIES_RAPIDASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rapidash, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWPOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowpoke, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWBRO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowbro, gDummySpriteAffineAnimTable}, - [SPECIES_MAGNEMITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magnemite, gDummySpriteAffineAnimTable}, - [SPECIES_MAGNETON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magneton, gDummySpriteAffineAnimTable}, - [SPECIES_FARFETCHD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Farfetchd, gDummySpriteAffineAnimTable}, - [SPECIES_DODUO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Doduo, gDummySpriteAffineAnimTable}, - [SPECIES_DODRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dodrio, gDummySpriteAffineAnimTable}, - [SPECIES_SEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seel, gDummySpriteAffineAnimTable}, - [SPECIES_DEWGONG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dewgong, gDummySpriteAffineAnimTable}, - [SPECIES_GRIMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grimer, gDummySpriteAffineAnimTable}, - [SPECIES_MUK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Muk, gDummySpriteAffineAnimTable}, - [SPECIES_SHELLDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shellder, gDummySpriteAffineAnimTable}, - [SPECIES_CLOYSTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cloyster, gDummySpriteAffineAnimTable}, - [SPECIES_GASTLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gastly, gDummySpriteAffineAnimTable}, - [SPECIES_HAUNTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Haunter, gDummySpriteAffineAnimTable}, - [SPECIES_GENGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gengar, gDummySpriteAffineAnimTable}, - [SPECIES_ONIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Onix, gDummySpriteAffineAnimTable}, - [SPECIES_DROWZEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Drowzee, gDummySpriteAffineAnimTable}, - [SPECIES_HYPNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hypno, gDummySpriteAffineAnimTable}, - [SPECIES_KRABBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Krabby, gDummySpriteAffineAnimTable}, - [SPECIES_KINGLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingler, gDummySpriteAffineAnimTable}, - [SPECIES_VOLTORB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Voltorb, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTRODE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrode, gDummySpriteAffineAnimTable}, - [SPECIES_EXEGGCUTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggcute, gDummySpriteAffineAnimTable}, - [SPECIES_EXEGGUTOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggutor, gDummySpriteAffineAnimTable}, - [SPECIES_CUBONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cubone, gDummySpriteAffineAnimTable}, - [SPECIES_MAROWAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marowak, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONLEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonlee, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONCHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonchan, gDummySpriteAffineAnimTable}, - [SPECIES_LICKITUNG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lickitung, gDummySpriteAffineAnimTable}, - [SPECIES_KOFFING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Koffing, gDummySpriteAffineAnimTable}, - [SPECIES_WEEZING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weezing, gDummySpriteAffineAnimTable}, - [SPECIES_RHYHORN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhyhorn, gDummySpriteAffineAnimTable}, - [SPECIES_RHYDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhydon, gDummySpriteAffineAnimTable}, - [SPECIES_CHANSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chansey, gDummySpriteAffineAnimTable}, - [SPECIES_TANGELA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tangela, gDummySpriteAffineAnimTable}, - [SPECIES_KANGASKHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kangaskhan, gDummySpriteAffineAnimTable}, - [SPECIES_HORSEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Horsea, gDummySpriteAffineAnimTable}, - [SPECIES_SEADRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seadra, gDummySpriteAffineAnimTable}, - [SPECIES_GOLDEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Goldeen, gDummySpriteAffineAnimTable}, - [SPECIES_SEAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seaking, gDummySpriteAffineAnimTable}, - [SPECIES_STARYU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Staryu, gDummySpriteAffineAnimTable}, - [SPECIES_STARMIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Starmie, gDummySpriteAffineAnimTable}, - [SPECIES_MR_MIME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mr_Mime, gDummySpriteAffineAnimTable}, - [SPECIES_SCYTHER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scyther, gDummySpriteAffineAnimTable}, - [SPECIES_JYNX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jynx, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTABUZZ] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electabuzz, gDummySpriteAffineAnimTable}, - [SPECIES_MAGMAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magmar, gDummySpriteAffineAnimTable}, - [SPECIES_PINSIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pinsir, gDummySpriteAffineAnimTable}, - [SPECIES_TAUROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tauros, gDummySpriteAffineAnimTable}, - [SPECIES_MAGIKARP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magikarp, gDummySpriteAffineAnimTable}, - [SPECIES_GYARADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gyarados, gDummySpriteAffineAnimTable}, - [SPECIES_LAPRAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lapras, gDummySpriteAffineAnimTable}, - [SPECIES_DITTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ditto, gDummySpriteAffineAnimTable}, - [SPECIES_EEVEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Eevee, gDummySpriteAffineAnimTable}, - [SPECIES_VAPOREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vaporeon, gDummySpriteAffineAnimTable}, - [SPECIES_JOLTEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jolteon, gDummySpriteAffineAnimTable}, - [SPECIES_FLAREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flareon, gDummySpriteAffineAnimTable}, - [SPECIES_PORYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon, gDummySpriteAffineAnimTable}, - [SPECIES_OMANYTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omanyte, gDummySpriteAffineAnimTable}, - [SPECIES_OMASTAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omastar, gDummySpriteAffineAnimTable}, - [SPECIES_KABUTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabuto, gDummySpriteAffineAnimTable}, - [SPECIES_KABUTOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabutops, gDummySpriteAffineAnimTable}, - [SPECIES_AERODACTYL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aerodactyl, gDummySpriteAffineAnimTable}, - [SPECIES_SNORLAX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorlax, gDummySpriteAffineAnimTable}, - [SPECIES_ARTICUNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Articuno, gDummySpriteAffineAnimTable}, - [SPECIES_ZAPDOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zapdos, gDummySpriteAffineAnimTable}, - [SPECIES_MOLTRES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Moltres, gDummySpriteAffineAnimTable}, - [SPECIES_DRATINI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dratini, gDummySpriteAffineAnimTable}, - [SPECIES_DRAGONAIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonair, gDummySpriteAffineAnimTable}, - [SPECIES_DRAGONITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonite, gDummySpriteAffineAnimTable}, - [SPECIES_MEWTWO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mewtwo, gDummySpriteAffineAnimTable}, - [SPECIES_MEW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mew, gDummySpriteAffineAnimTable}, - [SPECIES_CHIKORITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chikorita, gDummySpriteAffineAnimTable}, - [SPECIES_BAYLEEF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bayleef, gDummySpriteAffineAnimTable}, - [SPECIES_MEGANIUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meganium, gDummySpriteAffineAnimTable}, - [SPECIES_CYNDAQUIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cyndaquil, gDummySpriteAffineAnimTable}, - [SPECIES_QUILAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quilava, gDummySpriteAffineAnimTable}, - [SPECIES_TYPHLOSION] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Typhlosion, gDummySpriteAffineAnimTable}, - [SPECIES_TOTODILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Totodile, gDummySpriteAffineAnimTable}, - [SPECIES_CROCONAW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Croconaw, gDummySpriteAffineAnimTable}, - [SPECIES_FERALIGATR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feraligatr, gDummySpriteAffineAnimTable}, - [SPECIES_SENTRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sentret, gDummySpriteAffineAnimTable}, - [SPECIES_FURRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Furret, gDummySpriteAffineAnimTable}, - [SPECIES_HOOTHOOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoothoot, gDummySpriteAffineAnimTable}, - [SPECIES_NOCTOWL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Noctowl, gDummySpriteAffineAnimTable}, - [SPECIES_LEDYBA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledyba, gDummySpriteAffineAnimTable}, - [SPECIES_LEDIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledian, gDummySpriteAffineAnimTable}, - [SPECIES_SPINARAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinarak, gDummySpriteAffineAnimTable}, - [SPECIES_ARIADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ariados, gDummySpriteAffineAnimTable}, - [SPECIES_CROBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crobat, gDummySpriteAffineAnimTable}, - [SPECIES_CHINCHOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chinchou, gDummySpriteAffineAnimTable}, - [SPECIES_LANTURN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lanturn, gDummySpriteAffineAnimTable}, - [SPECIES_PICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pichu, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFFA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cleffa, gDummySpriteAffineAnimTable}, - [SPECIES_IGGLYBUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Igglybuff, gDummySpriteAffineAnimTable}, - [SPECIES_TOGEPI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togepi, gDummySpriteAffineAnimTable}, - [SPECIES_TOGETIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}, - [SPECIES_NATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Natu, gDummySpriteAffineAnimTable}, - [SPECIES_XATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Xatu, gDummySpriteAffineAnimTable}, - [SPECIES_MAREEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mareep, gDummySpriteAffineAnimTable}, - [SPECIES_FLAAFFY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flaaffy, gDummySpriteAffineAnimTable}, - [SPECIES_AMPHAROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ampharos, gDummySpriteAffineAnimTable}, - [SPECIES_BELLOSSOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellossom, gDummySpriteAffineAnimTable}, - [SPECIES_MARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marill, gDummySpriteAffineAnimTable}, - [SPECIES_AZUMARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azumarill, gDummySpriteAffineAnimTable}, - [SPECIES_SUDOWOODO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sudowoodo, gDummySpriteAffineAnimTable}, - [SPECIES_POLITOED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Politoed, gDummySpriteAffineAnimTable}, - [SPECIES_HOPPIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoppip, gDummySpriteAffineAnimTable}, - [SPECIES_SKIPLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skiploom, gDummySpriteAffineAnimTable}, - [SPECIES_JUMPLUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jumpluff, gDummySpriteAffineAnimTable}, - [SPECIES_AIPOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aipom, gDummySpriteAffineAnimTable}, - [SPECIES_SUNKERN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunkern, gDummySpriteAffineAnimTable}, - [SPECIES_SUNFLORA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunflora, gDummySpriteAffineAnimTable}, - [SPECIES_YANMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Yanma, gDummySpriteAffineAnimTable}, - [SPECIES_WOOPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wooper, gDummySpriteAffineAnimTable}, - [SPECIES_QUAGSIRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quagsire, gDummySpriteAffineAnimTable}, - [SPECIES_ESPEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Espeon, gDummySpriteAffineAnimTable}, - [SPECIES_UMBREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Umbreon, gDummySpriteAffineAnimTable}, - [SPECIES_MURKROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Murkrow, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowking, gDummySpriteAffineAnimTable}, - [SPECIES_MISDREAVUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Misdreavus, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_A, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_B] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_B, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_C] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_C, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_D] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_D, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_E] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_E, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_F, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_G] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_G, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_H] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_H, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_I] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_I, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_J] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_J, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_K] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_K, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_L] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_L, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_M, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_N] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_N, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_O] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_O, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_P] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_P, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Q] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Q, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_R] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_R, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_S] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_S, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_T] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_T, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_U] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_U, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_V] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_V, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_W] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_W, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_X] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_X, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Y] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Y, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Z] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Z, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_EMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Exclamation, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_QMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Question, gDummySpriteAffineAnimTable}, - [SPECIES_WOBBUFFET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wobbuffet, gDummySpriteAffineAnimTable}, - [SPECIES_GIRAFARIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Girafarig, gDummySpriteAffineAnimTable}, - [SPECIES_PINECO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pineco, gDummySpriteAffineAnimTable}, - [SPECIES_FORRETRESS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Forretress, gDummySpriteAffineAnimTable}, - [SPECIES_DUNSPARCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dunsparce, gDummySpriteAffineAnimTable}, - [SPECIES_GLIGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gligar, gDummySpriteAffineAnimTable}, - [SPECIES_STEELIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Steelix, gDummySpriteAffineAnimTable}, - [SPECIES_SNUBBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snubbull, gDummySpriteAffineAnimTable}, - [SPECIES_GRANBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Granbull, gDummySpriteAffineAnimTable}, - [SPECIES_QWILFISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Qwilfish, gDummySpriteAffineAnimTable}, - [SPECIES_SCIZOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scizor, gDummySpriteAffineAnimTable}, - [SPECIES_SHUCKLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuckle, gDummySpriteAffineAnimTable}, - [SPECIES_HERACROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Heracross, gDummySpriteAffineAnimTable}, - [SPECIES_SNEASEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sneasel, gDummySpriteAffineAnimTable}, - [SPECIES_TEDDIURSA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Teddiursa, gDummySpriteAffineAnimTable}, - [SPECIES_URSARING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ursaring, gDummySpriteAffineAnimTable}, - [SPECIES_SLUGMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slugma, gDummySpriteAffineAnimTable}, - [SPECIES_MAGCARGO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magcargo, gDummySpriteAffineAnimTable}, - [SPECIES_SWINUB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swinub, gDummySpriteAffineAnimTable}, - [SPECIES_PILOSWINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Piloswine, gDummySpriteAffineAnimTable}, - [SPECIES_CORSOLA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corsola, gDummySpriteAffineAnimTable}, - [SPECIES_REMORAID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Remoraid, gDummySpriteAffineAnimTable}, - [SPECIES_OCTILLERY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Octillery, gDummySpriteAffineAnimTable}, - [SPECIES_DELIBIRD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delibird, gDummySpriteAffineAnimTable}, - [SPECIES_MANTINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mantine, gDummySpriteAffineAnimTable}, - [SPECIES_SKARMORY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skarmory, gDummySpriteAffineAnimTable}, - [SPECIES_HOUNDOUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndour, gDummySpriteAffineAnimTable}, - [SPECIES_HOUNDOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndoom, gDummySpriteAffineAnimTable}, - [SPECIES_KINGDRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingdra, gDummySpriteAffineAnimTable}, - [SPECIES_PHANPY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Phanpy, gDummySpriteAffineAnimTable}, - [SPECIES_DONPHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Donphan, gDummySpriteAffineAnimTable}, - [SPECIES_PORYGON2] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon2, gDummySpriteAffineAnimTable}, - [SPECIES_STANTLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Stantler, gDummySpriteAffineAnimTable}, - [SPECIES_SMEARGLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smeargle, gDummySpriteAffineAnimTable}, - [SPECIES_TYROGUE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyrogue, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONTOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmontop, gDummySpriteAffineAnimTable}, - [SPECIES_SMOOCHUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smoochum, gDummySpriteAffineAnimTable}, - [SPECIES_ELEKID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Elekid, gDummySpriteAffineAnimTable}, - [SPECIES_MAGBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magby, gDummySpriteAffineAnimTable}, - [SPECIES_MILTANK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Miltank, gDummySpriteAffineAnimTable}, - [SPECIES_BLISSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blissey, gDummySpriteAffineAnimTable}, - [SPECIES_RAIKOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raikou, gDummySpriteAffineAnimTable}, - [SPECIES_ENTEI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Entei, gDummySpriteAffineAnimTable}, - [SPECIES_SUICUNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Suicune, gDummySpriteAffineAnimTable}, - [SPECIES_LARVITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Larvitar, gDummySpriteAffineAnimTable}, - [SPECIES_PUPITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pupitar, gDummySpriteAffineAnimTable}, - [SPECIES_TYRANITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyranitar, gDummySpriteAffineAnimTable}, - [SPECIES_LUGIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lugia, gDummySpriteAffineAnimTable}, - [SPECIES_HO_OH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ho_oh, gDummySpriteAffineAnimTable}, - [SPECIES_CELEBI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Celebi, gDummySpriteAffineAnimTable}, - [SPECIES_TREECKO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Treecko, gDummySpriteAffineAnimTable}, - [SPECIES_GROVYLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grovyle, gDummySpriteAffineAnimTable}, - [SPECIES_SCEPTILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sceptile, gDummySpriteAffineAnimTable}, - [SPECIES_TORCHIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torchic, gDummySpriteAffineAnimTable}, - [SPECIES_COMBUSKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Combusken, gDummySpriteAffineAnimTable}, - [SPECIES_BLAZIKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blaziken, gDummySpriteAffineAnimTable}, - [SPECIES_MUDKIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mudkip, gDummySpriteAffineAnimTable}, - [SPECIES_MARSHTOMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marshtomp, gDummySpriteAffineAnimTable}, - [SPECIES_SWAMPERT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swampert, gDummySpriteAffineAnimTable}, - [SPECIES_POOCHYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poochyena, gDummySpriteAffineAnimTable}, - [SPECIES_MIGHTYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mightyena, gDummySpriteAffineAnimTable}, - [SPECIES_ZIGZAGOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zigzagoon, gDummySpriteAffineAnimTable}, - [SPECIES_LINOONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Linoone, gDummySpriteAffineAnimTable}, - [SPECIES_WURMPLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wurmple, gDummySpriteAffineAnimTable}, - [SPECIES_SILCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Silcoon, gDummySpriteAffineAnimTable}, - [SPECIES_BEAUTIFLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beautifly, gDummySpriteAffineAnimTable}, - [SPECIES_CASCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cascoon, gDummySpriteAffineAnimTable}, - [SPECIES_DUSTOX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dustox, gDummySpriteAffineAnimTable}, - [SPECIES_LOTAD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lotad, gDummySpriteAffineAnimTable}, - [SPECIES_LOMBRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lombre, gDummySpriteAffineAnimTable}, - [SPECIES_LUDICOLO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ludicolo, gDummySpriteAffineAnimTable}, - [SPECIES_SEEDOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seedot, gDummySpriteAffineAnimTable}, - [SPECIES_NUZLEAF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nuzleaf, gDummySpriteAffineAnimTable}, - [SPECIES_SHIFTRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shiftry, gDummySpriteAffineAnimTable}, - [SPECIES_TAILLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Taillow, gDummySpriteAffineAnimTable}, - [SPECIES_SWELLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swellow, gDummySpriteAffineAnimTable}, - [SPECIES_WINGULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wingull, gDummySpriteAffineAnimTable}, - [SPECIES_PELIPPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pelipper, gDummySpriteAffineAnimTable}, - [SPECIES_RALTS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ralts, gDummySpriteAffineAnimTable}, - [SPECIES_KIRLIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kirlia, gDummySpriteAffineAnimTable}, - [SPECIES_GARDEVOIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gardevoir, gDummySpriteAffineAnimTable}, - [SPECIES_SURSKIT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Surskit, gDummySpriteAffineAnimTable}, - [SPECIES_MASQUERAIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Masquerain, gDummySpriteAffineAnimTable}, - [SPECIES_SHROOMISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shroomish, gDummySpriteAffineAnimTable}, - [SPECIES_BRELOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Breloom, gDummySpriteAffineAnimTable}, - [SPECIES_SLAKOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slakoth, gDummySpriteAffineAnimTable}, - [SPECIES_VIGOROTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vigoroth, gDummySpriteAffineAnimTable}, - [SPECIES_SLAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slaking, gDummySpriteAffineAnimTable}, - [SPECIES_NINCADA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nincada, gDummySpriteAffineAnimTable}, - [SPECIES_NINJASK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninjask, gDummySpriteAffineAnimTable}, - [SPECIES_SHEDINJA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shedinja, gDummySpriteAffineAnimTable}, - [SPECIES_WHISMUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whismur, gDummySpriteAffineAnimTable}, - [SPECIES_LOUDRED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Loudred, gDummySpriteAffineAnimTable}, - [SPECIES_EXPLOUD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exploud, gDummySpriteAffineAnimTable}, - [SPECIES_MAKUHITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Makuhita, gDummySpriteAffineAnimTable}, - [SPECIES_HARIYAMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hariyama, gDummySpriteAffineAnimTable}, - [SPECIES_AZURILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azurill, gDummySpriteAffineAnimTable}, - [SPECIES_NOSEPASS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nosepass, gDummySpriteAffineAnimTable}, - [SPECIES_SKITTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skitty, gDummySpriteAffineAnimTable}, - [SPECIES_DELCATTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delcatty, gDummySpriteAffineAnimTable}, - [SPECIES_SABLEYE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sableye, gDummySpriteAffineAnimTable}, - [SPECIES_MAWILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mawile, gDummySpriteAffineAnimTable}, - [SPECIES_ARON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aron, gDummySpriteAffineAnimTable}, - [SPECIES_LAIRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lairon, gDummySpriteAffineAnimTable}, - [SPECIES_AGGRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aggron, gDummySpriteAffineAnimTable}, - [SPECIES_MEDITITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meditite, gDummySpriteAffineAnimTable}, - [SPECIES_MEDICHAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Medicham, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTRIKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrike, gDummySpriteAffineAnimTable}, - [SPECIES_MANECTRIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Manectric, gDummySpriteAffineAnimTable}, - [SPECIES_PLUSLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Plusle, gDummySpriteAffineAnimTable}, - [SPECIES_MINUN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Minun, gDummySpriteAffineAnimTable}, - [SPECIES_VOLBEAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Volbeat, gDummySpriteAffineAnimTable}, - [SPECIES_ILLUMISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Illumise, gDummySpriteAffineAnimTable}, - [SPECIES_ROSELIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Roselia, gDummySpriteAffineAnimTable}, - [SPECIES_GULPIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gulpin, gDummySpriteAffineAnimTable}, - [SPECIES_SWALOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swalot, gDummySpriteAffineAnimTable}, - [SPECIES_CARVANHA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Carvanha, gDummySpriteAffineAnimTable}, - [SPECIES_SHARPEDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sharpedo, gDummySpriteAffineAnimTable}, - [SPECIES_WAILMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailmer, gDummySpriteAffineAnimTable}, - [SPECIES_WAILORD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailord, gDummySpriteAffineAnimTable}, - [SPECIES_NUMEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Numel, gDummySpriteAffineAnimTable}, - [SPECIES_CAMERUPT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Camerupt, gDummySpriteAffineAnimTable}, - [SPECIES_TORKOAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torkoal, gDummySpriteAffineAnimTable}, - [SPECIES_SPOINK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spoink, gDummySpriteAffineAnimTable}, - [SPECIES_GRUMPIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grumpig, gDummySpriteAffineAnimTable}, - [SPECIES_SPINDA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinda, gDummySpriteAffineAnimTable}, - [SPECIES_TRAPINCH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Trapinch, gDummySpriteAffineAnimTable}, - [SPECIES_VIBRAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vibrava, gDummySpriteAffineAnimTable}, - [SPECIES_FLYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flygon, gDummySpriteAffineAnimTable}, - [SPECIES_CACNEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacnea, gDummySpriteAffineAnimTable}, - [SPECIES_CACTURNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacturne, gDummySpriteAffineAnimTable}, - [SPECIES_SWABLU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swablu, gDummySpriteAffineAnimTable}, - [SPECIES_ALTARIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Altaria, gDummySpriteAffineAnimTable}, - [SPECIES_ZANGOOSE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zangoose, gDummySpriteAffineAnimTable}, - [SPECIES_SEVIPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seviper, gDummySpriteAffineAnimTable}, - [SPECIES_LUNATONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lunatone, gDummySpriteAffineAnimTable}, - [SPECIES_SOLROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Solrock, gDummySpriteAffineAnimTable}, - [SPECIES_BARBOACH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Barboach, gDummySpriteAffineAnimTable}, - [SPECIES_WHISCASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whiscash, gDummySpriteAffineAnimTable}, - [SPECIES_CORPHISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corphish, gDummySpriteAffineAnimTable}, - [SPECIES_CRAWDAUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crawdaunt, gDummySpriteAffineAnimTable}, - [SPECIES_BALTOY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Baltoy, gDummySpriteAffineAnimTable}, - [SPECIES_CLAYDOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Claydol, gDummySpriteAffineAnimTable}, - [SPECIES_LILEEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lileep, gDummySpriteAffineAnimTable}, - [SPECIES_CRADILY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cradily, gDummySpriteAffineAnimTable}, - [SPECIES_ANORITH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Anorith, gDummySpriteAffineAnimTable}, - [SPECIES_ARMALDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Armaldo, gDummySpriteAffineAnimTable}, - [SPECIES_FEEBAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feebas, gDummySpriteAffineAnimTable}, - [SPECIES_MILOTIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Milotic, gDummySpriteAffineAnimTable}, - [SPECIES_CASTFORM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, - [SPECIES_KECLEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kecleon, gDummySpriteAffineAnimTable}, - [SPECIES_SHUPPET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuppet, gDummySpriteAffineAnimTable}, - [SPECIES_BANETTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Banette, gDummySpriteAffineAnimTable}, - [SPECIES_DUSKULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Duskull, gDummySpriteAffineAnimTable}, - [SPECIES_DUSCLOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dusclops, gDummySpriteAffineAnimTable}, - [SPECIES_TROPIUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tropius, gDummySpriteAffineAnimTable}, - [SPECIES_CHIMECHO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chimecho, gDummySpriteAffineAnimTable}, - [SPECIES_ABSOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Absol, gDummySpriteAffineAnimTable}, - [SPECIES_WYNAUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wynaut, gDummySpriteAffineAnimTable}, - [SPECIES_SNORUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorunt, gDummySpriteAffineAnimTable}, - [SPECIES_GLALIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Glalie, gDummySpriteAffineAnimTable}, - [SPECIES_SPHEAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spheal, gDummySpriteAffineAnimTable}, - [SPECIES_SEALEO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sealeo, gDummySpriteAffineAnimTable}, - [SPECIES_WALREIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Walrein, gDummySpriteAffineAnimTable}, - [SPECIES_CLAMPERL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clamperl, gDummySpriteAffineAnimTable}, - [SPECIES_HUNTAIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Huntail, gDummySpriteAffineAnimTable}, - [SPECIES_GOREBYSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gorebyss, gDummySpriteAffineAnimTable}, - [SPECIES_RELICANTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Relicanth, gDummySpriteAffineAnimTable}, - [SPECIES_LUVDISC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Luvdisc, gDummySpriteAffineAnimTable}, - [SPECIES_BAGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bagon, gDummySpriteAffineAnimTable}, - [SPECIES_SHELGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shelgon, gDummySpriteAffineAnimTable}, - [SPECIES_SALAMENCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Salamence, gDummySpriteAffineAnimTable}, - [SPECIES_BELDUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beldum, gDummySpriteAffineAnimTable}, - [SPECIES_METANG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metang, gDummySpriteAffineAnimTable}, - [SPECIES_METAGROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metagross, gDummySpriteAffineAnimTable}, - [SPECIES_REGIROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regirock, gDummySpriteAffineAnimTable}, - [SPECIES_REGICE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regice, gDummySpriteAffineAnimTable}, - [SPECIES_REGISTEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Registeel, gDummySpriteAffineAnimTable}, - [SPECIES_LATIAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latias, gDummySpriteAffineAnimTable}, - [SPECIES_LATIOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latios, gDummySpriteAffineAnimTable}, - [SPECIES_KYOGRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kyogre, gDummySpriteAffineAnimTable}, - [SPECIES_GROUDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Groudon, gDummySpriteAffineAnimTable}, - [SPECIES_RAYQUAZA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rayquaza, gDummySpriteAffineAnimTable}, - [SPECIES_JIRACHI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jirachi, gDummySpriteAffineAnimTable}, - [SPECIES_DEOXYS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Deoxys, gDummySpriteAffineAnimTable}, + // placeholder gfx, used when other gfx aren't found + [SPECIES_NONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_SUBSTITUTE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Substitute, gDummySpriteAffineAnimTable}, + [SPECIES_BULBASAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bulbasaur, gDummySpriteAffineAnimTable}, + [SPECIES_IVYSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ivysaur, gDummySpriteAffineAnimTable}, + [SPECIES_VENUSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venusaur, gDummySpriteAffineAnimTable}, + [SPECIES_CHARMANDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmander, gDummySpriteAffineAnimTable}, + [SPECIES_CHARMELEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmeleon, gDummySpriteAffineAnimTable}, + [SPECIES_CHARIZARD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charizard, gDummySpriteAffineAnimTable}, + [SPECIES_SQUIRTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Squirtle, gDummySpriteAffineAnimTable}, + [SPECIES_WARTORTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wartortle, gDummySpriteAffineAnimTable}, + [SPECIES_BLASTOISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blastoise, gDummySpriteAffineAnimTable}, + [SPECIES_CATERPIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Caterpie, gDummySpriteAffineAnimTable}, + [SPECIES_METAPOD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metapod, gDummySpriteAffineAnimTable}, + [SPECIES_BUTTERFREE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Butterfree, gDummySpriteAffineAnimTable}, + [SPECIES_WEEDLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weedle, gDummySpriteAffineAnimTable}, + [SPECIES_KAKUNA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kakuna, gDummySpriteAffineAnimTable}, + [SPECIES_BEEDRILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beedrill, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgey, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEOTTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeotto, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeot, gDummySpriteAffineAnimTable}, + [SPECIES_RATTATA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rattata, gDummySpriteAffineAnimTable}, + [SPECIES_RATICATE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raticate, gDummySpriteAffineAnimTable}, + [SPECIES_SPEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spearow, gDummySpriteAffineAnimTable}, + [SPECIES_FEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Fearow, gDummySpriteAffineAnimTable}, + [SPECIES_EKANS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ekans, gDummySpriteAffineAnimTable}, + [SPECIES_ARBOK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arbok, gDummySpriteAffineAnimTable}, + [SPECIES_PIKACHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pikachu, gDummySpriteAffineAnimTable}, + [SPECIES_RAICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raichu, gDummySpriteAffineAnimTable}, + [SPECIES_SANDSHREW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandshrew, gDummySpriteAffineAnimTable}, + [SPECIES_SANDSLASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandslash, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORAN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_f, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORINA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorina, gDummySpriteAffineAnimTable}, + [SPECIES_NIDOQUEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoqueen, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORAN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_m, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORINO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorino, gDummySpriteAffineAnimTable}, + [SPECIES_NIDOKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoking, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFAIRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefairy, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFABLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefable, gDummySpriteAffineAnimTable}, + [SPECIES_VULPIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vulpix, gDummySpriteAffineAnimTable}, + [SPECIES_NINETALES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninetales, gDummySpriteAffineAnimTable}, + [SPECIES_JIGGLYPUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jigglypuff, gDummySpriteAffineAnimTable}, + [SPECIES_WIGGLYTUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wigglytuff, gDummySpriteAffineAnimTable}, + [SPECIES_ZUBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zubat, gDummySpriteAffineAnimTable}, + [SPECIES_GOLBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golbat, gDummySpriteAffineAnimTable}, + [SPECIES_ODDISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Oddish, gDummySpriteAffineAnimTable}, + [SPECIES_GLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gloom, gDummySpriteAffineAnimTable}, + [SPECIES_VILEPLUME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vileplume, gDummySpriteAffineAnimTable}, + [SPECIES_PARAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Paras, gDummySpriteAffineAnimTable}, + [SPECIES_PARASECT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Parasect, gDummySpriteAffineAnimTable}, + [SPECIES_VENONAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venonat, gDummySpriteAffineAnimTable}, + [SPECIES_VENOMOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venomoth, gDummySpriteAffineAnimTable}, + [SPECIES_DIGLETT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Diglett, gDummySpriteAffineAnimTable}, + [SPECIES_DUGTRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dugtrio, gDummySpriteAffineAnimTable}, + [SPECIES_MEOWTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meowth, gDummySpriteAffineAnimTable}, + [SPECIES_PERSIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Persian, gDummySpriteAffineAnimTable}, + [SPECIES_PSYDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Psyduck, gDummySpriteAffineAnimTable}, + [SPECIES_GOLDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golduck, gDummySpriteAffineAnimTable}, + [SPECIES_MANKEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mankey, gDummySpriteAffineAnimTable}, + [SPECIES_PRIMEAPE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Primeape, gDummySpriteAffineAnimTable}, + [SPECIES_GROWLITHE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Growlithe, gDummySpriteAffineAnimTable}, + [SPECIES_ARCANINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arcanine, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWAG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwag, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWHIRL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwhirl, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWRATH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwrath, gDummySpriteAffineAnimTable}, + [SPECIES_ABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Abra, gDummySpriteAffineAnimTable}, + [SPECIES_KADABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kadabra, gDummySpriteAffineAnimTable}, + [SPECIES_ALAKAZAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Alakazam, gDummySpriteAffineAnimTable}, + [SPECIES_MACHOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machop, gDummySpriteAffineAnimTable}, + [SPECIES_MACHOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machoke, gDummySpriteAffineAnimTable}, + [SPECIES_MACHAMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machamp, gDummySpriteAffineAnimTable}, + [SPECIES_BELLSPROUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellsprout, gDummySpriteAffineAnimTable}, + [SPECIES_WEEPINBELL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weepinbell, gDummySpriteAffineAnimTable}, + [SPECIES_VICTREEBEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Victreebel, gDummySpriteAffineAnimTable}, + [SPECIES_TENTACOOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacool, gDummySpriteAffineAnimTable}, + [SPECIES_TENTACRUEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacruel, gDummySpriteAffineAnimTable}, + [SPECIES_GEODUDE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Geodude, gDummySpriteAffineAnimTable}, + [SPECIES_GRAVELER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Graveler, gDummySpriteAffineAnimTable}, + [SPECIES_GOLEM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golem, gDummySpriteAffineAnimTable}, + [SPECIES_PONYTA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ponyta, gDummySpriteAffineAnimTable}, + [SPECIES_RAPIDASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rapidash, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWPOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowpoke, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWBRO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowbro, gDummySpriteAffineAnimTable}, + [SPECIES_MAGNEMITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magnemite, gDummySpriteAffineAnimTable}, + [SPECIES_MAGNETON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magneton, gDummySpriteAffineAnimTable}, + [SPECIES_FARFETCHD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Farfetchd, gDummySpriteAffineAnimTable}, + [SPECIES_DODUO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Doduo, gDummySpriteAffineAnimTable}, + [SPECIES_DODRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dodrio, gDummySpriteAffineAnimTable}, + [SPECIES_SEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seel, gDummySpriteAffineAnimTable}, + [SPECIES_DEWGONG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dewgong, gDummySpriteAffineAnimTable}, + [SPECIES_GRIMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grimer, gDummySpriteAffineAnimTable}, + [SPECIES_MUK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Muk, gDummySpriteAffineAnimTable}, + [SPECIES_SHELLDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shellder, gDummySpriteAffineAnimTable}, + [SPECIES_CLOYSTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cloyster, gDummySpriteAffineAnimTable}, + [SPECIES_GASTLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gastly, gDummySpriteAffineAnimTable}, + [SPECIES_HAUNTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Haunter, gDummySpriteAffineAnimTable}, + [SPECIES_GENGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gengar, gDummySpriteAffineAnimTable}, + [SPECIES_ONIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Onix, gDummySpriteAffineAnimTable}, + [SPECIES_DROWZEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Drowzee, gDummySpriteAffineAnimTable}, + [SPECIES_HYPNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hypno, gDummySpriteAffineAnimTable}, + [SPECIES_KRABBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Krabby, gDummySpriteAffineAnimTable}, + [SPECIES_KINGLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingler, gDummySpriteAffineAnimTable}, + [SPECIES_VOLTORB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Voltorb, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTRODE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrode, gDummySpriteAffineAnimTable}, + [SPECIES_EXEGGCUTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggcute, gDummySpriteAffineAnimTable}, + [SPECIES_EXEGGUTOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggutor, gDummySpriteAffineAnimTable}, + [SPECIES_CUBONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cubone, gDummySpriteAffineAnimTable}, + [SPECIES_MAROWAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marowak, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONLEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonlee, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONCHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonchan, gDummySpriteAffineAnimTable}, + [SPECIES_LICKITUNG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lickitung, gDummySpriteAffineAnimTable}, + [SPECIES_KOFFING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Koffing, gDummySpriteAffineAnimTable}, + [SPECIES_WEEZING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weezing, gDummySpriteAffineAnimTable}, + [SPECIES_RHYHORN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhyhorn, gDummySpriteAffineAnimTable}, + [SPECIES_RHYDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhydon, gDummySpriteAffineAnimTable}, + [SPECIES_CHANSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chansey, gDummySpriteAffineAnimTable}, + [SPECIES_TANGELA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tangela, gDummySpriteAffineAnimTable}, + [SPECIES_KANGASKHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kangaskhan, gDummySpriteAffineAnimTable}, + [SPECIES_HORSEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Horsea, gDummySpriteAffineAnimTable}, + [SPECIES_SEADRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seadra, gDummySpriteAffineAnimTable}, + [SPECIES_GOLDEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Goldeen, gDummySpriteAffineAnimTable}, + [SPECIES_SEAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seaking, gDummySpriteAffineAnimTable}, + [SPECIES_STARYU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Staryu, gDummySpriteAffineAnimTable}, + [SPECIES_STARMIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Starmie, gDummySpriteAffineAnimTable}, + [SPECIES_MR_MIME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mr_Mime, gDummySpriteAffineAnimTable}, + [SPECIES_SCYTHER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scyther, gDummySpriteAffineAnimTable}, + [SPECIES_JYNX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jynx, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTABUZZ] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electabuzz, gDummySpriteAffineAnimTable}, + [SPECIES_MAGMAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magmar, gDummySpriteAffineAnimTable}, + [SPECIES_PINSIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pinsir, gDummySpriteAffineAnimTable}, + [SPECIES_TAUROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tauros, gDummySpriteAffineAnimTable}, + [SPECIES_MAGIKARP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magikarp, gDummySpriteAffineAnimTable}, + [SPECIES_GYARADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gyarados, gDummySpriteAffineAnimTable}, + [SPECIES_LAPRAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lapras, gDummySpriteAffineAnimTable}, + [SPECIES_DITTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ditto, gDummySpriteAffineAnimTable}, + [SPECIES_EEVEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Eevee, gDummySpriteAffineAnimTable}, + [SPECIES_VAPOREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vaporeon, gDummySpriteAffineAnimTable}, + [SPECIES_JOLTEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jolteon, gDummySpriteAffineAnimTable}, + [SPECIES_FLAREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flareon, gDummySpriteAffineAnimTable}, + [SPECIES_PORYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon, gDummySpriteAffineAnimTable}, + [SPECIES_OMANYTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omanyte, gDummySpriteAffineAnimTable}, + [SPECIES_OMASTAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omastar, gDummySpriteAffineAnimTable}, + [SPECIES_KABUTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabuto, gDummySpriteAffineAnimTable}, + [SPECIES_KABUTOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabutops, gDummySpriteAffineAnimTable}, + [SPECIES_AERODACTYL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aerodactyl, gDummySpriteAffineAnimTable}, + [SPECIES_SNORLAX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorlax, gDummySpriteAffineAnimTable}, + [SPECIES_ARTICUNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Articuno, gDummySpriteAffineAnimTable}, + [SPECIES_ZAPDOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zapdos, gDummySpriteAffineAnimTable}, + [SPECIES_MOLTRES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Moltres, gDummySpriteAffineAnimTable}, + [SPECIES_DRATINI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dratini, gDummySpriteAffineAnimTable}, + [SPECIES_DRAGONAIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonair, gDummySpriteAffineAnimTable}, + [SPECIES_DRAGONITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonite, gDummySpriteAffineAnimTable}, + [SPECIES_MEWTWO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mewtwo, gDummySpriteAffineAnimTable}, + [SPECIES_MEW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mew, gDummySpriteAffineAnimTable}, + [SPECIES_CHIKORITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chikorita, gDummySpriteAffineAnimTable}, + [SPECIES_BAYLEEF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bayleef, gDummySpriteAffineAnimTable}, + [SPECIES_MEGANIUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meganium, gDummySpriteAffineAnimTable}, + [SPECIES_CYNDAQUIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cyndaquil, gDummySpriteAffineAnimTable}, + [SPECIES_QUILAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quilava, gDummySpriteAffineAnimTable}, + [SPECIES_TYPHLOSION] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Typhlosion, gDummySpriteAffineAnimTable}, + [SPECIES_TOTODILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Totodile, gDummySpriteAffineAnimTable}, + [SPECIES_CROCONAW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Croconaw, gDummySpriteAffineAnimTable}, + [SPECIES_FERALIGATR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feraligatr, gDummySpriteAffineAnimTable}, + [SPECIES_SENTRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sentret, gDummySpriteAffineAnimTable}, + [SPECIES_FURRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Furret, gDummySpriteAffineAnimTable}, + [SPECIES_HOOTHOOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoothoot, gDummySpriteAffineAnimTable}, + [SPECIES_NOCTOWL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Noctowl, gDummySpriteAffineAnimTable}, + [SPECIES_LEDYBA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledyba, gDummySpriteAffineAnimTable}, + [SPECIES_LEDIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledian, gDummySpriteAffineAnimTable}, + [SPECIES_SPINARAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinarak, gDummySpriteAffineAnimTable}, + [SPECIES_ARIADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ariados, gDummySpriteAffineAnimTable}, + [SPECIES_CROBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crobat, gDummySpriteAffineAnimTable}, + [SPECIES_CHINCHOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chinchou, gDummySpriteAffineAnimTable}, + [SPECIES_LANTURN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lanturn, gDummySpriteAffineAnimTable}, + [SPECIES_PICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pichu, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFFA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cleffa, gDummySpriteAffineAnimTable}, + [SPECIES_IGGLYBUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Igglybuff, gDummySpriteAffineAnimTable}, + [SPECIES_TOGEPI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togepi, gDummySpriteAffineAnimTable}, + [SPECIES_TOGETIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}, + [SPECIES_NATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Natu, gDummySpriteAffineAnimTable}, + [SPECIES_XATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Xatu, gDummySpriteAffineAnimTable}, + [SPECIES_MAREEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mareep, gDummySpriteAffineAnimTable}, + [SPECIES_FLAAFFY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flaaffy, gDummySpriteAffineAnimTable}, + [SPECIES_AMPHAROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ampharos, gDummySpriteAffineAnimTable}, + [SPECIES_BELLOSSOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellossom, gDummySpriteAffineAnimTable}, + [SPECIES_MARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marill, gDummySpriteAffineAnimTable}, + [SPECIES_AZUMARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azumarill, gDummySpriteAffineAnimTable}, + [SPECIES_SUDOWOODO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sudowoodo, gDummySpriteAffineAnimTable}, + [SPECIES_POLITOED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Politoed, gDummySpriteAffineAnimTable}, + [SPECIES_HOPPIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoppip, gDummySpriteAffineAnimTable}, + [SPECIES_SKIPLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skiploom, gDummySpriteAffineAnimTable}, + [SPECIES_JUMPLUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jumpluff, gDummySpriteAffineAnimTable}, + [SPECIES_AIPOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aipom, gDummySpriteAffineAnimTable}, + [SPECIES_SUNKERN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunkern, gDummySpriteAffineAnimTable}, + [SPECIES_SUNFLORA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunflora, gDummySpriteAffineAnimTable}, + [SPECIES_YANMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Yanma, gDummySpriteAffineAnimTable}, + [SPECIES_WOOPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wooper, gDummySpriteAffineAnimTable}, + [SPECIES_QUAGSIRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quagsire, gDummySpriteAffineAnimTable}, + [SPECIES_ESPEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Espeon, gDummySpriteAffineAnimTable}, + [SPECIES_UMBREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Umbreon, gDummySpriteAffineAnimTable}, + [SPECIES_MURKROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Murkrow, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowking, gDummySpriteAffineAnimTable}, + [SPECIES_MISDREAVUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Misdreavus, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_A, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_B] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_B, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_C] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_C, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_D] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_D, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_E] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_E, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_F, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_G] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_G, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_H] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_H, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_I] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_I, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_J] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_J, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_K] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_K, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_L] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_L, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_M, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_N] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_N, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_O] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_O, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_P] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_P, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Q] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Q, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_R] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_R, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_S] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_S, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_T] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_T, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_U] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_U, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_V] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_V, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_W] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_W, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_X] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_X, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Y] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Y, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Z] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Z, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_EMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Exclamation, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_QMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Question, gDummySpriteAffineAnimTable}, + [SPECIES_WOBBUFFET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wobbuffet, gDummySpriteAffineAnimTable}, + [SPECIES_GIRAFARIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Girafarig, gDummySpriteAffineAnimTable}, + [SPECIES_PINECO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pineco, gDummySpriteAffineAnimTable}, + [SPECIES_FORRETRESS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Forretress, gDummySpriteAffineAnimTable}, + [SPECIES_DUNSPARCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dunsparce, gDummySpriteAffineAnimTable}, + [SPECIES_GLIGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gligar, gDummySpriteAffineAnimTable}, + [SPECIES_STEELIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Steelix, gDummySpriteAffineAnimTable}, + [SPECIES_SNUBBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snubbull, gDummySpriteAffineAnimTable}, + [SPECIES_GRANBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Granbull, gDummySpriteAffineAnimTable}, + [SPECIES_QWILFISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Qwilfish, gDummySpriteAffineAnimTable}, + [SPECIES_SCIZOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scizor, gDummySpriteAffineAnimTable}, + [SPECIES_SHUCKLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuckle, gDummySpriteAffineAnimTable}, + [SPECIES_HERACROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Heracross, gDummySpriteAffineAnimTable}, + [SPECIES_SNEASEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sneasel, gDummySpriteAffineAnimTable}, + [SPECIES_TEDDIURSA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Teddiursa, gDummySpriteAffineAnimTable}, + [SPECIES_URSARING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ursaring, gDummySpriteAffineAnimTable}, + [SPECIES_SLUGMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slugma, gDummySpriteAffineAnimTable}, + [SPECIES_MAGCARGO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magcargo, gDummySpriteAffineAnimTable}, + [SPECIES_SWINUB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swinub, gDummySpriteAffineAnimTable}, + [SPECIES_PILOSWINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Piloswine, gDummySpriteAffineAnimTable}, + [SPECIES_CORSOLA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corsola, gDummySpriteAffineAnimTable}, + [SPECIES_REMORAID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Remoraid, gDummySpriteAffineAnimTable}, + [SPECIES_OCTILLERY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Octillery, gDummySpriteAffineAnimTable}, + [SPECIES_DELIBIRD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delibird, gDummySpriteAffineAnimTable}, + [SPECIES_MANTINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mantine, gDummySpriteAffineAnimTable}, + [SPECIES_SKARMORY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skarmory, gDummySpriteAffineAnimTable}, + [SPECIES_HOUNDOUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndour, gDummySpriteAffineAnimTable}, + [SPECIES_HOUNDOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndoom, gDummySpriteAffineAnimTable}, + [SPECIES_KINGDRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingdra, gDummySpriteAffineAnimTable}, + [SPECIES_PHANPY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Phanpy, gDummySpriteAffineAnimTable}, + [SPECIES_DONPHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Donphan, gDummySpriteAffineAnimTable}, + [SPECIES_PORYGON2] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon2, gDummySpriteAffineAnimTable}, + [SPECIES_STANTLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Stantler, gDummySpriteAffineAnimTable}, + [SPECIES_SMEARGLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smeargle, gDummySpriteAffineAnimTable}, + [SPECIES_TYROGUE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyrogue, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONTOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmontop, gDummySpriteAffineAnimTable}, + [SPECIES_SMOOCHUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smoochum, gDummySpriteAffineAnimTable}, + [SPECIES_ELEKID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Elekid, gDummySpriteAffineAnimTable}, + [SPECIES_MAGBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magby, gDummySpriteAffineAnimTable}, + [SPECIES_MILTANK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Miltank, gDummySpriteAffineAnimTable}, + [SPECIES_BLISSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blissey, gDummySpriteAffineAnimTable}, + [SPECIES_RAIKOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raikou, gDummySpriteAffineAnimTable}, + [SPECIES_ENTEI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Entei, gDummySpriteAffineAnimTable}, + [SPECIES_SUICUNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Suicune, gDummySpriteAffineAnimTable}, + [SPECIES_LARVITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Larvitar, gDummySpriteAffineAnimTable}, + [SPECIES_PUPITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pupitar, gDummySpriteAffineAnimTable}, + [SPECIES_TYRANITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyranitar, gDummySpriteAffineAnimTable}, + [SPECIES_LUGIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lugia, gDummySpriteAffineAnimTable}, + [SPECIES_HO_OH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ho_oh, gDummySpriteAffineAnimTable}, + [SPECIES_CELEBI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Celebi, gDummySpriteAffineAnimTable}, + [SPECIES_TREECKO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Treecko, gDummySpriteAffineAnimTable}, + [SPECIES_GROVYLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grovyle, gDummySpriteAffineAnimTable}, + [SPECIES_SCEPTILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sceptile, gDummySpriteAffineAnimTable}, + [SPECIES_TORCHIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torchic, gDummySpriteAffineAnimTable}, + [SPECIES_COMBUSKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Combusken, gDummySpriteAffineAnimTable}, + [SPECIES_BLAZIKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blaziken, gDummySpriteAffineAnimTable}, + [SPECIES_MUDKIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mudkip, gDummySpriteAffineAnimTable}, + [SPECIES_MARSHTOMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marshtomp, gDummySpriteAffineAnimTable}, + [SPECIES_SWAMPERT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swampert, gDummySpriteAffineAnimTable}, + [SPECIES_POOCHYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poochyena, gDummySpriteAffineAnimTable}, + [SPECIES_MIGHTYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mightyena, gDummySpriteAffineAnimTable}, + [SPECIES_ZIGZAGOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zigzagoon, gDummySpriteAffineAnimTable}, + [SPECIES_LINOONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Linoone, gDummySpriteAffineAnimTable}, + [SPECIES_WURMPLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wurmple, gDummySpriteAffineAnimTable}, + [SPECIES_SILCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Silcoon, gDummySpriteAffineAnimTable}, + [SPECIES_BEAUTIFLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beautifly, gDummySpriteAffineAnimTable}, + [SPECIES_CASCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cascoon, gDummySpriteAffineAnimTable}, + [SPECIES_DUSTOX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dustox, gDummySpriteAffineAnimTable}, + [SPECIES_LOTAD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lotad, gDummySpriteAffineAnimTable}, + [SPECIES_LOMBRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lombre, gDummySpriteAffineAnimTable}, + [SPECIES_LUDICOLO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ludicolo, gDummySpriteAffineAnimTable}, + [SPECIES_SEEDOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seedot, gDummySpriteAffineAnimTable}, + [SPECIES_NUZLEAF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nuzleaf, gDummySpriteAffineAnimTable}, + [SPECIES_SHIFTRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shiftry, gDummySpriteAffineAnimTable}, + [SPECIES_TAILLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Taillow, gDummySpriteAffineAnimTable}, + [SPECIES_SWELLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swellow, gDummySpriteAffineAnimTable}, + [SPECIES_WINGULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wingull, gDummySpriteAffineAnimTable}, + [SPECIES_PELIPPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pelipper, gDummySpriteAffineAnimTable}, + [SPECIES_RALTS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ralts, gDummySpriteAffineAnimTable}, + [SPECIES_KIRLIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kirlia, gDummySpriteAffineAnimTable}, + [SPECIES_GARDEVOIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gardevoir, gDummySpriteAffineAnimTable}, + [SPECIES_SURSKIT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Surskit, gDummySpriteAffineAnimTable}, + [SPECIES_MASQUERAIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Masquerain, gDummySpriteAffineAnimTable}, + [SPECIES_SHROOMISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shroomish, gDummySpriteAffineAnimTable}, + [SPECIES_BRELOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Breloom, gDummySpriteAffineAnimTable}, + [SPECIES_SLAKOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slakoth, gDummySpriteAffineAnimTable}, + [SPECIES_VIGOROTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vigoroth, gDummySpriteAffineAnimTable}, + [SPECIES_SLAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slaking, gDummySpriteAffineAnimTable}, + [SPECIES_NINCADA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nincada, gDummySpriteAffineAnimTable}, + [SPECIES_NINJASK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninjask, gDummySpriteAffineAnimTable}, + [SPECIES_SHEDINJA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shedinja, gDummySpriteAffineAnimTable}, + [SPECIES_WHISMUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whismur, gDummySpriteAffineAnimTable}, + [SPECIES_LOUDRED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Loudred, gDummySpriteAffineAnimTable}, + [SPECIES_EXPLOUD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exploud, gDummySpriteAffineAnimTable}, + [SPECIES_MAKUHITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Makuhita, gDummySpriteAffineAnimTable}, + [SPECIES_HARIYAMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hariyama, gDummySpriteAffineAnimTable}, + [SPECIES_AZURILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azurill, gDummySpriteAffineAnimTable}, + [SPECIES_NOSEPASS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nosepass, gDummySpriteAffineAnimTable}, + [SPECIES_SKITTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skitty, gDummySpriteAffineAnimTable}, + [SPECIES_DELCATTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delcatty, gDummySpriteAffineAnimTable}, + [SPECIES_SABLEYE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sableye, gDummySpriteAffineAnimTable}, + [SPECIES_MAWILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mawile, gDummySpriteAffineAnimTable}, + [SPECIES_ARON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aron, gDummySpriteAffineAnimTable}, + [SPECIES_LAIRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lairon, gDummySpriteAffineAnimTable}, + [SPECIES_AGGRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aggron, gDummySpriteAffineAnimTable}, + [SPECIES_MEDITITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meditite, gDummySpriteAffineAnimTable}, + [SPECIES_MEDICHAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Medicham, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTRIKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrike, gDummySpriteAffineAnimTable}, + [SPECIES_MANECTRIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Manectric, gDummySpriteAffineAnimTable}, + [SPECIES_PLUSLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Plusle, gDummySpriteAffineAnimTable}, + [SPECIES_MINUN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Minun, gDummySpriteAffineAnimTable}, + [SPECIES_VOLBEAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Volbeat, gDummySpriteAffineAnimTable}, + [SPECIES_ILLUMISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Illumise, gDummySpriteAffineAnimTable}, + [SPECIES_ROSELIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Roselia, gDummySpriteAffineAnimTable}, + [SPECIES_GULPIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gulpin, gDummySpriteAffineAnimTable}, + [SPECIES_SWALOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swalot, gDummySpriteAffineAnimTable}, + [SPECIES_CARVANHA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Carvanha, gDummySpriteAffineAnimTable}, + [SPECIES_SHARPEDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sharpedo, gDummySpriteAffineAnimTable}, + [SPECIES_WAILMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailmer, gDummySpriteAffineAnimTable}, + [SPECIES_WAILORD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailord, gDummySpriteAffineAnimTable}, + [SPECIES_NUMEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Numel, gDummySpriteAffineAnimTable}, + [SPECIES_CAMERUPT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Camerupt, gDummySpriteAffineAnimTable}, + [SPECIES_TORKOAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torkoal, gDummySpriteAffineAnimTable}, + [SPECIES_SPOINK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spoink, gDummySpriteAffineAnimTable}, + [SPECIES_GRUMPIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grumpig, gDummySpriteAffineAnimTable}, + [SPECIES_SPINDA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinda, gDummySpriteAffineAnimTable}, + [SPECIES_TRAPINCH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Trapinch, gDummySpriteAffineAnimTable}, + [SPECIES_VIBRAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vibrava, gDummySpriteAffineAnimTable}, + [SPECIES_FLYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flygon, gDummySpriteAffineAnimTable}, + [SPECIES_CACNEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacnea, gDummySpriteAffineAnimTable}, + [SPECIES_CACTURNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacturne, gDummySpriteAffineAnimTable}, + [SPECIES_SWABLU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swablu, gDummySpriteAffineAnimTable}, + [SPECIES_ALTARIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Altaria, gDummySpriteAffineAnimTable}, + [SPECIES_ZANGOOSE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zangoose, gDummySpriteAffineAnimTable}, + [SPECIES_SEVIPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seviper, gDummySpriteAffineAnimTable}, + [SPECIES_LUNATONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lunatone, gDummySpriteAffineAnimTable}, + [SPECIES_SOLROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Solrock, gDummySpriteAffineAnimTable}, + [SPECIES_BARBOACH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Barboach, gDummySpriteAffineAnimTable}, + [SPECIES_WHISCASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whiscash, gDummySpriteAffineAnimTable}, + [SPECIES_CORPHISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corphish, gDummySpriteAffineAnimTable}, + [SPECIES_CRAWDAUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crawdaunt, gDummySpriteAffineAnimTable}, + [SPECIES_BALTOY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Baltoy, gDummySpriteAffineAnimTable}, + [SPECIES_CLAYDOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Claydol, gDummySpriteAffineAnimTable}, + [SPECIES_LILEEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lileep, gDummySpriteAffineAnimTable}, + [SPECIES_CRADILY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cradily, gDummySpriteAffineAnimTable}, + [SPECIES_ANORITH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Anorith, gDummySpriteAffineAnimTable}, + [SPECIES_ARMALDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Armaldo, gDummySpriteAffineAnimTable}, + [SPECIES_FEEBAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feebas, gDummySpriteAffineAnimTable}, + [SPECIES_MILOTIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Milotic, gDummySpriteAffineAnimTable}, + [SPECIES_CASTFORM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, + [SPECIES_KECLEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kecleon, gDummySpriteAffineAnimTable}, + [SPECIES_SHUPPET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuppet, gDummySpriteAffineAnimTable}, + [SPECIES_BANETTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Banette, gDummySpriteAffineAnimTable}, + [SPECIES_DUSKULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Duskull, gDummySpriteAffineAnimTable}, + [SPECIES_DUSCLOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dusclops, gDummySpriteAffineAnimTable}, + [SPECIES_TROPIUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tropius, gDummySpriteAffineAnimTable}, + [SPECIES_CHIMECHO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chimecho, gDummySpriteAffineAnimTable}, + [SPECIES_ABSOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Absol, gDummySpriteAffineAnimTable}, + [SPECIES_WYNAUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wynaut, gDummySpriteAffineAnimTable}, + [SPECIES_SNORUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorunt, gDummySpriteAffineAnimTable}, + [SPECIES_GLALIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Glalie, gDummySpriteAffineAnimTable}, + [SPECIES_SPHEAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spheal, gDummySpriteAffineAnimTable}, + [SPECIES_SEALEO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sealeo, gDummySpriteAffineAnimTable}, + [SPECIES_WALREIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Walrein, gDummySpriteAffineAnimTable}, + [SPECIES_CLAMPERL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clamperl, gDummySpriteAffineAnimTable}, + [SPECIES_HUNTAIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Huntail, gDummySpriteAffineAnimTable}, + [SPECIES_GOREBYSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gorebyss, gDummySpriteAffineAnimTable}, + [SPECIES_RELICANTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Relicanth, gDummySpriteAffineAnimTable}, + [SPECIES_LUVDISC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Luvdisc, gDummySpriteAffineAnimTable}, + [SPECIES_BAGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bagon, gDummySpriteAffineAnimTable}, + [SPECIES_SHELGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shelgon, gDummySpriteAffineAnimTable}, + [SPECIES_SALAMENCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Salamence, gDummySpriteAffineAnimTable}, + [SPECIES_BELDUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beldum, gDummySpriteAffineAnimTable}, + [SPECIES_METANG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metang, gDummySpriteAffineAnimTable}, + [SPECIES_METAGROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metagross, gDummySpriteAffineAnimTable}, + [SPECIES_REGIROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regirock, gDummySpriteAffineAnimTable}, + [SPECIES_REGICE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regice, gDummySpriteAffineAnimTable}, + [SPECIES_REGISTEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Registeel, gDummySpriteAffineAnimTable}, + [SPECIES_LATIAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latias, gDummySpriteAffineAnimTable}, + [SPECIES_LATIOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latios, gDummySpriteAffineAnimTable}, + [SPECIES_KYOGRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kyogre, gDummySpriteAffineAnimTable}, + [SPECIES_GROUDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Groudon, gDummySpriteAffineAnimTable}, + [SPECIES_RAYQUAZA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rayquaza, gDummySpriteAffineAnimTable}, + [SPECIES_JIRACHI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jirachi, gDummySpriteAffineAnimTable}, + [SPECIES_DEOXYS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Deoxys, gDummySpriteAffineAnimTable}, }; // Normal, sunny, rainy, snowy -const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = { - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, +const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = +{ + {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, }; + +// Standalone follower palettes +// If not NULL, entries here override the front-sprite-based pals +// used by OBJ_EVENT_PAL_TAG_DYNAMIC +// Palette data may be compressed, or not +const void* const gFollowerPalettes[][2] = +{ + // Must have at least one entry, or ARRAY_COUNT comparison fails + // (SPECIES_NONE does not use OBJ_EVENT_PAL_TAG_DYNAMIC anyway) + [SPECIES_NONE] = {gMonPalette_CircledQuestionMark, gMonShinyPalette_CircledQuestionMark}, +}; + +#if OW_MON_POKEBALLS + +#define POKEBALL_GFX_INFO(NAME) \ + [BALL_##NAME] = { \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_BALL_##NAME, \ + .size = 256, \ + .width = 16, \ + .height = 32, \ + .shadowSize = SHADOW_SIZE_M, \ + .inanimate = TRUE, \ + .oam = &gObjectEventBaseOam_16x32, \ + .subspriteTables = sOamTables_16x32, \ + .anims = sAnimTable_Following, \ + .images = sPicTable_Ball_##NAME, \ + .affineAnims = gDummySpriteAffineAnimTable, \ + } + + +const struct ObjectEventGraphicsInfo gPokeballGraphics[POKEBALL_COUNT] = { + // Vanilla + POKEBALL_GFX_INFO(MASTER), + POKEBALL_GFX_INFO(ULTRA), + POKEBALL_GFX_INFO(GREAT), + POKEBALL_GFX_INFO(SAFARI), + POKEBALL_GFX_INFO(NET), + POKEBALL_GFX_INFO(DIVE), + POKEBALL_GFX_INFO(NEST), + POKEBALL_GFX_INFO(REPEAT), + POKEBALL_GFX_INFO(TIMER), + POKEBALL_GFX_INFO(LUXURY), + POKEBALL_GFX_INFO(PREMIER), + // Gen IV/Sinnoh pokeballs + #ifdef ITEM_DUSK_BALL + POKEBALL_GFX_INFO(DUSK), + POKEBALL_GFX_INFO(HEAL), + POKEBALL_GFX_INFO(QUICK), + POKEBALL_GFX_INFO(CHERISH), + #endif + #ifdef ITEM_PARK_BALL + POKEBALL_GFX_INFO(PARK), + #endif + // Gen II/Johto Apricorn pokeballs + #ifdef ITEM_FAST_BALL + POKEBALL_GFX_INFO(FAST), + POKEBALL_GFX_INFO(LEVEL), + POKEBALL_GFX_INFO(LURE), + POKEBALL_GFX_INFO(HEAVY), + POKEBALL_GFX_INFO(LOVE), + POKEBALL_GFX_INFO(FRIEND), + POKEBALL_GFX_INFO(MOON), + POKEBALL_GFX_INFO(SPORT), + #endif + // Gen V + #ifdef ITEM_DREAM_BALL + POKEBALL_GFX_INFO(DREAM), + #endif + // Gen VII + #ifdef ITEM_BEAST_BALL + POKEBALL_GFX_INFO(BEAST), + #endif + // Gen VIII + #ifdef ITEM_STRANGE_BALL + POKEBALL_GFX_INFO(STRANGE), + #endif +}; +#endif diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index bde5041803..b60a261ad4 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -1987,11 +1987,146 @@ static const struct SpriteFrameImage sPicTable_AnimatedBall[] = { overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 2), overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 3), overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 4), - overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 5), + overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 0), }; extern const struct SpriteFrameImage gFieldEffectObjectPicTable_BallLight[]; +#if OW_MON_POKEBALLS + +#define POKEBALL_PIC_FRAMES(name) \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 0), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 1), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 2), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 3), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 4), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 0) + + +static const struct SpriteFrameImage sPicTable_Ball_MASTER[] = { + POKEBALL_PIC_FRAMES(Master), +}; + +static const struct SpriteFrameImage sPicTable_Ball_ULTRA[] = { + POKEBALL_PIC_FRAMES(Ultra), +}; + +static const struct SpriteFrameImage sPicTable_Ball_GREAT[] = { + POKEBALL_PIC_FRAMES(Great), +}; + +static const struct SpriteFrameImage sPicTable_Ball_SAFARI[] = { + POKEBALL_PIC_FRAMES(Safari), +}; + +static const struct SpriteFrameImage sPicTable_Ball_NET[] = { + POKEBALL_PIC_FRAMES(Net), +}; + +static const struct SpriteFrameImage sPicTable_Ball_DIVE[] = { + POKEBALL_PIC_FRAMES(Dive), +}; + +static const struct SpriteFrameImage sPicTable_Ball_NEST[] = { + POKEBALL_PIC_FRAMES(Nest), +}; + +static const struct SpriteFrameImage sPicTable_Ball_REPEAT[] = { + POKEBALL_PIC_FRAMES(Repeat), +}; + +static const struct SpriteFrameImage sPicTable_Ball_TIMER[] = { + POKEBALL_PIC_FRAMES(Timer), +}; + +static const struct SpriteFrameImage sPicTable_Ball_LUXURY[] = { + POKEBALL_PIC_FRAMES(Luxury), +}; + +static const struct SpriteFrameImage sPicTable_Ball_PREMIER[] = { + POKEBALL_PIC_FRAMES(Premier), +}; + +// Gen IV/Sinnoh +#ifdef ITEM_DUSK_BALL +static const struct SpriteFrameImage sPicTable_Ball_DUSK[] = { + POKEBALL_PIC_FRAMES(Dusk), +}; +static const struct SpriteFrameImage sPicTable_Ball_HEAL[] = { + POKEBALL_PIC_FRAMES(Heal), +}; +static const struct SpriteFrameImage sPicTable_Ball_QUICK[] = { + POKEBALL_PIC_FRAMES(Quick), +}; +static const struct SpriteFrameImage sPicTable_Ball_CHERISH[] = { + POKEBALL_PIC_FRAMES(Cherish), +}; +#endif +#ifdef ITEM_PARK_BALL +static const struct SpriteFrameImage sPicTable_Ball_PARK[] = { + POKEBALL_PIC_FRAMES(Park), +}; +#endif + +// Gen II/Johto Apricorns +#ifdef ITEM_FAST_BALL +static const struct SpriteFrameImage sPicTable_Ball_FAST[] = { + POKEBALL_PIC_FRAMES(Fast), +}; +static const struct SpriteFrameImage sPicTable_Ball_LEVEL[] = { + POKEBALL_PIC_FRAMES(Level), +}; +static const struct SpriteFrameImage sPicTable_Ball_LURE[] = { + POKEBALL_PIC_FRAMES(Lure), +}; +static const struct SpriteFrameImage sPicTable_Ball_HEAVY[] = { + POKEBALL_PIC_FRAMES(Heavy), +}; +static const struct SpriteFrameImage sPicTable_Ball_LOVE[] = { + POKEBALL_PIC_FRAMES(Love), +}; +static const struct SpriteFrameImage sPicTable_Ball_FRIEND[] = { + POKEBALL_PIC_FRAMES(Friend), +}; +static const struct SpriteFrameImage sPicTable_Ball_MOON[] = { + POKEBALL_PIC_FRAMES(Moon), +}; +static const struct SpriteFrameImage sPicTable_Ball_SPORT[] = { + POKEBALL_PIC_FRAMES(Sport), +}; +#endif + +// Gen V +#ifdef ITEM_DREAM_BALL +static const struct SpriteFrameImage sPicTable_Ball_DREAM[] = { + POKEBALL_PIC_FRAMES(Dream), +}; +#endif + +// Gen VII +#ifdef ITEM_BEAST_BALL +static const struct SpriteFrameImage sPicTable_Ball_BEAST[] = { + POKEBALL_PIC_FRAMES(Beast), +}; +#endif + +// Gen VIII +#ifdef ITEM_STRANGE_BALL +static const struct SpriteFrameImage sPicTable_Ball_STRANGE[] = { + POKEBALL_PIC_FRAMES(Strange), +}; +#endif + +#endif + +static const struct SpriteFrameImage sPicTable_Substitute[] = { + overworld_frame(gObjectEventPic_Substitute, 4, 4, 0), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 1), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 2), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 3), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 4), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 5), +}; static const struct SpriteFrameImage sPicTable_Bulbasaur[] = { overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 0), overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 1), diff --git a/src/data/text/follower_messages.h b/src/data/text/follower_messages.h index 3fbec109cc..7678992f22 100644 --- a/src/data/text/follower_messages.h +++ b/src/data/text/follower_messages.h @@ -50,7 +50,7 @@ static const u8 sHappyMsg27[] = _("Your POKéMON is smelling the scent\nof flowe static const u8 sHappyMsg28[] = _("{STR_VAR_1} seems very happy to see\nyou!"); static const u8 sHappyMsg29[] = _("{STR_VAR_1} faced this way and\ngrinned."); static const u8 sHappyMsg30[] = _("{STR_VAR_1} happily cuddled up to\nyou!"); - // Conditional messages begin here, index 31 +// Conditional messages begin here, index 31 static const u8 sHappyMsg31[] = _("Your POKéMON seems happy about the\ngreat weather."); static const u8 sHappyMsg32[] = _("{STR_VAR_1} is very composed and\nsure of itself!"); @@ -106,7 +106,7 @@ const struct FollowerMsgInfo gFollowerNeutralMessages[] = { static const u8 sSadMsg00[] = _("{STR_VAR_1} is dizzy."); static const u8 sSadMsg01[] = _("{STR_VAR_1} is stepping on your\nfeet!"); static const u8 sSadMsg02[] = _("{STR_VAR_1} seems a little tired."); - // Conditional messages begin, index 3 +// Conditional messages begin, index 3 static const u8 sSadMsg03[] = _("{STR_VAR_1} is not happy."); static const u8 sSadMsg04[] = _("{STR_VAR_1} is going to fall down!\n"); static const u8 sSadMsg05[] = _("{STR_VAR_1} seems to be about to\nfall over!"); @@ -123,7 +123,7 @@ const struct FollowerMsgInfo gFollowerSadMessages[] = { static const u8 sUpsetMsg00[] = _("{STR_VAR_1} seems unhappy somehow…"); static const u8 sUpsetMsg01[] = _("{STR_VAR_1} is making an unhappy\nface."); static const u8 sUpsetMsg02[] = _("…Your POKéMON seems a little\ncold."); - // Conditional messages, index 3 +// Conditional messages, index 3 static const u8 sUpsetMsg03[] = _("{STR_VAR_1} is taking shelter in the\ngrass from the rain."); const struct FollowerMsgInfo gFollowerUpsetMessages[] = { @@ -225,7 +225,7 @@ static const u8 sSurpriseMsg16[] = _("{STR_VAR_1} sensed something strange\nand static const u8 sSurpriseMsg17[] = _("{STR_VAR_1} is scared and snuggled\nup to you!"); static const u8 sSurpriseMsg18[] = _("{STR_VAR_1} is feeling an unusual\npresence…"); static const u8 sSurpriseMsg19[] = _("{STR_VAR_1} is getting tense with\nnervous energy."); - // Conditional messages, index 20 +// Conditional messages, index 20 static const u8 sSurpriseMsg20[] = _("{STR_VAR_1} seems to be very\nsurprised that it is raining!"); const struct FollowerMsgInfo gFollowerSurpriseMessages[] = { diff --git a/src/decompress.c b/src/decompress.c index 8452f340ed..248ce346e7 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -19,6 +19,24 @@ void LZDecompressVram(const u32 *src, void *dest) LZ77UnCompVram(src, dest); } +// Checks if `ptr` is likely LZ77 data +// Checks word-alignment, min/max size, and header byte +bool32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize) { + const u8 *data = ptr; + u32 size; + // Compressed data must be word aligned + if (((u32)ptr) & 3) + return FALSE; + // Check LZ77 header byte + // See https://problemkaputt.de/gbatek.htm#biosdecompressionfunctions + if (data[0] != 0x10) + return FALSE; + + // Read 24-bit uncompressed size + size = data[1] | (data[2] << 8) | (data[3] << 16); + return (size >= minSize && size <= maxSize); +} + u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) { struct SpriteSheet dest; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f2d8b55375..349ebf8503 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1,5 +1,6 @@ #include "global.h" #include "malloc.h" +#include "battle_anim.h" #include "battle_pyramid.h" #include "battle_script_commands.h" #include "berry.h" @@ -18,11 +19,13 @@ #include "fieldmap.h" #include "follower_helper.h" #include "gpu_regs.h" +#include "graphics.h" #include "mauville_old_man.h" #include "metatile_behavior.h" #include "overworld.h" #include "palette.h" #include "pokemon.h" +#include "pokeball.h" #include "random.h" #include "region_map.h" #include "script.h" @@ -187,7 +190,7 @@ 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, bool8 shiny); +static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny); static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form); static bool8 NpcTakeStep(struct Sprite *); static bool8 IsElevationMismatchAt(u8, s16, s16); @@ -483,6 +486,43 @@ const u8 gInitialMovementTypeFacingDirections[] = { #define OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY 0x1125 #define OBJ_EVENT_PAL_TAG_CASTFORM_RAINY 0x1126 #define OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY 0x1127 +#if OW_MON_POKEBALLS +// Vanilla +#define OBJ_EVENT_PAL_TAG_BALL_MASTER 0x1150 +#define OBJ_EVENT_PAL_TAG_BALL_ULTRA 0x1151 +#define OBJ_EVENT_PAL_TAG_BALL_GREAT 0x1152 +#define OBJ_EVENT_PAL_TAG_BALL_SAFARI 0x1153 +#define OBJ_EVENT_PAL_TAG_BALL_NET 0x1154 +#define OBJ_EVENT_PAL_TAG_BALL_DIVE 0x1155 +#define OBJ_EVENT_PAL_TAG_BALL_NEST 0x1156 +#define OBJ_EVENT_PAL_TAG_BALL_REPEAT 0x1157 +#define OBJ_EVENT_PAL_TAG_BALL_TIMER 0x1158 +#define OBJ_EVENT_PAL_TAG_BALL_LUXURY 0x1159 +#define OBJ_EVENT_PAL_TAG_BALL_PREMIER 0x115A +// Gen IV/Sinnoh +#define OBJ_EVENT_PAL_TAG_BALL_DUSK 0x115B +#define OBJ_EVENT_PAL_TAG_BALL_HEAL 0x115C +#define OBJ_EVENT_PAL_TAG_BALL_QUICK 0x115D +#define OBJ_EVENT_PAL_TAG_BALL_CHERISH 0x115E +#define OBJ_EVENT_PAL_TAG_BALL_PARK 0x115F +// Gen II/Johto Apricorns +#define OBJ_EVENT_PAL_TAG_BALL_FAST 0x1160 +#define OBJ_EVENT_PAL_TAG_BALL_LEVEL 0x1161 +#define OBJ_EVENT_PAL_TAG_BALL_LURE 0x1162 +#define OBJ_EVENT_PAL_TAG_BALL_HEAVY 0x1163 +#define OBJ_EVENT_PAL_TAG_BALL_LOVE 0x1164 +#define OBJ_EVENT_PAL_TAG_BALL_FRIEND 0x1165 +#define OBJ_EVENT_PAL_TAG_BALL_MOON 0x1166 +#define OBJ_EVENT_PAL_TAG_BALL_SPORT 0x1167 +// Gen V +#define OBJ_EVENT_PAL_TAG_BALL_DREAM 0x1168 +// Gen VII +#define OBJ_EVENT_PAL_TAG_BALL_BEAST 0x1169 +// Gen VIII +#define OBJ_EVENT_PAL_TAG_BALL_STRANGE 0x116A +#endif +// Used as a placeholder follower graphic +#define OBJ_EVENT_PAL_TAG_SUBSTITUTE 0x7611 #define OBJ_EVENT_PAL_TAG_LIGHT 0x8001 #define OBJ_EVENT_PAL_TAG_LIGHT_2 0x8002 #define OBJ_EVENT_PAL_TAG_EMOTES 0x8003 @@ -539,6 +579,54 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_CastformSunny, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY}, {gObjectEventPal_CastformRainy, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY}, {gObjectEventPal_CastformSnowy, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY}, + #if OW_MON_POKEBALLS + // Vanilla + {gObjectEventPal_MasterBall, OBJ_EVENT_PAL_TAG_BALL_MASTER}, + {gObjectEventPal_UltraBall, OBJ_EVENT_PAL_TAG_BALL_ULTRA}, + {gObjectEventPal_GreatBall, OBJ_EVENT_PAL_TAG_BALL_GREAT}, + {gObjectEventPal_SafariBall, OBJ_EVENT_PAL_TAG_BALL_SAFARI}, + {gObjectEventPal_NetBall, OBJ_EVENT_PAL_TAG_BALL_NET}, + {gObjectEventPal_DiveBall, OBJ_EVENT_PAL_TAG_BALL_DIVE}, + {gObjectEventPal_NestBall, OBJ_EVENT_PAL_TAG_BALL_NEST}, + {gObjectEventPal_RepeatBall, OBJ_EVENT_PAL_TAG_BALL_REPEAT}, + {gObjectEventPal_TimerBall, OBJ_EVENT_PAL_TAG_BALL_TIMER}, + {gObjectEventPal_LuxuryBall, OBJ_EVENT_PAL_TAG_BALL_LUXURY}, + {gObjectEventPal_PremierBall, OBJ_EVENT_PAL_TAG_BALL_PREMIER}, + // Gen IV/Sinnoh pokeballs + #ifdef ITEM_DUSK_BALL + {gObjectEventPal_DuskBall, OBJ_EVENT_PAL_TAG_BALL_DUSK}, + {gObjectEventPal_HealBall, OBJ_EVENT_PAL_TAG_BALL_HEAL}, + {gObjectEventPal_QuickBall, OBJ_EVENT_PAL_TAG_BALL_QUICK}, + {gObjectEventPal_CherishBall, OBJ_EVENT_PAL_TAG_BALL_CHERISH}, + #endif + #ifdef ITEM_PARK_BALL + {gObjectEventPal_ParkBall, OBJ_EVENT_PAL_TAG_BALL_PARK}, + #endif + // Gen II/Johto Apricorn pokeballs + #ifdef ITEM_FAST_BALL + {gObjectEventPal_FastBall, OBJ_EVENT_PAL_TAG_BALL_FAST}, + {gObjectEventPal_LevelBall, OBJ_EVENT_PAL_TAG_BALL_LEVEL}, + {gObjectEventPal_LureBall, OBJ_EVENT_PAL_TAG_BALL_LURE}, + {gObjectEventPal_HeavyBall, OBJ_EVENT_PAL_TAG_BALL_HEAVY}, + {gObjectEventPal_LoveBall, OBJ_EVENT_PAL_TAG_BALL_LOVE}, + {gObjectEventPal_FriendBall, OBJ_EVENT_PAL_TAG_BALL_FRIEND}, + {gObjectEventPal_MoonBall, OBJ_EVENT_PAL_TAG_BALL_MOON}, + {gObjectEventPal_SportBall, OBJ_EVENT_PAL_TAG_BALL_SPORT}, + #endif + // Gen V + #ifdef ITEM_DREAM_BALL + {gObjectEventPal_DreamBall, OBJ_EVENT_PAL_TAG_BALL_DREAM}, + #endif + // Gen VII + #ifdef ITEM_BEAST_BALL + {gObjectEventPal_BeastBall, OBJ_EVENT_PAL_TAG_BALL_BEAST}, + #endif + // Gen VIII + #ifdef ITEM_STRANGE_BALL + {gObjectEventPal_StrangeBall, OBJ_EVENT_PAL_TAG_BALL_STRANGE}, + #endif + #endif + {gObjectEventPal_Substitute, OBJ_EVENT_PAL_TAG_SUBSTITUTE}, {gObjectEventPaletteLight, OBJ_EVENT_PAL_TAG_LIGHT}, {gObjectEventPaletteLight2, OBJ_EVENT_PAL_TAG_LIGHT_2}, {gObjectEventPaletteEmotes, OBJ_EVENT_PAL_TAG_EMOTES}, @@ -1497,50 +1585,48 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven return objectEventId; } -static u8 -TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, - u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { - u8 objectEventId; - struct SpriteTemplate spriteTemplate; - struct SpriteFrameImage spriteFrameImage; - const struct ObjectEventGraphicsInfo *graphicsInfo; - const struct SubspriteTable *subspriteTables = NULL; +static u8 TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { + u8 objectEventId; + struct SpriteTemplate spriteTemplate; + struct SpriteFrameImage spriteFrameImage; + const struct ObjectEventGraphicsInfo *graphicsInfo; + const struct SubspriteTable *subspriteTables = NULL; - graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); - MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = graphicsInfo->size; - spriteTemplate.images = &spriteFrameImage; - objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); - if (objectEventId == OBJECT_EVENTS_COUNT) - return OBJECT_EVENTS_COUNT; + graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); + MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = graphicsInfo->size; + spriteTemplate.images = &spriteFrameImage; + objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); + if (objectEventId == OBJECT_EVENTS_COUNT) + return OBJECT_EVENTS_COUNT; - gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; - if (subspriteTables) - SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); + gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; + if (subspriteTables) + SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); - // Set species based on script header - if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) { - const u8 *script = objectEventTemplate->script; - if (script[0] == 0x7d) { // bufferspeciesname - u16 species; - u8 form; - bool8 shiny; - gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; - species = gObjectEvents[objectEventId].extra.mon.species; - form = gObjectEvents[objectEventId].extra.mon.form; - shiny = gObjectEvents[objectEventId].extra.mon.shiny; - FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny, TRUE); + // Set species based on script header + if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) { + const u8 *script = objectEventTemplate->script; + if (script[0] == 0x7d) { // bufferspeciesname + u16 species; + u8 form; + bool8 shiny; + gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; + species = gObjectEvents[objectEventId].extra.mon.species; + form = gObjectEvents[objectEventId].extra.mon.form; + shiny = gObjectEvents[objectEventId].extra.mon.shiny; + FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny, TRUE); + } + // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID + } else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) { + gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); + FollowerSetGraphics(&gObjectEvents[objectEventId], + gObjectEvents[objectEventId].extra.mon.species, + gObjectEvents[objectEventId].extra.mon.form, + gObjectEvents[objectEventId].extra.mon.form, TRUE); } - // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID - } else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) { - gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); - FollowerSetGraphics(&gObjectEvents[objectEventId], - gObjectEvents[objectEventId].extra.mon.species, - gObjectEvents[objectEventId].extra.mon.form, - gObjectEvents[objectEventId].extra.mon.form, TRUE); - } - return objectEventId; + return objectEventId; } u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) @@ -1631,7 +1717,7 @@ u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Spr u16 species; u8 form; bool8 shiny; - u8 paletteNum; + u32 paletteNum; spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); if (graphicsId == OBJ_EVENT_GFX_OW_MON && GetFollowerInfo(&species, &form, &shiny)) { @@ -1648,9 +1734,8 @@ u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Spr CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { - const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - spriteTemplate->paletteTag = spritePalette->tag; + spriteTemplate->paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); } else if (spriteTemplate->paletteTag != TAG_NONE) { if (paletteTag == TAG_NONE) LoadObjectEventPalette(spriteTemplate->paletteTag); @@ -1725,85 +1810,138 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio } struct Pokemon * GetFirstLiveMon(void) { // Return address of first conscious party mon or NULL - u8 i; - for (i=0; i 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) - return &gPlayerParty[i]; - } - return NULL; + u32 i; + for (i = 0; i < PARTY_SIZE; i++) { + if (gPlayerParty[i].hp > 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) + return &gPlayerParty[i]; + } + return NULL; } struct ObjectEvent * GetFollowerObject(void) { // Return follower ObjectEvent or NULL - u8 i; - for (i=0; i < OBJECT_EVENTS_COUNT; i++) { - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) - return &gObjectEvents[i]; - } - return NULL; + u32 i; + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) + return &gObjectEvents[i]; + } + return NULL; } // Return graphicsInfo for a pokemon species & form static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - switch (species) { + const struct ObjectEventGraphicsInfo *graphicsInfo; + switch (species) + { case SPECIES_UNOWN: // Letters >A are defined as species >= NUM_SPECIES, so are not contiguous with A - form %= NUM_UNOWN_FORMS; - graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; - break; + form %= NUM_UNOWN_FORMS; + graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; + break; case SPECIES_CASTFORM: // Sunny, rainy, snowy forms stored separately - graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; - break; + graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; + break; default: - graphicsInfo = &gPokemonObjectGraphics[species]; - break; - } - return graphicsInfo->tileTag == 0xFFFF ? graphicsInfo : &gPokemonObjectGraphics[SPECIES_PORYGON]; // avoid OOB access + graphicsInfo = &gPokemonObjectGraphics[species]; + break; + } + // Try to avoid OOB or undefined access + if (graphicsInfo->tileTag == 0 && species < NUM_SPECIES) + return &gPokemonObjectGraphics[SPECIES_NONE]; + else if (graphicsInfo->tileTag != TAG_NONE && species >= NUM_SPECIES) + return &gPokemonObjectGraphics[SPECIES_NONE]; + else + return graphicsInfo; } // Find, or load, the palette for the specified pokemon info -static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny) { - u8 paletteNum; +static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) { + u32 paletteNum; // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap - const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; - if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette - LoadCompressedSpritePalette(spritePalette); - paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present - // TODO: Add more glowing pokemon besides Ampharos - // CHARIZARD LINE ? CHINCHOU LANTERN FLAAFY MAREEP UMBREON VOLBEAT ? - UpdateSpritePaletteWithWeather(paletteNum, FALSE); + struct SpritePalette spritePalette = {.tag = shiny ? (species + SPECIES_SHINY_TAG) : species}; + // palette already loaded + if ((paletteNum = IndexOfSpritePaletteTag(spritePalette.tag)) < 16) + return paletteNum; + + // Use matching front sprite's normal/shiny palettes + spritePalette.data = (u16*)((shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species].data); + // Use standalone palette, unless entry is OOB or NULL (fallback to front-sprite-based) + if (species < ARRAY_COUNT(gFollowerPalettes) && gFollowerPalettes[species][shiny & 1]) + spritePalette.data = gFollowerPalettes[species][shiny & 1]; + + // Check if pal data must be decompressed + if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) { + // IsLZ77Data guarantees word-alignment, so casting this is safe + LZ77UnCompWram((u32*)spritePalette.data, gDecompressionBuffer); + spritePalette.data = (void*)gDecompressionBuffer; } + + paletteNum = LoadSpritePalette(&spritePalette); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); return paletteNum; } // Set graphics & sprite for a follower object event by species & shininess. static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny, bool8 doPalette) { - const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - ObjectEventSetGraphics(objEvent, graphicsInfo); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - objEvent->extra.mon.species = species; - objEvent->extra.mon.form = form; - objEvent->extra.mon.shiny = shiny; - if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC && doPalette) { // Use palette from species palette table - struct Sprite *sprite = &gSprites[objEvent->spriteId]; - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - } + const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + ObjectEventSetGraphics(objEvent, graphicsInfo); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + objEvent->extra.mon.species = species; + objEvent->extra.mon.form = form; + objEvent->extra.mon.shiny = shiny; + if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC && doPalette) { // Use palette from species palette table + struct Sprite *sprite = &gSprites[objEvent->spriteId]; + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + } } -// Like FollowerSetGraphics, but does not reposition sprite; intended to be used for mid-movement form changes, etc. -// TODO: Reposition sprite if size changes +// Free a sprite's current tiles and reallocate with a new size +// Used when changing to a gfx info with a larger size +static s16 ReallocSpriteTiles(struct Sprite *sprite, u32 byteSize) { + s16 i; + bool32 wasVisible = sprite->invisible; + sprite->invisible = TRUE; + + i = CopySprite(sprite, sprite->x, sprite->y, 0xFF); + if (i < MAX_SPRITES) { + DestroySprite(&gSprites[i]); + i = AllocSpriteTiles(byteSize / TILE_SIZE_4BPP); + if (i >= 0) { + // Fill the allocated area with zeroes + // To avoid visual glitches if the frame hasn't been copied yet + CpuFastFill16(0, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * i, byteSize); + sprite->oam.tileNum = i; + } + } else { + i = -1; + } + + sprite->invisible = wasVisible; + return i; +} + +// Like FollowerSetGraphics, but does not recenter sprite on a metatile +// Intended to be used for mid-movement form changes, etc. static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { u16 species = objEvent->extra.mon.species; u8 form = objEvent->extra.mon.form; u8 shiny = objEvent->extra.mon.shiny; const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); struct Sprite *sprite = &gSprites[objEvent->spriteId]; - u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + u32 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + + #if LARGE_OW_SUPPORT + // If gfx size changes, we need to reallocate tiles + if (graphicsInfo->oam->size != sprite->oam.size) { + ReallocSpriteTiles(sprite, graphicsInfo->images->size); + // Add difference in Y vectors + sprite->y += -(graphicsInfo->height >> 1) - sprite->centerToCornerVecY; + } + #endif sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; @@ -1865,320 +2003,375 @@ static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) { return TRUE; } -void UpdateFollowingPokemon(void) { // Update following pokemon if any - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Sprite *sprite; - u16 species; - bool8 shiny; - u8 form; - // Avoid spawning large (>32x32) follower pokemon inside buildings - if (GetFollowerInfo(&species, &form, &shiny) && !(gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->height > 32) && !FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) { +void UpdateFollowingPokemon(void) { + // Update following pokemon if any + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Sprite *sprite; + u16 species; + bool8 shiny; + u8 form; + // Don't spawn follower if: + // 1. GetFollowerInfo returns FALSE + // 2. Map is indoors and gfx is larger than 32x32 + // 3. flag is set + if (!GetFollowerInfo(&species, &form, &shiny) || + (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->oam->size > ST_OAM_SIZE_2) || + FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) + { + RemoveFollowingPokemon(); + return; + } + if (objEvent == NULL) { // Spawn follower - struct ObjectEventTemplate template = { - .localId = OBJ_EVENT_ID_FOLLOWER, - .graphicsId = OBJ_EVENT_GFX_OW_MON, - .flagId = 0, - .x = gSaveBlock1Ptr->pos.x, - .y = gSaveBlock1Ptr->pos.y, - // If player active, copy player elevation - .elevation = gObjectEvents[gPlayerAvatar.objectEventId].active ? gObjectEvents[gPlayerAvatar.objectEventId].currentElevation : 3, - .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, - }; - objEvent = &gObjectEvents[SpawnSpecialObjectEvent(&template)]; - objEvent->invisible = TRUE; + u32 objId = gPlayerAvatar.objectEventId; + struct ObjectEventTemplate template = { + .localId = OBJ_EVENT_ID_FOLLOWER, + .graphicsId = OBJ_EVENT_GFX_OW_MON, + .flagId = 0, + .x = gSaveBlock1Ptr->pos.x, + .y = gSaveBlock1Ptr->pos.y, + // If player active, copy player elevation + .elevation = gObjectEvents[objId].active ? gObjectEvents[objId].currentElevation : 3, + .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, + }; + if ((objId = SpawnSpecialObjectEvent(&template)) >= OBJECT_EVENTS_COUNT) + return; + objEvent = &gObjectEvents[objId]; + objEvent->invisible = TRUE; } sprite = &gSprites[objEvent->spriteId]; // Follower appearance changed; move to player and set invisible - if (species != objEvent->extra.mon.species || shiny != objEvent->extra.mon.shiny || form != objEvent->extra.mon.form) { - MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objEvent->invisible = TRUE; + if (species != objEvent->extra.mon.species || + shiny != objEvent->extra.mon.shiny || + form != objEvent->extra.mon.form) + { + MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objEvent->invisible = TRUE; } FollowerSetGraphics(objEvent, species, form, shiny, TRUE); sprite->data[6] = 0; // set animation data objEvent->extra.mon.species = species; objEvent->extra.mon.shiny = shiny; objEvent->extra.mon.form = form; - } else { - RemoveFollowingPokemon(); - } } -void RemoveFollowingPokemon(void) { // Remove follower object. Idempotent. - struct ObjectEvent *objectEvent = GetFollowerObject(); - if (objectEvent == NULL) - return; - RemoveObjectEvent(objectEvent); +// Remove follower object. Idempotent. +void RemoveFollowingPokemon(void) { + struct ObjectEvent *objectEvent = GetFollowerObject(); + if (objectEvent == NULL) + return; + RemoveObjectEvent(objectEvent); } -static bool8 IsFollowerVisible(void) { // Determine whether follower *should* be visible - return - !(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || gWeatherPtr->currWeather == WEATHER_UNDERWATER - || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES); +static bool32 IsFollowerVisible(void) { // Determine whether follower *should* be visible + return + !(TestPlayerAvatarFlags(FOLLOWER_INVISIBLE_FLAGS) + || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) + || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)); } static bool8 SpeciesHasType(u16 species, u8 type) { - return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; + return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; } // Returns a random index according to a list of weights static u8 RandomWeightedIndex(u8 *weights, u8 length) { - u8 i; - u16 random_value; - u16 cum_weight = 0; - for (i = 0; i < length; i++) - cum_weight += weights[i]; - random_value = Random() % cum_weight; - cum_weight = 0; - for (i = 0; i < length; i++) { - cum_weight += weights[i]; - if (random_value <= cum_weight) - return i; - } + u32 i; + u16 random_value; + u16 weightSum = 0; + for (i = 0; i < length; i++) + weightSum += weights[i]; + random_value = Random() % weightSum; + weightSum = 0; + for (i = 0; i < length; i++) { + weightSum += weights[i]; + if (random_value <= weightSum) + return i; + } } -// Pool of "unconditional" follower messages TODO: Should this be elsewhere ? -static const struct FollowerMessagePool followerBasicMessages[] = { - [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, - [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, - [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, - [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, - [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, - [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, - [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, - [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages, EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, - [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, - [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, - [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages, EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, -}; - // Display an emote above an object event // Note that this is not a movement action static void ObjectEventEmote(struct ObjectEvent *objEvent, u8 emotion) { - emotion %= FOLLOWER_EMOTION_LENGTH; - ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - gFieldEffectArguments[7] = emotion; - FieldEffectStart(FLDEFF_EMOTE); + emotion %= FOLLOWER_EMOTION_LENGTH; + ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + gFieldEffectArguments[7] = emotion; + FieldEffectStart(FLDEFF_EMOTE); } // Script-accessible version of the above bool8 ScrFunc_emote(struct ScriptContext *ctx) { - u8 localId = ScriptReadByte(ctx); - u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; - u8 i = GetObjectEventIdByLocalId(localId); - if (i < OBJECT_EVENTS_COUNT) - ObjectEventEmote(&gObjectEvents[i], emotion); - return FALSE; + u8 localId = ScriptReadByte(ctx); + u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; + u8 i = GetObjectEventIdByLocalId(localId); + if (i < OBJECT_EVENTS_COUNT) + ObjectEventEmote(&gObjectEvents[i], emotion); + return FALSE; } -struct SpecialEmote { // Used for storing conditional emotes - u16 index; - u8 emotion; +// Used for storing conditional emotes +struct SpecialEmote { + u16 index; + u8 emotion; }; // Find and return direction of metatile behavior within distance static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) { s32 i; - for (i = y+1; i <= y + distance; i++) + + for (i = y + 1; i <= y + distance; i++) if (MapGridGetMetatileBehaviorAt(x, i) == mb) return DIR_SOUTH; - for (i = y-1; i >= y - distance; i--) + + for (i = y - 1; i >= y - distance; i--) if (MapGridGetMetatileBehaviorAt(x, i) == mb) return DIR_NORTH; - for (i = x+1; i <= x + distance; i++) + + for (i = x + 1; i <= x + distance; i++) if (MapGridGetMetatileBehaviorAt(i, y) == mb) return DIR_EAST; - for (i = x-1; i >= x - distance; i--) + + for (i = x - 1; i >= x - distance; i--) if (MapGridGetMetatileBehaviorAt(i, y) == mb) return DIR_WEST; return DIR_NONE; } +// Check a single follower message condition +bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u32 species, struct ObjectEvent *obj) { + u32 multi; + if (species == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + + switch (cond->type) + { + case MSG_COND_SPECIES: + return (cond->data.raw == species); + case MSG_COND_TYPE: + multi = (SpeciesHasType(species, cond->data.bytes[0]) || + SpeciesHasType(species, cond->data.bytes[1])); + // if bytes[2] == TYPE_NONE, + // invert; check that mon has *neither* type! + if (cond->data.bytes[2] == 0) + return multi; + else + return !multi; + break; + case MSG_COND_STATUS: + return (cond->data.raw & mon->status); + case MSG_COND_MAPSEC: + return (cond->data.raw == gMapHeader.regionMapSectionId); + case MSG_COND_MAP: + return (gSaveBlock1Ptr->location.mapGroup == cond->data.bytes[0] && + gSaveBlock1Ptr->location.mapNum == cond->data.bytes[1]); + case MSG_COND_ON_MB: + return (obj->currentMetatileBehavior == cond->data.bytes[0] || + obj->currentMetatileBehavior == cond->data.bytes[1]); + case MSG_COND_WEATHER: + multi = GetCurrentWeather(); + return (multi == cond->data.bytes[0] || multi == cond->data.bytes[1]); + case MSG_COND_MUSIC: + return (cond->data.raw == GetCurrentMapMusic()); + case MSG_COND_TIME_OF_DAY: + return (cond->data.raw == gTimeOfDay); + case MSG_COND_NEAR_MB: + multi = FindMetatileBehaviorWithinRange( + obj->currentCoords.x, obj->currentCoords.y, + cond->data.bytes[0], cond->data.bytes[1]); + if (multi) + gSpecialVar_Result = multi; + return multi; + case MSG_COND_NONE: + // fallthrough + default: + return TRUE; + } +} + +// Check if follower info can be displayed in the current situation; +// i.e, if all its conditions match +bool32 CheckMsgInfo(const struct FollowerMsgInfoExtended *info, struct Pokemon *mon, u32 species, struct ObjectEvent *obj) { + u32 i; + + // any condition matches + if (info->orFlag) { + for (i = 0; i < ARRAY_COUNT(info->conditions) && info->conditions[i].type; i++) + if (CheckMsgCondition(&info->conditions[i], mon, species, obj)) + return TRUE; + return FALSE; + // all conditions must match + } else { + for (i = 0; i < ARRAY_COUNT(info->conditions) && info->conditions[i].type; i++) + if (!CheckMsgCondition(&info->conditions[i], mon, species, obj)) + return FALSE; + return TRUE; + } +} + // Call an applicable follower message script bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages { - u16 species; - s32 multi, multi2; - struct SpecialEmote cond_emotes[16] = {0}; - u8 emotion, n_choices = 0; - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Pokemon *mon = GetFirstLiveMon(); - u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { - [FOLLOWER_EMOTION_HAPPY] = 10, - [FOLLOWER_EMOTION_NEUTRAL] = 15, - [FOLLOWER_EMOTION_SAD] = 5, - [FOLLOWER_EMOTION_UPSET] = 15, - [FOLLOWER_EMOTION_ANGRY] = 15, - [FOLLOWER_EMOTION_PENSIVE] = 15, - [FOLLOWER_EMOTION_SURPRISE] = 10, // TODO: Scale this with how long the follower has been out? - [FOLLOWER_EMOTION_CURIOUS] = 10, // TODO: Increase this if there is an item nearby? - [FOLLOWER_EMOTION_MUSIC] = 15, - }; - u32 i, j; - bool32 pickedCondition = FALSE; - if (mon == NULL) { - ScriptCall(ctx, EventScript_FollowerLovesYou); - return FALSE; - } - // If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly? - if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) + u32 species; + s32 multi, multi2; + struct SpecialEmote condEmotes[16] = {0}; + u32 condCount = 0; + u32 emotion; + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Pokemon *mon = GetFirstLiveMon(); + u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { + [FOLLOWER_EMOTION_HAPPY] = 10, + [FOLLOWER_EMOTION_NEUTRAL] = 15, + [FOLLOWER_EMOTION_SAD] = 5, + [FOLLOWER_EMOTION_UPSET] = 15, + [FOLLOWER_EMOTION_ANGRY] = 15, + [FOLLOWER_EMOTION_PENSIVE] = 15, + [FOLLOWER_EMOTION_SURPRISE] = 10, + [FOLLOWER_EMOTION_CURIOUS] = 10, + [FOLLOWER_EMOTION_MUSIC] = 15, + }; + u32 i, j; + bool32 pickedCondition = FALSE; + if (mon == NULL) { // failsafe + ScriptCall(ctx, EventScript_FollowerLovesYou); + return FALSE; + } + // Set the script to the very end; we'll be calling another script dynamically ScriptJump(ctx, EventScript_FollowerEnd); - species = GetMonData(mon, MON_DATA_SPECIES); - multi = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (multi > 80) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; - emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; - emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; - emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; - } - if (multi > 170) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; - } - // Conditional messages follow - // Health & status-related - multi = mon->hp * 100 / mon->maxHP; - if (multi < 20) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; - } - if (multi < 50 || mon->status & STATUS1_PARALYSIS) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; - } - // Gym type advantage/disadvantage scripts - if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) { - switch (gMapHeader.regionMapSectionId) - { - case MAPSEC_RUSTBORO_CITY: - case MAPSEC_PEWTER_CITY: - multi = TYPE_ROCK; - break; - case MAPSEC_DEWFORD_TOWN: - multi = TYPE_FIGHTING; - break; - case MAPSEC_MAUVILLE_CITY: - case MAPSEC_VERMILION_CITY: - multi = TYPE_ELECTRIC; - break; - case MAPSEC_LAVARIDGE_TOWN: - case MAPSEC_CINNABAR_ISLAND: - multi = TYPE_FIRE; - break; - case MAPSEC_PETALBURG_CITY: - multi = TYPE_NORMAL; - break; - case MAPSEC_FORTREE_CITY: - multi = TYPE_FLYING; - break; - case MAPSEC_MOSSDEEP_CITY: - case MAPSEC_SAFFRON_CITY: - multi = TYPE_PSYCHIC; - break; - case MAPSEC_SOOTOPOLIS_CITY: - case MAPSEC_CERULEAN_CITY: - multi = TYPE_WATER; - break; - case MAPSEC_CELADON_CITY: - multi = TYPE_GRASS; - break; - case MAPSEC_FUCHSIA_CITY: - multi = TYPE_POISON; - break; - case MAPSEC_VIRIDIAN_CITY: - multi = TYPE_GROUND; - break; - default: - multi = NUMBER_OF_MON_TYPES; + species = GetMonData(mon, MON_DATA_SPECIES); + multi = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (multi > 80) { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; + emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; + emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; + emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; } - if (multi < NUMBER_OF_MON_TYPES) { - multi = GetTypeEffectiveness(mon, multi); - if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; - else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + if (multi > 170) { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; + } + // Special C-based conditions follower + // Weather-related + if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; + // Health & status-related + multi = mon->hp * 100 / mon->maxHP; + if (multi < 20) { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; + } + if (multi < 50 || mon->status & STATUS1_PARALYSIS) { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; + } + // Gym type advantage/disadvantage + if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) { + switch (gMapHeader.regionMapSectionId) + { + case MAPSEC_RUSTBORO_CITY: + case MAPSEC_PEWTER_CITY: + multi = TYPE_ROCK; + break; + case MAPSEC_DEWFORD_TOWN: + multi = TYPE_FIGHTING; + break; + case MAPSEC_MAUVILLE_CITY: + case MAPSEC_VERMILION_CITY: + multi = TYPE_ELECTRIC; + break; + case MAPSEC_LAVARIDGE_TOWN: + case MAPSEC_CINNABAR_ISLAND: + multi = TYPE_FIRE; + break; + case MAPSEC_PETALBURG_CITY: + multi = TYPE_NORMAL; + break; + case MAPSEC_FORTREE_CITY: + multi = TYPE_FLYING; + break; + case MAPSEC_MOSSDEEP_CITY: + case MAPSEC_SAFFRON_CITY: + multi = TYPE_PSYCHIC; + break; + case MAPSEC_SOOTOPOLIS_CITY: + case MAPSEC_CERULEAN_CITY: + multi = TYPE_WATER; + break; + case MAPSEC_CELADON_CITY: + multi = TYPE_GRASS; + break; + case MAPSEC_FUCHSIA_CITY: + multi = TYPE_POISON; + break; + case MAPSEC_VIRIDIAN_CITY: + multi = TYPE_GROUND; + break; + default: + multi = NUMBER_OF_MON_TYPES; + } + if (multi < NUMBER_OF_MON_TYPES) { + multi = GetTypeEffectiveness(mon, multi); + if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; + else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + } } - } - emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); - #ifdef BATTLE_ENGINE - if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) - #else - if (mon->status & STATUS1_PSN_ANY) - #endif - emotion = FOLLOWER_EMOTION_POISONED; - multi = Random() % followerBasicMessages[emotion].length; - // With 50% chance, select special message using reservoir sampling - for (i = (Random() & 1) ? n_choices : 0, j = 1; i < n_choices; i++) { - if (cond_emotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace item with 1/j chance - multi = cond_emotes[i].index; - } - // Match scripted conditional messages - // With 50% chance, try to match scripted conditional messages - for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { - const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; - if (info->stFlags == 1 && species != info->st.species) - continue; - if (info->stFlags == 2 && (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? SpeciesHasType(species, info->st.types.type1) : !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2)))) - continue; - if (info->stFlags == 3 && !(mon->status & info->st.status)) - continue; - if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) - continue; - if (info->mmFlags == 2 && !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup)) - continue; - if (info->mmFlags == 3 && !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || objEvent->currentMetatileBehavior == info->mm.mb.behavior2)) - continue; - if (info->wtFlags == 1 && !(GetCurrentWeather() == info->wt.weather.weather1 || GetCurrentWeather() == info->wt.weather.weather2)) - continue; - if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) - continue; - if (info->wtFlags == 3 && (!MapHasNaturalLight(gMapHeader.mapType) || gTimeOfDay != info->wt.timeOfDay || GetCurrentWeather() >= WEATHER_RAIN)) - continue; - if (info->nearFlags == 1) { - if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) - gSpecialVar_Result = multi2; - else - continue; - } + emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); + #ifdef BATTLE_ENGINE + if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) + #else + if (mon->status & STATUS1_PSN_ANY) + #endif + emotion = FOLLOWER_EMOTION_POISONED; - // replace choice with weight/j chance - if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { - multi = i; - pickedCondition = TRUE; - } - } - if (pickedCondition) { // conditional message was chosen - emotion = gFollowerConditionalMessages[multi].emotion; - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; - // text choices are spread across array; pick a random one - if (gFollowerConditionalMessages[multi].textSpread) { - for (i = 0; i < 4; i++) - if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) - break; - ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; - } - ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : followerBasicMessages[emotion].script); - return FALSE; - } - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) followerBasicMessages[emotion].messages[multi].text; // Load message text - ScriptCall(ctx, followerBasicMessages[emotion].messages[multi].script ? - followerBasicMessages[emotion].messages[multi].script : followerBasicMessages[emotion].script); - return FALSE; -} + // end special conditions -bool8 ScrFunc_followerfly(struct ScriptContext *ctx) { - SetMainCallback2(CB2_OpenFlyMap); - return FALSE; + // roll for basic/unconditional message + multi = Random() % gFollowerBasicMessages[emotion].length; + // (50% chance) Select special condition using reservoir sampling + for (i = (Random() & 1) ? condCount : 0, j = 1; i < condCount; i++) { + if (condEmotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace each item with 1/j chance + multi = condEmotes[i].index; + } + // (50% chance) Match *scripted* conditional messages, from follower_helper.c + for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { + const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; + if (!CheckMsgInfo(info, mon, species, objEvent)) + continue; + + // replace choice with weight/j chance + if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { + multi = i; + pickedCondition = TRUE; + } + } + // condition message was chosen + if (pickedCondition) { + emotion = gFollowerConditionalMessages[multi].emotion; + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; + // text choices are spread across array; pick a random one + if (gFollowerConditionalMessages[multi].textSpread) { + for (i = 0; i < 4; i++) { + if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) + break; + } + ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; + } + ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : gFollowerBasicMessages[emotion].script); + return FALSE; + } + // otherwise, a basic or C-based message was picked + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) gFollowerBasicMessages[emotion].messages[multi].text; // Load message text + ScriptCall(ctx, gFollowerBasicMessages[emotion].messages[multi].script ? + gFollowerBasicMessages[emotion].messages[multi].script : + gFollowerBasicMessages[emotion].script); + return FALSE; } // Sprite callback for light sprites @@ -2412,10 +2605,10 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) spriteFrameImage.size = graphicsInfo->size; CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; - if (spriteTemplate.paletteTag != TAG_NONE) { - LoadObjectEventPalette(spriteTemplate.paletteTag); - } + if (spriteTemplate.paletteTag != TAG_NONE) + LoadObjectEventPalette(spriteTemplate.paletteTag); i = CreateSprite(&spriteTemplate, 0, 0, 0); + if (i != MAX_SPRITES) { sprite = &gSprites[i]; @@ -2436,9 +2629,10 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) sprite->coordOffsetEnabled = TRUE; sprite->sObjEventId = objectEventId; objectEvent->spriteId = i; - if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) { // Set pokemon graphics - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE); - } + + if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) // Set pokemon graphics + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE); + if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); @@ -2470,50 +2664,54 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI // Update sprite's palette, freeing old palette if necessary static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct Sprite * sprite) { - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { - sprite->oam.paletteNum = LoadSpritePalette(spritePalette); - UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); - } else { - sprite->oam.paletteNum = LoadSpritePalette(spritePalette); - } + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { + sprite->oam.paletteNum = LoadSpritePalette(spritePalette); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); + } else { + sprite->oam.paletteNum = LoadSpritePalette(spritePalette); + } - return sprite->oam.paletteNum; + return sprite->oam.paletteNum; } // Find and update based on template's paletteTag -// TODO: Add a better way to associate tags -> palettes besides listing them in sObjectEventSpritePalettes u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate * template, struct Sprite * sprite) { - u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); - if (i == 0xFF) - return i; - return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); + u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); + if (i == 0xFF) + return i; + return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); } // Set graphics *by info* static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct ObjectEventGraphicsInfo *graphicsInfo) { - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); - if (i != 0xFF) - UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = graphicsInfo->images; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + u32 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + if (i != 0xFF) + UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); + + #if LARGE_OW_SUPPORT + // If gfx size changes, we need to reallocate tiles + if (graphicsInfo->oam->size != sprite->oam.size) + ReallocSpriteTiles(sprite, graphicsInfo->images->size); + #endif + + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = graphicsInfo->images; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) @@ -2555,26 +2753,24 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) } static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, u8 berryId, u8 berryStage) { - const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - objectEvent->graphicsId = graphicsId; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } + const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = gBerryTreePicTablePointers[berryId]; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + objectEvent->graphicsId = graphicsId; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } static void get_berry_tree_graphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -3065,9 +3261,8 @@ void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction) static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - if (localId == OBJ_EVENT_ID_FOLLOWER) { - return EventScript_Follower; - } + if (localId == OBJ_EVENT_ID_FOLLOWER) + return EventScript_Follower; return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; } @@ -5037,7 +5232,7 @@ bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *objectEvent, struct Sprit return TRUE; } -static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { +static bool32 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!sprite) return FALSE; SetGpuReg(REG_OFFSET_MOSAIC, 0); @@ -5048,7 +5243,7 @@ static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct return FALSE; } -static bool8 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { +static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u32 multi; if (objectEvent->extra.mon.species == SPECIES_CASTFORM && objectEvent->extra.mon.form != (multi = GetOverworldCastformForm())) { sprite->data[7] = TRANSFORM_TYPE_PERMANENT << 8; @@ -5109,16 +5304,25 @@ movement_type_def(MovementType_FollowPlayer, gMovementTypeFuncs_FollowPlayer) bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - if (!IsFollowerVisible()) { // Shadow player's position - objectEvent->invisible = TRUE; - MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning - return FALSE; + if (!IsFollowerVisible()) { + // Shadow player's position + objectEvent->invisible = TRUE; + MoveObjectEventToMapCoords( + objectEvent, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y + ); + objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning + return FALSE; } // Move follower to player, in case we end up in the shadowing state for only 1 frame // This way the player cannot talk to the invisible follower before it appears if (objectEvent->invisible) { - MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + MoveObjectEventToMapCoords( + objectEvent, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y + ); objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning } sprite->sTypeFuncId = 1; // Enter active state; if the player moves the follower will appear @@ -5128,7 +5332,8 @@ bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct S bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!IsFollowerVisible()) { - if (objectEvent->invisible) { // Return to shadowing state + if (objectEvent->invisible) { + // Return to shadowing state sprite->sTypeFuncId = 0; return FALSE; } @@ -5139,7 +5344,6 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S sprite->sTypeFuncId = 2; // movement action sets state to 0 return TRUE; } - // TODO: Remove dependence on PlayerGetCopyableMovement return gFollowPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL); } @@ -5154,36 +5358,29 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { #endif objectEvent->singleMovementActive = 0; - if (sprite->sTypeFuncId) { // restore nonzero state + if (sprite->sTypeFuncId) // restore nonzero state sprite->sTypeFuncId = 1; - } } else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) { UpdateFollowerTransformEffect(objectEvent, sprite); - #if OW_MON_BOBBING == TRUE - if ((sprite->data[5] & 7) == 2) + if (OW_MON_BOBBING == TRUE && (sprite->data[5] & 7) == 2) sprite->y2 ^= -1; - #endif } return FALSE; } bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { - if (!objectEvent->singleMovementActive) - { // walk in place + if (!objectEvent->singleMovementActive) { + // walk in place ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); sprite->sTypeFuncId = 1; objectEvent->singleMovementActive = 1; return TRUE; - } - else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { // finish movement action + } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { + // finish movement action objectEvent->singleMovementActive = 0; - } - #if OW_MON_BOBBING == TRUE - else if ((sprite->data[3] & 7) == 2) + } else if (OW_MON_BOBBING == TRUE && (sprite->data[3] & 7) == 2) sprite->y2 ^= -1; - #endif UpdateFollowerTransformEffect(objectEvent, sprite); return FALSE; } @@ -5204,29 +5401,30 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; - if ((x == targetX && y == targetY) || !IsFollowerVisible()) { // don't move on player collision or if not visible - return FALSE; - } + if ((x == targetX && y == targetY) || !IsFollowerVisible()) // don't move on player collision or if not visible + return FALSE; + x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; ClearObjectEventMovement(objectEvent, sprite); - if (objectEvent->invisible) { // Animate exiting pokeball - // Player is jumping, but follower is invisible - if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { - sprite->sTypeFuncId = 0; // return to shadowing state + if (objectEvent->invisible) { + // Animate exiting pokeball + // Player is jumping, but follower is invisible + if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { + sprite->sTypeFuncId = 0; // return to shadowing state + return FALSE; + } + MoveObjectEventToMapCoords(objectEvent, targetX, targetY); + ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); + objectEvent->singleMovementActive = 1; + sprite->sTypeFuncId = 2; + if (OW_MON_BOBBING == TRUE) + sprite->y2 = 0; + return TRUE; + } else if (x == targetX && y == targetY) { + // don't move if already in the player's last position return FALSE; - } - MoveObjectEventToMapCoords(objectEvent, targetX, targetY); - ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); - objectEvent->singleMovementActive = 1; - sprite->sTypeFuncId = 2; - #if OW_MON_BOBBING == TRUE - sprite->y2 = 0; - #endif - return TRUE; - } else if (x == targetX && y == targetY) { // don't move if already in the player's last position - return FALSE; } // Follow player @@ -5234,40 +5432,41 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri MoveCoords(direction, &x, &y); #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE // https://github.com/ghoulslash/pokeemerald/tree/sideways_stairs GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs - if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) // InitJumpRegular will set the proper speed + if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) { + // InitJumpRegular will set the proper speed ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // Set follow speed according to player's speed + } else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { + // Set follow speed according to player's speed if (playerAction >= MOVEMENT_ACTION_RUN_DOWN_SLOW && playerAction <= MOVEMENT_ACTION_RUN_RIGHT_SLOW) objectEvent->movementActionId = GetWalkNormalMovementAction(direction); else objectEvent->movementActionId = GetWalkFastMovementAction(direction); - } else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); } else { - if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT) + if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - else { + } else { objectEvent->movementActionId = GetWalkNormalMovementAction(direction); - #if OW_MON_BOBBING == TRUE - sprite->y2 = -1; - #endif + if (OW_MON_BOBBING == TRUE) + sprite->y2 = -1; } } sprite->sActionFuncId = 0; #else - if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) // InitJumpRegular will set the proper speed + if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) { + // InitJumpRegular will set the proper speed ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) // Set follow speed according to player's speed + } else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { + // Set follow speed according to player's speed ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction)); - // If *player* jumps, make step take twice as long - else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) + } else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { + // If *player* jumps, make step take twice as long ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - else { + } else { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); - #if OW_MON_BOBBING == TRUE - sprite->y2 = -1; - #endif + if (OW_MON_BOBBING == TRUE) + sprite->y2 = -1; } #endif objectEvent->singleMovementActive = 1; @@ -5702,7 +5901,7 @@ bool8 ScrFunc_IsFollowerFieldMoveUser(struct ScriptContext *ctx) { if (follower && obj && !obj->invisible) { u16 followIndex = ((u32)follower - (u32)gPlayerParty) / sizeof(struct Pokemon); *var = userIndex == followIndex; - } else + } return FALSE; } @@ -6822,26 +7021,51 @@ bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, // Update sprite with a palette filled with a solid color static u8 LoadFillColorPalette(u16 color, u16 paletteTag, struct Sprite *sprite) { - u16 paletteData[16]; - struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; - CpuFill16(color, paletteData, PLTT_SIZE_4BPP); - return UpdateSpritePalette(&dynamicPalette, sprite); + u16 paletteData[16]; + struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; + CpuFill16(color, paletteData, PLTT_SIZE_4BPP); + return UpdateSpritePalette(&dynamicPalette, sprite); } +static void ObjectEventSetPokeballGfx(struct ObjectEvent *objEvent) { + #if OW_MON_POKEBALLS + u32 ball = BALL_POKE; + if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER) { + struct Pokemon *mon = GetFirstLiveMon(); + if (mon) + ball = ItemIdToBallId(GetMonData(mon, MON_DATA_POKEBALL)); + } + + if (ball != BALL_POKE && ball < POKEBALL_COUNT) { + const struct ObjectEventGraphicsInfo *info = &gPokeballGraphics[ball]; + if (info->tileTag == TAG_NONE) { + ObjectEventSetGraphics(objEvent, info); + return; + } + } + #endif + ObjectEventSetGraphicsId(objEvent, OBJ_EVENT_GFX_ANIMATED_BALL); +} + +#define sDuration data[3] +#define sSpeedFlip data[6] + bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; + u32 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; objectEvent->invisible = FALSE; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // If player is dashing, the pokemon must come out faster - StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction) + 4); - sprite->data[3] = 8; // duration - sprite->data[6] = 0; // fast speed + StartSpriteAnimInDirection(objectEvent, sprite, direction, GetJumpSpecialDirectionAnimNum(direction)); + sprite->sDuration = 8; + sprite->sSpeedFlip = 0; // fast speed } else { StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction)); - sprite->data[3] = 16; // duration - sprite->data[6] = 1; // slow speed + sprite->sDuration = 16; + sprite->sSpeedFlip = 1; // normal speed } - sprite->data[6] |= (direction == DIR_EAST ? 1 : 0) << 4; - ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL); + // If mon's right-facing sprite is h-flipped, we need to use a different affine anim + if (direction == DIR_EAST && sprite->anims[ANIM_STD_FACE_EAST]->frame.hFlip) + sprite->sSpeedFlip |= 1 << 4; + ObjectEventSetPokeballGfx(objectEvent); objectEvent->inanimate = FALSE; return MovementAction_ExitPokeball_Step1(objectEvent, sprite); } @@ -6892,32 +7116,30 @@ static const union AffineAnimCmd *const sAffineAnims_PokeballFollower[] = bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 duration = sprite->data[6] & 0xF; - sprite->data[3]--; - if (sprite->data[3] == 0) + // for different speeds, anim steps occur on different frame #s + u32 animStepFrame = (sprite->sSpeedFlip & 1) ? 7 : 3; // 0 -> 3, 1 -> 7 + if (--sprite->sDuration == 0) { sprite->sActionFuncId = 2; sprite->animCmdIndex = 0; sprite->animPaused = TRUE; return TRUE; // Set graphics, palette, and affine animation - } else if ((duration == 0 && sprite->data[3] == 3) || (duration == 1 && sprite->data[3] == 7)) { + } else if (sprite->sDuration == animStepFrame) { FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE); LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); // Initialize affine animation sprite->affineAnims = sAffineAnims_PokeballFollower; #if LARGE_OW_SUPPORT - if (IS_POW_OF_TWO(-sprite->centerToCornerVecX)) { - #endif - sprite->affineAnims = sAffineAnims_PokeballFollower; - sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, sprite->data[6] >> 4); - #if LARGE_OW_SUPPORT - } + if (!IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + return FALSE; #endif + sprite->affineAnims = sAffineAnims_PokeballFollower; + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, sprite->sSpeedFlip >> 4); // Restore original palette & disable affine - } else if ((duration == 0 && sprite->data[3] == 1) || (duration == 1 && sprite->data[3] == 3)) { + } else if (sprite->sDuration == (animStepFrame >> 1)) { sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; @@ -6927,40 +7149,41 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct } bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 direction = objectEvent->facingDirection; + u32 direction = objectEvent->facingDirection; StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction)); - sprite->data[3] = 16; // duration - sprite->data[6] = direction == DIR_EAST ? 3 : 2; // affine animation number + sprite->sDuration = 16; + // If mon's right-facing sprite is h-flipped, we need to use a different affine anim + if (direction == DIR_EAST && sprite->anims[ANIM_STD_FACE_EAST]->frame.hFlip) + sprite->sSpeedFlip = 3; + else + sprite->sSpeedFlip = 2; EndFollowerTransformEffect(objectEvent, sprite); return MovementAction_EnterPokeball_Step1(objectEvent, sprite); } bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sprite->data[3]--; - if (sprite->data[3] == 0) { - sprite->data[2] = 2; + if (--sprite->sDuration == 0) { + sprite->sActionFuncId = 2; return FALSE; - } else if (sprite->data[3] == 11) { // Set palette to white & start affine + } else if (sprite->sDuration == 11) { // Set palette to white & start affine LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); + sprite->subspriteTableNum = 0; #if LARGE_OW_SUPPORT // Only do affine if sprite width is power of 2 // (effect looks weird on sprites composed of subsprites like 48x48, etc) - if (IS_POW_OF_TWO(-sprite->centerToCornerVecX)) { + if (!IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + return FALSE; #endif - sprite->affineAnims = sAffineAnims_PokeballFollower; - sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, sprite->data[6]); - #if LARGE_OW_SUPPORT - } - #endif - sprite->subspriteTableNum = 0; - } else if (sprite->data[3] == 7) { // Free white palette and change to pokeball, disable affine + sprite->affineAnims = sAffineAnims_PokeballFollower; + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, sprite->sSpeedFlip); + } else if (sprite->sDuration == 7) { // Free white palette and change to pokeball, disable affine sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL); + ObjectEventSetPokeballGfx(objectEvent); objectEvent->inanimate = FALSE; } return FALSE; @@ -6970,12 +7193,15 @@ bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct { FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE); objectEvent->invisible = TRUE; - sprite->data[1] = 0; - sprite->data[6] = 0; + sprite->sTypeFuncId = 0; + sprite->sSpeedFlip = 0; sprite->animPaused = TRUE; return TRUE; } +#undef sDuration +#undef sSpeedFlip + bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); @@ -8982,19 +9208,16 @@ static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, return; ObjectEventUpdateElevation(objEvent, sprite); - #if LARGE_OW_SUPPORT if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER) { + #if LARGE_OW_SUPPORT // keep subspriteMode synced with player's // so that it disappears under bridges when they do sprite->subspriteMode |= gSprites[gPlayerAvatar.spriteId].subspriteMode & SUBSPRITES_IGNORE_PRIORITY; + #endif + // if transitioning between elevations, use the player's elevation if (!objEvent->currentElevation) objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; } - #else - // if transitioning between elevations, use the player's elevation - if (!objEvent->currentElevation && objEvent->localId == OBJ_EVENT_ID_FOLLOWER) - objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - #endif sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation]; sprite->oam.priority = sElevationToPriority[objEvent->previousElevation]; @@ -9375,7 +9598,7 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S }; static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) { - SetUpShadow(objEvent, sprite); + SetUpShadow(objEvent, sprite); } static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) diff --git a/src/field_effect.c b/src/field_effect.c index 0df3697696..6342b43dfc 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3082,7 +3082,7 @@ static void SurfFieldEffect_End(struct Task *task) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); if (followerObject) - ObjectEventClearHeldMovementIfFinished(followerObject); + ObjectEventClearHeldMovementIfFinished(followerObject); SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); UnfreezeObjectEvents(); UnlockPlayerFieldControls(); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 27dccbb13f..70f0db7f1b 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -55,10 +55,10 @@ u32 FldEff_Shadow(void); #define sIsStillReflection data[7] void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - gFieldEffectArguments[0] = objectEvent->localId; - gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; - gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; - FldEff_Shadow(); + gFieldEffectArguments[0] = objectEvent->localId; + gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; + gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; + FldEff_Shadow(); } void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) @@ -328,14 +328,14 @@ u32 FldEff_Shadow(void) u8 spriteId; s32 i; for (i = MAX_SPRITES - 1; i > -1; i--) { // Search backwards, because of CreateSpriteAtEnd - // Return early if a shadow sprite already exists - if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) - return 0; + // Return early if a shadow sprite already exists + if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) + return 0; } objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all - return 0; + return 0; LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94 + 1); // higher = farther back; shadows should be behind object events if (spriteId != MAX_SPRITES) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index c3a34bc60f..65cc57bbbd 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -687,9 +687,10 @@ static void Task_DoDoorWarp(u8 taskId) FreezeObjectEvents(); PlayerGetDestCoords(x, y); PlaySE(GetDoorSoundEffect(*x, *y - 1)); - if (followerObject) { // Put follower into pokeball - ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); - ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); + if (followerObject) { + // Put follower into pokeball + ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); + ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); } task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); task->tState = 1; diff --git a/src/follower_helper.c b/src/follower_helper.c index af45565848..1eb990b2e9 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -80,241 +80,236 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT .text = (u8*)sCelebiTexts, .textSpread = 1, .script = EventScript_FollowerDance, - .st = {.species = SPECIES_CELEBI}, - .stFlags = ST_FLAGS_SPECIES, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_SPECIES(SPECIES_CELEBI)}, }, [COND_MSG_FIRE] = { .text = (u8*)sFireTexts, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_FIRE}}, - .stFlags = ST_FLAGS_TYPE, - .emotion = FOLLOWER_EMOTION_NEUTRAL, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_TYPES(TYPE_FIRE, TYPE_FIRE)}, }, [COND_MSG_EVER_GRANDE] = { .text = sCondMsg06, .script = EventScript_FollowerFaceUp, - .mm = {.map = {.mapNum = MAP_NUM(EVER_GRANDE_CITY), .mapGroup = MAP_GROUP(EVER_GRANDE_CITY)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_HAPPY, + .conditions = {MATCH_MAP(EVER_GRANDE_CITY)}, }, [COND_MSG_ROUTE_112] = { .text = sCondMsg07, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE112), .mapGroup = MAP_GROUP(ROUTE112)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_HAPPY, + .conditions = {MATCH_MAP(ROUTE112)}, }, [COND_MSG_DAY_CARE] = { .text = sCondMsg08, .script = EventScript_FollowerNostalgia, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE117_POKEMON_DAY_CARE), .mapGroup = MAP_GROUP(ROUTE117_POKEMON_DAY_CARE)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_MAP(ROUTE117_POKEMON_DAY_CARE)}, }, [COND_MSG_MART] = { .text = (u8*)sShopTexts, .textSpread = 1, .script = EventScript_FollowerLookAround, - .wt = {.song = MUS_POKE_MART}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_MUSIC(MUS_POKE_MART)}, }, [COND_MSG_VICTORY_ROAD] = { .text = sCondMsg11, - .wt = {.song = MUS_VICTORY_ROAD}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MUSIC(MUS_VICTORY_ROAD)}, }, [COND_MSG_BIKE_SHOP] = { .text = sCondMsg12, - .mm = {.map = {.mapNum = MAP_NUM(MAUVILLE_CITY_BIKE_SHOP), .mapGroup = MAP_GROUP(MAUVILLE_CITY_BIKE_SHOP)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MAP(MAUVILLE_CITY_BIKE_SHOP)}, }, [COND_MSG_MACHINES] = { .text = (u8*)sMachineTexts, - .mm = {.map = {.mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE), .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE)}}, - .mmFlags = MM_FLAGS_MAP, - .emotion = FOLLOWER_EMOTION_MUSIC, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .orFlag = 1, // match any of these maps + .conditions = { + MATCH_MAP(NEW_MAUVILLE_INSIDE), + MATCH_MAP(SLATEPORT_CITY_STERNS_SHIPYARD_1F), + MATCH_MAP(SLATEPORT_CITY_STERNS_SHIPYARD_2F), + } }, [COND_MSG_SAILING] = { .text = (u8*)sBoatTexts, - .script = EventScript_FollowerLookAround, - .wt = {.song = MUS_SAILING}, - .wtFlags = WT_FLAGS_MUSIC, - .emotion = FOLLOWER_EMOTION_MUSIC, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .script = EventScript_FollowerLookAround, + .conditions = {MATCH_MUSIC(MUS_SAILING)}, }, [COND_MSG_PUDDLE] = { .text = sCondMsg18, .script = EventScript_FollowerHopping, - .mm = {.mb = {.behavior1 = MB_SHALLOW_WATER, .behavior2 = MB_PUDDLE}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SHALLOW_WATER, MB_PUDDLE)}, }, [COND_MSG_SAND] = { .text = sCondMsg19, - .mm = {.mb = {.behavior1 = MB_SAND, .behavior2 = MB_DEEP_SAND}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SAND, MB_DEEP_SAND)}, }, [COND_MSG_GRASS] = { .text = sCondMsg20, - .mm = {.mb = {.behavior1 = MB_TALL_GRASS, .behavior2 = MB_LONG_GRASS}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_TALL_GRASS, MB_LONG_GRASS)}, }, [COND_MSG_FOOTPRINTS] = { .text = sCondMsg21, - .mm = {.mb = {.behavior1 = MB_SAND, .behavior2 = MB_FOOTPRINTS}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SAND, MB_FOOTPRINTS)}, }, [COND_MSG_ELEVATOR] = { .text = (u8*)sElevatorTexts, .textSpread = 1, - .mm = {.map = {.mapNum = MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR), .mapGroup = MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR)}, }, [COND_MSG_ICE_ROOM] = { .text = (u8*)sColdTexts, .textSpread = 1, - .mm = {.map = {.mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM)}, }, [COND_MSG_ROUTE_117] = { .text = sCondMsg27, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE117), .mapGroup = MAP_GROUP(ROUTE117)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(ROUTE117)}, }, [COND_MSG_DRAGON_GROWL] = { .text = sCondMsg28, - .st = {.types = {.type1 = TYPE_DRAGON, .type2 = TYPE_DRAGON}}, - .stFlags = ST_FLAGS_TYPE, - .mm = {.mapSec = {.mapSec = MAPSEC_SKY_PILLAR}}, - .mmFlags = MM_FLAGS_MAPSEC, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_TYPES(TYPE_DRAGON, TYPE_DRAGON), + MATCH_MAPSEC(MAPSEC_SKY_PILLAR), + } }, [COND_MSG_FEAR] = { .text = (u8*)sFearTexts, .textSpread = 1, - .st = {.types = {.type1 = TYPE_GHOST, .type2 = TYPE_NOT_TYPE1}}, - .stFlags = ST_FLAGS_TYPE, - .mm = {.mapSec = {.mapSec = MAPSEC_MT_PYRE}}, - .mmFlags = MM_FLAGS_MAPSEC, - .wt = {.song = MUS_MT_PYRE}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_NOT_TYPES(TYPE_GHOST, TYPE_GHOST), + MATCH_MAPSEC(MAPSEC_MT_PYRE), + MATCH_MUSIC(MUS_MT_PYRE), + } }, [COND_MSG_FIRE_RAIN] = { .text = sCondMsg31, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_FIRE}}, - .stFlags = ST_FLAGS_TYPE, - .wt = {.weather = {.weather1 = WEATHER_RAIN, .weather2 = WEATHER_RAIN_THUNDERSTORM}}, - .wtFlags = WT_FLAGS_WEATHER, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_TYPES(TYPE_FIRE, TYPE_FIRE), + MATCH_WEATHER(WEATHER_RAIN, WEATHER_RAIN_THUNDERSTORM), + } }, [COND_MSG_FROZEN] = { .text = sCondMsg32, - .st = {.status = STATUS1_FREEZE}, - .stFlags = ST_FLAGS_STATUS, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_STATUS(STATUS1_FREEZE), + } }, [COND_MSG_SEASIDE] = { .text = (u8*)sSeaTexts, .textSpread = 1, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_OCEAN_WATER, .distance = 5}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_NEAR_MB(MB_OCEAN_WATER, 5)}, }, [COND_MSG_WATERFALL] = { .text = sCondMsg36, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_WATERFALL, .distance = 5}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_NEAR_MB(MB_WATERFALL, 5)}, }, [COND_MSG_RAIN] = { .text = sCondMsg37, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_NOT_TYPE1}}, - .stFlags = ST_FLAGS_TYPE, - .wt = {.weather = {.weather1 = WEATHER_RAIN, .weather2 = WEATHER_RAIN_THUNDERSTORM}}, - .wtFlags = WT_FLAGS_WEATHER, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = { + MATCH_NOT_TYPES(TYPE_FIRE, TYPE_FIRE), + MATCH_WEATHER(WEATHER_RAIN, WEATHER_RAIN_THUNDERSTORM) + } }, [COND_MSG_REFLECTION] = { .text = sCondMsg38, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_POND_WATER, .distance = 1}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_NEAR_MB(MB_POND_WATER, 1)}, }, [COND_MSG_LEAVES] = { .text = sCondMsg39, - .mm = {.mapSec = {.mapSec = MAPSEC_PETALBURG_WOODS}}, - .mmFlags = MM_FLAGS_MAPSEC, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MAPSEC(MAPSEC_PETALBURG_WOODS)}, }, [COND_MSG_ICE] = { .text = (u8*)sIceTexts, .textSpread = 1, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_ICE, .distance = 1}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_NEAR_MB(MB_ICE, 1)}, }, [COND_MSG_BURN] = { .text = sCondMsg42, - .st = {.status = STATUS1_BURN}, - .stFlags = ST_FLAGS_STATUS, .emotion = FOLLOWER_EMOTION_SAD, + .conditions = {MATCH_STATUS(STATUS1_BURN)}, }, [COND_MSG_DAY] = { .text = (u8*)sDayTexts, .textSpread = 1, - .wt = {.timeOfDay = TIME_OF_DAY_DAY}, - .wtFlags = 3, // time .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_TIME_OF_DAY(TIME_OF_DAY_DAY)}, }, [COND_MSG_NIGHT] = { .text = (u8*)sNightTexts, .textSpread = 1, - .wt = {.timeOfDay = TIME_OF_DAY_NIGHT}, - .wtFlags = 3, // time .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_TIME_OF_DAY(TIME_OF_DAY_NIGHT)}, }, }; + +// Pool of "unconditional" follower messages +const struct FollowerMessagePool gFollowerBasicMessages[FOLLOWER_EMOTION_LENGTH] = { + [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, + [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, + [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, + [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, + [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, + [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, + [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, + [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages, EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, + [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, + [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, + [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages, EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, +}; diff --git a/src/main.c b/src/main.c index d4831b0e24..5f12a2996e 100644 --- a/src/main.c +++ b/src/main.c @@ -441,13 +441,3 @@ void ClearPokemonCrySongs(void) { CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); } - -// TODO: Needs to be updated if compiling for a different processor than the GBA's -bool8 IsAccurateGBA(void) { // tests to see whether running on either an accurate emulator in >=2020, or real hardware - u32 code[5] = {0xFF1EE12F, 0xE1DF00B0, 0xE12FFF1E, 0xAAAABBBB, 0xCCCCDDDD}; // ARM: _;ldrh r0, [pc];bx lr - u32 func = (u32) &code[0]; - if (func & 3) // not word aligned; safer to just return false here - return FALSE; - func = (func & ~3) | 0x2; // misalign PC to test PC-relative loading - return ((u32 (*)(void)) func)() == code[3] >> 16; -} diff --git a/src/overworld.c b/src/overworld.c index b26a4af741..507caad778 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -206,7 +206,6 @@ EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; - static const struct WarpData sDummyWarpData = { .mapGroup = MAP_GROUP(UNDEFINED), @@ -1630,8 +1629,8 @@ void CB2_Overworld(void) SetVBlankCallback(NULL); OverworldBasic(); if (fading) { - SetFieldVBlankCallback(); - return; + SetFieldVBlankCallback(); + return; } } @@ -2112,9 +2111,9 @@ static bool32 ReturnToFieldLocal(u8 *state) ResumeMap(FALSE); InitObjectEventsReturnToField(); if (gFieldCallback == FieldCallback_Fly) - RemoveFollowingPokemon(); + RemoveFollowingPokemon(); else - UpdateFollowingPokemon(); + UpdateFollowingPokemon(); SetCameraToTrackPlayer(); (*state)++; break; @@ -2130,6 +2129,7 @@ static bool32 ReturnToFieldLocal(u8 *state) case 3: return TRUE; } + return FALSE; } diff --git a/src/palette.c b/src/palette.c index 6bb4486372..0093a4bf69 100644 --- a/src/palette.c +++ b/src/palette.c @@ -483,7 +483,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) return PALETTE_FADE_STATUS_DONE; if (IsSoftwarePaletteFadeFinishing()) - return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; + return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; if (!gPaletteFade.objPaletteToggle) { @@ -512,15 +512,14 @@ static u8 UpdateTimeOfDayPaletteFade(void) // First pply TOD blend to relevant subset of palettes if (gPaletteFade.objPaletteToggle) { // Sprite palettes, don't blend those with tags - u8 i; - u16 j = 1; - for (i = 0; i < 16; i++, j <<= 1) { // Mask out palettes that should not be light blended - if ((selectedPalettes & j) && !(GetSpritePaletteTagByPaletteNum(i) >> 15)) - timePalettes |= j; - } - + u32 i; + u32 j = 1; + for (i = 0; i < 16; i++, j <<= 1) { // Mask out palettes that should not be light blended + if ((selectedPalettes & j) && !(GetSpritePaletteTagByPaletteNum(i) >> 15)) + timePalettes |= j; + } } else { // tile palettes, don't blend [13, 15] - timePalettes = selectedPalettes & 0x1FFF; + timePalettes = selectedPalettes & 0x1FFF; } TimeMixPalettes(timePalettes, src, dst, gPaletteFade.bld0, gPaletteFade.bld1, gPaletteFade.weight); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 911f1285dc..642b176d6b 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3360,36 +3360,23 @@ static void PrintRibbonCount(void) PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_RIBBON_COUNT), text, x, 1, 0, 0); } -// Based on https://www.pokecommunity.com/showpost.php?p=10024409&postcount=21 -static void BufferStat(u8 *dst, s8 natureMod, u32 stat, u32 strId, u32 n) { - static const u8 textNatureMinus[] = _("{COLOR_HIGHLIGHT_SHADOW}{BLUE}{TRANSPARENT}{07}"); // Blue - static const u8 textNaturePlus[] = _("{COLOR_HIGHLIGHT_SHADOW}{05}{TRANSPARENT}{06}"); // Red - static const u8 textNatureNone[] = _("{COLOR_HIGHLIGHT_SHADOW}{01}{TRANSPARENT}{DARK_GRAY}"); // Black - u8 *txtPtr; - if (natureMod == 0) - txtPtr = StringCopy(dst, textNatureNone); - else if (natureMod > 0) - txtPtr = StringCopy(dst, textNaturePlus); - else - txtPtr = StringCopy(dst, textNatureMinus); - - ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(strId, dst); -} - static void BufferLeftColumnStats(void) { - u8 *currentHPString = Alloc(20); - u8 *maxHPString = Alloc(20); - u8 *attackString = Alloc(20); - u8 *defenseString = Alloc(20); - const s8 *natureMod = gNatureStatTable[sMonSummaryScreen->summary.nature]; + u8 *currentHPString = Alloc(8); + u8 *maxHPString = Alloc(8); + u8 *attackString = Alloc(8); + u8 *defenseString = Alloc(8); + + ConvertIntToDecimalStringN(currentHPString, sMonSummaryScreen->summary.currentHP, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(maxHPString, sMonSummaryScreen->summary.maxHP, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(attackString, sMonSummaryScreen->summary.atk, STR_CONV_MODE_RIGHT_ALIGN, 7); + ConvertIntToDecimalStringN(defenseString, sMonSummaryScreen->summary.def, STR_CONV_MODE_RIGHT_ALIGN, 7); DynamicPlaceholderTextUtil_Reset(); - BufferStat(currentHPString, 0, sMonSummaryScreen->summary.currentHP, 0, 3); - BufferStat(maxHPString, 0, sMonSummaryScreen->summary.maxHP, 1, 3); - BufferStat(attackString, natureMod[STAT_ATK - 1], sMonSummaryScreen->summary.atk, 2, 7); - BufferStat(defenseString, natureMod[STAT_DEF - 1], sMonSummaryScreen->summary.def, 3, 7); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, currentHPString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, maxHPString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, attackString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, defenseString); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsLeftColumnLayout); Free(currentHPString); @@ -3405,12 +3392,14 @@ static void PrintLeftColumnStats(void) static void BufferRightColumnStats(void) { - const s8 *natureMod = gNatureStatTable[sMonSummaryScreen->summary.nature]; + ConvertIntToDecimalStringN(gStringVar1, sMonSummaryScreen->summary.spatk, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, sMonSummaryScreen->summary.spdef, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar3, sMonSummaryScreen->summary.speed, STR_CONV_MODE_RIGHT_ALIGN, 3); DynamicPlaceholderTextUtil_Reset(); - BufferStat(gStringVar1, natureMod[STAT_SPATK - 1], sMonSummaryScreen->summary.spatk, 0, 3); - BufferStat(gStringVar2, natureMod[STAT_SPDEF - 1], sMonSummaryScreen->summary.spdef, 1, 3); - BufferStat(gStringVar3, natureMod[STAT_SPEED - 1], sMonSummaryScreen->summary.speed, 2, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar3); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsRightColumnLayout); } diff --git a/src/scrcmd.c b/src/scrcmd.c index 0504c19e16..bd0d35737f 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1019,13 +1019,14 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) } ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; - if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { // Force follower into pokeball - objEvent = GetFollowerObject(); - // return early if no follower or in shadowing state - if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) - return FALSE; - ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); + // Force follower into pokeball + if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { + objEvent = GetFollowerObject(); + // return early if no follower or in shadowing state + if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) + return FALSE; + ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); + ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); } return FALSE; } @@ -2081,11 +2082,11 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) return FALSE; } -bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) +bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) { - u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); - PlayCry_Script(species, 0); - return FALSE; + u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); + PlayCry_Script(species, 0); + return FALSE; } bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) diff --git a/src/shop.c b/src/shop.c index 23699f07ba..5793bcd5e5 100644 --- a/src/shop.c +++ b/src/shop.c @@ -867,7 +867,10 @@ 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_OW_MON && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) + if (objEventId != OBJECT_EVENTS_COUNT + && !(gObjectEvents[objEventId].active + && gObjectEvents[objEventId].graphicsId == OBJ_EVENT_GFX_OW_MON + && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) { sShopData->viewportObjects[numObjects][OBJ_EVENT_ID] = objEventId; sShopData->viewportObjects[numObjects][X_COORD] = x; diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index b185e87048..a25eaa5fb0 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -339,7 +339,7 @@ u16 FreeAndDestroyMonPicSprite(u16 spriteId) u16 FreeAndDestroyMonPicSpriteNoPalette(u16 spriteId) { - return FreeAndDestroyPicSpriteInternal(spriteId, FALSE); + return FreeAndDestroyPicSpriteInternal(spriteId, FALSE); } static u16 UNUSED LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) diff --git a/src/trainer_see.c b/src/trainer_see.c index 5136a3931a..b118fc9d00 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -152,101 +152,112 @@ static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] = static const struct SpriteFrameImage sSpriteImageTable_Emotes[] = { - { .data = (u8 *)sEmotion_Gfx+0*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+1*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+2*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+3*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+4*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+5*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+6*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+7*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+8*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+9*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+10*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+11*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+12*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+13*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+14*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+15*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+16*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+17*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+18*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+19*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+20*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED - { .data = (u8 *)sEmotion_Gfx+21*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED + overworld_frame(sEmotion_Gfx, 2, 2, 0), // FOLLOWER_EMOTION_HAPPY + overworld_frame(sEmotion_Gfx, 2, 2, 1), // FOLLOWER_EMOTION_HAPPY + overworld_frame(sEmotion_Gfx, 2, 2, 2), // FOLLOWER_EMOTION_NEUTRAL + overworld_frame(sEmotion_Gfx, 2, 2, 3), // FOLLOWER_EMOTION_NEUTRAL + overworld_frame(sEmotion_Gfx, 2, 2, 4), // FOLLOWER_EMOTION_SAD + overworld_frame(sEmotion_Gfx, 2, 2, 5), // FOLLOWER_EMOTION_SAD + overworld_frame(sEmotion_Gfx, 2, 2, 6), // FOLLOWER_EMOTION_UPSET + overworld_frame(sEmotion_Gfx, 2, 2, 7), // FOLLOWER_EMOTION_UPSET + overworld_frame(sEmotion_Gfx, 2, 2, 8), // FOLLOWER_EMOTION_ANGRY + overworld_frame(sEmotion_Gfx, 2, 2, 9), // FOLLOWER_EMOTION_ANGRY + overworld_frame(sEmotion_Gfx, 2, 2, 10), // FOLLOWER_EMOTION_PENSIVE + overworld_frame(sEmotion_Gfx, 2, 2, 11), // FOLLOWER_EMOTION_PENSIVE + overworld_frame(sEmotion_Gfx, 2, 2, 12), // FOLLOWER_EMOTION_LOVE + overworld_frame(sEmotion_Gfx, 2, 2, 13), // FOLLOWER_EMOTION_LOVE + overworld_frame(sEmotion_Gfx, 2, 2, 14), // FOLLOWER_EMOTION_SURPRISE + overworld_frame(sEmotion_Gfx, 2, 2, 15), // FOLLOWER_EMOTION_SURPRISE + overworld_frame(sEmotion_Gfx, 2, 2, 16), // FOLLOWER_EMOTION_CURIOUS + overworld_frame(sEmotion_Gfx, 2, 2, 17), // FOLLOWER_EMOTION_CURIOUS + overworld_frame(sEmotion_Gfx, 2, 2, 18), // FOLLOWER_EMOTION_MUSIC + overworld_frame(sEmotion_Gfx, 2, 2, 19), // FOLLOWER_EMOTION_MUSIC + overworld_frame(sEmotion_Gfx, 2, 2, 20), // FOLLOWER_EMOTION_POISONED + overworld_frame(sEmotion_Gfx, 2, 2, 21), // FOLLOWER_EMOTION_POISONED }; -static const union AnimCmd sSpriteAnim_Emotes0[] = { +static const union AnimCmd sSpriteAnim_Emotes0[] = +{ ANIMCMD_FRAME(0*2, 30), ANIMCMD_FRAME(0*2+1, 25), ANIMCMD_FRAME(0*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes1[] = { +static const union AnimCmd sSpriteAnim_Emotes1[] = +{ ANIMCMD_FRAME(1*2, 30), ANIMCMD_FRAME(1*2+1, 25), ANIMCMD_FRAME(1*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes2[] = { +static const union AnimCmd sSpriteAnim_Emotes2[] = +{ ANIMCMD_FRAME(2*2, 30), ANIMCMD_FRAME(2*2+1, 25), ANIMCMD_FRAME(2*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes3[] = { +static const union AnimCmd sSpriteAnim_Emotes3[] = +{ ANIMCMD_FRAME(3*2, 30), ANIMCMD_FRAME(3*2+1, 25), ANIMCMD_FRAME(3*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes4[] = { +static const union AnimCmd sSpriteAnim_Emotes4[] = +{ ANIMCMD_FRAME(4*2, 30), ANIMCMD_FRAME(4*2+1, 25), ANIMCMD_FRAME(4*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes5[] = { +static const union AnimCmd sSpriteAnim_Emotes5[] = +{ ANIMCMD_FRAME(5*2, 30), ANIMCMD_FRAME(5*2+1, 25), ANIMCMD_FRAME(5*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes6[] = { +static const union AnimCmd sSpriteAnim_Emotes6[] = +{ ANIMCMD_FRAME(6*2, 30), ANIMCMD_FRAME(6*2+1, 25), ANIMCMD_FRAME(6*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes7[] = { +static const union AnimCmd sSpriteAnim_Emotes7[] = +{ ANIMCMD_FRAME(7*2, 30), ANIMCMD_FRAME(7*2+1, 25), ANIMCMD_FRAME(7*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes8[] = { +static const union AnimCmd sSpriteAnim_Emotes8[] = +{ ANIMCMD_FRAME(8*2, 30), ANIMCMD_FRAME(8*2+1, 25), ANIMCMD_FRAME(8*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes9[] = { +static const union AnimCmd sSpriteAnim_Emotes9[] = +{ ANIMCMD_FRAME(9*2, 30), ANIMCMD_FRAME(9*2+1, 25), ANIMCMD_FRAME(9*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes10[] = { +static const union AnimCmd sSpriteAnim_Emotes10[] = +{ ANIMCMD_FRAME(10*2, 30), ANIMCMD_FRAME(10*2+1, 25), ANIMCMD_FRAME(10*2, 30), @@ -271,7 +282,8 @@ static const union AnimCmd *const sSpriteAnimTable_Icons[] = sSpriteAnim_Icons2 }; -static const union AnimCmd *const sSpriteAnimTable_Emotes[] = { +static const union AnimCmd *const sSpriteAnimTable_Emotes[] = +{ sSpriteAnim_Emotes0, sSpriteAnim_Emotes1, sSpriteAnim_Emotes2, @@ -311,8 +323,9 @@ static const struct SpriteTemplate sSpriteTemplate_HeartIcon = .callback = SpriteCB_TrainerIcons }; -static const struct SpriteTemplate sSpriteTemplate_Emote = { - .tileTag = 0xffff, +static const struct SpriteTemplate sSpriteTemplate_Emote = +{ + .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_EMOTES, .oam = &sOamData_Icons, .anims = sSpriteAnimTable_Emotes, @@ -842,7 +855,8 @@ u8 FldEff_ExclamationMarkIcon(void) u8 FldEff_QuestionMarkIcon(void) { u8 spriteId; - if (gFieldEffectArguments[7] >= 0) { // Use follower emotes + if (gFieldEffectArguments[7] >= 0) { + // Use follower emotes u8 emotion = gFieldEffectArguments[7]; spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emote, 0, 0, 0x52); if (spriteId == MAX_SPRITES)